Beispiel-IMS-Programmcode

Anhand dieser Auszüge aus EGL-Programmen wird die Interaktion mit seriellen IMS-Dateien, IMS-Terminals und IMS-Nachrichtenwarteschlangen gezeigt.

Beispiel einer Ausgabe in eine einer Nachrichtenwarteschlange zugeordneten serielle Datei

Im Folgenden finden Sie einige Codeauszüge aus einem EGL-Programm, mit dem auf Nachrichtenwarteschlangen zugegriffen wird. Mit dem Programm werden die folgenden Tasks ausgeführt:
  1. Eingaben von einem Terminal mithilfe eines Formulars anfordern.
  2. Die Antwort lesen.
  3. Serielle Datensätze anhand der Benutzereingabe mit Informationen aktualisieren.
  4. Serielle Datensätze für spätere Stapelverarbeitung an eine andere Transaktion ausgeben.
Im Programm werden die folgenden Zuordnungen in Ihrer IMS-Umgebung angenommen:
  • IMS-Transaktionscode MYTRXCD1 wird dem PSB MYTRXCD1 zugeordnet.
  • IMS-Transaktionscode NEXTTRX wird dem PSB MYTRXCD2 zugeordnet.
//define PSB
Record addToQueue type PSBRecord { defaultPSBName="MYTRXCD1" }
   // three PCBs required for CBLTDLI on IMS
   iopcb IO_PCBRecord { @PCB { pcbType = TP } };
   elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
   elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
   // other database PCBs
   ...
end


Record myTransactionPart type serialRecord
   { fileName="MYMSGQUE" }
   ...
end

program addtrans type textUIProgram
   { alias = "MYTRXCD1",           // IMS requires pgm to match PSB name
      segmented = yes,
      @DLI { psb = "mypsb" }}

use MYFORMS;  // MYFORMS is a formGroup containing FORM1

// declare variables
myTransaction myTransactionPart;  // serial record for message queue
mypsb addToQueue;                 // psb

   function main()
      ...
      converse FORM1;  
      // do whatever processing is necessary
      move FORM1 to myTransaction byName;
      add myTransaction;
      ...
   end
end
Wenn Sie die Generierung durchführen, müssen Sie einen Ressourcenzuordnungsabschnitt angeben, durch den die serielle Datei einer Nachrichtenwarteschlange zugeordnet wird und durch den Name der Transaktion bereitgestellt wird, an die dieser zusammen mit dem Namen des zu verwendenden PBCs weitergeleitet werden soll. Berücksichtigen Sie das folgende Beispiel, das auch ein Zuordnungselement enthält, mit dem die Eingabe der Daten in der Nachrichtenwarteschlange durch ein Stapelverarbeitungsprogramm wie später beschrieben ermöglicht wird:
<ResourceAssociations name="IMS_RESOURCE_ASSOCIATION">
   <association fileName="MYMSGQUE">
      <imsvs>
         <smsgq systemName="NEXTTRX" pcbName="elaalt"/>
      </imsvs>
   </association>   
   <association fileName="MYINQUE">
      <imsvs>
         <smsgq systemName="NEXTTRX" pcbName="iopcb"/>
      </imsvs>
   </association>
</ResourceAssociations>

Da es sich bei 'addtrans' um ein textUI-Programm handelt, wird in EGL die Steuerlogik als Schnittstelle zur IMS-Umgebung generiert. Es wird erwartet, dass die Eingabenachrichtenwarteschlange von IMS-Programmen gelesen wird, bis diese leer ist. Daher wird in EGL eine Logik im Programm generiert, die bewirkt, dass das Programm in einer Schleife jeweils die nächste Eingabenachricht aus der Warteschlange liest, sobald das Programm auf den aktuellen Benutzer reagiert (mithilfe einer CONVERSE- oder SHOW-Anweisung) oder die Verantwortung zum Reagieren (mithilfe einer TRANSFER- oder TRANSACTION-Anweisung) weitergibt. Eine Übersicht finden Sie im Kapitel In IMS mit Terminals interagieren, weitere Informationen finden Sie in diesem Kapitel im Abschnitt 'Mehrere Benutzer und Nachrichtenwarteschlangen'.

Beispiel für IMS-Stapelverarbeitung

Sie können auch ein Programm erstellen, mit dem die Nachrichten verarbeitet werden, die vom Programm 'addtrans' in die Nachrichtenwarteschlange geschrieben werden. Bei dem Programm muss es sich um ein Basisprogramm handeln, mit dem Datensätze von einer seriellen Datei abgerufen werden und mit dem die serielle Datei dem Eingabe-/Ausgabe-PCB zugeordnet wird.

Im Programm kann derselbe serielle Datensatz verwendet werden, der auch von 'addtrans' verwendet wurde, jedoch nur mit einem neuen Dateinamen, da ein anderer PCB-Name erforderlich ist. Die wichtigsten Änderungen werden im untenstehenden Beispiel fett angezeigt:
//define PSB
Record getFromQueue type PSBRecord { defaultPSBName="MYTRXCD2" }
   // three PCBs required for CBLTDLI on IMS
   iopcb IO_PCBRecord { @PCB { pcbType = TP } }
   elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
   elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
   // other database PCBs
end

program gettrans type basicProgram
   { alias = "MYTRXCD2"
      @DLI { psb = "mypsb" }}

// declare variables
myTransaction myTransactionPart             // serial record for message queue
   {fileName="MYINQUE"};  
