Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

FPAMACC - FASTPAM-Dateizugriffe formulieren

Makrotyp: S-Typ (E-Form/L-Form/D-Form/C-Form/M-Form) (siehe "Typen von Makroaufrufen")

Der FPAMACC Makro realisiert die Funktion ACCESS FILE. Es können auf die über die OPENID referenzierte Datei Zugriffe formuliert werden.

Format

Operation

Operanden

FPAMACC

[,OPENID = zahl / adr(r)]

[,LEN = länge / adr / (r)]

[,BLOCK = zahl / adr / (r)]

[,IOAREA = adr / (r)]

[,OPCODE = *READ / *WRITE / *READ_WAIT / *WRITE_WAIT /

           *READ_EQUALIZE / *WAIT / adr / (r)]

[,WAITLST = adr / (r)]

[,CHAIN = adr / (r)]

[,POSTCD = zahl / adr / (r)]

MF = L

MF = E,PARAM = adr / (r)

MF = D[,PREFIX = F / pre]

MF = C / M

[,PREFIX = F / pre]

[,MACID = ACC / macid]

Operandenbeschreibung

BLOCK

Bestimmt die Nummer des ersten zu übertragenden logischen FASTPAM-Blockes innerhalb der Datei.
Die Blockgröße wurde beim Makro FPAMSRV, Funktion OPEN, Operand BLKSIZE bestimmt. Es sind nur ganzzahlige Werte zugelassen.

Bei der Form MF=L ist nur die direkte Angabe erlaubt.

= zahl
Ist die direkte Angabe eines dezimalen numerischen Wertes für die Nummer des ersten zu übertragenden logischen Blockes. Der Wert wird begrenzt durch die maximale Größe einer Datei in 4-KB-Seiten minus 1:

1 <= zahl <= 8388606 bei LARGE_FILE=*FORBIDDEN (siehe Makro FPAMSRV)

1 <= zahl <= 1073741823 bei LARGE_FILE=*ALLOWED (siehe Makro FPAMSRV)

= adr
Ist die symbolische Adresse eines 4 Byte langen Feldes, das den numerischen Wert enthält (binär).

= (r)
Ist ein Register, das den numerischen Wert enthält.

CHAIN

Spezifiziert die Anfangsadresse einer anderen FPAMACC-Parameterliste, deren Auftrag an den der aktuellen Parameterliste gekettet werden soll. Auf diese Weise können bis zu 5000 Parameterlisten miteinander verbunden werden. Alle auf diese Weise miteinander verketteten Aufträge werden innerhalb eines SVC angenommen bzw. ausgeführt.
Die Aufträge werden in der Reihenfolge ihrer Verkettung ausgeführt. Wird in einem der Aufträge ein Parameterfehler entdeckt, werden auch alle anderen mit Returncode „CHAIN ERROR“ abgewiesen. Bei jedem anderen Fehler wird ab dem Zeitpunkt, da er erkannt wird, kein weiterer Auftrag mehr bearbeitet außer beim Returncode FACCPNAC. Alle nachfolgenden Aufträge werden ebenfalls abgewiesen. Bei asynchronen Ein-Ausgaben mit dazu geketteten Wait-Parameterlisten muss deshalb der Anwender bei einem Fehler abgewiesene Wait-Operationen wiederholen.
Tritt ein Fehler erst auf, nachdem alle Aufträge erfolgreich angestartet worden sind (z.B. ein Ein-Ausgabefehler in einer Kette asynchroner Read/Write-Operationen mit Eventing), werden alle anderen Aufträge unabhängig von dem fehlerhaften behandelt. Jede Parameterliste muss also für sich ausgewertet werden.
Vergleiche dazu auch den Abschnitt „Fehlerbehandlung bei Parameterlistenkettung".

Bei der Form MF=L ist nur die symbolische Adresse erlaubt, wobei symbolische Namen innerhalb einer DSECT ausgeschlossen sind, da ihre Adresse erst zur Laufzeit bekannt ist.

Hinweis

Bei Eventing wird für jeden einzelnen Auftrag ein Signal gesendet.

= adr
Ist die symbolische Adresse (Name) der nächsten zu bearbeitenden Parameterliste.

= (r)
Ist ein Register, das die Anfangsadresse der nächsten zu bearbeitenden Parameterliste enthält.

IOAREA

Spezifiziert die auf 4 KByte ausgerichtete Anfangsadresse des Ein-/Ausgabepuffers, der innerhalb des beim OPEN angegebenen IO-Area-Pools liegen muss.
Bei Datenräumen wird automatisch der beim ENABLE IOAREA POOL angegebene ALET benutzt.

Bei der Form MF=L ist nur die symbolische Adresse erlaubt, wobei symbolische Namen innerhalb einer DSECT ausgeschlossen sind, da ihre Adresse erst zur Laufzeit bekannt ist.

= adr
Ist die symbolische Adresse (Name) des Bereichs.

= (r)
Ist ein Register, das die Anfangsadresse des Ein-/Ausgabepuffers enthält.

LEN

Bestimmt die zu übertragende Datenlänge in logischen Blöcken. Die Blockgröße wird im Makro FPAMSRV, Funktion OPEN, Operand BLKSIZE festgelegt. Es sind nur ganzzahlige Werte zwischen 1 und 8 zugelassen, die den beim ENABLE ENVIRONMENT angegebenen MAXIOLN-Wert nicht überschreiten.

