Das ist eine interessante Frage ... es ist normalerweise ziemlich offensichtlich.
Ich nehme an, die schnelle Antwort ist, dass Kopierbücher nicht verschiedene Arten von Spezifikationen enthalten. Ein RPG IV-Programm kann H-, F-, D-, I-, C-, O- und P-Spezifikationen oder ihre Freiformäquivalente haben. (Der Spezifikationstyp wird durch den Buchstaben in Spalte 6 der Quelle mit festem Format bestimmt). Die Reihenfolge ist wichtig und Sie können die Typen nicht mischen. Wenn Sie eine Quelle mit nur einer Art von Spezifikationen betrachten, ist diese wahrscheinlich als Copybook konzipiert. Da der ausführbare Code in den Spezifikationen C (Berechnung) und/oder P (Prozedur) enthalten ist, ist eine Quelle ohne C- oder P-Spezifikationen ein Copybook. Während es normalerweise eine schlechte Übung ist, C oder P Specs in einem Copybook zu haben, erlaubt RPG es und ich habe es gesehen. Aber noch einmal, das einzige Ding im Kopierbuch würde C oder P specs sein.
EDIT Sie könnten ein Heft mit zum Beispiel F & D-Spezifikationen, aber der einzige Ort, es ist am Ende eines F-Spezifikationen des Programms vor all D-Spezifikationen berücksichtigt werden kann. Sie könnten ein Copybook haben, das Compiler-Direktiven /IF DEFINED
verwendet, um zu steuern, welcher Teil des Copybooks wo enthalten ist.
EDIT2 Es stellte sich heraus, dass IBM die Möglichkeit hinzugefügt hat, F & D Spezifikationen in Version 7.1 und höher zu mischen. Ein Quellenelement mit nur F & D Spezifikationen wäre ein Copybook Also die kurze Antwort wird, ein Quellelement mit beiden Definitionen (H, F, D, I, O) Spezifikationen und ausführbare (C & P) Spezifikationen ist so konzipiert, kompiliert werden .
Die längere Antwort, ein RPG-Programm hat auch eine "Haupt". Ursprünglich war die einzige Option, was heute als "cycle-main" bekannt ist. IE. Die "Haupt" -Prozedur ist der implizit erzeugte Code "cycle", der in RPG-Programme eingebaut ist.
Dann kam RPG IV und ILE. IBM hat das Steuerelementspezifikationsschlüsselwort NOMAIN
hinzugefügt.
H NOMAIN
//or in freeform
ctl-opt nomain;
Dies führte zu einem nicht ausführbaren Modul ohne eine "Haupt" -Prozedur; der normalerweise vom Compiler für den "Zyklus" erzeugte Code wird weggelassen. Das resultierende * MODULE-Objekt müsste in ein * PGM-Objekt mit einem anderen * MODULE eingebunden werden, das eine Hauptprozedur bereitstellt.
Oder es könnte mit null oder mehr anderen * MODULE-Objekte in ein * SRVPGM-Objekt gebunden werden; * SRVPGM sind nur Sammlungen von Prozeduren. Denken Sie an sie wie Windows DLLs.
Dann fügte IBM die Option hinzu, ein "linear-main" RPG IV-Programm zu haben.
H MAIN(MYMAIN)
// or freeform
ctl-opt main(MYMAIN);
So ist die Hauptprozedur, welche Prozedur Sie bezeichnen. Der erzeugte "Zyklus" -Code wird wieder aus der ausführbaren Datei herausgelassen.
Die Existenz der Schlüsselwörter NOMAIN
oder MAIN
würde also anzeigen, dass ein Quellmember kompiliert werden soll; vorausgesetzt, es gibt mehr als die Quelle. Es ist möglich, dass es eine Include-Datei für "Standardoptionen" gibt, die eines davon enthält.
Das Fehlen dieser beiden Schlüsselwörter weist darauf hin, dass es sich um eine Zyklushaupt- oder eine Include-Datei handelt.
Wenn es ein Zyklus Hauptprogramm ist und es dauert Parameter als Eingabe, können Sie den Eintrag Parameterliste
//Fixed format, old school RPG III, IV
C *ENTRY PLIST
C PARM LCMPNO 2
C PARM LNTACT 1
// fixed format, RPG IV using a "Procedure Interface (PI) to replace *ENTRY PLIST
D CheckDate PI
D lDateIs 4a
// free format RPG IV
dcl-pi CheckDate;
lDateIs char(4);
end-pi;
Beachten Sie, dass ein wesentlicher Unterschied in der Quelle zwischen einem „Zyklus-main“ sehen Programm, das die PI anstelle von *ENTRY PLIST
verwendet und eine lineare Haupt ist, dass eine lineare Hauptprozedur von einer expliziten Prozedurdefinition umgeben ist.
// linear main
h main(CHECKDATE)
p CheckDate b
d CheckDate PI
d lDateIs 4a
//do something
*INLR = *ON
return;
p CheckDate e
//cycle main with PI
d lDateIs 4a
//do something
*INLR = *ON
return;
Einfachste, möglicherweise sogar "schnellste", ist es zu versuchen, es zu kompilieren. Das größte Problem wäre, dass Sie bis zu vier Compiles testen müssen - als * PGM, * MODULE, SQL * PGM und SQL * MODULE. Wenn ein Fehler auftritt, versuchen Sie den nächsten. Hmmm ... ich denke auch OPM und ILE. Kompilieren Sie mit etwas wie OPTION (* NOSRCSTMT * NOXREF * NOGEN) vielleicht, und in QTEMP. – user2338816