Mainframe Connector verwendet einen ANTLR4-basierten Parser, der Standard-COBOL-Copybooks unterstützt.
In diesem Dokument werden die vom Copybook-Parser ausgeführten Vorverarbeitungsaufgaben, die unterstützten Datentypen und Nutzungseinschränkungen sowie die Konfiguration von Feldmodifikatoren mithilfe der Transcoder-Konfiguration mit den Befehlen qsam decode und qsam
encode beschrieben.
Vorverarbeitung
Vor dem Parsen eines Copybooks verarbeitet der Copybook-Parser die Daten vor und führt die folgenden Schritte aus:
- Entfernt Kommentarzeilen (
*in Spalte 7 oder Inline-Kommentare mit*>und*>CE). - Löst die Zeilenfortsetzung auf (
-in Spalte 7, gefolgt von einem Literal in Anführungszeichen). - Sequenznummernbereiche (Spalten 1–6) und Spalte 73 und höher werden ausgeblendet. Der Code muss in Spalte 8 oder höher beginnen.
- Behält präprozessorspezifische Anweisungen wie
EJECT,SKIP1,SKIP2,SKIP3undTITLEbei. Diese Anweisungen werden geparst, aber ignoriert. Copybooks, die Präprozessorparameter enthalten, die vonCOPY REPLACINGverwendet werden können, werden vom Copybook-Parser nicht unterstützt. In diesen Copybooks sind Kennungen von Doppelpunkten (:) umgeben.
Unterstützte Datentypen und Einschränkungen
Im Folgenden finden Sie die vom Copybook-Parser unterstützten Datentypen und die Einschränkungen für ihre Verwendung:
- In einem Copybook ist nur ein einziger
01-Eintrag auf oberster Ebene zulässig. Der01-Eintrag darf keineOCCURS-Klausel enthalten. - Felder der Ebene
66(RENAMES/Alias) und der Ebene77(eigenständig) werden nicht unterstützt. Ebene88(Bedingungsnamen) wird geparst und ignoriert. - Alle elementaren Felder (Nicht-Gruppenfelder) müssen eine
PICTURE-Klausel haben, mit Ausnahme von hexadezimalen Gleitkommafeldern (COMP-1undCOMP-2). Die folgendenPICTURE-Felder werden unterstützt:- Alphabetisch (
PIC A), alphanumerisch (PIC X) und alphanumerisch bearbeitet (A,X,9,B,0,/). PIC G(DBCS; erfordertUSAGE DISPLAY-1).PIC N(national oder DBCS) und national-edited (N,B,0,/).PIC U(UTF-8), einschließlichPIC U BYTE-LENGTH n.- Numerisch (
9,S,V) und numerisch bearbeitet ($,B,/,V,Z,0,9,,,.,*,+,-,CR,DB). Beachten Sie, dassPIC P(Skalierungsposition) nicht unterstützt wird. - Zonen- und gepackte Dezimalfelder mit einer Genauigkeit von bis zu 18 werden in 64-Bit-Typen (
LONGoderDECIMAL64) decodiert. Felder mit höherer Genauigkeit werden in Typen mit beliebiger Genauigkeit (BIG_INTEGERoderBIG_DECIMAL) decodiert. Wennschema_validation_modeaufBIG_QUERYgesetzt ist, beträgt die maximal unterstützte Genauigkeit 76 (BIGNUMERIC) und die maximale Skalierung 38 (fürPOSTGRESbeträgt die maximale Genauigkeit 147.455 und die maximale Skalierung 16.383; fürMYSQLbeträgt die maximale Genauigkeit 65 und die maximale Skalierung 30).
- Alphabetisch (
- IBM Hexadecimal Floating-Point (HFP) wird mit
COMP-1/COMPUTATIONAL-1(einfache Genauigkeit, 4 Byte) undCOMP-2/COMPUTATIONAL-2(doppelte Genauigkeit, 8 Byte) oder durch Anwendung des Feldmodifikatorshfpin der Transcoder-Konfiguration unterstützt. REDEFINES-Klauseln werden für Felder mit statischer Größe unterstützt, wenn alle neu definierten Varianten dieselbe Bytegröße haben. Neu definierte Felder können nicht als Längenfeld einerOCCURS DEPENDING ON-Klausel oder alstarget_fieldeinesnull_if-Modifikators referenziert werden.OCCURS-Klauseln werden für Arrays mit fester Länge (OCCURS n TIMES), Arrays mit dynamischer Länge (OCCURS min TO max TIMES DEPENDING ON field) und gepackte Arrays mit dynamischer Länge (OCCURS UNBOUNDED DEPENDING ON field) unterstützt. Die AusdrückeASCENDING/DESCENDING KEYundINDEXED BYin einerOCCURS-Klausel werden nicht unterstützt undDEPENDING ONmuss auf einen Feldnamen im Bereich verweisen.- Nur die folgenden
USAGE-Anweisungen werden unterstützt:DISPLAY(Standard für alphanumerische und gezonte Dezimalfelder)DISPLAY-1(DBCS)NATIONAL(Standard fürPIC N-Felder; codiert alsUTF-16BE)UTF-8(Standard fürPIC U-Felder)BINARY,COMP,COMPUTATIONAL,COMP-4,COMPUTATIONAL-4,COMP-5,COMPUTATIONAL-5COMP-3,COMPUTATIONAL-3,PACKED-DECIMALCOMP-1,COMPUTATIONAL-1,COMP-2,COMPUTATIONAL-2
DATEundTIMESTAMPwerden mit der Transcoder-Konfiguration unterstützt.- Null-Indikatoren werden über die Transcoder-Konfiguration unterstützt.
- Die DBCS-Felder (Double-Byte Character Set)
PIC GundPIC Nwerden unterstützt. Standardmäßig wirdPIC N-Feldern ohneUSAGE-KlauselUSAGE NATIONAL(UTF-16BE) zugewiesen. Wenn Sie einPIC N-Feld als DBCS verwenden möchten, geben Sie entwederUSAGE DISPLAY-1im Copybook an oder überschreiben Sie die Zeichencodierung in der Transcoder-Konfiguration. - Zeichenfolgen mit variabler Länge werden über die Transcoder-Konfiguration unterstützt.
- Die
SIGN-Klausel (LEADING,TRAILING,SEPARATE CHARACTER) wird unterstützt. - Kommentare werden unterstützt.
Unterstützung für Datums- und Zeitstempelfelder
Mainframe Connector unterstützt das Decodieren und Codieren von Datums- und Zeitstempelfeldern mit den Feldmodifikatoren format_date und format_timestamp in der Transcoder-Konfiguration (--transcode-configuration). Sie können diese Modifikatoren mit field_suffixes auf übereinstimmende Felder oder mit field_overrides auf bestimmte Felder anwenden:
{
"field_suffixes": [
{
"suffix": "SUFFIX_STRING",
"modifier": {
"format_date": {
"formats": [
{
"size": FIELD_SIZE,
"pattern": "FORMAT_PATTERN"
}
]
}
}
}
]
}
In der folgenden Liste werden die Konfigurationsattribute ausführlicher beschrieben:
suffix: Stimmt mit jedem Copybook-Feld überein, dessen Name mit-SUFFIX_STRINGoder_SUFFIX_STRINGendet (Groß-/Kleinschreibung wird nicht berücksichtigt). Achten Sie darauf, dasssuffixkeinen führenden Bindestrich oder Unterstrich enthält. Alternativ können Siefield_overridesmit"field": "FIELD_NAME"verwenden, um ein einzelnes Feld anzugeben.format_date/format_timestamp: Definiert den Modifikator, der zum Parsen oder Formatieren des Felds verwendet wird:format_datekann auf Stringfelder mit Größenangabe (PIC X) oder ganzzahlige numerische Felder (z. B.PIC 9(n),COMPoderCOMP-3mit Skalierung0und Genauigkeit bis zu 18, die vor der Formatierung dynamisch in ihre vorzeichenlose Stringdarstellung konvertiert werden) angewendet werden.format_timestampkann auf Stringfelder mit Größenangabe (PIC X) angewendet werden. Zeitstempel werden in UTC interpretiert, sofern im Muster keine Zeitzone oder kein Versatz enthalten ist.
formats: Eine Liste vonDateTimeFormat-Objekten, die jeweils Folgendes angeben:size: Die Größe des Felds, auf das das Muster angewendet wird (Bytelänge für Stringfelder oder Genauigkeit für numerische Felder).pattern: Ein Datums- oder Zeitstempelmuster. Beim Decodieren (qsam decode) werden Formate, die der Größe des Felds entsprechen, der Reihe nach ausgewertet, bis eines übereinstimmt. Während der Codierung (qsam encode) wird nur das erste übereinstimmende Format für die Größe des Felds verwendet. Weitere Informationen zu gültigen Formaten finden Sie unter Unterstützte Datums- und Zeitstempelformate.
- Suffixe entfernen (optional): Wenn Sie
-SUFFIX_STRINGoder_SUFFIX_STRINGaus dem Namen des Ausgabefelds entfernen möchten, fügen Sie dem Arraytransformationsin Ihrer Transcoder-Konfiguration einerename-Transformation hinzu.
Beispiele
So formatieren Sie 8-Byte-Felder, die mit
-DT8oder_DT8enden, alsDATEmit dem MusteryyyyMMddund 10-Byte-Felder, die mit-DToder_DTenden, mitMM-dd-yyyyoderMM/dd/yyyy:{ "field_suffixes": [ { "suffix": "DT8", "modifier": { "format_date": { "formats": [ { "size": 8, "pattern": "yyyyMMdd" } ] } } }, { "suffix": "DT", "modifier": { "format_date": { "formats": [ { "size": 10, "pattern": "MM-dd-yyyy" }, { "size": 10, "pattern": "MM/dd/yyyy" } ] } } } ] }So formatieren Sie 26-Byte-Felder, die auf
-TIMESTAMP,_TIMESTAMP,-TSoder_TSenden, alsTIMESTAMPmit dem Musteryyyy-MM-dd HH.mm.ss.SSSSSSund entfernen das Suffix aus den Namen der Ausgabespalten:{ "field_suffixes": [ { "suffix": "TIMESTAMP", "modifier": { "format_timestamp": { "formats": [ { "size": 26, "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS" } ] } } }, { "suffix": "TS", "modifier": { "format_timestamp": { "formats": [ { "size": 26, "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS" } ] } } } ], "transformations": [ { "rename": { "find": "^(.*)[-_](TIMESTAMP|TS)$", "replace": "$1" } } ] }
Unterstützung für Null-Indikatoren
Mainframe Connector unterstützt Null-Indikatoren über den Feldmodifikator null_if in der Transcoder-Konfiguration (--transcode-configuration).
Wenn Sie einen suffixbasierten Null-Indikator konfigurieren möchten (wobei ein Feld wie COL1-NID als Null-Indikator für COL1 im selben Datensatz fungiert), definieren Sie einen Eintrag in field_suffixes mit "is_inverse": true und "target_field": "$self":
{
"field_suffixes": [
{
"suffix": "NULL_INDICATOR_NAME",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "NULL_VALUE",
"non_null_value": "NOT_NULL_VALUE"
}
}
}
]
}
In der folgenden Liste werden die Parameter beschrieben, mit denen Sie Null-Indikatoren konfigurieren können:
suffix: Entspricht den Suffixen-NULL_INDICATORNAMEoderNULL_INDICATOR_NAME, die ein Null-Indikatorfeld in einem Copybook identifizieren.is_inverse: Wenn für einFieldSuffixauftruegesetzt, wird der Modifikator auf das gleichgeordnete Feld angewendet, dessen Name mit dem Indikatorfeld ohne das Suffix übereinstimmt (z. B.COL1, wenn der IndikatorCOL1-NID1ist)."$self"bezieht sich auf das Indikatorfeld selbst. Sie könnennull_ifauch direkt auf ein bestimmtes Feld anwenden. Verwenden Sie dazufield_overridesund legen Sie fürtarget_fieldden Namen des Indikatorfelds fest.null_valueodernull_values: Gibt den einzelnen Wert (null_value) oder die Liste der Werte (null_values) intarget_fieldan, die signalisieren, dass das referenzierte Feldnullist.non_null_valueodernon_null_values: (Optional) Gibt den einzelnen Wert (non_null_value) oder die Liste von Werten (non_null_values) intarget_fieldan, um zu signalisieren, dass das referenzierte Feld nichtnullist. Wenn der Wert weggelassen wird, wird jeder Wert außernull_valueodernull_valuesals nicht null behandelt. Es muss mindestensnull_value(s)odernon_null_value(s)angegeben werden.- Null-Indikatorfeld ausschließen oder beibehalten: Standardmäßig wird das Null-Indikatorfeld als Spalte im Ausgabeschema beibehalten. Wenn Sie das Null-Indikatorfeld aus der Ausgabetabelle weglassen, es aber während der Transcodierung verwenden möchten, fügen Sie im Array
transformationseineexclude-Transformation für das Indikatorfeld hinzu. Wenden Sie den Modifikatorfillernicht auf ein Null-Indikatorfeld an, dafillerdie Decodierung des Felds vollständig überspringt. - Feldtyp des Indikators überschreiben: (Optional) Wenn Sie erzwingen möchten, dass ein Null-Indikatorfeld als
bytesoderbinarydecodiert wird, fügen Sie eine nicht inversefield_suffixes-Regel (oderfield_overrides-Regel) für das Indikatorfeld mit"modifier": { "bytes": {} }oder"modifier": { "binary": {} }hinzu. Geben Sie fürbytesdienull_valueundnon_null_valueals hexadezimale Strings an (z. B."FF"oder"00").
Beispiele
In den folgenden Beispielen werden COL1-NID1 und FIELD-NID2 aus der Ausgabetabelle ausgeschlossen, nachdem sie als Null-Indikatoren ausgewertet wurden, während COL2-NULL im Ausgabeschema beibehalten wird.
Copybook-Snippet:
01 REC.
10 COL1-NID1 PIC S9(4) USAGE COMP.
10 COL1 PIC S9(6) USAGE COMP.
10 FIELD PIC X(10).
10 FIELD-NID2 PIC X(1).
10 COL2 PIC X(10).
10 COL2-NULL PIC X(1).
Transcoder-Konfiguration (transcode-configuration.json):
{
"field_suffixes": [
{
"suffix": "NID1",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "-1",
"non_null_value": "0"
}
}
},
{
"suffix": "NID2",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "?"
}
}
},
{
"suffix": "NULL",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "?"
}
}
}
],
"transformations": [
{
"exclude": {
"field": "COL1-NID1"
}
},
{
"exclude": {
"field": "FIELD-NID2"
}
}
]
}
Unterstützung für DBCS-Felder
Beachten Sie bei der Verwendung von DBCS-Feldern (PIC G oder PIC N mit USAGE DISPLAY-1) Folgendes:
- In
PIC G-Feldern mussUSAGE DISPLAY-1explizit angegeben werden. PIC N-Felder ohneUSAGE-Klausel werden standardmäßig aufUSAGE NATIONAL(UTF-16BE) gesetzt. Wenn Sie einPIC N-Feld als DBCS-Feld behandeln möchten, geben SieUSAGE DISPLAY-1im Copybook an (oder überschreiben Sie die Codierung in der Transcoder-Konfiguration).- Standardmäßig werden
USAGE DISPLAY-1-Felder mit dem DBCS-Zeichensatzcp300(x-IBM300) decodiert und codiert. Dieser erwartet rohe DBCS-Bytes ohne die Steuerzeichen „Shift-Out“ (0x0E) und „Shift-In“ (0x0F). - Wenn Sie einen anderen DBCS-Zeichensatz (z. B.
Cp834) oder einen Multi-Byte-Zeichensatz (MBCS) verwenden möchten, der Shift-Out- (0x0E) und Shift-In-Bytes (0x0F) verwendet (z. B.x-IBM930,x-IBM933,x-IBM935,x-IBM937,x-IBM939,x-IBM942,x-IBM942C,x-IBM943,x-IBM943C,x-IBM949,x-IBM949C,x-IBM950,x-IBM964,x-IBM970oderx-IBM1364), konfigurieren Sie den Feldmodifikatorstringin der Transcoder-Konfiguration (--transcode-configuration).
Sie können die DBCS-Codierung global für alle USAGE DISPLAY-1-Felder mit defaults.dbcs oder für bestimmte Felder mit field_overrides oder field_suffixes festlegen:
{
"defaults": {
"dbcs": {
"string": {
"encoding": "x-IBM930"
}
}
}
}
Unterstützung für Zeichenfolgen mit variabler Länge
Der Copybook-Parser unterstützt Gruppenfelder für Zeichenstrings mit variabler Länge mithilfe des Feldmodifikators varlen in der Transcoder-Konfiguration:
10 VAR-GRP.
15 VAR-LEN PIC 9(4) USAGE COMP.
15 VAR-TEXT PIC X(50).
Beachten Sie bei Verwendung des Feldmodifikators varlen Folgendes:
Wenden Sie den Modifikator
varlenauf das Gruppenelement (z. B.VAR-GRP) an. Verwenden Sie dazufield_overridesoderfield_suffixesin der Transcoder-Konfiguration:{ "field_overrides": [ { "field": "VAR-GRP", "modifier": { "varlen": {} } } ] }Das Gruppenelement muss genau zwei Unterfelder enthalten:
- Das erste Unterfeld muss in eine 64-Bit-Ganzzahl (
LONG, z. B. ein binäresCOMP- oder ein gezontes dezimales Ganzzahlfeld) decodiert werden, die die Bytelänge der Stringdaten angibt. - Das zweite Unterfeld muss ein unverändertes Stringfeld sein (z. B.
PIC X(n),PIC N(n)oderPIC U(n)).
- Das erste Unterfeld muss in eine 64-Bit-Ganzzahl (
Es sind keine spezifischen Suffixe für Unterfelder (wie
-LENoder-TEXT) erforderlich. Die resultierende Spalte im Ausgabeschema verwendet den Namen des Gruppenelements (VAR-GRP).
Nicht unterstützte Felder und Konstrukte
In den folgenden Abschnitten werden die Felder und Konstrukte beschrieben, die vom Copybook-Parser nicht unterstützt werden.
Nicht unterstützte COBOL-Konstrukte
Der Copybook-Parser kann die folgenden COBOL-Konstrukte parsen, obwohl diese Konstrukte nicht unterstützt werden. Wenn Sie diese Konstrukte in Ihrem Copybook verwenden, zeigt Mainframe Connector einen Fehler an:
ALIGNEDBLANK WHEN ZEROCOMMON,OWN,LOCALDYNAMIC LENGTH(z. B.PIC X DYNAMIC LENGTHoderPIC U DYNAMIC LENGTH LIMIT n)INTEGER,STRINGJUSTIFIEDASCENDING/DESCENDING KEYinOCCURSINDEXED BYinOCCURSRECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
Nicht unterstützte Datentypen
Die folgenden USAGE-Typen können von der Grammatik geparst werden, werden aber vom Copybook-Compiler nicht unterstützt:
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK