Hallo.
Die Programmabstürze wurden schon öfter diskutiert. Eine allgemeine Lösung habe ich aber noch nicht gefunden.
Ich habe eine Mehrplatzapplikation bei einem Kunden im Netzwerk.
Das Netzwerk wird von Profis betreut und ist schnell und dauerhaft verfügbar. Die Rechner sind alle an der Domain angemeldet. Im Netzwerk konnte ich keinen Fehler erkennen. Ping reagiert auch immer schnell.
Und die erste Mehrplatzanwendung haben wir schon unter Clipper erstellt, so dass mir die prinzipiellen Abläufe schon klar sind.
Aber irgendwas muss doch noch falsch laufen.
Ein Teil der Daten hole ich mir aus dem SQL-Server (mit XBase 1.9 ohne externe Tools), und ein anderer Teil der Daten liegt auf dem Server als DBF/NTX Dateien.
Probleme habe ich beim Schreiben in DBF-Dateien.
Es werden teilweise mehrere Dateien upgedatet und mit close databases
beendet. Das Programm stürzt ab und zu mal ab. Teilweise mehrmals am Tage.
Ich habe auch schon öfter den Index erneuert, hat aber auch nichts bewirkt. Die Indexe sind nicht sehr groß, habe mir schon überlegt vor dem lesen/schreiben immer einen temporären Index lokal zu erstellen. Aber keine Ahnung ob das hilft.
Hier die Fehlermeldung:
------------------------------------------------------------------------------
FEHLERPROTOKOLL von "WAAGE.EXE" Datum: 12.10.06 14:24:46
Xbase++ Version : Xbase++ (R) Version 1.90.331
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 2
------------------------------------------------------------------------------
oError:args :
oError:canDefault : J
oError:canRetry : N
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Fehler beim Schreiben
oError:filename :
oError:genCode : 74
oError:operation : DbCloseAll
oError:osCode : 0
oError:severity : 2
oError:subCode : 8999
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von DATEN_ABSPEICHERN(1754)
Aufgerufen von VERLADE13_STELLE(1180)
Aufgerufen von FMAINPRG(1101)
Aufgerufen von MAIN(386)
Die Zeiten werden folgendermaßen beim Programmstart gesetzt.
/* zur Vermeidung bei Satzsperre */
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKRETRY, 100000)
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKDELAY, 20)
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKRETRY, 100000)
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKDELAY, 20)
Alle Dateien werden shared geöffnet. Keine Satzsperre kann länger sein als zum Update der Daten benötigt wird. Der Bediener kann im normalen Programmablauf keine Daten ändern.
Also:
Code: Alles auswählen
SELECT PARAME_D
loc_counter := 0
cDbfDatei := "\\servername\freigabe\dbfdateien\parameter.dbf"
cIndexDatei := "\\servername\freigabe\dbfdateien\parameter.ntx"
DO WHILE loc_counter++ <= 30
USE (cDbfDatei)
IF !NETERR()
SET INDEX TO (cIndexDatei)
GO TOP
par_lesen() // datenfelder lesen
lienr_dl := LEFT(dp_lienr, LIE_LAENGE)
REPLACE dp_lienr WITH RIGHT(REPLICATE("0",LIE_LAENGE) + ;
ALLTRIM(STR(VAL(dp_lienr) + 1)),;
LIE_LAENGE)
EXIT
ELSE
SLEEP(50)
ENDIF
ENDDO
// Weitere dbf-Dateien ändern
close Databases
Begin Sequence RECOVER ab. Beim Fehler versuche ich es erneut.
Muss ich dies beim Schreiben in dbf-Dateien auch machen?
Oder mache ich hier noch prinzipiell was falsch.
Gruß
Bernd