Der Makro CMDCST bewirkt, dass SDF mit dem Benutzer einen Dialog führt, in dem dieser Semantikfehler in einer Anweisung korrigiert. SDF hat die Anweisung unmittelbar zuvor analysiert und als syntaktisch richtig an das Programm übergeben. Verdeckt eingegebene Operandenwerte muss der Benutzer während des Korrekturprozesses noch einmal eingeben.
Voraussetzungen für den Semantikfehlerdialog sind:
Das Programm läuft in einer interaktiven Task und bei der Syntaxanalyse war ein Fehlerdialog zugelassen. Das bedeutet im Einzelnen:
Temporär oder permanent geführter Dialog musste eingestellt sein.
In Prozeduren musste die SDF-Option PROCEDURE-DIALOGUE=*YES eingestellt sein.
Wenn CMDCST nach CMDTST aufgerufen wird, musste bei CMDTST DIALOG=*ERROR eingestellt sein.
Es steht die gleiche Syntaxdatei wie bei der ersten Analyse der Anweisung zur Verfügung (kein zwischenzeitlicher Wechsel der Syntaxdatei).
Sind diese Voraussetzungen nicht erfüllt, lehnt SDF den Dialog ab (Fehlercode X’20’).
Bild 11: Wirkung des Makros CMDCST
Operation | Operanden |
CMDCST | INOUT = <var: pointer> ,MESSAGE = <var: pointer> ,DEFAULT = *NO / <var: pointer> ,INVAR = *NO / <var: pointer> ,CALLID = *NO / <var: pointer> ,CCSNAME = *NO / *EXTEND / <c-string 1..8> / <var: char:8> ,MF = C / D / L / M / E |
INOUT = <var: pointer>
Adresse des normierten Übergabebereichs, der auf Wortgrenze beginnen muss. In ihm steht das zuvor von SDF an das Programm übergebene Analyseergebnis der fehlerhaften Anweisung. Das Programm hat die von ihm als fehlerhaft erkannten Operandenwerte gekennzeichnet. Änderungen von Eingabewerten durch das Programm übernimmt SDF nicht. Nach dem Fehlerdialog und der erneuten Analyse legt SDF das geänderte Analyseergebnis wieder in diesem Bereich ab (siehe Abschnitt „Aufbau des normiertenÜbergabebereichs“).
MESSAGE = <var: pointer>
Adresse des auszugebenden Textes für den Fehlerdialog. Dieser Text wird im geführten Dialog in das Anweisungsmenü integriert. Der Textbereich muss auf Halbwortgrenze ausgerichtet sein und folgendes Format haben:
2 Byte: | absolute Länge des Satzes (n+4) |
2 Byte: | (reserviert) |
n Byte: | Meldungstext |
Der Text darf maximal 400 Zeichen lang sein. In SDF-formatierten Bildschirmen werden jedoch nur die ersten 280 Zeichen dargestellt. Enthält der Text Bildschirmsteuerzeichen, so kann die Menü-Maske zerstört werden.
DEFAULT =
bestimmt, ob SDF folgende Werte durch vom Programm dynamisch erzeugte Werte ersetzt:
eingegebene Operandenwerte oder
Default-Werte der Operanden
In der Syntaxdatei müssen die Operanden bzw. Operandenwerte entsprechend definiert sein (siehe ADD-OPERAND...,OVERWRITE-POSSIBLE=*YES,... bzw. ADD-VALUE..., VALUE=<c-string> (OVERWRITE-POSSIBLE=*YES),...). Der vom Programm erzeugte Wert muss gültiger Operandenwert sein.
Im geführten Dialog zeigt SDF die vom Programm erzeugten Werte im Fragebogen.
Beispiel:
SDF-A ersetzt in den eingegebenen MODIFY-Anweisungen den Wert *UNCHANGED durch den aktuellen Wert.
*NO
Die angegebenen Operandenwerte werden nicht durch vom Programm dynamisch erzeugte Werte ersetzt.
<var: pointer>
Adresse einer auf Wortgrenze ausgerichteten Liste, die Adressen von Umsetzbeschreibungen für Anweisungen enthält. Als Umsetzbeschreibung wird ein formatierter Übergabebereich mit dem Typ 'Struktur' verwendet (siehe Abschnitt „Aufbau des normiertenÜbergabebereichs“). Je Anweisung kann nur eine Umsetzbeschreibung angegeben werden. Eine Umsetzbeschreibung enthält u.a. den internen Anweisungsnamen und die Information, welche Operanden mit welchen Werten zu belegen sind. Die Liste der Adressen von Umsetzbeschreibungen ist wie folgt aufgebaut:
2 Byte: | Anzahl der Umsetzbeschreibungen in der Liste (n) |
2 Byte: | (reserviert) |
4 Byte: | Adresse der ersten Umsetzbeschreibung . . . |
4 Byte: | Adresse der n-ten Umsetzbeschreibung |
Die Bereiche für die Umsetzbeschreibungen, die für die Default-Werte des Programms übergeben werden, müssen auf Wortgrenze ausgerichtet sein. Dies gilt ebenso für den Ausgabebereich der Makros (OUTPUT-Operand).
Stehen die zu defaultierenden Operanden in einer Struktur, deren Einleiter mit LIST-ALLOWED=*YES definiert ist (siehe ADD-VALUE), so kann folgender Fall eintreten: Die Umsetzbeschreibung enthält mehrere Listenelemente, an denen eine Struktur mit zu defaultierenden Operanden hängt. Auf der anderen Seite gibt der Anwender ebenfalls mehrere Listenelemente ein, an denen eine Struktur mit zu defaultierenden Operanden hängt. SDF versucht zunächst, die vom Benutzer eingegebenen und die in der Umsetzbeschreibung angegebenen Strukturen einander über den Wert des Struktureinleiters zuzuordnen. Ist über den struktureinleitenden Wert keine eindeutige Zuordnung möglich, weil keiner der eingegebenen Werte mit denen in der Umsetzbeschreibung übereinstimmt oder weil der Benutzer den übereinstimmenden Wert mehrfach eingegeben hat, so erfolgt die Zuordnung über die Position des Struktureinleiters in der Liste.
INVAR =
Legt fest, ob die INVARIANT-INPUT-Form der Anweisung abgespeichert wird. Das heißt, dass die Anweisung mit allen eingegebenen Operanden, allen durch Default-Werte vorbelegten Operanden und mit allen Operandenwerten abgelegt wird, die für die Task zu dieser Zeit erlaubt sind. Die INVARIANT-INPUT-Form ist damit die größtmögliche Eingabeform für eine Anweisung, die für einen Benutzer mit bestimmten Privilegien und im gewählten Dialogmodus zulässig ist.
Im Gegensatz zur Protokollierungsform LOGGING=*INVARIANT-FORM (Anweisung MODIFY-SDF-OPTIONS) werden Kennwörter und geheime Operanden jedoch nicht ausgeblendet.
*NO
Die INVARIANT-INPUT-Form der Anweisung wird nicht abgespeichert.
<var: pointer>
Gibt die Adresse eines Puffers an, in den SDF die INVARIANT-INPUT-Form der Anweisung schreibt. Der Puffer muss auf Wortgrenze ausgerichtet sein und das erste Halbwort muss die Länge des Puffers enthalten. SDF legt die INVARIANT-INPUT-Form ab dem zweiten Halbwort als Satz mit variabler Satzlänge ab. Der Puffer hat dann folgenden Inhalt:
2 Byte: | maximale Länge des Puffers |
2 Byte: | Ausgabelänge, die SDF schreibt (n+4) |
2 Byte: | (reserviert) |
n Byte: | INVARIANT-INPUT-Form der Anweisung, ab 7. Byte |
CALLID =
bezieht sich auf einen Kontext (=Syntaxdateihierarchie), der durch einen OPNCALL-Makro eröffnet wurde. Der Name der Syntaxdateihierarchie (callid) muss den 4 Byte langen Wert haben, der von SDF an das Feld zurückgegeben wird, welches durch den Operanden CALLID im Open-Context-Makro bezeichnet wurde.
Diese Funktion bezieht sich auf den Gebrauch der Makros OPNCALL und CLSCALL.
*NO
Die aktuelle Syntaxdateihierarchie (Kontext) der Task wird für die Analyse der Anweisung verwendet.
<var: pointer>
Adresse des Aufrufprüfungsfeldes. Der Bereich muss auf Wortgrenze ausgerichtet sein.
CCSNAME =
Gibt den Namen des Zeichensatzes an, der für den Korrekturdialog auf 8-bit-Terminals und für die Konvertierung von Klein- in Großbuchstaben verwendet wird. Jedes Terminal arbeitet mit einem bestimmten Zeichensatz. Ein codierter Zeichensatz (CCS, Coded Character Set) ist die eindeutige Darstellung der Zeichen eines Zeichensatzes in binärer Form. Jeder codierte Zeichensatz wird durch seinen Namen (Coded Character Set Name, CCSN) bestimmt (siehe Handbuch „XHCS“ [11]). Die Ausgabe von Meldungen wird durch diesen Parameter nicht beeinflusst.
*NO
Der 7-bit-Standard-Code wird für Ein-/Ausgabeoperationen verwendet.
*EXTEND
Der 8-bit-Standard-Code wird für Ein-/Ausgabeoperationen verwendet.
<c-string 1..8> / <var: char:8>
Gibt den Namen eines speziellen 8-bit-Code an, der für Ein-/Ausgabeoperationen verwendet wird. Der Name muss 8 Byte lang sein und kann als C-String-Konstante oder als String-Variable übergeben werden.
Beschreibung der Parameter MF, PARAM, MACID und PREFIX siehe Benutzerhandbuch „Makroaufrufe an den Ablaufteil“ [8].
Rückinformation und Fehleranzeigen
Der Aufbau des Übergabebereichs ist auf den "Aufbau des normierten Übergabebereichs" beschrieben. Das bis SDF V4.0
verwendete Format des Übergabebereiches finden Sie im Kapitel „Anhang“.
Hinweise zur INVARIANT-INPUT-Form einer Anweisung finden Sie beim Makro CMDRST
auf "CMDRST Anweisung lesen und analysieren".
Der Returncode wird im Standardheader der Parameterliste übergeben.
Standardheader | cc: Subcode 2 (SC2) |
(SC2) | SC1 | Maincode | Bedeutung |
00 | 00 | 0000 | erfolgreiche Beendigung |
00 | 20 | 0004 | nicht behebbarer Systemfehler |
01 | 0008 | Parameterfehler: | |
00 |
| ||
01 |
| ||
03 |
| ||
04 |
| ||
06 |
| ||
07 |
| ||
00 | 40 | 000C | Übergabebereich zu klein |
00 | 40 | 0010 | Eingabeende (EOF) oder Anweisung fehlerhaft, danach wurde Eingabeende (EOF) erkannt |
00 | 40 | 0014 | Anweisung fehlerhaft, danach wurde Kommando erkannt |
00 | 40 | 0018 | Anweisung ist zwar in Ordnung, die vom Programm übergebenen Default-Werte sind jedoch fehlerhaft |
00 | 40 | 001C | Anweisung fehlerhaft, danach wurde //STEP erkannt |
00 | 40 | 0020 | Fehlerdialog nicht möglich |
00 | 40 | 0024 | Fehlerdialog vom Benutzer abgelehnt |
00 | 40 | 002C | END-Anweisung wurde gelesen |
00 | 40 | 0034 | Anweisung fehlerhaft, danach wurde END erkannt |
00 | 40 | 0040 | angegebene CALLID nicht gefunden |
00 | 40 | 0044 | im DSSM-Katalog eingetragene Syntaxdatei nicht gefunden |
00 | 40 | 005C | INVAR-Puffer zu klein, INVARIANT-INPUT abgeschnitten |
00 | 40 | 0064 | XHCS-Fehler bei Anweisungseingabe |
Migration von CORSTMT zu CMDCST
Die Migration von CORSTMT nach CMDCST ist nur dann notwendig, wenn Sie die neue Funktionalität von CMDCST, CMDRST und CMDTST nutzen wollen. Dabei sind dieselben Punkte wie bei CMDRST zu beachten (siehe „Migration von RDSTMT zu CMDRST“ (CMDRST Anweisung lesen und analysieren) (CMDRST Anweisung lesen und analysieren).
Der Makro-Returncode wird im Standardheader der Parameterliste übergeben. Der Maincode von CMDCST entspricht den Werten, die bei CORSTMT im rechtsbündigen Byte im Register 15 übergeben wurden. Die Erzeugung von EQUATES für Returncodes mit dem Makro CMDANALY ist nicht mehr notwendig, da diese mit CMDCST MF=D automatisch erzeugt werden. Im Folgenden finden Sie eine Gegenüberstellung der alten (CORSTMT-) und neuen (CMDCST-)Feldnamen:
CORSTMT | CMDCST |
&P.NOERR | &PREFIX.MDCSUCCESSFUL |