PDA

View Full Version : *entry plist ersetzen in RPG/IV Free-Format



coolie
22-04-04, 09:02
Hallo Forum!

Mein Problem wurde zwar ähnlich weiter unten bereits aufgelistet, aber trotzdem habe ich Schwierigkeiten, dies umzusetzen.

Ich möchte eine PRG/IV-Source umstellen auf Free-Format und anschließend mit CRTBNDRPG erstellen. Wie ersetze ich die *entry plist? Irgendwie scheints ja mit D-Anweisungen und PR/PI möglich zu sein.

Alter Quellcode:
C *ENTRY PLIST
C PARM LAND 3

Neuer Quellcode:
h decedit('0,') datedit(*dmy.) datfmt(*eur) debug(*yes) option(*srcstmt : *nodebugio)
D PRDEF PR
D LAND 3

D PRDEF PI
D LAND 3


In der Umwandlungsliste erscheinen folgende Fehlermeldungen:
007900 d prdef pr
======> aaaaaaaaaaaaaaa
*RNF3788 30 a 007900 Schlüsselwort EXTPGM muß angegeben werden, wenn
DFTACTGRP(*YES) im Befehl CRTBNDRPG angegeben wird.
008000 d land 3
008100 d prdef pi
======> aaaaaaaaaaaaaaa
*RNF3751 30 a 008100 Externe Prozedur im Prototyp für Hauptprozedur nicht mit
aktuellem externem Namen identisch.
008200 d land 3

woki
22-04-04, 09:25
Versuch es mal so:



D PRDEF PR extpgm('getLand')
D LAND 3

D PRDEF PI
D LAND 3


Aufruf der Prozedur mit callP getLand.

Fuerchau
22-04-04, 09:29
Versuch es einfach mit
h dftactgrp(*no)

EXTPGM kann ja nicht angegeben werden, da es ja das Interface der Main-Procedure ist !

B.Hauser
22-04-04, 09:40
Hallo,

Wie du bereits festgestellt hast, muss für Programm- und Prozedure-Aufrufe im Free Format Prototyping verwendet werden.

Beides, sowohl Programme als auch Prozeduren werden mit dem Befehl CALLP aufgerufen.
Zur Compile-Zeit wird der Prototyp mit Procedure-Interface bzw. in rufenden Programmen mit den Parametern verglichen.
Die Parameter müssen in Anzahl, Art und Reihenfolge übereinstimmen.

Prozeduren werden immer statisch aufgerufen, d.h. sie verhalten sich als wären sie Bestandteil des Programms. Aus diesem Grund müssen sie zum Erstellungs-Zeitpunkt des Programms physisch vorhanden sein.

Programme dagegen werden dynamisch aufgerufen, d.h. erst dann, wenn der CALL erfolgt.

Zur Unterscheidung zwischen Programm und Prozedur muss im Prototyp das Schlüssel-Wort EXTPGM('PROGNAME') angegeben werden.
Für externe Prozeduren kann das Schlüssel-Wort EXTPROC() angegeben werden. Wird weder EXTPGM noch EXTPROC angegeben, geht der Compiler davon aus, dass eine Prozedur aufgerufen wird.

Aber vielleicht solltest Du Dich zuerst einmal ein bisschen mit den ILE-Konzepten und vor allem mit Prototyping beschäftigen.
Schau Dir mal folgendes Redbook an:
Who Knew You Could Do That with RPG IV? A Sorcerer’s Guide to System Access and More (http://www.redbooks.ibm.com/redbooks/SG245402.html)

Zum Thema Prototyping kannst Du Dir auch folgenden Link anschauen:
Prototyping (http://common-d.de/pdf04/ws-rpg/prototyping.pdf)

Birgitta

coolie
22-04-04, 11:27
Hallo,

erst einmal vielen Dank für die schnellen und hilfreichen Tipps.

Evtl. werden ja auch noch einige andere auf dieses eigentlich simple Problem stossen, darum hier noch eine kurze zusätzliche Erklärung:

Meine Absicht war lediglich, den Quellcode auf Free-Format umzustellen. Der Aufruf des Programms sollte über eine Befehlszeile/CL o.ä. mit Parameterübergabe erfolgen, also z.B.

CALL PGM(ABC) PARM('USA')

Die Lösung meines Problems lautet wie folgt:

D PRDEF PR extpgm('Dummy')
D LAND 3

D PRDEF PI
D LAND 3


Wie Birgitta bereits erwähnte, wird durch Angabe des Schlüssel-Wortes EXTPGM im Prototyp erreicht, daß

a) ein dynamischer call ausgeführt wird
b) der Compiler dacon ausgeht, daß ein Programm aufgerufen werden soll.


Beste Grüße
coolie

Fuerchau
22-04-04, 11:53
Aus Dokumentatorischen Gründen solltest du statt "Dummy" den richtigen Namen verwenden.
Die Deklaration kann man nämlich auch in eine COPY-Strecke verlegen und somit in anderen RPG-Programmen verwenden. Diese brauchen dann nur noch den CALLP aufzurufen und das richtige Programm wird gestartet.

BenderD
22-04-04, 11:53
Hallo,


Hallo,

erst einmal vielen Dank für die schnellen und hilfreichen Tipps.

Evtl. werden ja auch noch einige andere auf dieses eigentlich simple Problem stossen, darum hier noch eine kurze zusätzliche Erklärung:

Meine Absicht war lediglich, den Quellcode auf Free-Format umzustellen. Der Aufruf des Programms sollte über eine Befehlszeile/CL o.ä. mit Parameterübergabe erfolgen, also z.B.

CALL PGM(ABC) PARM('USA')

Die Lösung meines Problems lautet wie folgt:

D PRDEF PR extpgm('Dummy')
D LAND 3

D PRDEF PI
D LAND 3


Wie Birgitta bereits erwähnte, wird durch Angabe des Schlüssel-Wortes EXTPGM im Prototyp erreicht, daß

a) ein dynamischer call ausgeführt wird
b) der Compiler dacon ausgeht, daß ein Programm aufgerufen werden soll.


Beste Grüße
coolie

letzteres gilt für die Verwendung des Prototyps beim Aufruf; bei der Implementierung erkennt der Compiler das Procedure Interface des Mains daran, dass selbiges global deklariert ist und sucht den zugehörigen Prototyp nach Namen - hier wird nun der EXTPGM Eintrag erwartet, da ein Main nur per dynamischem Call aufgerufen werden kann.

mfg

Dieter Bender