Hallo Jan,Günter Beyes hat geschrieben:Hallo Jan,
was sagt DBESetDefault() unmittelbar vor dem USE-Befehl?
Günter
da du mit mehreren Thraeds arbeitest, muss du die Default-DBE für jeden Thread festlegen.
Moderator: Moderatoren
warum eine *.DBF und nicht das "normale" ERROR.LOG ?Jan hat geschrieben: In meiner errorsys werden alle Fehlermeldungen gespeichert.
Code: Alles auswählen
BEGIN SEQUENCE
SET ALTERNATE TO (cErrorLog) ADDITIVE
SET ALTERNATE ON
RECOVER
Code: Alles auswählen
*****************************************************************************************************************************
*** Thread für Fehler anzeige erzeugen
*****************************************************************************************************************************
FUNCTION Fehlerliste(oAltDlg, oTabDlgFehlerliste)
LOCAL oThread := Thread():new()
oThread:atEnd := {||"DBCloseAll", oTabDlgFehlerliste:destroy()}
oThread:start("Fehlerliste1", oAltDlg, oTabDlgFehlerliste)
RETURN NIL
*****************************************************************************************************************************
*** Fehler anzeigen
*****************************************************************************************************************************
FUNCTION Fehler1(oAltDlg, oTabDlgFehler)
LOCAL nEvent := 0
LOCAL mp1 := NIL
LOCAL mp2 := NIL
LOCAL oXbpFehlerliste := NIL
USE fehler ALIAS uebersicht NEW SHARED
DBSETINDEX("fehler")
Code: Alles auswählen
bErr := ErrorBlock({|e|break(e))
BEGIN SEQUENCE
DBSETINDEX("fehler")
RECOVER USING e
ErrorBlock( bErr )
IF valtype(e) = "O"
MsgBox( var2char(e:genCode) + " " + var2char(e:description) )
ELSE
MsgBox("Fehler ohne Fehlerobjekt!")
ENDIF
END SEQUENCE
ErrorBlock( bErr )
weil er den Befehl davor (also den USE-Eintrag) nicht ausführen konnte!Jan hat geschrieben:Aber warum springt der aus der Index-Zeile plötzlich einfach in die Funktion davor?
... was ich noch nicht ganz verstehe : Wann / wofür wird die "FEHLER.DBF"Jan hat geschrieben: nein. Und wie ich oben mal geschrieben habe: Ich habe auch mal mit einer anderen Funktion versucht, da einen Alias einzubauen. Da kam sofort der gleiche Fehler.
Hallo Jan,Jan hat geschrieben:Ohne Alias funktioniet alles ganz einwandfrei.Jan
Code: Alles auswählen
public nFehlerReadOnly, nFehlerWrite, ...
if nFehlerReadOnly > 0 // Datei schon offen
....
else
use fehler
if neterr()
... fehlermeldung
else
nFehlerReadOnly := select()
...
(nFehlerReadOnly)->..... // () da Variable
.....
ich denke schon das es gelesen wirde, trotzdem ist es "mir" noch immerJan hat geschrieben: Aber liest denn niemand, was schon x-mal geschrieben wurde?
also ... du hast eine (modifizierte) errorsys ...Jan hat geschrieben: ja, ich benutze eine modifizierte errorsys. Ich schreibe darin die Fehler in besagte fehler.dbf. Funktioniert auch einwandfrei. Sonst überall.
wenn "das" passiert würde ich mal behaupten das dein Programm geradeJan hat geschrieben: In diesem Moment wechselt auch Thread1 von Idle auf Running, Thread3 von Running auf Idle (nebenbei: Wo bleibt Thread2?). Warum das ganze?
"das" verstehe ich z.B. nicht ... wie rufst du die dann "normal" auf ?Jan hat geschrieben: Und wenn ich die wieder raus nehme ist die Fehlermeldung genau die gleiche. Es liegt also nicht an meiner errorsys.
versuche es mal so :Jan hat geschrieben: "USE fehler INDEX fehler ALIAS fehler NEW SHARED"
Code: Alles auswählen
FUNCTION xyz(cDatei,cAlias,cTagName)
...
DO WHILE .T.
USE (cDatei) ALIAS (cAlias) SHARED NEW
IF Neterr() .AND. ;
Alert( "Datei ist gesperrt!;Zugriff wiederholen?", ;
{"Wiederholen","Abbrechen"} ) <> 2
LOOP
ENDIF
EXIT
ENDDO
IF Used()
SET INDEX TO ("fehler.CDX")
OrdSetFocus(cTagname)
ENDIF