Delphi 5.0: Tabellen-Reset

In einem Formular werden Daten einer Tabelle angezeigt. Wird nun die Runtime (EXE) beendet und das Programm über Delphi gestartet, werden alle Daten auf einen Stand von „anno“ zurückgesetzt (manchmal).
Das gleiche Problem habe ich immer bei Abstürzen (siehe weiter unten in diesem Forum).

Was mache ich falsch?
Reicht der Befehl „Anmeldung_Table.Post“ nicht um Daten dauerhaft zu speichern? Wie kann man den Datenzugriff verbessern?

Viele Fragen mit Hoffnung auf Antworten …

Vielleicht hat auch jemand ein Stückchen Code, der zeigt wie man das korrekt macht?

pp

Hi,

welche DB benutzt Du und wie greifst Du darauf zu??

Grüße
Wolfgang

Ich benutze Paradox und habe im Hauptformular das Tabellenobjekt „TTable“ und greife darauf zu mit „TDataSource“. Im Formular dann steckt ein „TDBCtrlGrid“, das die Datensätze anzeigt und wiederum das „TDataSource“ als Recordsource hat.

Es sind und bleiben genau 18 Datensätze in der Tabelle, die nach einem Prüfablauf beschrieben werden mit aktueller Laufzeit, Prüfanzahl etc. Die Anzeige im Hauptformular wird zyklisch aktualisiert. In einem Editmode (der automatische Betrieb ist währenddessen gestoppt) können von Hand verschiedene Einträge vorgenommen werden, danach mit „Post“ gespeichert und der automatische Prüfablauf wieder gestartet.
Das zyklische Beschreiben wird von einem weiteren Formular aus vorgenommen, in dem die gesamte Prüfroutine enthalten ist. Dort sind ebenfalls die Elemente „TTable“ und „TDataSource“ enthalten um direkten Zugriff auf die Daten zu haben.

Das Ganze läuft im Dauerbetrieb und funktioniert tadellos, solange nichts dazwischenkommt. Schmiert der PC nun ab, sind sämtliche Daten zurückgesetzt auf alte Werte. Das habe ich versucht abzufangen, indem ich die Tabelle nach jedem Zyklus wegkopiere, was nur leidlich funktioniert.

Nun habe ich auch oben beschriebenen Effekt bemerkt, wenn ich nicht die Laufzeitversion (EXE) starte, sondern im Debugmode bzw. unter Delphi.

Habe ich hier einen Denkfehler gemacht oder etwas vergessen?

Die zyklische Anzeige-Aktualisierung im Hauptformular:

// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// TableAnmeldungCalcFields
// Funktion: Feldberechnungen
// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
procedure TF\_T10\_SZP\_Main.Anmeldung\_TableCalcFields(DataSet: TDataSet);
var
 b\_ : byte;
 d\_datetime1 : double;
 d\_datetime2 : double;
begin
 d\_datetime1 := now();
 if Anmeldung\_Table['Start'] null then
 begin
 d\_datetime2 := Anmeldung\_Table['Start'] ;
 if d\_datetime2 0 then
 begin
 Anmeldung\_Table['Restzeit'] := F\_T10\_SZP\_Tools.stundenanzeige((d\_datetime2 - d\_datetime1 + (pruefzeit/24)));
 end;
 end;
end;

Die Tabellen-Aktualisierung im „Prüfformular“:

// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// procedure Speichern\_ButtonClick
// Funktion: Prüfdaten speichern
// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
procedure TF\_T10\_SZP\_Prf.Speichern\_ButtonClick(Sender: TObject);
var
 b\_ : byte;
 s\_ : ShortString;
begin
 // Anmeldedaten
 Anmeldung\_Table.Active := true;
 Anmeldung\_Table.Locate('ID', strtoint(ps1edit.text), [loCaseInsensitive]);
 Anmeldung\_Table.Edit;
 if Anmeldung\_Table['Anmeldung'] = true then
 begin
 // nur speichern, wenn auch angemeldet
 Anmeldung\_Table['Pruefanzahl'] := Anmeldung\_Table['Pruefanzahl'] + 1;
 s\_ := Anmeldung\_Table['Typ'];
 if b\_gesamtfehler 0 then
 begin
 Anmeldung\_Table['Fehler'] := Anmeldung\_Table['Fehler'] + 1;
 end;
 Anmeldung\_Table.post;
 end;
 Anmeldung\_Table.Active := false
end;

GUten Morgen,

wie ist die Eigenschaft CachedUpdates des TTables eingestellt? Wenn das auf true ist, werde die Daten erst mal „zwischengespeichert“ bevor sie der BDE übergeben werden. mit

DbiSaveChanges(TAdr.Handle);

kann die Speicherung auch erzwungen werden.

Es sind und bleiben genau 18 Datensätze in der Tabelle, die
nach einem Prüfablauf beschrieben werden mit aktueller

Soll heißen, es sollen immer nur die 18 Datensätze aktualisiert und keine neuen hinzukommen?!?

Das Ganze läuft im Dauerbetrieb und funktioniert tadellos,
solange nichts dazwischenkommt. Schmiert der PC nun ab, sind
sämtliche Daten zurückgesetzt auf alte Werte. Das habe ich

Was heißt „alte Werte“? Werte aus dem letzten Zyklus oder die Werte bei Programmstart?

Die Codeausschnitte sehen IMHO gut aus, ich kann keinen offensichtlichen Fehler entdecken.

Grüße
Wolfgang

Hi!

Die Eigenschaft CachedUpdates ist richtig auf „False“ gestellt.

Es kommen keine neuen DS hinzu, nur diese werden immer aktualisiert. Ich habe diese Struktur gewählt, um ein Grid verwenden zu können.

Die „alten Werte“ stammen von einem Zeitpunkt, den ich nicht mehr bestimmen kann, auf jeden Fall nicht aus dem letzten Zyklus. Ich muß zuerst die Daten über einen Zeitraum archivieren um das festzustellen von wann die daten sind.

Im Code habe ich jetzt noch eine mögliche Fehlerquelle entdeckt:

Anmeldung\_Table.Edit; 

mache ich vor der IF-Entscheidung. Es kann also sein, daß Datensätze zwar auf „Edit“ gestellt sind, aber kein „Post“ folgt wenn der Prüfling nicht angemeldet ist. Ist das evtl. die Fehlerursache (bis jetzt habe ich noch kein Feedback)?

pp

hi,
ich hab nicht alles durchgelesen, aber hast du schon ein Table.FlushBuffers probiert?
Chris