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