PDA

View Full Version : Aufruf Prozedur im Serviceprogramm ohne Prototypdefinition im aufrufenden Programm



Etherion
12-08-14, 11:27
Hallo zusammen,

ich habe eine Prozedur von einem Copy Bound(per Copystrecke) auf eine Prozedur in eine Serviceprogramm umgestellt.

In der Copy Bound Version brauchte ich für das Compilieren keinen Prototyp.
Mit der Version als Serviceprogramm braucht man einen Prototyp.

Kann man die Definition des Prototyps in RPG irgendwie umgehen(ausser Copystrecke)?

Im CL mus z. B. auch kein Prototyp angelegt werden. Da holt der CL-Compiler die Daten wohl aus dem Binderverzeichnis.

Beispiel-CL, beim dem ich nicht dediziert einen Prototyp angebe:

PGM

DCLPRCOPT BNDDIR(MYLIB/BDSL)

DCL &z1$gue *CHAR 1
DCL &a1$dat *DEC (8 0) VALUE(01012014)
DCL &r1$d8n *DEC (8 0)
DCL &r1$d6n *DEC (6 0)
DCL &r1$tag *CHAR 2
DCL &r1$mon *CHAR 2
DCL &r1$jah *CHAR 4
DCL &r1$wot *DEC (1 0)
DCL &r1$ttx *CHAR 10
DCL &r1$rvd *DEC (5 0)

CALLPRC PRC(#DATUMPRUE) PARM((&A1$DAT) (&R1$D8N) +
(&R1$D6N) (&R1$TAG) (&R1$MON) (&R1$JAH) +
(&R1$WOT) (&R1$TTX) (&R1$RVD)) +
RTNVAL(&Z1$GUE)
CHGVAR VAR(&A1$DAT) VALUE(32012014)

CALLPRC PRC(#DATUMPRUE) PARM((&A1$DAT) (&R1$D8N) +
(&R1$D6N) (&R1$TAG) (&R1$MON) (&R1$JAH) +
(&R1$WOT) (&R1$TTX) (&R1$RVD)) +
RTNVAL(&Z1$GUE)

CHGVAR VAR(&z1$gue) VALUE(&z1$gue)

ENDPGM



Beispiel-RPG: Hier ist der Compile nur erfolgreich, wenn ich den Prototyp angebe:

H ACTGRP('ACTGRPSL') BNDDIR('MYLIB/BDSL')
*----------------------------------------------------------------
* DS #ddatprue - Variablen für Datumsroutine
d#ddatprue ds inz
d a1$dat 8p 0
d r1$d8n 8p 0
d r1$d6n 6p 0
d r1$tag 2
d r1$mon 2
d r1$jah 4
d r1$wot 1p 0
d r1$ttx 10
d r1$rvd 5p 0
* Datumsprüfung
d#datumprue pr 1
d a1$dat 8 0 const
d r1$d8n 8 0
d r1$d6n 6 0
d r1$tag 2
d r1$tag 2
d r1$mon 2
d r1$jah 4
d r1$wot 1 0
d r1$ttx 10
d r1$rvd 5 0
*================================================= ===============
* VARIABLEN
*----------------------------------------------------------------
d z1rueckgabe s 1
*================================================= ===============
* PROGRAMMERÖFFNUNG
*----------------------------------------------------------------
* Parameterliste
*----------------------------------------------------
* Aufruf Datumsprüfung
clear #ddatprue;
a1$dat= 01012014;
z1rueckgabe = #datumprue(
a1$dat : r1$d8n : r1$d6n :
r1$tag : r1$mon : r1$jah :
r1$wot : r1$ttx : r1$rvd);

a1$dat = 32012014;
z1rueckgabe = #datumprue(
a1$dat : r1$d8n : r1$d6n :
r1$tag : r1$mon : r1$jah :
r1$wot : r1$ttx : r1$rvd);
*inlr = *on;

Freundliche Grüße
Stefan

B.Hauser
12-08-14, 11:45
Für den Aufruf einer Prozedur in einem Service-Programm benötigst Du auf alle Fälle einen Prototypen.

Erst seit Release 7.1 ist die Definition und Verwendung eines Prototypen für interne Prozeduren optional.

Übrigens der Befehl CALLP, der im RPG-Free-Format optional ist, steht für "CALL WITH PROTOTYPE".

Mit Hilfe der Prototypen werden die Parameter-Definitionen zu Compile-Zeit geprüft. Stimmen die Parameter-Definitionen nicht überein wird das Programm oder Modul erst gar nicht erstellt. Im Gegensatz zum CL. Hier werden Abweichungen zwischen den Parameter-Definitionen nicht vor der Laufzeit festgestellt.

Birgitta

Etherion
12-08-14, 12:09
Hi Brigitta,

Danke für die schnelle Antwort.

Gruß
Stefan