Anmelden

View Full Version : Satzformat komplett sichern und Vergleichen



Paul_Hofmann
22-10-15, 07:20
Hallo,

ich habe das Problem das ich bei einer Veränderung im Programm reagieren möchte.

Beispiel:
FMyDatei UF A E K DISK
F RENAME(MyDateiF:MyForm)
F** --------------------------------------------------------------
*================================================= ====================
* Record comparison
*================================================= ====================
DSavRec e ds extname(MyDatei) inz
DSvBefore ds likerec(MyForm) inz
DSvAfter ds likerec(MyForm) inz
*================================================= ====================


chain(e) (Key01:Key02) MyDatei; // lesen MyDatei
// Sichern alte Satzinhalt
clear SvBefore ; // Vergleichsfelder löschen
clear SvAfter ; // Vergleichsfelder löschen
if %found(MyDatei); // gefunden MyDatei
SvBefore = SavRec ; // Satzinhalt sichern
SvBefore.uekz01 = ' '; // Zustand neu erzeugen
endif; // End gefunden MyDatei

Verarbeitung und Neubesetzung der Satzfelder

SvAfter = SavRec ; // Satzinhalt sichern
if SvAfter <> SvBefore; // Sätze vergleichen
if %found(MyDatei); // gefunden MyDatei
update MyForm; // UPDATE
else; // Else gefunden MyDatei
write MyForm; // Write
endif; // End gefunden MyDatei
endif; // End SvAfter <> SvBefore

aber leider steht in SavRec noch der Inhalt wie nach dem Chain und nicht die Veränderten Daten die jetzt in Format MyForm sehen.
Wenn ich nach den Update/Write prüfen würde, würde es klappen, denn SavRec wird erst nach einer Dateioperation gefüllt. Ich möchte aber vor dem Update/Write reagieren.


Hat jemand einen Tip für mich??

DKSPROFI
22-10-15, 09:24
Moin,

da die Feldname immer gleich in der DS sind, probiere mal folgendes:

Ds_AKtRec Prefix(_A)
Ds_Oldrec Prefix(O_)
Ds_NewRec Prefix (N)

Chain in Aktrec
Nicht da Ds_NewRec in Ds_Aktrec
Da dann Ds_Aktrec in Ds_oldRec
Mach was
Ds_NewRec in Ds_Aktrec update

mfg

DKSPROFI

Paul_Hofmann
22-10-15, 09:33
Hi DKSPROFI,

die DS sind nicht immer gleich.
für SvBefore heist das Feld uekz01 z.B. SvBefore.uekz0;
Mein Problem ist, das ich die Felder von MyForm geändert habe und jetzt vergleichen möchte gegen meinen gesicherten Stand.
Also die DS SvBefore mit dem aktuellen Stand.

Kann aber das Format MyForm nicht der DS SvAfter zuweisen oder SvBefore mit dem Format MyForm vergleichen.

Ich habe dass schonmal gemacht, kann aber leider die SRC nicht finden.

Gruß

Paul

DKSPROFI
22-10-15, 09:44
Moin,

das mit dem Rename habe ich glatt überlesen. Was spricht denn gegen die DS aktuell, alt neu, oder nur Before und after?

mfg

Michael

Paul_Hofmann
22-10-15, 10:05
Hi DKSPROFI,

eigentlich nichts, ich stehe nur im Moment auf dem Schlauch, wie ich das komplette Satzformat in eine DS verschieben (sichern) kann um dann zu vergleichen.

camouflage
22-10-15, 10:55
Für solche Fälle verwende ich in der per Definition:



dcl-ds $SvBefore likeds (SavRec);
dcl-ds $SvAfter likeds (SavRec);


Dann kann ich verschieben und vergleichen bis ich lustig bin.

Paul_Hofmann
22-10-15, 14:26
Hallo zusammen,

habe das Problem gelöst. War auch mit der ersten Lösung OK.
Hatte einen anderen Fehler im Programm.

Wenn aber jemand den Unterschied zwischen LIKE, LIKEDS und LIKEREC einfach
beschreiben könnte, wäre das toll.

Gruß
Paul

Fuerchau
23-10-15, 09:04
LIKEREC lädt die Feldinformationen aus dem Satzformat und listet diese in der DS auf, funktioniert also wie LIKEDS.
LIKE definiert ein Feld wie ein anderes, auf das man sich bezieht.
Eine DS ist aber auch ein Feld, daher ist LIKE(MYDS) nur ein Zeichen-Feld in der Größe der DS.
LIKEDS(MYDS) definiert eine UnterDS, allerdings nur wenn auch Qualified verwendet wird.
Ohne Qualified darf ein Feld nur in einer DS vorkommen.

DS1 DS Qualified
F1 10
F2 5I 0

DS2 DS Qualified
F1 like(DS1.F1)
F2 like(DS1)
F3 likeds(DS1)

Du hat nun folgende Felder:
DS1
DS1.F1
DS1.F2

DS2
DS2.F1
DS2.F2 <= nur ein Zeichenfeld
DS2.F3
DS2.F3.F1
DS2.F3.F2

Paul_Hofmann
23-10-15, 09:27
Hallo Fuerchau,

das habe ich jetzt verstanden.
Danke für die tolle Erklärung.

Gruß
Paul