Hallo
Bei der Programmierung einer kleinen Adressverwaltung (Delphi 5 Enterprise, Access-Datenbank, Zugriff über TBetterADODataset, TADODataset zeigt aber gleiches Verhalten) ist mir folgendes Problem untergekommen:
Im BeforePost-Ereignis wird geprüft, ob der Post-Befehl explizit über den Navigator oder implizit durch einen Datensatzwechsel erfolgte. Hintergrund ist, dass der Anwender bei einem Datensatzwechsel entscheiden soll, ob eine noch offene Änderung gespeichert oder verworfen werden soll. Hierzu wird das Flag fExplictPost, das beim Aktivieren des Post-Buttons im Navigator gesetzt wird, geprüft (Tip aus diesem Forum).
Im Code sieht das wie folgt aus:
procedure TDataMod.adsetAdressenBeforePost( Dataset: TDataset );
begin
if not fExplicitPost and (MessageDlg('Änderung speichern?', mtConfirmation,[mbYes, mbNo], 0 ) = mrNo )
then
Dataset.Cancel;
end;
Das Merkwürdige ist nun, dass nach einer Ablehnung der Speicherungsabfrage und anschließendem Requery ein neuer Datensatz in der Tabelle enthalten ist, und zwar als Kopie des ursprünglichen Datensatzes, wobei
aber nur die Felder, die zuvor geändert (und verworfen) wurden, gefüllt sind (und zwar mit dem Inhalt des ursprünglichen Datensatzes vor der Änderung).
Beispiel:
-Das Feld NAME hat den Inhalt "Mustermann", andere Felder (VORNAME usw.) sind auch belegt
-Der Feldinhalt wird geändert
-Ein anderer Datensatz wird ausgewählt ohne vorher explizit zu Posten.
-Das obige BeforePost-Ereignis tritt in Aktion
-Nach einem Requery ist ein zweiter Datensatz "Mustermann" vorhanden, bei dem aber nur das Feld NAME gefüllt ist
Das Merkwürdige dabei ist, dass der neue Datensatz angelegt wird, obwohl einige Felder (die leer sind) im TBetterADODataset-Objekt die Eigenschaft "Required=true" haben.
Das ganze tritt allerdings dann nicht auf, wenn ich nach dem Cancel-Befehl ein Abort setzte. Dann wird aber auch der Datensatzwechsel, der den Vorgang ausgelöst hat, "abgewürgt".
Kennt jemand einen besseren Weg?
Bei der Programmierung einer kleinen Adressverwaltung (Delphi 5 Enterprise, Access-Datenbank, Zugriff über TBetterADODataset, TADODataset zeigt aber gleiches Verhalten) ist mir folgendes Problem untergekommen:
Im BeforePost-Ereignis wird geprüft, ob der Post-Befehl explizit über den Navigator oder implizit durch einen Datensatzwechsel erfolgte. Hintergrund ist, dass der Anwender bei einem Datensatzwechsel entscheiden soll, ob eine noch offene Änderung gespeichert oder verworfen werden soll. Hierzu wird das Flag fExplictPost, das beim Aktivieren des Post-Buttons im Navigator gesetzt wird, geprüft (Tip aus diesem Forum).
Im Code sieht das wie folgt aus:
procedure TDataMod.adsetAdressenBeforePost( Dataset: TDataset );
begin
if not fExplicitPost and (MessageDlg('Änderung speichern?', mtConfirmation,[mbYes, mbNo], 0 ) = mrNo )
then
Dataset.Cancel;
end;
Das Merkwürdige ist nun, dass nach einer Ablehnung der Speicherungsabfrage und anschließendem Requery ein neuer Datensatz in der Tabelle enthalten ist, und zwar als Kopie des ursprünglichen Datensatzes, wobei
aber nur die Felder, die zuvor geändert (und verworfen) wurden, gefüllt sind (und zwar mit dem Inhalt des ursprünglichen Datensatzes vor der Änderung).
Beispiel:
-Das Feld NAME hat den Inhalt "Mustermann", andere Felder (VORNAME usw.) sind auch belegt
-Der Feldinhalt wird geändert
-Ein anderer Datensatz wird ausgewählt ohne vorher explizit zu Posten.
-Das obige BeforePost-Ereignis tritt in Aktion
-Nach einem Requery ist ein zweiter Datensatz "Mustermann" vorhanden, bei dem aber nur das Feld NAME gefüllt ist
Das Merkwürdige dabei ist, dass der neue Datensatz angelegt wird, obwohl einige Felder (die leer sind) im TBetterADODataset-Objekt die Eigenschaft "Required=true" haben.
Das ganze tritt allerdings dann nicht auf, wenn ich nach dem Cancel-Befehl ein Abort setzte. Dann wird aber auch der Datensatzwechsel, der den Vorgang ausgelöst hat, "abgewürgt".
Kennt jemand einen besseren Weg?
Comment