![]() |
Datenbank: Paradox7 • Zugriff über: Query
Letzte Änderung eines Datensatzes speichern
D3-Prof., Anfänger
Hallo, auf meiner FormAdr habe ich den folgenden Code:
Delphi-Quellcode:
Problem:
TFormAdr.TableAdrBeforePost (DataSet: TDataSet);
begin TableAdr['Update']:= DateToStr(Date); //Datum letzte Änderung LabelUpdate.Caption:= TableAdr.FieldByName('Update').AsString; end; Im Editmodus wird sofort das Datum gesetzt, auch wenn keine Einträge geändert bzw hinzugefügt wurden. Das Datum soll aber nur dann gespeichert werden, wenn tatsächlich am Datensatz etwas verändert wurde. Für Hilfe bin ich dankbar! Gruß Lombi |
Re: Letzte Änderung eines Datensatzes speichern
Hallo Lombi,
ich würde es so machen:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.TableBeforePost(DataSet: TDataSet);
begin if DataSet.Modified then DataSet['UPDATED'] := Now; end; |
Re: Letzte Änderung eines Datensatzes speichern
Hi marabu,
danke für Deine Antwort. Wie mit meinem Code, wird auch bei Deinem Vorschlag das Datum unabhängig von einer Datenänderung immer gesetzt. Das Datum darf nur angezeigt und gespeichert werden, wenn im Editmodus tatsächlich Datenänderungen vorgenommen wurden, sonst nicht. Gruß Lombi |
Re: Letzte Änderung eines Datensatzes speichern
Wenn du einen Buchstaben in einem Feld mit sich selbst überschreibst, dann wird bereits das Modified-Bit für den Datensatz gesetzt, auch wenn der Text des Feldes sich letztlich gar nicht verändert hat. Wenn du solche Fälle ausschließen willst, dann musst du tatsächlich die Feldinhalte vorher und nachher vergleichen - Feld für Feld. Ist das dein Problem?
marabu |
Re: Letzte Änderung eines Datensatzes speichern
Ja, genau das wird's sein. Wie kann ich bitte im EditModus die Feldinhalte auf Veränderung überprüfen, um im Falle das Datum
zu setzen? Schönen Abend! Lombi |
Re: Letzte Änderung eines Datensatzes speichern
Vor dem .Edit; die Werte in Variablen speichern und dann abgleichen oder andere Datenbank benutzen.
|
Re: Letzte Änderung eines Datensatzes speichern
Hi Lombi.
Normalerweise lässt man dem Benutzer die Möglichkeit einen Datensatz unverändert neu zu speichern. In bestimmten Programmen wird das sogar als feature angesehen, aber egal. Wenn du den timestamp eines record nur dann aktualisieren willst, wenn sich auch eine inhaltliche Änderung ergeben hat, dann musst du die Feldwerte zu Beginn eines Edit-Vorganges zwischenspeichern (Markus hat es schon geschrieben) und beim Abspeichern mit den dann aktuellen Feldwerten vergleichen. Nehmen wir an, dass nur ein Dataset deiner Form sich zu jedem Zeitpunkt im Edit-Modus befindet, dann könnte man das so angehen:
Delphi-Quellcode:
Getippt - und nicht getestet. Ich hoffe, dass du den Code nachvollziehen kannst und die dahinter steckende Idee erkennst.
type
TDemoForm = class(TForm) private OldValues: array of Variant; end; procedure TDemoForm.TableAfterEdit(DataSet: TDataSet); var i: Integer; begin with DataSet do begin SetLength(OldValues, FieldCount); for i := Low(OldValues) to High(OldValues) do OldValues[i] := Fields[i].Value; end; end; procedure TDemoForm.TableBeforePost(DataSet: TDataSet); var i: Integer; changed: Boolean; begin changed := false; with DataSet do begin for i := Low(OldValues) to High(OldValues) do changed := changed or (OldValues[i] = Fields[i].Value); end; if changed then Dataset['UPDATED'] := Now; end; procedure TDemoForm.TableAfterCancel(DataSet: TDataSet); begin SetLength(OldValues, 0); end; Freundliche Grüße vom marabu |
Re: Letzte Änderung eines Datensatzes speichern
Hi marabu,
danke für Deine Erklärung. Mit Arrays habe ich bisher noch nicht gearbeitet. Habe deshalb in Borland Grundlagen und Profiwissen nachgelesen. Ein Datensatz kann ja immer unverändert gespeichert werden. In diesem Falle wird halt kein Datum gebucht. Die Private-Deklaration:
Delphi-Quellcode:
erwartet einen Parameter in []. Wenn ich es mit [Boolean] versuche, dann erhalte ich im BeforePost-Ereignis die Meldung: Inkompatible Typen:"Integer" u. "Boolean". Ansonsten kann ich den Code schon einigermaßen begreifen.
private
OldValues: array of Variant; Gruß Lombi |
Re: Letzte Änderung eines Datensatzes speichern
Hi Lombi,
wenn du D3Pro in deinem DP-Profil einträgst, dann berücksichtige ich das vielleicht beim Erstellen von Code-Beispielen. Der von mir verwendete Typ "array of Variant" ist ein dynamisches Array, welches zur Laufzeit mittels SetLength() dimensioniert wird. Diese Spracherweiterung existiert in D3 wohl noch nicht. Du kannst statt dessen auch ein statisches Array deklarieren. Die Dimensionierung muss dann auf die maximale Zahl an Feldinhalten abgestimmt sein. Oder du verwendest eine Listenstruktur. Oder du benutzt den Heap. Grüße vom marabu |
Re: Letzte Änderung eines Datensatzes speichern
Guten Abend marabu,
würdest Du bitte mal meinen Code ansehen, ob er so in Ordnung ist:
Delphi-Quellcode:
Mit diesem Code wird jede Datenänderung mit Datum festgehalten. Allerdings, wenn noch keine Adressen existieren
type
TDemoForm = class(TForm) private OldValues: array [1..26] of Variant // 26 Edits auf der Form end; procedure TDemoForm.TableAfterEdit(DataSet: TDataSet); var i: Integer; begin with DataSet do begin for i := Low(OldValues) to High(OldValues) do OldValues[i] := Fields[i].Value; end; procedure TDemoForm.TableBeforePost(DataSet: TDataSet); var i: Integer; changed: Boolean; begin changed := false; with DataSet do begin for i := Low(OldValues) to High(OldValues) do changed := changed or (OldValues[i] <> Fields[i].Value); end; if changed then DataSet['Update'] := Now; end; procedure TDemoForm.TableAfterCancel(DataSet: TDataSet); var i: Interger; begin with DataSet do begin for i := Low(OldValues) to High(OldValues) do OldValues[i] := Fields[i].Value; end; und die erste angelegt werden soll, dann erscheint folgende Fehlermeldung: "Ungültige Variantenoperation". Was könnte ich noch verbessern? Gruß Lombi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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 by Thomas Breitkreuz