Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Dataset auf Unmodified setzen? (https://www.delphipraxis.net/123153-dataset-auf-unmodified-setzen.html)

nachti1505 28. Okt 2008 16:43

Datenbank: FB • Version: 21 • Zugriff über: FIBPlus

Dataset auf Unmodified setzen?
 
Hallo,

ich habe ein Formular in welchem der Nutzer Eingaben machen kann.

Legt der Nutzer einen neuen Datensatz an, so belegt das Programm einige Datenfelder defaultmäßig mit Werten (bspw. wird STAAT auf DE gesetzt).

Wenn der Nutzer nun direkt nach dem Anlegen-Click auf Abbrechen drückt hat ER ja de facto noch nichts am Datensatz geändert, trotzdem wird ihm mein Programm die Sicherheitsfrage "Ungespeicherte Daten... wirklich abbrechen?" stellen, da der Datensatz ja MODIFIED ist. Gibt es eine Möglichkeit nach Belegen der Defaultfelder den Status wieder auf Unmodified zu setzen?

mkinzler 28. Okt 2008 18:12

Re: Dataset auf Unmodified setzen?
 
Rollback

nachti1505 29. Okt 2008 11:03

Re: Dataset auf Unmodified setzen?
 
Rollback setzt ja alle Änderungen zurück... eigentlich möchte ich das folgende Verhalten nachbilden:

1) Nutzer klickt auf Einfügen (Dataset.Insert --> Modified ist false)

2) Programm fügt Defaultdaten ein (Modified ist true, wegen Einfügen der Daten)

3a) Nutzer fügt Daten ein und bricht ab --> Sicherheitsfrage
3b) Nutzer fügt keine Daten ein und bricht ab --> leider auch Sicherheitsfrage wegen (2)

Es wäre also wünschenswert, dass der Zustand modified nach Einfügen der Defaultdaten auf false gesetzt wird, so dass dem Nutzer im Zustand 3b die Sicherheitsfrage NICHT gestellt wird.

mkinzler 29. Okt 2008 11:05

Re: Dataset auf Unmodified setzen?
 
Entweder kein Insert machen oder davor eine SavePoint erzeugen, welchen du dann zurückfahren kannst.

nachti1505 29. Okt 2008 11:11

Re: Dataset auf Unmodified setzen?
 
Glaube, du bist schon einen Schritt zu weit...

Wenn der Nutzer auf abbrechen klickt, wird folgende Unterscheidung getroffen:

if Nutzer_Has_Made_Changes then SicherheitsfrageStellen(Wirklich abbrechen?)
else AbbrechenOhneSicherheitsfrage;

Durch das Einfügen der Defaultwerte seitens des Programm wird dem Dataset aber immer suggeriert, der Nutzer hätte Änderungen gemacht.


Ein alternative Weg um mein Problem zu lösen wäre, alle Komponenten mit OnClick / OnKeyPress-Events auszustatten und dann ein Flag zu setzen, dass Änderungen stattgefunden haben. Ist mir aber zu umständlich, daher der Weg über Dataset.Modified, welche im oben genannten Beispiel eben nicht ganz funktioniert.

Hansa 29. Okt 2008 12:44

Re: Dataset auf Unmodified setzen?
 
Mache das "modified" doch selber. Das muss sowieso bei nicht DB-Edits etc. auch gemacht werden. Also Form-globale Variable deklarieren, z.B. AltFeldWert. Dieses im OnEnter merken und im OnExit den dann aktuellen Feldwert mit AltFeldWert Vergleichen. Ist er gleich, dann ist nichts modified ansonsten eben doch. Bei längeren Eingaben, wie bereits gesagt : immer SavePoints setzen. Werden auf einen Schlag 500 Eingaben gemacht, dann ist jeder Benutzer froh, wenn er nur Teile der Eingaben verwerfen muss und nicht alles !!

alex517 29. Okt 2008 13:37

Re: Dataset auf Unmodified setzen?
 
Hallo nachti1505,

wenn du mit FIBDataSet1.Insert einen Datensatz hinzufügst,
so existiert dieser Datensatz erstmal nur im lokalen Puffer und wird nicht an
Datenbankserver weitergereicht.
Erst mit einen FIBDataSet1.Post wird, vorausgesetzt FIBDataSet1.CancelUpdates=false,
die FIBDataSet1.UpdateTransaction gestartet, FIBDataSet1.InsertSQL ausgeführt
und damit das ganze an den Datenbankserver weitergereicht.

Wenn du aber statt dem Post ein FIBDataSet1.Cancel ausführst, wird
der neue Datensatz im lokaten Puffer verworfen und der Datenbankserver bekommt
davon überhaupt nichts mit.

FIBDataSet ist übrigens vom TDataSet abgeleitet und verhält sich dementsprechend.

alex

shmia 29. Okt 2008 17:25

Re: Dataset auf Unmodified setzen?
 
Zitat:

Zitat von nachti1505
... trotzdem wird ihm mein Programm die Sicherheitsfrage "Ungespeicherte Daten... wirklich abbrechen?" stellen, da der Datensatz ja MODIFIED ist.

Prüfe einfach ein zusätzliches Feld, dass der Benutzer befüllen muss, damit der Datensatz vollständig ist.
Delphi-Quellcode:
if Dataset.Modified and not Dataset.FieldByName('WichtigesFeld').IsNull then
begin
   MessageBox('Ungespeicherte Daten...blabla...', ...)
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz