Datenzugriff mithilfe von PSBs und PCBs

Verwenden Sie Programmspezifikationsblöcke (PSBs) und Programmkommunikationsblöcke (PCBs), um die logischen Strukturen in einem für COBOL generierten Programm zu beschreiben.

In EGL werden PSBs mit dem Stereotyp 'PSBRecord' dargestellt. Wenn Sie einen Datensatzabschnitt mit diesem Stereotyp anpassen, dann deklarieren Sie (wie bei anderen Datensatzabschnitten auch) anschließend eine Variable auf Basis der PSB-Datensatzdefinition. Darüber hinaus umfasst EGL vier Typen von PCB-Datensatzdefinitionen. Mithilfe von PCB-Datensatzdefinitionen deklarieren Sie PCB-Datensatzvariablen innerhalb der PSB-Datensatzdefinition.

Sie müssen auch die tatsächlichen PSBs und PCBs in Ihrer COBOL-Umgebung erstellen. Die Informationen in diesen PSBs und PCBs müssen mit den Informationen in Ihren EGL-PSBs und -PCBs übereinstimmen.

In den folgenden Situationen ist die Verwendung von PSBs und PCBs erforderlich:
Die folgenden Tasks sind typisch für den Datenzugriff mithilfe von PSBs und PCBs:
  1. Wenn Sie auf eine DL/I-Datenbank zugreifen, definieren Sie die DLISegment-Datensätze, auf die in Ihren PCB-Datensätzen verwiesen werden soll.
  2. Definieren Sie einen Datensatz mit dem Stereotyp 'PSBRecord'. Dieser Datensatz enthält die Gruppe der PCB-Datensatzvariablen, die Sie beim Zugriff auf IMS-Nachrichtenwarteschlangen, DL/I-Datenbanken oder GSAM-Dateien verwenden.
  3. Machen Sie die PSB- und PCB-Informationen im Programm verfügbar:
    • Deklarieren Sie eine Variable auf Basis des PSB-Datensatzes, den Sie in Schritt 1 definiert haben.
    • Setzen Sie das Eigenschaftsfeld 'psb' der Programmeigenschaft '@DLI' auf den Namen dieser PSB-Datensatzvariablen.

Jeder PCB-Datensatz basiert auf einer der vordefinierten PCB-Datensatzdefinitionen, die von EGL bereitgestellt werden. Siehe PCB-Datensatz - Stereotypen.

Auf bestimmten Plattformen müssen Sie einen anfänglichen Eingabe-/Ausgabe-PCB und mindestens einen Datenfernverarbeitungs-PCB deklarieren. Weitere Informationen finden Sie unter 'Kompatibilität' in diesem Thema. Wenn Sie diese PCBs im EGL-PSB-Datensatz deklarieren und die Laufzeitumgebung die PCBs nicht unterstützt, dann werden die zugehörigen EGL-PCBs nicht in den generierten COBOL-Code eingeschlossen.

So unterstützt beispielsweise CICS keine Ein-/Ausgabe- und Datenfernverarbeitungs-PCBs. Wenn Ihr EGL-PSB-Datensatz diese PCB-Typen enthält, werden sie bei der Generierung für CICS ignoriert. Schließen Sie in diesem Fall die folgende Eigenschaft/Feld-Zuordnung ein, wenn Sie die komplexe Eigenschaft '@DLI' codieren:
callInterface = DLICallInterfaceKind.CBLTDLI

Mit dieser Zuordnung wird die Anzahl der PCBs in DL/I-Aufrufen entsprechend angepasst, um der fehlenden CICS-Unterstützung für Ein-/Ausgabe- und Datenfernverarbeitungs-PCBs Rechnung zu tragen.

Voraussetzungen für die PSB-Datensatzdefinition

Die Struktur Ihrer PSB-Datensatzdefinition hängt mit der Struktur Ihres Laufzeit-PSB zusammen. Darüber hinaus sind zwei weitere Aspekte von Bedeutung:
  • Das Zielsystem beeinflusst, welche PCBs im PSB-Datensatzabschnitt erforderlich sind (siehe 'Kompatibilität' in diesem Thema).
  • Der Wert des Eigenschaftsfelds 'callInterface' der komplexen Programmeigenschaft '@DLI' (ob AIBTDLI oder CBLTDLI) wirkt sich ebenfalls auf die Voraussetzungen für Ihre PSB-Datensatzdefinition aus. Weitere Informationen finden Sie in den folgenden beiden Abschnitten in diesem Thema.

