AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Letzte Änderung eines Datensatzes speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Letzte Änderung eines Datensatzes speichern

Ein Thema von LOMBI · begonnen am 17. Mär 2006 · letzter Beitrag vom 24. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
LOMBI
(Gast)

n/a Beiträge
 
#1

Letzte Änderung eines Datensatzes speichern

  Alt 17. Mär 2006, 15:57
Datenbank: Paradox7 • Zugriff über: Query
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Letzte Änderung eines Datensatzes speichern

  Alt 17. Mär 2006, 16:56
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
  Mit Zitat antworten Zitat
LOMBI
(Gast)

n/a Beiträge
 
#3

Re: Letzte Änderung eines Datensatzes speichern

  Alt 17. Mär 2006, 18:11
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Letzte Änderung eines Datensatzes speichern

  Alt 17. Mär 2006, 18:35
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
  Mit Zitat antworten Zitat
LOMBI
(Gast)

n/a Beiträge
 
#5

Re: Letzte Änderung eines Datensatzes speichern

  Alt 17. Mär 2006, 20:17
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Letzte Änderung eines Datensatzes speichern

  Alt 17. Mär 2006, 20:19
Vor dem .Edit; die Werte in Variablen speichern und dann abgleichen oder andere Datenbank benutzen.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Letzte Änderung eines Datensatzes speichern

  Alt 18. Mär 2006, 19:37
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
  Mit Zitat antworten Zitat
LOMBI
(Gast)

n/a Beiträge
 
#8

Re: Letzte Änderung eines Datensatzes speichern

  Alt 22. Mär 2006, 12:04
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Letzte Änderung eines Datensatzes speichern

  Alt 22. Mär 2006, 12:26
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
  Mit Zitat antworten Zitat
LOMBI
(Gast)

n/a Beiträge
 
#10

Re: Letzte Änderung eines Datensatzes speichern

  Alt 23. Mär 2006, 18:16
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.
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