Bei der Form MF=L ist nur die direkte Angabe erlaubt.

= länge
Direkte Angabe eines dezimalen numerischen Wertes.

= adr
Ist die symbolische Adresse eines 1 Byte langen Feldes, das den numerischen Wert enthält (binär).

= (r)
Ist ein Register, das den numerischen Wert enthält.

MACID

Legt jeweils das zweite bis einschließlich vierte Zeichen der Feldnamen und Equates fest, die bei der Makroauflösung generiert werden.

= ACC
Voreinstellung:     MACID=ACC

= macid
„macid“ ist eine drei Zeichen lange Zeichenfolge, die jeweils das zweite bis vierte Zeichen der generierten Feldnamen und Equates festlegt.

MF

Die Formen des MF-Operanden sind detailliert im Anhang, "Typen von Makroaufrufen" beschrieben.

OPCODE

Kennzeichnet die Art des Auftrags.

Bei der Form MF=L ist nur die direkte Angabe erlaubt.

= *READ
Asynchrones Lesen von logischen Blöcken. Im Subcode2 wird hinterlegt, ob der Auftrag synchron oder asynchron erledigt wurde. Wurde beim OPEN, Operand EVENTNG=*NO angegeben und ist der Auftrag nicht synchron beendet worden, muss er mit OPCODE=*WAIT abgeschlossen werden, sonst werden alle folgenden Aufträge mit dieser FPAMACC-Parameterliste abgewiesen.

= *WRITE
Asynchrones Schreiben von logischen Blöcken. Im Subcode2 wird hinterlegt, ob der Auftrag synchron oder asynchron erledigt wurde. Wurde beim OPEN EVENTNG=*NO angegeben und ist der Auftrag nicht synchron beendet worden, muss er mit OPCODE=*WAIT abgeschlossen werden, sonst werden alle folgenden Aufträge mit dieser FPAMACC-Parameterliste abgewiesen.

= *READ_WAIT
Synchrones Lesen von logischen Blöcken.

= *WRITE_WAIT
Synchrones Schreiben von logischen Blöcken.

= *READ_EQUALIZE
Synchrones Lesen von logischen Blöcken mit gleichzeitiger Egalisierung der DRV-Platten im angegebenen Bereich innerhalb der Datei. Im nicht-DRV-Betrieb wirkt *READ_EQUALIZE wie *READ_WAIT (zu DRV siehe auch Handbuch „DRV“ [15]).

= *WAIT
Warten auf das Ende eines asynchronen Auftrags (*READ oder *WRITE). Diese Operation darf nur von der Task ausgeführt werden, die den Auftrag gestartet hat.
Mit dem Operanden WAITLST wird die Adresse der FPAMACC-Parameterliste angegeben, auf deren Ein-/Ausgabe gewartet werden soll. Dies kann auch dieselbe Parameterliste sein, muss aber im selben Environment liegen und dieselbe OPENID enthalten wie die WAIT-Parameterliste.