Wert für 'callInterface' ist AIBTDLI

Wenn das Eigenschaftsfeld 'callInterface' auf AIBTDLI (Standardwert) gesetzt ist, erfolgt der Zugriff auf einen bestimmten Laufzeit-PCB nach PCB-Name, und die Struktur des PSB-Datensatzes in Ihrem Programm muss nicht die Struktur des entsprechenden Laufzeit-PSB widerspiegeln. Sie müssen die Laufzeit-PCBs jedoch für EGL verfügbar machen:
  • Bei IMS/VS, IMS BMP und z/OS Batch muss der erste PCB im Laufzeit-PSB ein Eingabe-/Ausgabe-PCB sein. IMS verwendet stets IOPCB als Namen für den Eingabe-/Ausgabe-PCB.
  • Bei IMS/VS und IMS BMP verwendet EGL die folgenden Namen für die anderen erforderlichen PCBs:
    • ELAALT für den alternativen PCB.
    • ELAEXP für den sofort wirksamen alternativen PCB.
    • ELAWORK, wenn Sie eine DL/I-Datenbank als EGL-Arbeitsdatenbank in der IMS/VS-Umgebung verwenden. In diesem Fall brauchen Sie die Informationen zur Datenbankhierarchie nicht in den EGL-PCB-Datensatz einzuschließen, und Ihr IMS-Systemprogrammierer sollte beim Definieren des Laufzeit-PSB das Makro ELAPCB verwenden, wie weiter unten gezeigt wird. Akzeptieren Sie zur Generierungszeit den Standardwert für die Erstellungsdeskriptoroption 'workDBType', um anzugeben, dass es sich bei der Arbeitsdatenbank um eine DL/I-Datenbank handelt.
    Zum Angeben der Namen für diese PCBs stehen folgende Methoden zur Verfügung:
    • Bitten Sie Ihren IMS-Systemprogrammierer, den für EGL erforderlichen PCB-Namen im Job PSBGEN anzugeben, der den Laufzeit-PSB erstellt. Im folgenden Beispiel wird eine Bezeichnung (LABEL) verwendet, um den Namen des alternativen PCB bereitzustellen, und der Parameter PCBNAME eingeschlossen, um den Namen des sofort wirksamen alternativen PCB und Arbeitsdatenbanks-PCB bereitzustellen:
      ELAALT   PCB    TYPE=TP,MODIFY=YES
               PCB    TYPE=TP,MODIFY=YES,EXPRESS=YES,PCBNAME=ELAEXP
               ELAPCB LABEL=ELAWORK 

      In diesem Fall brauchen Sie die PCB-Datensätze nicht in Ihren PSB-Datensatzabschnitt einzuschließen.

    • Wenn Ihr IMS-Programmierer andere Namen verwendet als diejenigen, die für EGL erforderlich sind, müssen Sie die erforderlichen PCB-Datensätze in Ihren PSB-Datensatzabschnitt einschließen und jeweils den für EGL erforderlichen Namen dem entsprechenden Namen in Ihrem Laufzeit-PSB zuordnen. Beispiel: Ihr Laufzeit-PSB enthält die folgenden PCBs:
               PCB    TYPE=TP,MODIFY=YES,PCBNAME=MYALTPCB
               PCB    TYPE=TP,MODIFY=YES,EXPRESS=YES,PCBNAME=MYEXPPCB
               ELAPCB LABEL=MYWORKDB
      In diesem Fall enthält Ihr PSB-Datensatzabschnitt die PCB-Datensätze wie folgt:
      Record MYPSB type PSBRecordPart 		
         ELAALT ALT_PCBRecord {@PCB {pcbType = PCBKind.TP, PCBName = "MYALTPCB"}};
         ELAEXP ALT_PCBRecord {@PCB {pcbType = PCBKind.TP, PCBName = "MYEXPPCB"}};
         ELAWORK DB_PCBRecord {@PCB {pcbType = PCBKind.DB, PCBName = "MYWORKDB"}};
      end 

