Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Letzte Änderung eines Datensatzes speichern (https://www.delphipraxis.net/65525-letzte-aenderung-eines-datensatzes-speichern.html)

LOMBI 17. Mär 2006 14:57

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:
TFormAdr.TableAdrBeforePost (DataSet: TDataSet);
begin
 TableAdr['Update']:= DateToStr(Date); //Datum letzte Änderung
 LabelUpdate.Caption:= TableAdr.FieldByName('Update').AsString;
end;
Problem:

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

marabu 17. Mär 2006 15:56

Re: Letzte Änderung eines Datensatzes speichern
 
Hallo Lombi,

ich würde es so machen:

Delphi-Quellcode:
procedure TDemoForm.TableBeforePost(DataSet: TDataSet);
begin
  if DataSet.Modified then
    DataSet['UPDATED'] := Now;
end;
Grüße vom marabu

LOMBI 17. Mär 2006 17:11

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

marabu 17. Mär 2006 17:35

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

LOMBI 17. Mär 2006 19:17

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

mkinzler 17. Mär 2006 19:19

Re: Letzte Änderung eines Datensatzes speichern
 
Vor dem .Edit; die Werte in Variablen speichern und dann abgleichen oder andere Datenbank benutzen.

marabu 18. Mär 2006 18:37

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:
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;
Getippt - und nicht getestet. Ich hoffe, dass du den Code nachvollziehen kannst und die dahinter steckende Idee erkennst.

Freundliche Grüße vom marabu

LOMBI 22. Mär 2006 11:04

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:
private
  OldValues: array of Variant;
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.

Gruß
Lombi

marabu 22. Mär 2006 11:26

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

LOMBI 23. Mär 2006 17:16

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:
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;
Mit diesem Code wird jede Datenänderung mit Datum festgehalten. Allerdings, wenn noch keine Adressen existieren
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 14:52 Uhr.
Seite 1 von 2  1 2      

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