Nachdem wir nun Binderverzeichnisse erstellt und Module und/oder Service-Programme in diese Binderverzeichnissen eingefügt haben, stellt sich die Frage wie wir diese Binderverzeichnisse beim Erstellen von Programmen und Service-Programmen einsetzen können. In diesem Artikel wird gezeigt, wie die Binderverzeichnisse sowohl bei einer zweistufigen Kompilierung als auch der Kompilierung über CRTBNDxxx verwendet werden können.
Zweistufige Kompilierung mit Binder-Verzeichnissen
Programme und Service-Programme können in einer zweistufigen Kompilierung erstellt werden, d. h. zunächst werden die Module erstellt und im Anschluss im Binder-Schritt die Module entweder zu Programmen oder Service-Programmen gebunden. Dabei müssen die Module, die zu dem Programm oder Service-Programm gebunden werden sollen, angegeben werden. Werden in den Prozeduren, die sich innerhalb der Module befinden andere Prozeduren in verschiedenen Service-Programmen aufgerufen, so müssen auch diese Service-Programme im Binder-Schritt angegeben werden.
Anstatt die gebundenen Objekte einzeln aufzulisten, können Module und Service-Programme in Binder-Verzeichnisse eingetragen werden. Im Binder-Schritt werden dann nur einige wenige Binder-Verzeichnisse angegeben.
In unserer Umgebung sind aktuell zwei Service-Programme SVVCVTDAT (Datums-Funktionen) und SVVSTRING (String-Funktionen) vorhanden. In beiden Service-Programmen sind diverse exportierte Prozeduren hinterlegt.
Die folgende Abbildung zeigt über den Befehl DSPSRVPGM die exportierten Prozeduren in den Service-Programmen SVVSTRING und SVVCVTDAT in Bibliothek HSCOMMON05.

In Service-Programm SVVSTRING sind nur Prozeduren vorhanden sind, die entweder keine anderen Prozeduren oder nur Prozeduren innerhalb des gleichen Service-Programms aufrufen. Da diese Service-Programme in Zukunft noch um weitere Prozeduren erweitert werden und außerdem noch weitere Service-Programme geplant sind, aus denen Prozeduren in den beiden Service-Programmen aufgerufen werden, wurde beschlossen das Binder-Verzeichnis ILEBNDDIR mit dem folgenden Befehl anzulegen:
CRTBNDDIR BNDDIR(YOUROBJLIB/ILEBNDDIR)
TEXT('ILE Binder-Verzeichnis')
Beispiel 2: Erstellen Binder-Verzeichnis ILEBNDDIR
Diesem Binder-Verzeichnis werden die beiden Service-Programme SVVCVTDAT und SVVSTRING mit dem folgenden Befehl hinzugefügt.
ADDBNDDIRE BNDDIR(YOUROBJLIB/ILEBNDDIR)
OBJ((YOUROBJLIB/SVVSTRING *SRVPGM *IMMED)
(YOUROBJLIB/SVVCVTDAT *SRVPGM *IMMED))
Beispiel 3: Hinzufügen von Service-Programmen zu Binder-Verzeichnis ILEBNDDIR
Die folgende Abbildung zeigt das Binder-Verzeichnis ILEBNDDIR mit beiden Einträgen über den Befehl WRKBNDDIRE (Mit Binder-Verzeichnis-Einträgen arbeiten). Da beide Service-Programme im bislang noch nicht erstellt wurden und zum Zeitpunkt des Eintrags nicht auf Existenz geprüft wird, wird an dieser Stelle kein Erstellungs-Datum und keine Erstellungs-Zeit angezeigt.

