Dieses Kapitel behandelt Themen, die für Entwickler relevant sind.
Dieses Dokument behandelt die Unterschiede, die bestehen, wenn ein Natural-Subprogramm
vom Natural Subprogram Server (Natsubsrv) statt von einer Terminalsitzung
ausgeführt wird.
Es handelt sich hierbei nicht um eine Einführung in die Natural-Programmierung – dazu siehe die Dokumentation des Basisprodukts Natural.
Die Unterschiede sind auf zwei Eigenschaften zurückzuführen:
Kein Terminal. Es handelt sich um eine Serversitzung; es gibt weder einen Bildschirm noch eine Tastatur.
Kein Zwischenzustand zwischen Aufrufen. Eine Sitzung bedient nacheinander die Anfragen vieler Endbenutzer und wird bei jeder Anfragegrenze zurückgesetzt.
Dieses Dokument behandelt die folgenden Themen:
Das Subprogramm wird über einen CALLNAT aufgerufen und über sein normales Ende oder
über ESCAPE
ROUTINE verlassen.
Der DEFINE DATA
PARAMETER-Block ist der einzige Datenkanal zum und aus dem
Subprogramm.
Jede Anfrage benennt ihre eigene Bibliothek und ihren eigenen Benutzer; beide
werden vom Server vor dem CALLNAT festlegt.
Die Sitzung wird an der Anfragegrenze zurückgesetzt, sodass jeder Aufruf aus einem definierten Zustand startet und keine Spur hinterlässt.
In einem Subprogramm können Sie den Namen des API-Parameters definieren, der auf einen Natural-Parameter gemappt werden soll.
Dies geschieht durch Hinzufügen des Präfixes oapi.n:, gefolgt
vom gewünschten Eigenschaftsnamen, im Kommentar des Feldes.
Beispiel in Natural:
#PARAM1 (A1) /* oapi.n:nameParm IN
Dadurch wird ein API-Parameter namens nameParm erstellt, der
auf den Natural-Parameter #PARAM1 gemappt wird.
| Statement | Grund |
|---|---|
TERMINATE |
Beendet die vom Server verwaltete Sitzung. Die Anfrage wird abgebrochen und die Ausgabeparameter werden nicht zurückgeschrieben. |
STOP |
Verlässt den CALLNAT, ohne die Ausgabeparameter
zurückzuschreiben. Verwenden Sie ESCAPE
ROUTINE.
|
FETCH |
Startet ein Programm innerhalb der Anfrage. Der Rest des Subprogramms wird nicht ausgeführt und die Ausgabeparameter werden nicht zurückgeschrieben. |
RUN |
Erfordert Quellcode und einen Compiler in einer Sitzung, die Anfragen bedient. |
LOGON |
Die Bibliotheksumgebung wird vom Server pro Anfrage eingerichtet. |
REINPUT |
Erfordert ein Terminal. |
Maps (INPUT
USING MAP, WRITE USING MAP), PROCESS
PAGE |
Erfordert ein Terminal. |
SET
KEY |
Erfordert ein Terminal. Die PF-Tasteneinstellungen werden pro Anfrage zurückgesetzt. |
SET
CONTROL |
Erfordert ein Terminal. |
OPEN
CONVERSATION, CLOSE
CONVERSATION |
Konversationaler RPC wird nicht unterstützt. |
DEFINE DATA CONTEXT |
Kontextvariablen sind die Daten einer Konversation, und es
gibt keine. Der Bereich gehört zu dem einzelnen CALLNAT, der ihn
erstellt, und wird mit diesem freigegeben, sodass er nichts von einem Aufruf
zum nächsten überträgt. Verwenden Sie den
PARAMETER-Block.
|
| Statement | Was ist möglich? |
|---|---|
STACK |
Daten können auf den Stack gelegt und innerhalb derselben Anfrage wieder ausgelesen werden. Kommandos werden nicht ausgeführt. |
INPUT |
Nur ohne Terminal-E/A, d. h. beim Lesen von Daten vom
Stack. Jedes INPUT-Statement, das einen Bildschirm anspricht,
schlägt fehl.
|
Ein gesperrtes Subprogramm blockiert die Sitzung, in der es ausgeführt wird, und damit jede Anfrage, die von diesem Subprogramm bedient worden wäre.
Warten Sie nicht auf benutzerseitige Interaktionen, externe Ereignisse oder an anderer Stelle vorhandene Sperren.
Halten Sie CALLs zu
3GL-Modulen kurz. Der Server kann einen laufenden 3GL-Aufruf nicht unterbrechen,
sodass die Sitzung so lange belegt bleibt, wie der Aufruf dauert.
Halten Sie Arbeitseinheiten kurz. Datenbanksperren werden bis zu einem END TRANSACTION oder
BACKOUT
TRANSACTION aufrechterhalten, sodass eine lange Arbeitseinheit
andere Anfragen von denselben Datensätzen fernhält.
Das Gleiche gilt für das Subprogramm als Ganzes: Während seiner Laufzeit steht die Sitzung für alle anderen nicht zur Verfügung.
Jeder Aufruf muss für sich allein stehen: Er darf keine Daten weitergeben und darf nicht auf Daten zurückgreifen, die von einem früheren Aufruf hinterlassen wurden.
Folgende Elemente werden an jeder Anfragegrenze in einen definierten Zustand zurückversetzt:
Globale Datenbereiche, einschließlich des globalen Datenbereichs mit Namen
COMMON.
Anwendungsunabhängige Variablen (DEFINE DATA
INDEPENDENT).
Session-Parameter, einschließlich derer, die mit SET GLOBALS und
*LANGUAGE geändert wurden.
Die Profilparameter zur Angabe von Maximalwerten MADIO, MAXCL,
MAXERR und LT.
Steplib-Ketten.
Retained Sets und Adabas-Kommandokennungen (CIDs/Command IDs).
PF-Tasteneinstellungen.
Ein globaler Datenbereich (GDA) ist zu Beginn jeder Anfrage leer, sofern das
Subprogramm ihn nicht selbst füllt, und ein durch RETAINED
in einer Anfrage zurückbehaltener Set existiert in der nächsten Anfrage nicht
mehr.
Auch mit Kontextvariablen (DEFINE DATA CONTEXT) lässt sich dies nicht umgehen. Ohne
eine Konversation stellen sie keinen Datenbereich dar, der sich über Aufrufe hinweg
erstreckt: Der Kontext existiert nur für den einen CALLNAT und ist nach dessen
Rückkehr nicht mehr vorhanden, sodass er weder einen Zustand weitergeben noch von der
nächsten Anfrage gelesen werden kann. Weitere Informationen finden Sie unter Nicht
zulässige Statements.
*ETID
und die darunter gespeicherten ET-Daten gehören zur Sitzung, nicht zum Endbenutzer.
Sie werden von allen Anfragen gemeinsam genutzt, die die Sitzung bedient, und dürfen
nicht zur Übertragung benutzerspezifischer Zustände verwendet werden.
Beenden Sie Ihnen gehörende Arbeitseinheiten, d.h. vervollständigen Sie jede einzelne
Arbeitseinheit mit END
TRANSACTION oder BACKOUT TRANSACTION, bevor Sie sie zurückgeben. Der
Server führt kein Festschreiben (Commit) durch.
Bei Erreichen der Anfragegrenze nimmt der Server normalerweise ein Rollback der
Transaktion vor (BACKOUT TRANSACTION) und schließt offene Arbeitsdateien.
Unter Linux können Sie beide Verhaltensweisen mit den Parametern
backoutTransactionPerRequest und closeWorkFilesPerRequest
deaktivieren; andernfalls werden beide Verhaltensweisen immer ausgeführt.
Anmerkungen:
CLOSE MODE=USER hält sie nicht über die
Anfragegrenze hinweg offen.
Fehler, die während der Verarbeitung einer Anfrage auftreten, werden vom Server abgefangen und dem Aufrufer mit Fehlernummer, Zeile, Status und Objektname gemeldet.
Es wird empfohlen, das Statement ON
ERROR zu verwenden, um Fehler als Daten zurückzugeben, auf die
der Aufrufer reagieren kann – einen Fehlercode und eine Meldung in den
Ausgabeparametern – und unbehandelte Fehler für wirklich unerwartete Bedingungen zu
reservieren. Führen Sie die Bereinigung auf dem Fehlerpfad genau wie auf dem
Erfolgspfad durch.
| Variable | Wert |
|---|---|
*SERVER-TYPE |
CALLNAT |
*USER |
Der Benutzer der aktuellen Anfrage in Großbuchstaben, bis zu 8 Zeichen. |
*NET-USER |
Der Benutzer der aktuellen Anfrage, wie bei
*USER. Unter z/OS enthält diese Variable stattdessen den
Benutzer der vom Server gestarteten Sitzung – denselben Wert wie
*INIT-USER — und identifiziert daher nicht den anfragenden
Benutzer.
|
*LIBRARY-ID |
Der Name der von der aktuellen Anfrage angegebene Bibliothek. |
*INIT-USER, *INIT-ID, *ETID |
Die vom Server gestartete Sitzung, nicht der anfragende
Benutzer. Unter z/OS enthält *INIT-ID eine Sitzungsnummer, die
der Server bei jeder neuen Sitzung erhöht.
|
*DEVICE |
Ein Batch-Gerät. |
[ ] Kein REINPUT, keine Masken (Maps), kein SET KEY, kein SET CONTROL; INPUT nur ohne
Terminal-Ein-/Ausgabe.
[ ] Kein OPEN
CONVERSATION, / CLOSE CONVERSATION, kein DEFINE DATA
CONTEXT.
[ ] Das Subprogramm las nur Werte, die es selbst gesetzt hatte; es las keine Werte aus einem globalen Datenbereich (GDA), aus unabhängigen Variablen oder aus einem früheren Aufruf beibehaltene Werte.
[ ] Jede Arbeitseinheit endete auf jedem Pfad mit END TRANSACTION oder
BACKOUT
TRANSACTION.
[ ] Jede geöffnete Arbeitsdatei wird auf jedem Pfad geschlossen.
[ ] Nichts blockiert – weder das Subprogramm noch ein von ihm aufgerufenes 3GL-Modul.
[ ] Der Endbenutzer wird über *USER, nicht über *NET-USER, *INIT-USER oder
*ETID
identifiziert.