Announcement

Collapse
No announcement yet.

Merkwürdige Datensatzvermehrung nach Cancel

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Merkwürdige Datensatzvermehrung nach Cancel

    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?

  • #2
    Hallo Jürgen,<br>
    <br>
    das Problem scheint zu sein, dass Du zu spät versuchst, das Schreiben des Datensatzes zu verhindern. Durch Dein "Cancel" beim Speichern bringst Du Delphi/ADO aus dem Tritt. Versuch doch mal, Deine Abfrage in das BeforeScroll-Event zu ziehen.<br>
    <br>
    Gruß,<br>
    Ulric

    Comment


    • #3
      Hallo Jürgen,
      füg mal hinter dem "Dataset.Cancel;" noch ein "abort;" ein.<br>
      Hendri

      Comment


      • #4
        Das klappt leider nicht, da das BeforeScroll-Ereignis nach dem BeforePost-Ereignis aufgerufen wird. Dann ist die Änderung aber schon automatisch gespeichert

        Comment


        • #5
          Mit dem Abort hinter den Cancel funktioniert es, aber dann ist auch die Information über den Datensatzwechsel verloren. Aber damit kann ich leben (die Anwedner hoffentlich auch). Es würde mich aber doch interessieren, auf welchen Wegen der zusätzliche Datensatz in die Tabelle kommt. Wie schon erwähnt: Sämliche "Required"-Eigenschaften werden ignoriert! Ich vermute daher, das die Ursache irgendwo in den ADO-Tiefen zu suchen ist

          Comment

          Working...
          X