Im Anschluss daran werden für die beiden Service-Programme zunächst die Module und im Anschluss daran die Service-Programme mit dem folgenden Befehlen erstellt. Da die Prozeduren aus dem Service-Programm SVVSTRING aus Prozeduren in Service-Programm SVVCVTDAT aufgerufen werden, muss das Service-Programm SVVSTRING zuerst erstellt werden.
CRTRPGMOD MODULE(YOURMODLIB/SVVSTRING)
SRCFILE(YOURSRCLIB/QRPGLESRC)
SRCMBR(SVVSTRING)
CRTRPGMOD MODULE(YOURMODLIB/SVVCVTDAT)
SRCFILE(YOURSRCLIB/QRPGLESRC)
SRCMBR(SVVCVTDAT)
CRTSRVPGM SRVPGM(YOUROBJLIB/SVVSTRING)
MODULE(*SRVPGM)
SRCFILE(YOURMODLIB/QSRVSRC)
SRCMBR(SVVSTRING)
BNDDIR(YOUROBJLIB/ILEBNDDIR)
CRTSRVPGM SRVPGM(YOUROBJLIB/SVVCVTDAT)
MODULE(*SRVPGM)
SRCFILE(YOURMODLIB/QSRVSRC)
SRCMBR(SVVCVTDAT)
BNDDIR(YOUROBJLIB/ILEBNDDIR)
Beispiel 5: Zweistufige Kompilierung von Service-Programmen mit Binder-Verzeichnis ILEBNDDIR
Prüft man nach der Erstellung der Service-Programme die Binder-Verzeichnis-Einträge erneut mit dem Befehl WRKBNDDIRE (Mit Binder-Verzeichnis-Einträgen arbeiten), werden auch die Erstellungs-Daten angezeigt, wie die folgende Abbildung beweist.

Prozeduren aus den Service-Programmen SVVCVTDAT und SVVSTRING werden in den Programmen SVVCALL1 und SVVCALL2 aufgerufen. Diese Programme können ebenfalls in einer zweistufigen Kompilierung mit Angabe des Binderverzeichnisses mit den folgenden Befehlen erstellt werden.
CRTRPGMOD MODULE(YOURMODLIB/SVVCALL1)
SRCFILE(YOURSRCLIB/QRPGLESRC)
SRCMBR(SVVSTRING)
CRTRPGMOD MODULE(YOURMODLIB/SVVCALL2)
SRCFILE(YOURSRCLIB/QRPGLESRC)
SRCMBR(SVVCVTDAT)
CRTPGM PGM(YOUROBJLIB/SVVCALL1)
MODULE(*PGM)
BNDDIR(YOUROBJLIB/ILEBNDDIR)
CRTPGM PGM(YOUROBJLIB/SVVCALL2)
MODULE(*PGM)
BNDDIR(YOUROBJLIB/ILEBNDDIR)
Beispiel 7: Zweistufige Kompilierung von Programmen mit Binder-Verzeichnis
Anmerkung: Nach dem Binder-Schritt sind die Module nicht länger erforderlich und können/sollten gelöscht werden.
Zeigt man sich nach dem Erstellen der Programme mit dem Befehl DSPPGM (Programm anzeigen) die gebundenen Service-Programme an, so stellt man fest, dass in Programm SVVCALL1 nur das Service-Programm SVVCVTDAT gebunden ist, während in Programm SVVCALL2 beide Service-Programme (SVVCVTDAT und SVVSTRING) gebunden sind, wie die folgende Abbildung beweist.

Einstufige Kompilierung mit Binder-Verzeichnissen
Während Service-Programme immer zweistufig kompiliert werden müssen, können Programme direkt in einem Schritt mit dem Befehl CRTBNDxxx (XXX Binder-Programm erstellen) erstellt werden.
Dieses Vorgehen war kein Problem, solange in dem Programm nur ein Modul gebunden war und keine Prozeduren aus Service-Programmen aufgerufen wurden. In beiden Fällen müssen die zu bindenden Objekte im Binder-Schritt angegeben werden, was eine zweistufige Kompilierung erfordert, … zumindest solange man ohne Binder-Verzeichnisse arbeitet.
Befehl CRTBNDxxx mit Binder-Verzeichnis
Sofern man im Befehl CRTBNDxxx (xxx Binder-Programm erstellen) den Wert für die Standard-Aktivierungsgruppe von *YES auf *NO ändert und eine Aktivierungsgruppe angibt (oder auch nur den Unterlassungs-Wert akzeptiert), können auch bei der direkten Erstellung von Binder-Programmen ein oder mehrere Binder-Verzeichnisse angegeben werden.
Die folgende Abbildung zeigt den Befehl CRTBNDRPG (RPG Binder-Programm erstellen), nachdem der Wert für die Standard-Aktivierungsgruppe auf *NO geändert wurde.


