PDA

View Full Version : Feldinhalten bleiben in Satzformat stehen



JonnyRico
14-11-05, 09:48
Hallo,

ich habe ein Serviceprogramm mit zwei Modulen und ein PGM (PGM1) das sich derer bedient. PGM1 ruft MDL1 des Serviceprogramms auf. Dieses öffnet ein DSPF mit einem EXFMT auf ein bestimmtes Satzformat (SFMT1). Bei einer bestimmten F-Taste wird von MDL1 das MDL2 aufgerufen. Dieses öffnet die Bildschrimdatei per Open und macht ein EXFMT auf SFMT2. Wird MDL2 beendet und noch einmal von MDL1 aufgerufen, habe alle Felder aus SFTM2 noch die Werte vom letzen Start. Erst wenn ich PGM1 beende und neu starte kann ich MDL2 wieder 1 Mal mit leeren Variablen aufrufen.
MDL2 wir aber immer! mit Close *ALL und *INLR beendet. Ich dachte eigentlich damit würde ich auch die Felder von SFMT2 initalisieren.
Hat jemand einen Tip für mich.

Gruß

Sascha

Fuerchau
14-11-05, 10:58
Module interessieren sich nicht für *INLR beim Return !
Mach einfach ein CLEAR auf das Satzformat.

JonnyRico
14-11-05, 11:35
Module interessieren sich nicht für *INLR beim Return !
Mach einfach ein CLEAR auf das Satzformat.
Hi,

danke für die fixe Antwort. Ich werd's gleich mal versuchen.

Gruß

Sascha

Pikachu
14-11-05, 13:26
Mach einfach ein CLEAR auf das Satzformat.
Oder ein RESET (http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c0925083703.htm). Das müsste auch gehen ...

Gruß
Pikachu

Fuerchau
14-11-05, 14:36
RESET unterscheidet sich von CLEAR dadurch, dass Valriablen durch *INZSR vorbelegt werden können und somit auf diesen Stand zurückgesetzt werden können.
Allerdings ist dies vorsichtig anzuwenden, da z.B. durch Copystrecken in der *INZSR der tatsächliche Inhalt ggf. nicht gewährleistet ist.
Clear löscht auf jeden Fall entsprechend dem Feldtyp.

cbe
15-11-05, 15:19
Mach einfach ein CLEAR auf das Satzformat.
Hallo,

ich hatte es übrigens schon mal, dass der CLEAR auf das Satzformat nicht griff.
Das lag vielleicht daran, dass ich zusätzlich externe DS über diese Datei definiert hatte?

Wie auch immer: Meine Lösung siehe unten - wobei ich nicht schlüssig erklären kann, warum es funktioniert.



Fsslstd if E k disk rename(sslSTDf1: sslSTDr0)
...
D dsSSLSTD E DS extname(SSLSTD)
D a$SSLSTD E DS extname(SSLSTD) prefix(a$)
...


C*** reicht nicht! clear SSLSTDr0
C clear a$SSLSTD
C MOVE a$SSLSTD dsSSLSTD



Gruß
Christian

Rincewind
15-11-05, 15:32
Hi,

Bei CLEAR von Dateien....

Klappt nur bei Dateien die Update / Output geöffnet sind.
Gibt auch einen Hinweis im Wandlungsprotokoll (nicht kritisch, aber halt blöd wenn man sich drauf verlässt).

Gruss

Rince

/edit/
Subfile Clear geht natürlich immer

Fuerchau
15-11-05, 18:56
Bei Dateien werden sog. Pseudo-DS generiert, die nur die Felder der Eingabeformate enthält. Reine Ausgabe-Felder findet man in den generierten O-Bestimmungen (Umwandlungsliste).

CLEAR/RESET wirkt aber nur auf DS !

Nun macht man sich den Vorteil von RPG (ohne qualified) zu Nutze, dass jedes Feld im Programm nur genau 1 Mal vorhanden ist.
Definiert man nun eine externe DS, die alle Felder der I/O-Bestimmungen enthält, funktioniert der CLEAR nun.
Da auch Namen im RPG eindeutig sein müssen, darf es keine Namensgleichheit zwischen Datei-Formatname und DS-Namen geben. Welchen man von beiden umbenennt spielt dabei keine Rolle.

Es gibt dann nur Probleme, wenn man die gleichen Feldnamen in mehreren Formaten benötigt/verwendet, da ja ein Feld wiederum nur 1 Mal im gesamten Programm und somit nur in 1 DS vorkommen kann.
Mittels I-Bestimmungen kann ich ja Eingabefelder umbenennen, leider habe ich noch keine Möglichkeit gefunden, Felder in O-Bestimmungen (nämlich die automatischen) umzubenennen.
Für DISK-Dateien kann ich dies mittels Updatefile (und Pseudo Read/Writes) noch regeln. Bei Printer/Display-Files kann ich das nun mal leider nicht.