Wenn das Eigenschaftsfeld 'callInterface' auf AIBTDLI gesetzt ist, müssen Sie nur diejenigen PCB-Datensätze deklarieren, die in Ihrem Programm verwendet werden, sowie alle diejenigen erforderlichen PCBs, deren Laufzeitname von dem für EGL erforderlichen Namen abweicht. Diese Regel gilt für Hauptprogramme und aufgerufene Programme.

Wert für 'callInterface' ist CBLTDLI

Wenn Sie das Eigenschaftsfeld 'callInterface' auf CBLTDLI setzen, erfolgt der Zugriff auf einen bestimmten Laufzeit-PCB nach Adresse und nicht nach Name.

Die Struktur des PSB-Datensatzes in einem Hauptprogramm muss zumindest die anfänglichen PCBs im Laufzeit-PSB widerspiegeln. Hiervon ausgenommen sind Eingabe-/Ausgabe-PCB-Datensätze und alternative PCB-Datensätze, die von EGL ignoriert werden, sodass Sie dasselbe Programm in unterschiedlichen Umgebungen generieren können:
  • Die Anzahl der PCB-Datensätze im PSB-Datensatz darf nicht größer sein als die Anzahl der PCBs im Laufzeit-PSB. Eine geringere Anzahl ist jedoch zulässig.
  • Die Position jedes einzelnen PCB-Datensatzes muss mit der Position des zugehörigen Laufzeit-PCB übereinstimmen. Gleiches gilt für den Typ.

Wenn das Zielsystem IMS/VS ist und Sie eine DL/I-Datenbank als EGL-Arbeitsdatenbank verwenden, brauchen Sie die Informationen zur Datenbankhierarchie nicht in den EGL-PCB-Datensatz einzuschließen, und Ihr IMS-Systemprogrammierer sollte beim Definieren des Laufzeit-PSB das Makro ELAPCB verwenden. Akzeptieren Sie zur Generierungszeit den Standardwert für die Erstellungsdeskriptoroption 'workDBType', um anzugeben, dass es sich bei der Arbeitsdatenbank um eine DL/I-Datenbank handelt.

Die Situation in aufgerufenen Programmen stellt sich wie folgt dar:
  • Wenn Sie einen PSB-Datensatz an das aufgerufene Programm übergeben, dann übergeben Sie eine Adresse, die für den Zugriff auf den Laufzeit-PSB verwendet wird. Sie müssen zumindest den Anfangsabschnitt des PSB-Datensatzabschnitts definieren (wie im Hauptprogramm), einschließlich der PCB-Datensätze für den Eingabe/Ausgabe-PCB, den alternativen PCB und den sofort wirksamen alternativen PCB (sofern er in einer bestimmten Umgebung verwendet wird) sowie aller anderen PCB-Datensätze, die Sie im aufgerufenen Programm benötigen. Darüber hinaus müssen Sie das Eigenschaftsfeld 'psbParm' für die Programmeigenschaft '@DLI' setzen.
  • Wenn Sie PCB-Datensätze an das aufgerufene Programm übergeben (das bewährte Verfahren), dann übergeben Sie Adressen, die für den Zugriff auf den jeweiligen Laufzeit-PCB verwendet werden. Sie müssen weiterhin zumindest den Eingabe/Ausgabe-PCB, den alternativen PCB und den sofort wirksamen alternativen PCB (sofern er in einer bestimmten Umgebung verwendet wird) einrichten. Darüber hinaus brauchen Sie nur diejenigen PCB-Datensätze zu deklarieren, die im aufgerufenen Programm benötigt werden. Außerdem müssen Sie das Eigenschaftsfeld 'pcbParm' für die Programmeigenschaft '@DLI' setzen.

Wenn Sie die Eigenschaften 'pcbParms' und 'psbParm' in einem aufgerufenen Programm angeben, überschreiben die PCB-spezifischen Adressen in 'pcbParms' die entsprechenden Adressen in 'psbParm'; der übergebene PSB-Datensatz wird ignoriert.

