Ein Feld ist ein Teil des Ein- oder Ausgabesatzes, das charakterisiert ist durch
seine Anfangsposition im Satz,
seine Länge,
sein Format.
Das Format gibt an, wie das Feld im Eingabesatz zu interpretieren bzw. wie es bei seiner Übertragung in den Ausgabesatz umzuformen ist. Kennwörter und Literale besitzen ein implizit festgelegtes Format. PERCON kann folgende Formate bearbeiten:
CHARACTER
Das bezeichnete Feld enthält Zeichen oder soll Zeichen aufnehmen.
Unter ’Zeichen’ sind Buchstaben, Ziffern und Sonderzeichen zu verstehen.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'C1C2F1F2F3F4' (6 Byte lang) | C'AB1234' (6 Byte lang) |
HEXADECIMAL
Nur Ausgabeformat. Das Eingabefeld wird sedezimal aufbereitet und in das bezeichnete Ausgabefeld ausgegeben, d.h. jedes Zeichen des Eingabefeldes wird in den entsprechenden Sedezimal-Code umgewandelt und nimmt im Ausgabefeld 2 Byte ein.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'C1C2F1F2F3F4' (6 Byte lang) | C'C1C2F1F2F3F4' (12 Byte lang) |
BINARY
Nur Ausgabeformat. Das Eingabefeld wird binär aufbereitet und in das bezeichnete Ausgabefeld ausgegeben, d.h. jedes Zeichen des Eingabefeldes wird in den entsprechenden Binär-Code umgewandelt und nimmt im Ausgabefeld 8 Byte ein.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'C1C2' (2 Byte lang) | C'1100000111000010' (16 Byte lang) |
ZONED-DECIMAL
Das bezeichnete Feld enthält eine entpackte Dezimalzahl im EBCDI-Code oder soll eine solche aufnehmen. Das Vorzeichen der Zahl wird nicht berücksichtigt.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'F1F2F3F4' (4 Byte lang) | C'1234' (4 Byte lang) |
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'123F' (2 Byte lang) | C'123' (3 Byte lang) |
SIGNED-DECIMAL
Nur Ausgabeformat. Das Ausgabefeld soll eine entpackte Dezimalzahl aufnehmen, bei der das Vorzeichen (+ oder –) in jedem Fall im ersten Byte des Feldes enthalten ist.
Dies ist für die Längenangabe des Feldes zu berücksichtigen.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'F1F2F3F4' (4 Byte lang) | C'+1234' (5 Byte lang) |
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'123F' (2 Byte lang) | C'+123' (4 Byte lang) |
DECIMAL
Nur Ausgabeformat. Das Ausgabefeld soll eine entpackte Dezimalzahl enthalten, bei der das Vorzeichen nur bei negativem Wert der Zahl ausgegeben wird. Bei positivem Wert wird an Stelle des Vorzeichens ein Leerzeichen ausgegeben. Dies ist bei der Längenangabe zu berücksichtigen.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'F1F2F3F4' (4 Byte lang) | C' |
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'123F' (2 Byte lang) | C' |
PACKED-DECIMAL
Das bezeichnete Feld enthält eine gepackte Dezimalzahl bzw. soll eine solche aufnehmen. Die Länge einer gepackten Zahl darf maximal 16 Byte betragen.
Beispiel
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'F1F2F3F4' (4 Byte lang) | X'01234F' (3 Byte lang) |
Inhalt vom Eingabefeld | Inhalt vom Ausgabefeld |
X'123F' (2 Byte lang) | X'123F' (2 Byte lang) |
ZONED-DECIMAL-LEFT
Nur Ausgabeformat für Kennwörter. Das Ausgabefeld soll eine linksbündige Dezimalzahl aufnehmen. Der rechte Teil des Ausgabefeldes wird mit Leerzeichen aufgefüllt.
Beispiel
Inhalt vom | Ausgabeformat ZONED-DECIMAL-LEFT |
RECORD-COUNTER | C' |
TRANSLATION
Diese Angabe ist nur zulässig innerhalb der Feldbeschreibung des Operanden OUTPUT-FIELDS in der SET-RECORD-MAPPING-Anweisung. Die einzelnen Zeichen werden entsprechend einer Code-Tabelle umgesetzt.
NO-TRANSLATION
Diese Angabe ist nur zulässig innerhalb der Feldbeschreibung des Operanden OUTPUT-FIELDS in der SET-RECORD-MAPPING-Anweisung. NO-TRANSLATION ist zu verwenden, wenn das Eingabefeld nicht in den Ausgabezeichensatz umgesetzt werden soll, z.B. bei gepackten Zahlen.
UNICODE-TRANSLATION
Diese Angabe ist nur zulässig innerhalb der Feldbeschreibung des Operanden OUTPUT-FORMAT in der SET-RECORD-MAPPING-Anweisung. Der Eingabedatei und/oder der Ausgabedatei muss ein Unicode-Format zugeordnet sein. Mit Hilfe dieser Anweisung werden einzelne Bereiche eines Satzes konvertiert und/oder, falls die Unicode-Variante UTF-16 verwendet wird, normalisiert. Fehlt die Angabe OUTPUT-FORMAT=*UNICODE-TRANSLATION findet keine Konvertierung bzw. Normalisierung des betroffenen Bereichs statt.
Bei der Konvertierung von einem Nicht-Unicode-Format in ein Unicode-Format oder umgekehrt ist zu beachten, dass sich die Länge das auszugebenden Bereichs ändern kann (siehe "Verwendung von UNICODE-Zeichensätzen in PERCON ").
Formatierte Zahlen mit einer Aufbereitungsmaske
Nur Ausgabeformat für numerische Ausgabefelder. Neben den Ausgabeformaten ZONED-DECIMAL, SIGNED-DECIMAL und ZONED-DECIMAL-LEFT kann für numerische Ausgabefelder auch eine Aufbereitungsmaske angegeben werden. In einer Maske können führende Nullen unterdrückt, Nachkommastellen angezeigt oder eine Zifferngruppierung durchgeführt werden.
Eine Maske wird in den Anweisungen SET-GROUP-ATTRIBUTES oder SET-RECORD-MAPPING mit dem Operanden OUTPUT-FORMAT=<c-string> vereinbart. Zudem muss der Operand OUTPUT-LENGTH den Wert *STD haben.
In einer Maske können folgende Zeichen stehen:
Füllzeichen : alle abdruckbaren Zeichen Ziffernzeichen : Ziffernselektor ('Z') Signifikanzstarter ('N') Einfügungen : Zeichen ungleich 'Z' und 'N'
Maskenaufbau
Das 1. Zeichen der Maske wird als Füllzeichen interpretiert. Für Maskenzeichen rechts vom Füllzeichen gilt, dass die Anzahl der Ziffernzeichen ungerade sein muss und nur ein oder kein Signifikanzstarter vorhanden sein darf. Ist dies nicht der Fall, so wird die Maske mit einem Syntaxfehler als fehlerhaft zurückgewiesen. Zwischen den Ziffernzeichen können Einfügungen vorhanden sein.
Maskengröße
Enthält die Maske mehr Ziffernzeichen als in der aufbereitenden Zahl Ziffern vorhanden sind, so wird die aufzubereitende Zahl linksbündig mit Nullen erweitert.
Ist die Anzahl der Ziffern der aufzubereitenden Zahl größer als die der Ziffernzeichen in der Maske, so wird die aufzubereitende Zahl (von links beginnend) gekürzt. Werden bei diesem Kürzungsvorgang relevante Ziffern (
!=
führende Nullen) abgeschnitten, so wird der Konvertierungsschritt sofort fehlerhaft abgebrochen (siehe Meldung PER0042).Bei den bisherigen Ausgabeformaten von PERCON gilt weiterhin die Einschränkung, dass die Anzahl der Ziffernstellen des Ausgabefeldes größer gleich der des Eingabefeldes sein muss.
Maskenverarbeitung
Die Maske wird von links nach rechts abgearbeitet. Alle Zeichen vor dem ersten Ziffernzeichen (’Z’, ’N’) werden durch das Füllzeichen ersetzt.
In weiterer Folge werden alle Zeichen, auch die Einfügungszeichen, solange durch das Füllzeichen ersetzt, bis entweder ein Ziffernselektor durch eine Ziffer
!=
0 ersetzt wird oder in der Maske ein Signifikanzstarter auftritt.Danach werden die Ziffernzeichen durch die entsprechenden Ziffern ersetzt, einzufügende Zeichen bleiben unverändert.
Einzufügende Zeichen hinter dem letzten Ziffernzeichen bleiben unverändert, wenn die aufzubereitende Zahl negativ ist, sonst werden sie durch das Füllzeichen ersetzt.
Beispiel 1
FIELD (INPUT-POSITION=...,- INPUT-LENGTH=5,- INPUT-FORMAT=*PACKED-DECIMAL,- OUTPUT-POSITION=...,- OUTPUT-LENGTH=*STD,- OUTPUT-FORMAT='*ZZNZ.ZZZ-')
Es ergibt sich folgender Umsetzvorgang:
Aufzubereitendes Feld: 0 0 0 0 0 0 0 3 8 C Angegebene Maske: * Z Z N Z . Z Z Z - Ausgabefeld: * * * * 0 . 0 3 8 *
Die gepackte Zahl ist positiv, deshalb wird das Minuszeichen hinter der Zahl durch das Füllzeichen ersetzt. Beim aufzubereitenden Feld wird wegen der Anpassung an die Maske das führende Byte, das Null enthält, weggeschnitten. Das Abschneiden von Feldteilen ungleich Null würde zu einem Abbruch mit Fehlermeldung PER0042 führen.
Beispiel 2
FIELD (INPUT-POSITION=...,- INPUT-LENGTH=4,- INPUT-FORMAT=*ZONED-DECIMAL,- OUTPUT-POSITION=...,- OUTPUT-LENGTH=*STD,- OUTPUT-FORMAT='xZ ZNZ,ZZZ -')
Es ergibt sich folgender Umsetzvorgang:
Aufzubereitendes Feld: F 3 F 9 F 7 D 1 Angegebene Maske: x Z Z N Z , Z Z Z - Ausgabefeld: x x x x x 3 , 9 7 1 -
Da die gezonte Zahl negativ ist, wird das Leer- und Minuszeichen hinter der Zahl in das Ausgabefeld übernommen.