Anmerkung: Sofern Module und Service-Programme in Binder-Verzeichnisse hinterlegt werden, können Programme auch dann in einem Schritt erstellt werden, wenn mehrere Module gebunden oder Prozeduren aus Service-Programmen aufgerufen werden.
Sofern Programme embedded SQL beinhalten, wird es etwas problematischer, da die Optionen DFTACTGRP (Default Aktivierungsgruppe), ACTGRP (Aktivierungsgruppe) und BNDDIR (Binder-Verzeichnis) nicht direkt in dem CRTSQLRPGI-Befehl angegeben werden können.
Beim Erstellen von Objekten mit embedded SQL wird zunächst die Original-Quelle durch den SQL-Precompiler überarbeitet. Dabei werden die SQL Statements auskommentiert und durch API (Application Programming Interface)-Aufrufe ersetzt. Die Objekte werden im Anschluss durch den Aufruf der System-Befehle CRTBNDxxx oder CRTxxxMOD, je nachdem ob ein Programm oder Modul erzeugt werden soll, aus der modifizierten Quelle erstellt.
Wie bereits zuvor erwähnt beinhalten die CRTSQLxxxI-Befehle nicht alle Optionen, die in den Befehle CRTBNDxxx und CRTxxxMOD gesetzt werden können. Um Compile-Optionen für die Erstellungs-Befehle setzen zu können wurde bereits mit Release V5R3M0 wurde die Option COMPILEOPT (Compiler-Optionen) in die Befehle CRTSQLxxxI integriert. Fehlende Optionen können über die COMPILEOPT-Option in Form eines Strings mit einer Länge von bis zu 5.000 Zeichen hinterlegt werden. Mehrere Optionen können durch ein Blank getrennt aufgelistet werden. Es erfolgt allerdings keine Prüfung, ob die angegebenen Optionen gültig sind. Ungültige Optionen werden ignoriert.
Die folgende Abbildung zeigt die Compiler-Optionen im Befehl CRTSQLRPGI sowie der komplette Erstellungsbefehl für das Programm MYPGM. Die Option DFTACTGRP wird auf *NO gesetzt und das Programm mit Aktivierungsgruppe YOURPGM erstell. Das Binder-Verzeichnis YOURBNDDIR wird zum Auffinden der zu bindenden Module und Service-Programme verwendet.

Jetzt sind wir in der Lage Programme und Service-Programme, in denen viele Module und/oder Service-Programme gebunden sind, relativ elegant erstellen.
Allerdings muss man sich beim erneuten Erstellen der Programme und Service-Programme and die manuell eingegeben Optionen erinnern. Einfacher wäre es, wenn die Compile-Optionen irgendwo hinterlegt und automatisch beim Erstellen der Module und (Service-)Programme herangezogen werden könnten.
… und auch das ist möglich! Wie das geht, sehen wir im nächsten Artikel. Bis dahin schon einmal viel Spaß beim Erstellen von Programmen und Service-Programmen mit Angabe von Binderverzeichnissen.
Birgitta Hauser ist IBM Champion und Spezialistin für SQL- sowie RPG-Programmierung.
Frau Hauser gibt regelmäßig Workshops im Rahmen der MIDRANGE ACADEMY.
Sie schreibt regelmäßig für MIDRANGE und den TechKnowLetter. Hier erhalten Sie brandneue, tiefe Informationen zu SQL, RPG und vielem mehr.
Der TechKnowLetter erscheint monatlich. Sechs Ausgaben erhalten Sie für 88 Euro hier.