Hauptprogramme und aufgerufene Programme, die für IMS/VS oder IMS BMP generiert werden, weisen standardmäßig folgendes Verhalten auf:
  • Der zweite PCB-Datensatz verweist auf den alternativen PCB.
  • Der dritte PCB-Datensatz verweist auf den sofort wirksamen alternativen PCB.

Wenn Sie ELAALT als Namen für einen anderen Datensatz als den zweiten Datensatz verwenden oder wenn Sie ELAEXP als Namen für einen anderen Datensatz als den dritten Datensatz verwenden, hat der Name Vorrang; EGL geht davon aus, dass der benannte PCB-Datensatz auf den entsprechenden Laufzeit-PCB-Typ verweist.

Kompatibilität

Tabelle 1. Hinweise zur Kompatibilität für PSB-Datensätze
Plattform Problem
Java™-Generierung Der Stereotyp 'PSBRecord' wird nicht unterstützt.
CICS

Der Wert der PSB-Datensatzeigenschaft 'defaultPSBName' ist standardmäßig der Name des Laufzeit-PSB. EGL stellt diesen Namen in das Feld 'psbName' der Systemvariablen 'dliLib.psbData'; Sie können diesem Bibliotheksfeld jedoch auch einen anderen Wert zuordnen. Wenn Ihr Programm versucht, eine E/A-Operation für eine DL/I-Datenbank auszuführen, wird mit dem Wert in 'psbName' festgelegt, welcher Laufzeit-PSB verwendet wird.

Die Systemvariable 'dliLib.psbData' hat ein zweites Feld: psbRef. Der Anfangswert des Felds ist Null. Dieser Wert gibt an, dass kein PSB terminiert ist. Bei der ersten DL/I-Ein-/Ausgabe gibt die EGL-Laufzeit einen Aufruf für PSB-Terminierung aus; dieser Aufruf führt die folgenden Aktionen aus:
  • Er verwendet den Wert in 'dliLib.psbData.psbName', um einen Laufzeit-PSB zu terminieren.
  • Er setzt 'dliLib.psbData.psbRef' auf eine Adresse, die auf diesen PSB zugreifen kann.

Vermeiden Sie das Schreiben von Logik, die einen Wert zu 'dliLib.psbData.psbRef' zuordnet.

Verwenden Sie während eines Aufrufs die Variable 'dliLib.psbData', um "den PSB zu übergeben" (d. h. um einen Namen und die zugehörige Adresse zu übergeben).

Während einer Übertragung hängt das genaue Laufzeitverhalten davon ab, wie die Übertragung erfolgt:
  • Wenn die Übertragung durch eine Anweisung 'show' mit einer Klausel vom Typ 'returning' oder durch eine Anweisung 'transfer to transaction' erfolgt, wird der terminierte PSB beendet, da während der Übertragung ein Commitpunkt ausgegeben wird, und es wird kein PSB an das Zielprogramm übergeben.
  • Wenn die Übertragung durch eine Anweisung 'transfer to program' erfolgt, hängt das Standardverhalten davon ab, ob ein PSB terminiert ist:
    • Ist kein PSB terminiert, wird kein Commitpunkt ausgegeben.
    • Ist ein PSB terminiert, wird dieser PSB beendet, da während der Übertragung ein Commitpunkt ausgegeben wird, und es wird kein PSB an das Zielprogramm übergeben. In diesem Fall ist ein alternatives Ergebnis möglich, wodurch der Verhaltensunterschied bei Generierung des übertragenden Programms für CICS im Vergleich zur Generierung des übertragenden Programms für IMS/VS minimiert werden kann. Dieses alternative Ergebnis tritt ein, wenn die vier folgenden Bedingungen allesamt erfüllt sind:
      • Das Zielsystem ist z/OS CICS.
      • Das Zielprogramm ist von EGL generiert.
      • Die Erstellungsdeskriptoroption 'synchOnPgmTransfer' ist auf NO gesetzt.
      • Der im PSB-Datensatz des übertragenden Programms referenzierte Standard-PSB entspricht dem Standard-PSB, der im PSB-Datensatz des Zielprogramms referenziert ist.

      In diesem Fall wird kein Commitpunkt ausgegeben, und EGL übergibt den terminierten PSB an das Zielprogramm.

      Der Standard-PSB ist der Wert der Eigenschaft 'defaultPSBName', die in dem PSB-Datensatzabschnitt gesetzt wird, auf dem ein PSB-Datensatz im Programm basiert. Der Standardwert dieser Eigenschaft ist der Name des Datensatzabschnitts.

