PDA

View Full Version : Call aus RPGIV Freiformat in RPG400



Tobse77
14-02-08, 08:23
Hallo zusammen,

wir programmieren seit ca. einem Monat mit RPGIV.

Nun haben wir allerdings etliche Sub-Programme, die in RPG400 geschrieben sind. Da wir von Beginn an im Freiformat programmieren, stehen wir nun immer wieder vor dem Problem die alten Sub-Programme aufrufen zu wollen, denn wir möchten ja nicht jedesmal das Rad neu erfinden.
Hierzu beenden wir also jedesmal den Free-Code mit /End-Free, rufen per konventionellem CALL mit PLIST das Programm auf und programmieren anschließend mit /Free weiter.

Ist dies die allgemein übliche Art oder wie macht ihr das ??

Angenommen, wir konvertieren sukzessive die alten Programme mittels CVTRPGSRC und erstellen für die für das Prototyping benötigten PR- und PI-Definitionen ... würden dann die alten Programme, die die Sub-Programme per CALL aufrufen weiterhin funktionieren ??

Fuerchau
14-02-08, 09:10
Hierfür bietet sich die Prototyp-Definition an.
Der Vorteil ist, dass man bestimmte Parameter dann als "VALUE" definieren kann, so dass die komplizierten Ver- und Entsorgungen von Übergabestrukturen entfallen kann.

Aufgerufen wird das Ganze dann per

callp MyExtPgm(P1: P2: ...);

wobei Value-Parameter dann automatisch in Hilfsfelder kopiert und ggf. konvertiert werden.

BenderD
14-02-08, 09:37
- value geht mit dynamischem Aufruf (CALL) nicht, da hierbei Parameter immer by Reference übergeben werden.
- das callp darf man im Freeformat auch weglassen
- zur Verdeutlichung: an den aufgerufenen Programmen wird nix geändert, es wird lediglich im aufrufenden ein Prototyp statt der Keylist benötigt.

D*B


Hierfür bietet sich die Prototyp-Definition an.
Der Vorteil ist, dass man bestimmte Parameter dann als "VALUE" definieren kann, so dass die komplizierten Ver- und Entsorgungen von Übergabestrukturen entfallen kann.

Aufgerufen wird das Ganze dann per

callp MyExtPgm(P1: P2: ...);

wobei Value-Parameter dann automatisch in Hilfsfelder kopiert und ggf. konvertiert werden.

Tobse77
14-02-08, 09:44
Hallo Fuerchau und BenderD,

vielen Dank für die Antworten.

Dass die aufgerufenen Programme weiterhin funktionieren ist das Wichtigste !!! Habe ich eben auch mal kurz getestet - Danke !!

Was ich noch nicht so ganz verstanden habe ist die Sache mit dem Value Fuerchau.

Meintest du anstatt
Firma = 1 / immer 1 im Format 3S0
callp PGMName (Firma : TNr);

dann nur noch
callp PGMName (1 : TNr);

so dass ich mir die fixen Feldfüllungen sparen kann??

BenderD
14-02-08, 09:56
value (keyword beim Parameter in PR und PI) geht nur bei Procedure Aufrufen.
bei Programmen (was du hier brauchst) geht nur CONST und das auch nur, wenn da nix geändert zurück kommt.
In beiden Fällen kann man Literale und Ausdrücke als Parameter verwenden, der Compiler prüft dann Typ Verträglichkeit beim Aufruf gegen den Prototyp und konvertiert implizit.

D*B




Meintest du anstatt
Firma = 1 / immer 1 im Format 3S0
callp PGMName (Firma : TNr);

dann nur noch
callp PGMName (1 : TNr);

so dass ich mir die fixen Feldfüllungen sparen kann??

Tobse77
14-02-08, 10:39
OK, Verstanden !!
Beim Aufruf von RPG400-Programmen muss mit Variablen als Parameter gearbeitet werden - sonst meckert auch der Compiler - da im aufgerufenen Programm die übergebenen Parameter jederzeit geändert werden können, da aufgrund fehlender PR-Definition nicht prüfbar für den Compiler.

Dankeschön !!

BenderD
14-02-08, 12:36
Hallo,

wenn die Variablen im aufgerufenen Programm nicht geändert werden, kann man im Prototyp bei selbigen das Schlüsselwort CONST ablochen, dann gehen auch hier Literale und Ausdrücke.

mfg

Dieter Bender

PS: Literale sind kein guter Programmierstil, da sollte man in ordentlichen Programmiersprachen Konstanten verwenden und in RPG Variablen mit festbelegtem Wert.


OK, Verstanden !!
Beim Aufruf von RPG400-Programmen muss mit Variablen als Parameter gearbeitet werden - sonst meckert auch der Compiler - da im aufgerufenen Programm die übergebenen Parameter jederzeit geändert werden können, da aufgrund fehlender PR-Definition nicht prüfbar für den Compiler.

Dankeschön !!