Zitat Zitat von dschroeder Beitrag anzeigen
Wir haben das gleiche Problem und es folgendermaßen gelöst:

1. Definition einer externen Datenstruktur, die auf BESTELLUNG basiert.
2. Eine Alpha-Variable definieren, die immer die Länge der Datenstruktur hat und die vor der Änderung mit dem alten Datensatzinhalt gefüllt wird.
3. Vor dem Update einen Vergleich des Datensatzes mit dem gesicherten Alphafeld.

Hier der Code:
D BestellSatz E DS EXTNAME(bestellung)
D BestellKopie S like(BestellSatz)

read Bestellung // dadurch wird Struktur BestellSatz gefüllt
BestellKopie = BestellSatz // Alten Datensatzinhalt sichern

- Änderung des Datensatzes (oder auch nicht)

if BestellSatz <> BestellKopie
writeHistorie;
endif

Bei Datenstrukuränderungen (z.B. wenn in der Tabelle BESTELLUNG ein neues Feld eingefügt wird) reicht es, das Programm neu zu kompilieren, da die Alpha-Variable mit like definiert ist und damit immer die richtige Länge hat.

Bei uns klappt das Verfahren seit Jahren problemlos.

Das mit dem Trigger geht natürlich auch. Dabei hat man den Vorteil, dass alle Änderungen (z.B. auch mit SQL) die Historie fortschreiben

Gruß,
Dieter
Hallo!

Ich hab das auch schon mehrmals so gemacht, aber statt eines Alpha-Feldes eine zweite DS mit dem Schlüsselwort PREFIX verwendet. Dadurch bekommen alle Variablen-Namen ein Prefix z.B. 'H' für Hilf o.ä. vorangestellt.
Dann braucht man nicht mit qualified arbeiten und kann die DS auch mit Like definieren. Vor dem Update wird die DS1 in die DS1H gemoved und mit einem Chain der Satz aus der DB in DS1 gelesen
Der Vergleich ist dann durch ein einfaches if ds1 <> ds1h erledigt. Wenn Unterschiede herrschen, DS1H zurückmoven und damit die DB updaten.


Gruß,
Günter