Datenbank-PCBs sind im Laufzeit-PSB gültig.

IMS BMP

Der PSB-Parameter in der Laufzeit-JCL (Jobsteuersprache) gibt den Laufzeit-PSB an, der im gesamten Jobschritt verwendet wird. Wenngleich Sie die JCL zur Implementierungszeit anpassen können, generiert EGL den Standardwert des PSB-Parameters in der Laufzeit-JCL durch Zuordnung des Werts der PSB-Datensatzeigenschaft 'defaultPSBName'.

Bei IMS BMP müssen für EGL die folgenden PCBs im Laufzeit-PSB vorhanden sein:
  1. An der Nullposition (ersten Position): der Eingabe-/Ausgabe-PCB. Stellen Sie sicher, dass Ihr IMS-Systemprogrammierer beim Entwickeln des Jobs PSBGEN für CMPAT den Wert YES angibt, selbst wenn Sie eine stapelorientierte BMP generieren.
  2. Ein alternativer PCB, der sich üblicherweise an der zweiten Position befindet.
  3. Ein sofort wirksamer alternativer PCB, der sich üblicherweise an der dritten Position befindet.

Datenbank- und GSAM-PCBs sind ebenfalls gültig.

IMS/VS

Anhand der Regeln der IMS-Systemdefinition wird sichergestellt, dass der Name des Hauptprogramms dem Namen des Laufzeit-PSB entspricht, der in der gesamten Transaktion verfügbar ist.

Bei IMS/VS müssen für EGL die folgenden PCBs im Laufzeit-PSB vorhanden sein:
  1. An der Nullposition (ersten Position): der Eingabe-/Ausgabe-PCB. Ihr IMS-Systemprogrammierer kann beim Entwickeln des Jobs PSBGEN für CMPAT den Wert YES angeben; diese Aktion ist jedoch optional.
  2. Ein alternativer PCB, der sich üblicherweise an der zweiten Position befindet.
  3. Ein sofort wirksamer alternativer PCB, der sich üblicherweise an der dritten Position befindet.

Datenbank-PCBs sind ebenfalls gültig.

Wenn der Wert der Erstellungsdeskriptoroption 'workDBType' DLI lautet (der Standardwert), setzen Sie einen Ihrer Laufzeit-Datenbank-PCBs für die EGL-Arbeitsdatenbank. Die EGL-Arbeitsdatenbank wird als ELAWORK entweder im Laufzeit-PSB oder als Name des EGL-PCB-Datensatzes angegeben.

Die größtmögliche Flexibilität erzielen Sie, wenn Sie den letzten Datenbank-PCB in Ihrem Laufzeit-PSB als ELAWORK angeben. Wenn Sie sich später für einen Wechsel zu einer SQL-Arbeitsdatenbank entscheiden sollten, können Sie diesen PCB ohne großen Aufwand entfernen.

z/OS Batch

Der PSB-Parameter in der Laufzeit-JCL (Jobsteuersprache) gibt den Laufzeit-PSB an, der im gesamten Jobschritt verwendet wird. Wenngleich Sie die JCL zur Implementierungszeit anpassen können, generiert EGL den Standardwert des PSB-Parameters durch Zuordnung des Werts der PSB-Datensatzeigenschaft 'defaultPSBName'.

Bei z/OS Batch muss für EGL der erste Laufzeit-PCB der Eingabe-/Ausgabe-PCB sein. Stellen Sie sicher, dass Ihr IMS-Systemprogrammierer beim Entwickeln des Jobs PSBGEN für CMPAT den Wert YES angibt.

Darüber hinaus müssen für EGL zwei zusätzliche PCBs eines beliebigen Typs im Laufzeit-PSB vorhanden sein. Datenbank- und GSAM-PCBs sind gültig, ebenso alternative PSBs. Ihr Code kann die alternativen PSBs jedoch nicht verwenden; ihre Gültigkeit ermöglicht die Verwendung desselben Laufzeit-PSB für z/OS Batch und IMS BMP.


Feedback