Die EGL-textUI-Hauptprogramme, die für die IMS/VS-Zielumgebung generiert werden, werden als IMS-Nachrichtenverarbeitungsprogramme (MPPs) ausgeführt.
Wenn die Zieltransaktion ein Nicht-EGL-Programm ist, das Formulareingaben von der Nachrichtenwarteschlange zu Beginn der Verarbeitung benötigt, sollte das EGL-Programm eine verzögerte Programm-zu-Programm-Nachrichtenumschaltung verwenden (EGL-Anweisung "show"). Anderenfalls sollte das EGL-Programm eine direkte Programm-zu-Programm-Nachrichtenumschaltung verwenden (EGL-Anweisung "transfer to transaction").
In der folgenden Tabelle werden die Methoden dargestellt, die verwendet werden, um Daten zwischen interaktiven Programmen zu übergeben (Generierung mit der Erstellungsdeskriptoroption "spaSize > 0").
| Aktion | Direkte Nachrichtenumschaltung (optionales Eingabeformular) | Verzögerte Nachrichtenumschaltung (mit Eingabeformular) |
|---|---|---|
| Codierung und Generierung | Definieren Sie beide Programme als "segmented = YES". Generieren Sie beide Programme als interaktiv (spaSize > 0). | Definieren Sie beide Programme als "segmented = YES". Generieren Sie beide Programme als interaktiv (spaSize > 0). |
| Durchführung der Übertragung | Das übertragende Programm kann kein Formular senden. Wenn es sich um ein EGL-Programm handelt, wird die Anweisung "transfer to transaction" zum Senden eines Datensatzes verwendet. | Das übertragende Programm muss das Formular in eine Nachrichtenwarteschlange schreiben, die mit dem Terminal nach dem ersten Schreiben des Arbeitspufferbereichs verbunden ist. Wenn es sich um ein EGL-Programm handelt, wird dies mit "show", mit einem Formular und mit einem optionalen Datensatz durchgeführt. |
| Verwendung eines Eingabeformulars | Das Zielprogramm kann optional ein Eingabeformular haben. | Das Zielprogramm muss ein Eingabeformular haben. |
| Übergabe eines Datensatzes | Der Datensatz wird an den Arbeitspufferbereich (SPA) übergeben. | Der Datensatz, wenn vorhanden, wird an den Arbeitspufferbereich (SPA) übergeben. |
| Angabe des Segmentierungsstatusbytes | Wenn "spaStatusBytePosition" angegeben ist, wird das Segmentierungsstatusbyte immer an die letzte Position im Arbeitspufferbereich platziert. Das Zielprogramm ignoriert stets den Wert des Segmentierungsstatusbyte. | Wenn "spaStatusBytePosition=n" angegeben ist, wird das Segmentierungsstatusbyte entweder an die Position 15 oder an die letzte Position im Arbeitspufferbereich (auf der Basis des Wertes "n") platziert. Das Zielprogramm verwendet den Wert des Segmentierungsstatusbyte bei einem Integritätsproblem des Eingabeformulars, das vom Programmbenutzer durch Drücken von PA1 oder PA2 verursacht wird. |
| Hinweis: Das von "spaStatusBytePosition" angegebene Segmentierungsstatusbyte wird ausschließlich für Programm-zu-Programm-Übertragungen für interaktive Programme genutzt. Das Byte ist für Übertragungen zwischen interaktiven Programmen und anderen Programmen vorhanden. Jedoch sollte bei einem übertragenden Nicht-EGL-Programm das Byte immer als Leerzeichen festgelegt sein. Ein Nicht-EGL-Zielprogramm muss immer den Wert des Segmentierungsstatusbyte ignorieren. | ||
Mit diesem Verfahren können zwei segmentierte interaktive EGL-Programme sowohl den Transaktionsnamen als auch den PSB-Namen ändern, ohne dass dem Programmbenutzer ein Formular angezeigt wird. Es können verschiedene Formulargruppen (formGroups) von den zwei Programmen verwendet werden. Im folgenden Beispiel wird eine Skeleton-Definition der zwei Programme dargestellt.
program ProgramA type textUIProgram
{segmented=yes, inputRecord="basicRecord1",
@DLI { psb="psb" } }
// Declarations
basicRecord1 TRANSFER_RECORD;
psb PSB1A;
// FormGroup
use FORMGX;
function main()
...
sysVar.transferName = 'trx1b';
transfer to transaction sysVar.transferName passing basicRecord1;
...
end // end main
end // end ProgramA
program ProgramB type textUIProgram // inputForm is optional
{segmented=yes, inputRecord="basicRecord1", inputForm="form2",
@DLI { psb="psb" } }
// Declarations
basicRecord1 TRANSFER_RECORD;
psb PSB1B;
// FormGroup
use FORMGY;
function main()
// generated EGL logic does the following:
// initializes basicRecord1
// if inputForm is specified:
// converses form2
// performs edits for form2
// converses form2 until form2 passes all edits
// gives control to the first statement in the main function
...
end // end main
end // end ProgramB
Die EGL-generierte Programmsteuerungslogik bearbeitet automatisch den Arbeitspufferbereich und den Datensatz (basicRecord1), der von Programm A an Programm B übergeben wird. Der Datenbereich der Arbeitspufferbereiche für die Programme A und B müssen groß genug für die meisten betroffenen Datensätze sein.
Das Nicht-EGL-Programm muss ein interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm B wie in "Direkte Umschaltung zwischen zwei EGL-Programmen" definiert sein. Die Erstellungsdeskriptoroption "spaSize" muss den Arbeitspufferbereich angeben, der vom Nicht-EGL-Programm verwendet wird.
Wenn Sie "spaSize=n" und "spaStatusBytePosition=p" als Erstellungsdeskriptoroptionen festgelegt haben, befindet sich das Segmentierungsstatusbyte an letzter Position des Arbeitspufferbereichs, und zwar unabhängig vom Wert von "spaStatusBytePosition". Das Nicht-EGL-Programm sollte das Segmentierungsstatusbyte als Leerzeichen festlegen, bevor der Arbeitspufferbereich eingegeben wird.
Das Nicht-EGL-Programm muss ein interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm A wie in "Direkte Umschaltung zwischen zwei EGL-Programmen" definiert sein. Die Erstellungsdeskriptoroption "spaSize" muss den Arbeitspufferbereich angeben, der vom Nicht-EGL-Programm verwendet wird.
Das Nicht-EGL-Programm muss eine eindeutige GET-Anforderung an den Eingabe-/Ausgabe-PCB ausgeben, damit der Arbeitspufferbereich gelesen werden kann. Sie finden das erforderliche Layout eines Arbeitspufferbereichs unter "Format des IMS-Arbeitspufferbereichs für die Nachrichtenumschaltung". Der Arbeitspufferbereich wird von der EGL-Programmsteuerungslogik erstellt. Der Datenbereich des Arbeitspufferbereichs enthält den Datensatz, den das EGL-Programm an die Anweisung "transfer to transaction" übergeben hat.
Wenn Sie "spaSize=n" und "spaStatusBytePosition=p" als Erstellungsdeskriptoroptionen festgelegt haben, befindet sich das Segmentierungsstatusbyte an letzter Position des Arbeitspufferbereichs, und zwar unabhängig vom Wert von "spaStatusBytePosition". Das Nicht-EGL-Programm sollte das letzte Byte des Arbeitspufferbereichs ignorieren.
Mit diesem Verfahren können zwei segmentierte interaktive EGL-Programme sowohl den Transaktionsnamen als auch den PSB-Namen ändern, wenn dem Programmbenutzer ein Formular angezeigt wird. Sie müssen für beide Programme dieselbe "formGroup" verwenden. Es muss kein Datensatz übertragen werden, aber es ist ein Formular erforderlich. Im folgenden Beispiel wird eine Skeleton-Definition der zwei Programme dargestellt.
program ProgramA type textUIProgram
{segmented=yes, inputRecord="basicRecord2",
@DLI { psb="psb" } }
// Declarations
basicRecord2 TRANSFER_RECORD;
psb PSB2A;
// FormGroup
use FORMG2;
function main()
...
sysVar.transferName = 'trx2b';
show form2 returning to sysVar.transferName passing basicRecord2;
...
end // end main
end // end ProgramA
program ProgramB type textUIProgram // inputForm is required
{segmented=yes, inputRecord="basicRecord2", inputForm="map2",
@DLI { psb="psb" } }
// Declarations
basicRecord2 TRANSFER_RECORD;
psb PSB2B;
// FormGroup
use FORMG2;
function main()
// generated EGL logic does the following:
// initializes basicRecord2
// performs edits for map2
// converses map2 until map2 passes all edits
// gives control to the first statement in the main function
...
end // end main
end // end ProgramB
Das Nicht-EGL-Programm muss ein interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm B wie in "Verzögerte Umschaltung zwischen zwei EGL-Programmen" definiert sein. Die Erstellungsdeskriptoroption "spaSize" muss den Arbeitspufferbereich angeben, der vom Nicht-EGL-Programm verwendet wird.
Wenn Sie "spaSize=n" und "spaStatusBytePosition=p" als Erstellungsdeskriptoroptionen festgelegt haben, müssen Sie das Segmentierungsstatusbyte am Offset im Arbeitspufferbereich (angegeben von "spaStatusBytePosition=p") initialisieren. Legen Sie das Segmentierungsstatusbyte als Leerzeichen fest.
Das Nicht-EGL-Programm muss ein interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm A wie in "Verzögerte Umschaltung zwischen zwei EGL-Programmen" definiert sein. Das EGL-Programm muss für alle variablen Datenfelder im Formular, die als Eingabe im Nicht-EGL-Programm erforderlich sind, die Eigenschaft "modified" auf YES festlegen. Die Erstellungsdeskriptoroption "spaSize" muss den Arbeitspufferbereich angeben, der vom Nicht-EGL-Programm verwendet wird.
Wenn Sie "spaSize=n" und "spaStatusBytePosition=p" als Erstellungsdeskriptoroptionen festgelegt haben, befindet sich das Segmentierungsstatusbyte entweder an Position 15 oder an letzter Position des Arbeitspufferbereichs. Das Nicht-EGL-Programm sollte den Wert des Segmentierungsstatusbyte ignorieren.
In der folgenden Tabelle werden die Methoden dargestellt, die verwendet werden, um Daten zwischen nicht interaktiven Programmen zu übergeben. Ein nicht interaktives Programm ist ein textUI-Hauptprogramm, das mit der auf "0" festgelegten Erstellungsdeskriptoroption "spaSize" (Standardeinstellung) generiert wurde.
| Aktion | Direkte Nachrichtenumschaltung (optionales Eingabeformular) | Verzögerte Nachrichtenumschaltung (mit Eingabeformular) |
|---|---|---|
| Codierung und Generierung | Definieren Sie beide Programme als "segmented = YES". Generieren Sie beide Programme als nicht interaktiv (spaSize = 0). | Definieren Sie beide Programme als "segmented = YES". Generieren Sie beide Programme als nicht interaktiv (spaSize = 0). |
| Durchführung der Übertragung | Das übertragende Programm kann kein Formular senden. Wenn es sich um ein EGL-Programm handelt, wird die Anweisung "transfer to transaction" mit einem Datensatz verwendet. | Das übertragende Programm muss das Formular in eine Nachrichtenwarteschlange schreiben, die dem Terminal zugeordnet ist. Wenn es sich um ein EGL-Programm handelt, wird die Anweisung "show" mit einem Formular und mit einem optionalen Datensatz verwendet. |
| Verwendung eines Eingabeformulars | Das Zielprogramm kann optional ein Eingabeformular haben. | Das Zielprogramm muss ein Eingabeformular haben. |
| Übergabe eines Datensatzes | Der Datensatz wird zur Nachricht übertragen. | Der Datensatz, wenn vorhanden, wird zur Arbeitsdatenbank übertragen. |
Dieses Verfahren ist bei der Entwicklung von EGL-Programmen mit dem Übertragen mit segmentierten interaktiven EGL-Programmen identisch. Die einzige Ausnahme ist, dass die Erstellungsdeskriptoroption "spaSize" auf "0" (nicht interaktiv) festgelegt ist. Mit diesem Verfahren können zwei nicht interaktive EGL-Programme sowohl den Transaktionsnamen als auch den PSB-Namen ändern, ohne dass dem Programmbenutzer ein Formular angezeigt wird. Es können verschiedene Formulargruppen (formGroups) von den zwei Programmen verwendet werden.
program ProgramA type textUIProgram
{segmented=yes, inputRecord="basicRecord1",
@DLI { psb="psb" } }
// Declarations
basicRecord1 TRANSFER_RECORD;
psb PSB1A;
// FormGroup
use FORMGX;
function main()
...
sysVar.transferName = 'trx1b';
transfer to transaction sysVar.transferName passing basicRecord1;
...
end // end main
end // end ProgramA
program ProgramB type textUIProgram
// omit inputForm for better performance
{segmented=yes, inputRecord="basicRecord1", inputForm="form2",
@DLI { psb="psb" } }
// Declarations
basicRecord1 TRANSFER_RECORD;
psb PSB1B;
// FormGroup
use FORMGY;
function main()
// generated EGL logic does the following:
// initializes basicRecord1
// if inputForm is specified:
// converses form2
// performs edits for form2
// converses form2 until form2 passes all edits
// gives control to the first statement in the main function
...
end // end main
end // end ProgramB
Die EGL-generierte Programmsteuerungslogik bearbeitet automatisch die IMS-Nachricht, die zur Übertragung der Steuerung verwendet wird, sowie den Datensatz, der von Program A an Programm B übergeben wird.
Das Nicht-EGL-Programm muss ein nicht interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm B wie in "Nicht interaktive direkte Umschaltung zwischen zwei EGL-Programmen" definiert sein.
Das Nicht-EGL-Programm muss eine Nachricht an den alternativen PCB einfügen. Die Zielposition muss auf den Transaktionsnamen für das EGL-Programm festgelegt werden. Das Nicht-EGL-Programm muss die Headerinformationen (Länge, ZZ und Transaktionsname) in der Nachricht angeben. Sie finden das erforderliche Layout einer Nachricht unter "Format der EGL-Eingabenachricht für die nicht interaktive IMS-Nachrichtenumschaltung". Mit der EGL-generierten Programmsteuerungslogik werden die Headerinformationen automatisch entfernt, sodass das EGL-Programm nur die Daten empfängt.
Das Nicht-EGL-Programm muss ein nicht interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm A wie in "Nicht interaktive direkte Umschaltung zwischen zwei EGL-Programmen" definiert sein.
Das Nicht-EGL-Programm muss eine GET-Anweisung an den Eingabe-/Ausgabe-PCB ausgeben, um den Datensatz abzurufen, den das EGL-Programm an die Anweisung "transfer to transaction" übergeben hat. Sie finden das erforderliche Layout einer Nachricht unter "Format der EGL-Eingabenachricht für die nicht interaktive IMS-Nachrichtenumschaltung". Mit der EGL-generierten Programmsteuerungslogik werden die Headerinformationen (Länge, ZZ, Transaktionsname) automatisch angegeben, sodass das EGL-Programm nur die Daten definiert. Das Nicht-EGL-Programm muss jedoch für den Empfang der Headerinformationen vorbereitet sein.
Dieses Verfahren ist aus der Sicht eines EGL-Entwicklers mit dem Übertragen mit segmentierten interaktiven EGL-Programmen identisch. Die einzige Ausnahme ist, dass die Erstellungsdeskriptoroption "spaSize" auf "0" festgelegt ist (die "nicht interaktiv" angibt). Mit diesem Verfahren können zwei nicht interaktive EGL-Programme sowohl den Transaktionsnamen als auch den PSB-Namen ändern, wenn dem Programmbenutzer ein Formular angezeigt wird. Sie müssen für beide Programme dieselbe "formGroup" verwenden. Es muss kein Datensatz übertragen werden, aber es ist ein Formular erforderlich.
program ProgramA type textUIProgram
{segmented=yes, inputRecord="basicRecord2",
@DLI { psb="psb" } }
// Declarations
basicRecord2 TRANSFER_RECORD;
psb PSB2A;
// FormGroup
use FORMG2;
function main()
...
sysVar.transferName = 'trx2b';
show form2 returning to sysVar.transferName passing basicRecord2;
...
end // end main
end // end ProgramA
program ProgramB type textUIProgram // inputForm is required
{segmented=yes, inputRecord="basicRecord2", inputForm="map2",
@DLI { psb="psb" } }
// Declarations
basicRecord2 TRANSFER_RECORD;
psb PSB2B;
// FormGroup
use FORMG2;
function main()
// generated EGL logic does the following:
// initializes basicRecord2
// performs edits for map2
// converses map2 until map2 passes all edits
// gives control to the first statement in the main function
...
end // end main
end // end ProgramB
Das Nicht-EGL-Programm muss ein nicht interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm B wie in "Nicht interaktive verzögerte Umschaltung zwischen zwei EGL-Programmen" definiert sein.
Das Nicht-EGL-Programm muss ein nicht interaktives IMS-Programm sein. Das EGL-Programm muss auf ähnliche Weise wie Programm A wie in "Nicht interaktive verzögerte Umschaltung zwischen zwei EGL-Programmen" definiert sein. Das EGL-Programm muss für alle variablen Datenfelder im Formular, die als Eingabe im Nicht-EGL-Programm erforderlich sind, die Eigenschaft "modified" auf YES festlegen.
EGL-Programme können mit Nicht-EGL-Programmen kommunizieren, indem die Anweisungen "add" oder "get next" in Datensätzen in seriellen Dateien, die zur IMS-Nachrichtenwarteschlange gehören, verwendet werden.
Ein EGL-Basisprogramm, das entweder als Nachrichtenverarbeitungsprogramm (MPP) oder als transaktionsabhängiges Batch-Nachrichtenverarbeitungsprogramm (BMP) ausgeführt wird, kann die Datei verwenden, um die Nachrichten mit den Anweisungen "get next" zu lesen. Das EGL-Programm entfernt die Headerinformationen aus der Nachricht und platziert die Daten in den seriellen Datensatz.
Ein Nicht-EGL-Programm kann eine Reihe von Datensätzen in die IMS-Nachrichtenwarteschlange schreiben, um sie später durch ein EGL-Basisprogramm verarbeiten zu lassen, das entweder als MPP oder als transaktionsabhängige BMP ausgeführt wird. Das Nicht-EGL-Programm muss einen Datensatz in dem Format, das in der folgenden Tabelle angezeigt wird, in einen alternativen Eingabe-/Ausgabe-PCB eingeben, der zu der Transaktion gehört, die den Datensatz verarbeitet.
| Feld | Länge in Byte | Datentyp | Beschreibung |
|---|---|---|---|
| Segmentlänge | 2 | Binär | Die Länge des Segments. |
| Reserviert (ZZ) | 2 | Binär | Reserviert. |
| IMS-Transaktionsname | 8 | Zeichen | Der IMS-Transaktionsname für das EGL-Programm. |
| Programmdefinierte Felder | Variable | Variable | In diesem Bereich sind die Datenelemente enthalten, die im seriellen EGL-Datensatz definiert sind. |
Ein EGL-Basisprogramm verwendet "get next", um eine serielle Datei zu lesen, die zum Eingabe-/Ausgabe-PCB gehört, und verarbeitet dann die Nachricht. Das EGL-Programm entfernt automatisch den IMS-Nachrichtenheader (Segmentlänge, ZZ und Transaktionsname), sodass das Programm nur die Nachrichtendaten im seriellen Datensatz empfängt.
Wenn ein EGL-Programm die eine "add"-Anweisung für eine serielle Datei durchführt, die einer Nachrichtenwarteschlange zugeordnet ist, fügt das EGL-Programm automatisch den IMS-Nachrichtenheader vor den Datensatzdaten hinzu und fügt dann die Nachricht in den alternativen PCB ein. Für das EGL-Programm sind nur die tatsächlichen Daten in der Nachricht relevant.
Ein Nicht-EGL-Programm, das entweder als MPP oder als transaktionsabhängige BMP ausgeführt wird, kann die Nachrichtenwarteschlange verarbeiten. Das Format der Nachricht, die in die Nachrichtenwarteschlange eingefügt und vom Nicht-EGL-Programm empfangen wird, wird in der Tabelle im vorherigen Abschnitt "Von Nicht-EGL-Programmen zu EGL-Programmen" dargestellt.