Die Angabe *WAIT ist in folgenden Fällen unzulässig:

      • Nach den synchronen Operationen *READ_WAIT, *WRITE_WAIT und *READ_EQUALIZE.

      • Wenn schon ein *WAIT erfolgt ist.

      • Wenn der asynchrone Auftrag synchron beendet wurde (Subcode2=FACCSYTE nach *READ/*WRITE).

      • Wenn beim OPEN EVENTNG=*YES angegeben wurde.

= adr
Ist die symbolische Adresse eines 1 Byte langen Feldes, das den Wert für OPCODE enthält.

= (r)
Ist ein Register, das den Wert für OPCODE enthält.

OPENID

Bezeichnet die Kurzkennung des OPEN, für den die FPAMACC Operation ausgeführt werden soll.
Sie muss nach erfolgreicher OPEN Verarbeitung aus der FPAMSRV- in die FPAMACC-Parameterliste übertragen werden.

Bei der Form MF=L ist nur die direkte Angabe erlaubt.

= zahl
Ist direkte Angabe eines dezimalen numerischen Wertes für die Kurzkennung des OPEN.

= adr
Ist die Adresse eines 4 Byte langen Feldes, das die Kurzkennung enthält.

= (r)
Ist ein Register, das die Kurzkennung enthält.

PARAM

Bezeichnet die Adresse der Operandenliste. Der Operand wird nur in Verbindung mit MF=E ausgewertet (siehe auch "Typen von Makroaufrufen").

POSTCD

Enthält die Daten, die beim Börsensignal mitgegeben werden. Dieser Parameter wird nur bei EVENTNG=*YES ausgewertet.

Bei der Form MF=L ist nur die direkte Angabe erlaubt.

= adr
Ist die Adresse eines 2 Byte langen Feldes, das den POSTCD enthält.

= (r)
Ist ein Register, das den POSTCD enthält (unterste 2 Byte).

PREFIX

Legt das jeweils erste Zeichen der Feldnamen und Equates fest, die bei der Makroauflösung generiert werden.

= F
Voreinstellung:         PREFIX=F

= pre
„pre“ ist ein ein Zeichen langes Präfix, mit dem die generierten Feldnamen und Equates beginnen sollen.

WAITLST

Spezifiziert die Anfangsadresse der FPAMACC-Parameterliste, auf deren Ein-Ausgabe mit der Operation WAIT gewartet werden soll. Dies kann auch dieselbe Parameterliste sein, muss aber im selben Environment liegen und dieselbe OPENID enthalten.

Ein Fehler wird in der Parameterliste gemeldet, mit der die fehlerhafte Operation angestartet wurde. Bei einem Ein-/Ausgabefehler z.B. erhält die Wait-Parameterliste den Returncode „SUCCESSFUL_PROCESSING“ und die Read/Write-Parameterliste „IO_ERROR“.
WAITLST wird nur zusammen mit OPCODE=*WAIT interpretiert.

Bei der Form MF=L ist nur die symbolische Adresse erlaubt, wobei symbolische Namen innerhalb einer DSECT ausgeschlossen sind, da ihre Adresse erst zur Laufzeit bekannt ist.

= adr
Ist die symbolische Adresse (Name) des Bereichs.

= (r)
Ist ein Register, das die Anfangsadresse der FPAMACC-Parameterliste enthält.

Hinweise zur Programmierung

DRV-Status

Der DRV-Status wird bei Änderungen in dem Feld FACCDS zur Verfügung gestellt. Er steht nach der ersten Ein-/Ausgabe zur Verfügung.

Auftragsendemeldung bei EVENTING

FASTPAM meldet im Zusammenhang mit dem Eventing Mechanismus (OPEN, Operand EVENTNG=*YES) das Auftragsende über das Feld FACCREQ der FPAMACC-Parameterliste. Es gibt zwei Fälle:

  • FACCREQ = X'00' = FACCTERM bedeutet „Auftrag beendet“.

  • FACCREQ = X'FF' = FACCACTV bedeutet „Auftrag noch nicht beendet“.

Das Feld FACCREQ wird bei Auftragsannahme mit dem Wert FACCACTV (Auftrag aktiv) und bei Ein-/Ausgabeende asynchron von einem Systemprozess mit dem Wert FACCTERM (Auftrag beendet) versorgt. Deshalb darf das Feld FACCREQ nicht mit einem schreibenden Assemblerbefehl abgefragt werden.
Zum Verlust der Endemeldung kann z.B. eine Abfrage mit folgendem Assemblerbefehl

führen:

OC FACCREQ,FACCREQ

Problemlos ist :

CLI FACCREQ,0


Wichtig

Zwischen Auftragserteilung und Auftragsendemeldung darf auf das Feld FACCREQ nicht mit einem schreibenden Maschinenbefehl zugegriffen werden.
Alle Returninformationen (Returncode, DRV-Status) dürfen erst ausgewertet werden, nachdem die Auftragsendemeldung für sich abgefragt worden ist. Falsch wäre es z.B., den Inhalt der FPAMACC Parameterliste an eine andere Speicherstelle zu übertragen und auf dieser Kopie die entsprechenden Aktionen durchzuführen.

Der Auftrag kann sowohl synchron als auch asynchron beendet worden sein, wenn das Anwenderprogramm die Kontrolle wieder erhält. Ob das System nun ein Signal an die Börse gesendet hat, erfährt der Anwender aus dem Subcode2, der allerdings erst abgefragt werden darf, wenn der Auftrag als beendet gemeldet worden ist.

Synchrone Aufträge sind immer beendet, wenn das Anwenderprogramm die Kontrolle wieder erhält. Das Feld FACCREQ wird trotzdem sinngemäß versorgt.

Beispiel: Auftragsendebehandlung bei Eventing

*---------------------------------------------------------------------*
* Die Ereigniskennung, das FASTPAM-Environment und der IO-Area-Pool   *
* sollen an dieser Stelle schon eingerichtet und die Datei            *
* mit EVENT=*YES geöffnet sein.                                       *
*---------------------------------------------------------------------*
       FPAMACC MF=M,OPCODE=*READ,....
       FPAMACC MF=E,...
       CLI   FACCREQ,FACCTERM        Auftrag schon beendet?
       BE    TERM
*---------------------------------------------------------------------*
* Auftrag noch nicht beendet                                          *
* tue etwas anderes                                                   *
*---------------------------------------------------------------------*
:
          :
*---------------------------------------------------------------------*
* warte mit SOLSIG (Auftrag nicht synchron beendet!)                  *
*---------------------------------------------------------------------*
B     SOLS
TERM     CLI   FACCSR2,FACCSYTE
*---------------------------------------------------------------------*
* Auftrag synchron beendet                                            *
* kein SOSLIG!!                                                       *
*---------------------------------------------------------------------*
BE    WEITER
SOLS     SOLSIG ...
WEITER   EQU   *
          :
          :

Fehlerbehandlung bei Parameterlistenkettung

Stellt FASTPAM bei der Bearbeitung einer Auftragskette einen Fehler fest (sei es bei der Parameterüberprüfung oder bei der folgenden Auftragsabarbeitung), so weist FASTPAM alle folgenden Aufträge in der Kette mit dem Returncode „CHAIN_ERROR“ zurück.
Der Returncode „FACCPNAC“ (WAIT auf nicht-aktiven Ein-/Ausgabepfad) gilt dabei jedoch nicht als Fehler, da er bei synchron terminierter Ein-/Ausgabe (Caching) im normalen, korrekten Programmlauf vorkommt. Die Kette wird daher bei „FACCPNAC“ nicht abgebrochen. Daher vereinfacht sich die Fehlerabfrage.

  • Bei Ketten synchroner Aufträge genügt es, den Returncode des letzten Kettenmitglieds abzufragen, um sicherzustellen, dass alle Aufträge erfolgreich ausgeführt wurden.

  • Bei Ketten asynchroner Ein-/Ausgaben mit darangeketteten WAIT-Aufträgen genügt es, den Returncode des letzten WAIT-Auftrags sowie den Returncode der zugehörigen Ein-/Ausgabe abzufragen. Sind beide „SUCCESSFUL“, so ist sichergestellt, dass die vorangehenden bereits abgeschlossenen Aufträge ebenfalls erfolgreich ausgeführt wurden.

  • Bei Ketten asynchroner Ein-/Ausgaben mit Eventing müssen allerdings alle Returncodes gesondert abgefragt werden, da die Auftragsbeendigungen unabhängig voneinander erfolgen.

Returncodes

Returncodes sind erst dann gültig, wenn der jeweilige Auftrag beendet ist. Returncodes werden im Header der Parameterliste (Standardheader) hinterlegt (vgl. Abschnitt „Layout der Parameterliste"):

  • Der Main Returncode in einem Halbwort mit dem Namen FACCMRET.

  • Der Subcode1 in einem Byte mit dem Namen FACCSR1.
    Subcode1 beschreibt Fehlerklassen, die es dem Aufrufer ermöglichen, auf Fehlerklassen zu reagieren. Der Aufrufer kann sich sowohl am Maincode als auch am Subcode1 orientieren. (Es wird empfohlen, sich am Subcode1 zu orientieren, da man damit versionsunabhängig bleibt.)

  • Der Subcode2 in einem Byte mit dem Namen FACCSR2.
    Der Subcode2 spezifiziert einzelne Maincodes genauer. Der Subcode2 hat beim Makro FPAMACC nur bei asynchronen Aufträgen eine Bedeutung und gibt für jeden Returncode an, ob der Auftrag bereits synchron beendet wurde. Dies gilt auch im Fehlerfall.

Die mit der C- oder D-Form des Makros generierten Feldnamen und EQU-Anweisungen für die Returncodes beginnen standardmäßig mit der Zeichenfolge FPAM, die durch PREFIX und MACID geändert werden kann.

Weitere Returncodes, deren Bedeutung durch Konvention makroübergreifend festgelegt ist, können der Tabelle „Standardheader" entnommen werden.

Falls Returncodes nicht im Header abgelegt werden können (z.B. wenn er nicht zugreifbar ist), wird das aufrufende Programm mit einer Fehlermeldung beendet. Falls der Anwender das STXIT-Ereignis „nicht behebbarer Programmfehler“ definiert hat, wird dieser STXIT aktiviert.

Das aufrufende Programm wird beendet, wenn bezüglich der Parameterliste folgende Fehler auftreten:

  • Die Liste ist dem Aufrufer nicht zugewiesen.

  • Die Liste ist nicht auf Wortgrenze ausgerichtet.

  • Die Liste ist gegen Schreibzugriff geschützt.

Im Folgenden werden die Maincodes den entsprechenden Subcode1 Klassen zugeordnet und mittels Subcode2 genauer beschrieben.

Hinweise

  • Die Fehleranzeigen sind in den entsprechenden Systemmeldungen mit dem Meldungsschlüssel DFPaaaa aufgeführt (aaaa=Maincode). Meldungstexte können mit dem Kommando bzw. der Standardanweisung HELP-MSG-INFORMATION ausgegeben werden.

  • Alle an FASTPAM übergebenen Adressen müssen bereinigte 31-Bit-Adressen sein. Insbesondere darf das Bit 32 nicht gesetzt sein, da dies sonst als zur Adresse gehörend betrachtet wird.

Standardheader: ccbbaaaa

Über die Ausführung des Makros FPAMACC wird im Standardheader folgender Returncode übergeben (cc = SUBCODE2, bb = SUBCODE1, aaaa = MAINCODE):

X'cc'

X'bb'

X'aaaa'

Erläuterung

X'00'



Synchrone Beendigung.
In diesem Fall wird eine darauf folgende *WAIT Operation auf diesen Ein-/Ausgabepfad mit dem Returncode FACCPNAC (PATH NOT ACTIVE) beantwortet und bei Eventing kein Signal vom System gesendet.

X'01'



Asynchrone Beendigung.
Bei EVENTNG=*NO muss der Auftrag mit *WAIT beendet werden und bei EVENTNG=*YES wird vom System ein Signal an die Auftragsendebörse gesendet.


X'00'

X'0000'

Funktion erfolgreich ausgeführt.

X'01'


Die Funktion konnte nicht ausgeführt werden, da der entsprechende Operand falsch spezifiziert wurde.

X'01'

X'00C8'

Funktion nicht ausgeführt.
Ungültige OPEN-ID

X'01'

X'00C9'

Funktion nicht ausgeführt.
Ungültige Adresse des Ein-/Ausgabepuffers

X'01'

X'00CA'

Funktion nicht ausgeführt.
Ungültige Blockangabe

X'01'

X'00CB'

Funktion nicht ausgeführt.
Ungültige WAITLST-Angabe

X'01'

X'00CE'

Funktion nicht ausgeführt.
Ungültige Blocknummer

X'01'

X'00CF'

Funktion nicht ausgeführt.
Ungültiger Operationscode

X'02'


Funktion nicht ausgeführt.
Aufgerufene Funktion nicht verfügbar.

X'03'


Funktion nicht ausgeführt.
Schnittstellen-Version wird nicht unterstützt.

X'20'


Interner Fehler

X'20'

X'0028'

Funktion nicht ausgeführt.
Systemfehler. Systemdiagnose verständigen.

X'40'


CORRECT AND RETRY


X'40'

X'0037'

Systembetriebsmittelengpass
Maßnahme: Systemverwaltung verständigen.

X'40'

X'00C7'

Ungültige CFID angegeben.
Maßnahme: Dateinamen im Programm korrigieren.

X'40'

X'012C'

Ein-Ausgabefehler
Maßnahme: Systemverwaltung verständigen.

X'40'

X'012D'

Auf diesem Pfad ist noch eine Ein-/Ausgabe aktiv.

X'40'

X'012E'

Nur bei OPCODE=*WAIT:
Auf diesem Pfad ist keine Ein-/Ausgabe aktiv. Dies kann auch bei mit asynchronen Aufträgen *WAIT Operationen vorkommen, wenn die Ein-/Ausgabe synchron beendet werden konnte.
Bei diesem Returncode wird die Auftragskette nicht abgebrochen.

X'40'

X'012F'

Auftrag wurde nicht ausgeführt, da bei einem dazu geketteten Auftrag ein Fehler auftrat.
Maßnahme: Fehler in der Kette suchen.

X'40'

X'0133'

OPCODE=*WAIT bei EVENTNG=*YES nicht erlaubt.

X'40'

X'0134'

Warten auf eine Ein-/Ausgabe eines anderen Tasks ist nicht erlaubt.

X'40'

X'0140'

Ein-/Ausgabe hinter das Dateiende.
Im Gegensatz zu UPAM erfolgt bei diesem Returncode keine einzige Ein-/Ausgabe.

X'40'

X'0141'

Bei einer Sekundärallokierung konnte auf der Platte kein Platz mehr zugewiesen werden.
Maßnahme: Systemverwaltung verständigen.

X'40'

X'0142'

Benutzerkennung voll.
Maßnahme: Dateien löschen oder Systemverwaltung verständigen.

X'40'

X'0143'

PVS nicht attached.
Maßnahme: Systemverwaltung verständigen.

X'40'

X'0144'

Im Katalog können keine neuen Dateien aufgenommen werden.
Maßnahme: Dateien löschen oder Systemverwalter verständigen.

X'40'

X'0145'

Beim Zugriff auf eine Datei im Modus SHARUPD=YES wurde festgestellt, dass die Dateigröße den Wert von 32 GB übersteigt, beim OPEN für diese Datei wurde aber ein Überschreiten von 32 GB nicht erlaubt.

X'40'

X'014A'

Wegen fehlender Klasse-4-Extent-Liste kann keine Sekundärallokierung vorgenommen werden. Das Fehlen der Extent-Liste weist darauf hin, dass die Systemverwaltung das Kommando REPAIR-DISK-FILES bzw. REMOVE-FILE-ALLOCATION auf die gerade
geöffnete Datei abgesetzt hat.
Maßnahme: Systemverwaltung verständigen.

Beispiele

Beispiel 1: Fehler während der Parameterüberprüfung

Bevor der erste Auftrag in einer Kette bearbeitet wird, überprüft FASTPAM die Parameter aller Kettenmitglieder. Dabei wird ein Parameterfehler „INVALID_<parameter>“ festgestellt.

(In den folgenden Diagrammen sollen die Kästchen FPAMACC-Parameterlisten darstellen. Darunter stehen die jeweiligen Returncodes.)

Bild 8: FPAMACC-Makro: Fehler während der Parameterüberprüfung

Beispiel 2: Fehler nach der Parameterüberprüfung

  • Asynchrone Ein-/Ausgaben mit Eventing:
    Tritt in einer Kette asynchroner Ein-/Ausgaben mit Eventing ein Fehler auf, nachdem alle Ein-/Ausgaben angestartet worden sind (z.B. ein Ein-/Ausgabefehler „IO_ERROR“), wird jeder Auftrag gesondert behandelt. „CHAIN_ERROR“ kann nicht auftreten.

    Jede Ein-/Ausgabe geht auf eine Datei, die mit „Eventing“ geöffnet ist. READ/WRITE kann beliebig vertauscht werden:

Bild 9: FPAMACC-Makro: Fehler nach der Parameterüberprüfung (asynchrone Ein-/Ausgabe mit Eventing)

  • Asynchrone Ein-/Ausgaben mit „WAIT“:
    In einer Kette asynchroner Ein-/Ausgaben mit dahinter geketteten WAIT-Operationen tritt bei der n-ten Ein-/Ausgabe ein Fehler auf („IO_ERROR“). Die zugehörige WAIT-Operation, bei der der Fehler bemerkt wird, wird trotzdem als erfolgreich betrachtet. Da die Verarbeitung nach einem Fehler abgebrochen wird, fehlen jedoch die darauf folgenen WAIT-Operationen auf die Ausgaben 1 bis (n-1).

    B

Bild 10: FPAMACC-Makro: Fehler nach der Parameterüberprüfung (asynchrone Ein-/Ausgabe mit WAIT)  

Layout der Parameterliste

Von einem FPAMACC Makroaufruf wird folgende Parameterliste abgesetzt:

FPAMACC MF=D 
1          STACK  PRINT 
1          PRINT  NOGEN 
2                *,##### PREFIX=F, MACID=ACC ##### 
1          #INTF REFTYPE=REQUEST,INTNAME=FPAMACC,INTCOMP=001 
1 FACCPA   DS    0F      BEGIN of PARAMETERAREA           _INOUT 
1          FHDR  MF=(C,FACC),EQUATES=YES 
2          DS    0A 
2 FACCFHE  DS    0XL8            0   GENERAL PARAMETER AREA HEADER 
2 *       
2 FACCIFID DS    0A              0   INTERFACE IDENTIFIER 
2 FACCFCTU DS    AL2             0   FUNCTION UNIT NUMBER 
2 *                                  BIT 15    HEADER FLAG BIT, 
2 *                                  MUST BE RESET UNTIL FURTHER NOTICE 
2 *                                  BIT 14-12 UNUSED, MUST BE RESET 
2 *                                  BIT 11-0  REAL FUNCTION UNIT NUMBER 
2 FACCFCT  DS    AL1             2   FUNCTION NUMBER      
2 FACCFCTV DS    AL1             3   FUNCTION INTERFACE VERSION NUMBER 
2 *       
2 FACCRET  DS    0A              4   GENERAL RETURN CODE  
2 *       
2 * GENERAL_RETURN_CODE CLEARED (X'00000000') MEANS     
2 * REQUEST SUCCESSFUL PROCESSED AND NO ADDITIONAL INFORMATION 
2 * 
2 FACCSRET DS    0AL2            4   SUB RETURN CODE    
2 FACCSR2  DS    AL1             4   SUB RETURN CODE 2  
2 * ALWAYS CLEARED (X'00') IF MAIN_RETURN_CODE IS X'FFFF' 
2 * Standard subcode2 values as defined by convention:  
2 FACCR2OK EQU   X'00'               All correct, no additional info 
2 FACCR2NA EQU   X'01'               Successful, no action was necessary 
2 FACCR2WA EQU   X'02'               Warning, particular situation 
2 FACCSR1  DS    AL1             5   SUB RETURN CODE 1  
2 * 
2 * GENERAL INDICATION OF ERROR CLASSES                 
2 * 
2 * CLASS A    X'00'           FUNCTION WAS SUCCESSFULLY PROCESSED 
2 * CLASS B    X'01' - X'1F'   PARAMETER SYNTAX ERROR   
2 * CLASS C    X'20'           INTERNAL ERROR IN CALLED FUNCTION 
2 * CLASS D    X'40' - X'7F'   NO CLASS SPECIFIC REACTION POSSIBLE 
2 * CLASS E    X'80' - X'82'   WAIT AND RETRY           
2 * 
2 FACCRFSP EQU   X'00'               FUNCTION SUCCESSFULLY PROCESSED 
2 FACCRPER EQU   X'01'               PARAMETER SYNTAX ERROR 
2 *  3 GLOBALLY DEFINED ISL ERROR CODES IN CLASS X'01' - X'1F'
2 FACCRFNS EQU   X'01'               CALLED FUNCTION NOT SUPPORTED 
2 FACCRFNA EQU   X'02'               CALLED FUNCTION NOT AVAILABLE 
2 FACCRVNA EQU   X'03'               INTERFACE VERSION NOT SUPPORTED 
2 * 
2 FACCRAER EQU   X'04'               ALIGNMENT ERROR    
2 FACCRIER EQU   X'20'               INTERNAL ERROR     
2 FACCRCAR EQU   X'40'               CORRECT AND RETRY  
2 *  2 GLOBALLY DEFINED ISL ERROR CODES IN CLASS X'40' - X'7F' 
2 FACCRECR EQU   X'41'               SUBSYSTEM (SS) MUST BE CREATED 
2 *                                  EXPLICITELY BY CREATE-SS 
2 FACCRECN EQU   X'42'               SS MUST BE EXPLICITELY CONNECTED 
2 * 
2 FACCRWAR EQU   X'80'               WAIT FOR A SHORT TIME AND RETRY 
2 FACCRWLR EQU   X'81'                    "     LONG       " 
2 FACCRWUR EQU   X'82'               WAIT TIME IS UNCALCULABLY LONG 
2 *                                  BUT RETRY IS POSSIBLE 
2 *  2 GLOBALLY DEFINED ISL ERROR CODES IN CLASS X'80' - X'82' 
2 FACCRTNA EQU   X'81'               SS TEMPORARILY NOT AVAILABLE 
2 FACCRDH  EQU   X'82'               SS IN DELETE / HOLD
2 * 
2 FACCMRET DS    0AL2            6   MAIN RETURN CODE   
2 FACCMR2  DS    AL1             6   MAIN RETURN CODE 2 
2 FACCMR1  DS    AL1             7   MAIN RETURN CODE 1 
2 * 
2 * SPECIAL LAYOUT OF LINKAGE_MAIN_RETURN_CODE (YYYY IN X'00XXYYYY') 
2 * 
2 FACCRLNK EQU   X'FFFF'             LINKAGE ERROR / REQ. NOT PROCESSED 
2 FACCFHL  EQU   8               8   GENERAL OPERAND LIST HEADER LENGTH 
2 * 
1 * 
1 * MAINCODE                  
1 * 
1 FACCMFSP EQU  X'0000'       SUCCESSFUL_PROCESSING              = 0 
1 FACCMIER EQU  X'0028'       INTERNAL_ERROR                     = 40 
1 FACCSRES EQU  X'0037'       SHORTAGE_OF_RESOURCES              = 55 
1 FACCICFI EQU  X'00C7'       INVALID_CFID                       = 199
1 FACCIOPI EQU  X'00C8'       INVALID_OPEN_ID                    = 200
1 FACCIIOA EQU  X'00C9'       INVALID ADDRESS OF IOAREA          = 201
1 FACCIBLK EQU  X'00CA'       INVALID_BLOCK                      = 202
1 FACCILAW EQU  X'00CB'       INVALID LIST ADDRESS FOR WAIT      = 203
1 FACCIBL# EQU  X'00CE'       INVALID_BLOCK_#                    = 206
1 FACCIOP  EQU  X'00CF'       INVALID_OPCODE                     = 207 
1 FACCIOER EQU  X'012C'       IO_ERROR = 300
1 FACCPACT EQU  X'012D'       PATH_ACTIVE                        = 301 
1 FACCPNAC EQU  X'012E'       PATH_NOT_ACTIVE (WAIT ONLY)        = 302 
1 FACCCHE  EQU  X'012F'       CHAIN_ERROR                        = 303 
1 FACCWTEV EQU  X'0133'       WAIT_AND_EVENTING                  = 307 
1 FACCWTNS EQU  X'0134'       WAIT_NOT_BY_SAME_TASK              = 308 
1 FACCEOF  EQU  X'0140'       END_OF_FILE                        = 320 
1 FACCNDSA EQU  X'0141'       NO_DISC_SPACE_AVAILABLE            = 321 
1 FACCUIDE EQU  X'0142'       USER_ID_EXHAUSTED                  = 322 
1 FACCPVNA EQU  X'0143'       PUBLIC_VOLUME_NOT_ATTACHED         = 323 
1 FACCCEFL EQU  X'0144'       CATALOG_ENTRY_FULL                 = 324 
1 FACCLFNS EQU  X'0145'       LARGE_FILE_NOT_SPECIFIED           = 325 
1 FACCSAVY EQU  X'014A'       SYSTEM_ADMINISTRATOR_VERIFY        = 330 
1 * 
1 * SUB RETURN CODE2          
1 * 
1 FACCSYTE EQU  X'00'         SYNCHRONEOUS TERMINATION  
1 FACCASTE EQU  X'01'         ASYNCHRONEOUS TERMINATION 
1 * 
1 * FPAMACC FUNCTIONS:        
1 * 
1 FACCACCF EQU  7             ACCESS FILE               
1 * 
1 * OUTPUT PARAMETER          
1 * 
1         DS   XL2           RESERVED                   
1 FACCDS  DS   X             DRV STATUS                 
1 FACCREQ  DS   X             REQUEST STATUS             
1 FACCTERM EQU  X'00'         REQUEST TERMINATED        
1 FACCACTV EQU  X'FF'         REQUEST ACTIVE            
1 * 
1 * INPUT PARAMETER           
1 * 
1 FACCOPID DS   F             OPEN-ID                   
1 FACCIOA  DS   A             ADDRESS OF IOAREA          
1 FACCBLK  DS   F             BLOCK WITHIN FILE          
1 FACCLAW  DS   A             LIST ADDRESS FOR WAIT OPERATION 
1 FACCCHLA DS   A             ADDRESS OF CHAINED LIST   
1 FACCPOCO DS   FL2           POSTCODE                  
1 FACCBLK# DS   FL1           BLOCK NUMBER              
1 FACCOP   DS   AL1           OPCODE                     
1 FACCREAD EQU  1             READ                      
1 FACCWRIT EQU  2             WRITE                     
1 FACCRDWT EQU  3             READ AND WAIT             
1 FACCWRWT EQU  4             WRITE AND WAIT            
1 FACCRDEQ EQU  5             READ AND EQUALIZE  
1 FACCWAIT EQU  6             WAIT                      
1          DS   0F             
1 FACC#    EQU   *-FACCPA LENGTH of PARAMETERAREA   

Beispiel

Erstellen einer Datei mit FASTPAM

FPAMTEST START
         BALR  10,0
         USING *,10
         USING FPAMD,9
         LA    9,FPAMPL               R9 -> FPAMSRV-Parameterliste
*---------------------------------------------------------------------*
* Speicher für die ACCESS-Parameterlisten                             *
*---------------------------------------------------------------------*
REQM
         LTR   15,15
         BNZ   ERROR
         LR    8,1                   R8 -> FPAMACC-Parameterliste
*---------------------------------------------------------------------*
* Speicher für den IOAREA-POOL                                        *
*---------------------------------------------------------------------*
REQM  30
         LTR   15,15
         BNZ   ERROR
         LR    7,1                   R7 -> IOAREA-POOL
*---------------------------------------------------------------------*
* ENABLE ENVIRONMENT                                                  *
*---------------------------------------------------------------------*
FPAMSRV MF=M,PARAM=FPAMPL,ACCLSTS=(8)
         FPAMSRV MF=E,PARAM=FPAMPL
         CLI   FPAMSR1,FPAMRFSP
         BE    ENAIPO
         CLI   FPAMSR1,FPAMRCAR
         BNE   ERROR
         CLC   FPAMMRET,=Y(FPAMNORE)
         BNE   ERROR
*---------------------------------------------------------------------*
* Behandlung des Fehlers 'RESIDENT SPACE NOT AVAILABLE'               *
* evt. nur Meldung ausgeben und weitermachen                          *
*---------------------------------------------------------------------*
*              .
*              .
*              .
*---------------------------------------------------------------------*
* ENABLE IOAREA-POOL                                                  *
*---------------------------------------------------------------------*
ENAIPO   FPAMSRV MF=M,PARAM=FPAMPL,FCT=*ENAIPO,IPONAME='IOAREA',       -
               IPOADDR=((7),0),IPOSIZE=30
         FPAMSRV MF=E,PARAM=FPAMPL
         CLI   FPAMSR1,FPAMRFSP
         BE    OPEN
         CLI   FPAMSR1,FPAMRCAR
         BNE   ERROR
         CLC   FPAMMRET,=Y(FPAMNORE)
         BNE   ERROR
*---------------------------------------------------------------------*
* Behandlung des Fehlers 'RESIDENT SPACE NOT AVAILABLE'               *
* evt. nur Meldung ausgeben und weitermachen
*---------------------------------------------------------------------*
*              .
*              .
*              .
*---------------------------------------------------------------------*
* Eröffnen der Datei mit OUTIN                                        *
*---------------------------------------------------------------------*
OPEN     FPAMSRV MF=M,PARAM=FPAMPL,FCT=*OPEN,FILE='TESTFILE',         -
               MODE=*OUTIN,SHARUPD=*YES,BLKSIZE=1
         FPAMSRV MF=E,PARAM=FPAMPL
         CLI   FPAMSR1,FPAMRFSP
         BNE   ERROR
*---------------------------------------------------------------------*
* Schreibe nummerierte Blöcke in die Datei                            *
*---------------------------------------------------------------------*
LA    6,1
         LR    4,8                   R4 -> 1. Parameterliste
         USING ACCESSD,4
         LR    3,8                   R3 -> 1. Parameterliste
         LA    2,30                   Schleifenzähler
CYCL1    DS    0F
         ST    6,0(7)
         MVC   0(FACC#,4),FACCPL
         C     2,=A(1)
         BNE   NOTLAST
* IN DER LETZTEN FPAMACC-PARAMETERLISTE KEINE KETTUNG MEHR
         L     3,FFFFFFFF
         B     NEXT
NOTLAST  EQU   *
         A     3,=A(FACC#)            R3 -> nächste Parameterliste
NEXT     EQU   *
         FPAMACC MF=M,PARAM=(4),OPENID=FPAMOPID,BLOCK=(6),            -
               IOAREA=(7),CHAIN=(3)
         A     6,=A(1)
         LR    4,3                   R4 -> nächste Parameterliste
         BCT   2,CYCL1
         FPAMSRV MF=E,PARAM=(8)
* Fehlerauswertung der Parameterlisten                                *
         LR    3,8                   R3 -> 1. Parameterliste
         USING ACCESSD,3
         LA    2,30                   Schleifenzähler
CYCL2    DS    0F
         CLI   FACCSR1,FACCRFSP
         BNE   ERROR
         A     3,=A(FACC#)            R3 -> nächste Parameterliste
         BCT   2,CYCL2
*
*---------------------------------------------------------------------*
* Schließen der Datei                                                 *
*---------------------------------------------------------------------*
FPAMSRV MF=M,PARAM=FPAMPL,FCT=*CLOSE
         FPAMSRV MF=E,PARAM=FPAMPL
         CLI   FPAMSR1,FPAMRFSP
         BNE   ERROR
*---------------------------------------------------------------------*
* DISABLE IOAREA-POOL                                                 *
*---------------------------------------------------------------------*
FPAMSRV MF=M,PARAM=FPAMPL,FCT=*DISIPO
         FPAMSRV MF=E,PARAM=FPAMPL
         CLI   FPAMSR1,FPAMRFSP
         BNE   ERROR
*---------------------------------------------------------------------*
* DISABLE ENVIRONMENT                                                 *
*---------------------------------------------------------------------*
FPAMSRV MF=M,PARAM=FPAMPL,FCT=*DISENV
         FPAMSRV MF=E,PARAM=FPAMPL
         CLI   FPAMSR1,FPAMRFSP
         BNE   ERROR
*---------------------------------------------------------------------*
* Speicherfreigabe für den IOAREA-POOL                                *
*---------------------------------------------------------------------*
RELM  30,(7)
*---------------------------------------------------------------------*
* Speicherfreigabe für die ACCESS-Parameterlisten                     *
*---------------------------------------------------------------------*
RELM  1,(8)
*
ERROR    DS   0Y
         TERM
*
FPAMPL   FPAMSRV  MF=L,FCT=*ENAENV,ENVNAME='TESTENV',ACCNUMB=30,      -
               MAXIOLN=*MINI,EVENTNG=*NO
FPAMD    FPAMSRV  MF=D
FACCPL   FPAMACC MF=L,LEN=1,                                          -
               OPCODE=*WRITE_WAIT
FFFFFFFF DC    X'FFFFFFFF'
*
         END