mypsb getFromQueue;               // psb

   function main()
      while (myTransaction not endOfFile)
         get next myTransaction;
      // do whatever processing is necessary
      end
   end
end

Wenn Sie das Programm für IMS/VS- oder IMS-BMP-Umgebungen generieren, müssen Sie auch einen Ressourcenzuordnungsabschnitt angeben, mit dem die serielle Datei einer Nachrichtenwarteschlange zugeordnet wird, sowie den Namen des zu verwendenden PCBs. In diesem Fall wird der Eingabe-/Ausgabe-PCB, wie im Abschnitt 'ResourceAssociations' im vorherigen Abschnitt gezeigt, für die Eingabe verwendet. Die Eigenschaft 'systemName' ist optional. Im Programm wird die Nachrichtenwarteschlange, die der Transaktion zugeordnet wurde, mit der das Programm gestartet wurde, basierend auf der IMS-Systemdefinition gelesen. In EGL wird anhand der IMS-Transaktions-ID in der Eingabenachricht der Wert für 'sysVar.transactionID' festgelegt.

Mehrere Benutzer und Nachrichtenwarteschlangen

Wenn Sie ein EGL-Programm schreiben, müssen Sie nur die Verarbeitung berücksichtigen, die für einen einzelnen Benutzer an einem einzelnen Terminal durchgeführt werden muss. In EGL im Programm wird eine Steuerlogik generiert, mit der die komplexe Situation bei IMS gehandhabt wird, bei der mehrere Benutzer in Bezug auf die Ressourcen in Konflikt miteinander stehen. Voraussetzung ist, dass USER1 und USER2 an ihren Terminals gleichzeitig MYTRXCD1 eingeben. Voraussetzung ist außerdem, dass der Transaktionscode von USER1 an der ersten Stelle in der MYTRXCD1 zugeordneten Nachrichtenwarteschlange ist.
  1. IMS wird der dem Transaktionscode MYTRXCD1 zugeordnete PSB geplant. Dieser PSB heißt zufällig ebenfalls MYTRXCD1, dies ist aber nicht zwingend erforderlich. Das dem PSB zugeordnete Programm muss jedoch denselben Namen wie der PSB in IMS besitzen. Daher wird mit IMS das Programm MYTRXCD1 geladen (in EGL als 'addtrans' bekannt).
  2. Durch die in EGL generierte Steuerlogik im Programm MYTRXCD1 wird ermittelt, dass dies das erste Mal ist, dass das Programm für USER1 aufgerufen wurde. Die Verarbeitung beginnt daher am Anfang.
  3. Wenn im Programm schließlich die CONVERSE-Anweisung erreicht wird, werden die folgenden Aktionen durchgeführt:
    • Die Daten für alle Datensätze und Formulare, die vom Programm verwendet werden, werden gespeichert.
    • Informationen dazu, wo im Programm die CONVERSE-Anweisung auftritt, werden gespeichert.
    • Der ISRT-Befehl wird im angegebenen Formular ausgeführt.
  4. Entsprechend der Logik, die in EGL hinzugefügt wurde, erfolgt im Programm eine Schleife zurück zum Anfang, an der USER2 in der Nachrichtenwarteschlange wartet. Im Programm werden dieselben Schritte für USER2 wie für USER1 befolgt: die CONVERSE-Anweisung wird erreicht, das Formular wird übergeben, eine Schleife wird ausgeführt, um die Nachrichtenwarteschlange erneut zu prüfen.
  5. In diesem Fall ist es wahrscheinlich, dass die Antwort von USER1 auf die CONVERSE-Anweisung im Programm gefunden wird. Mit der in EGL generierten Steuerlogik wird ermittelt, dass es sich bei dieser Antwort um eine Fortsetzung der Verarbeitung von USER1 handelt. Zudem werden folgende Aktionen durchgeführt:
    • Die Daten von USER1 werden wiederhergestellt (einschließlich der Position der CONVERSE-Anweisung).
    • Die Anzahl der Systemvariablen wird aktualisiert.
    • Die von FORM1 angeforderten Gültigkeitsprüfungen werden durchgeführt.
    • Wenn keine Eingabefehler auftreten, wird die Verarbeitung bei der Anweisung nach der CONVERSE-Anweisung fortgesetzt.
  6. Abschließend erreicht das Programm eine weitere CONVERSE-Anweisung. Daraufhin werden alle Daten gespeichert und eine Antwort an USER1 gespeichert. Im Programm wird dann eine Schleife ausgeführt, um die Nachrichtenwarteschlange erneut zu überprüfen.
  7. Angenommen, USER2 befindet sich nicht am Arbeitsplatz und in der Nachrichtenwarteschlange, die dem Transaktionscode MYTRXCD1 zugeordnet ist, sind keine Elemente mehr vorhanden. Das Programm MYTRXCD1 endet.
  8. Wenn USER1 später auf die neueste Konsolennachricht reagiert, wird von IMS erneut eine Nachricht in der Warteschlange vorhanden sein, die dem Transaktionscode MYTRXCD1 zugeordnet ist, und das Programm MYTRXCD1 wird erneut gestartet. Mit der in EGL generierten Steuerlogik wird ermittelt, dass diese Antwort die Fortsetzung der Verarbeitung von USER1 ist, alle Daten werden wiederhergestellt und die Verarbeitung wird fortgesetzt.

Feedback