PDA

View Full Version : Alternative zu *ENTRY PLIST



Seiten : 1 [2]

BenderD
15-01-04, 16:57
Hallo,

eh' da was durchgerät einander:

VALUE geht leider nur für gebundene Aufufe, die as400 kann auf OS Ebene nur call by Reference.

das mit der Abfrage auf Null mit der BIF geht wie obiges nur in ILE

CONST erzeugt bei Verwendung im aufrufenden Programm auch Code mit Zwischenvariablen und Konvertierung und ermöglicht damit Literale, geht aber auch nur in ILE im aufrufenden Programm.

Über die Commands und deren Kontrolle über die Parameter, könnte man einen ganzen Artikel schreiben (mach' ich vielleicht mal)

mfg

Dieter Bender

B.Hauser
15-01-04, 17:06
VALUE kann für den Aufruf zwischen Prozeduren benutzt werden, nicht für den Aufruf von Programmen.

Bei VALUE wird der komplette String übergeben und keine Adresse.
Im aufgerufenen Programm kann ein mit VALUE übergebener Parameter beliebig geändert werden.

RPGIII kennt nur Parameterübergabe by Reference (Adressen).

Die Parameter-Übergabe mit CONST erfolgt ebenfalls über Adresse. Bei abweichendem Feldtyp wird jedoch ein temporäres Feld mit der erwarteten Definition erstellt und diese Adresse an die rufende Prozedur weitergegeben.
Deshalb kann CONST auch für den Aufruf von RPGIII-Programmen verwendet werden.

Wird ein Prototyp mit Parametern mit CONST-Definition eingebunden, kann in der aufgerufenen Prozedur dieses Feld nicht geändert werden. (Fehler bei der Compilierung)

Durch diese Erklärung müsste auch klar sein, dass CONST und VALUE nicht für das gleiche Parameter-Feld verwendet werden können.

Birgitta

malzusrex
28-01-04, 14:29
erklärt doch mal bitte eine unwissenden wie man *entry in den D-Bestimmungen darstellt

C *ENTRY PLIST
C PARM OBJ 4 0
C PARM FOLG 6 0


tschau ronald

Fuerchau
28-01-04, 14:54
Definition Procedure-Interface




D PI
D OBJ 4p 0
D FOLG 6p 0

B.Hauser
28-01-04, 14:54
Hallo Ronald,

die Entry PList entspricht dem Procedure Interface:


D Ersatz für *Entry PLIST
D MyPGM PI
D OBJ 4 0
D FOLG 6 0



Die Felder (hier OBJ und FOLG) sind durch das Procedure Interface definiert.

Zusätzlich benötigst Du noch einen Prototyp, in dem die Parameter-Felder mit der gleichen Art, Länge und in der gleichen Reihenfolge hinterlegt sein müssen.
Feld-Namen müssen im Prototyp nicht angegeben werden.
Werden Feldnamen angegeben werden diese ignoriert, d.h. in mehreren Prototypen kann der gleiche Name mit unterschiedlicher Definition verwendet werden.
Der Prototyp muss in jedem Programm, das das Programm oder die Prozedur über CALLP aufruft eingebunden werden.



D Prototyp
D MyPGM PR ExtPGM(MYPGM)
D OBJ 4 0
D FOLG 6 0



Übrigens, am 12./13.Feburar findet von Common aus in Mannheim ein 2-tägiger RPG-Workshop statt.
Prototyping ist nur eines von vielen Themen.
Bei Interesse informier Dich doch mal unter:


Common Deutschland (http://common-d.de/)

Birgitta

malzusrex
28-01-04, 14:59
dank euch beiden. wieder was gelernt

danke ronald

Fuerchau
30-01-04, 11:11
Bei der Übergabe von Strukturen (DS) ist das mit dem PI etwas komplizierter, die einfachere Version ist dann wieder *ENTRY (nur geht das leider bei Prozeduren wieder nicht).

Meine Lösung lautet dann:

d MyProg PI
d MyDs 1

d MyDsPtr s *
d MyOrigDs ds based(MyDsPtr)
d Field1 ....

c/free
MyDsPtr = %adr(Myds)
/end-free

Oder hast du eine bessere Lösung Birgitta ?

BenderD
30-01-04, 11:44
Hallo Baldur,

das mit der Dummy Deklaration mit der Länge 1 gefällt mir nicht, entweder
würde ich da LIKE nehmen oder * (Pointer) mit value, ansonsten, wie skizziert. LIKEDS habe ich nicht probiert, was da passiert, aber LIKEDS ist eh' Waffenschein pflichtig, sobald man embedded SQL verwendet; der PreCompiler ist halt Sch...(denkste, soll schlecht heissen)

Dieter Bender