Mainframe Connector utilizza un parser basato su ANTLR4 che supporta i copybook COBOL standard.
Questo documento elenca le attività di pre-elaborazione eseguite dall'analizzatore sintattico del copybook, i tipi di dati supportati e le limitazioni di utilizzo, nonché come configurare i modificatori di campo utilizzando la configurazione del transcoder con i comandi qsam decode e qsam
encode.
Pre-elaborazione
Prima di analizzare un copybook, il parser del copybook pre-elabora i dati ed esegue i seguenti passaggi:
- Rimuove le righe di commento (
*nella colonna 7 o commenti*>e*>CEincorporati). - Risolve la continuazione della riga (
-nella colonna 7 seguita da un valore letterale tra virgolette). - Cancella le aree dei numeri di sequenza (colonne 1-6) e la colonna 73 e successive. Il codice deve iniziare alla colonna 8 o successiva.
- Conserva le istruzioni specifiche del preprocessore come
EJECT,SKIP1,SKIP2,SKIP3eTITLE. Queste istruzioni vengono analizzate, ma ignorate. I copybook contenenti parametri del preprocessore che possono essere utilizzati daCOPY REPLACINGnon sono supportati dall'analizzatore sintattico dei copybook. In questi copybook, gli identificatori sono racchiusi tra due punti (:).
Tipi di dati supportati e limitazioni
Di seguito sono riportati i tipi di dati supportati dal parser del copybook e le limitazioni per il loro utilizzo:
- In un copybook è consentito un solo record
01di primo livello e il record01non può avere una clausolaOCCURS. - I campi di livello
66(RENAMES/alias) e di livello77(autonomo) non sono supportati. Il livello88(nomi delle condizioni) viene analizzato e ignorato. - Tutti i campi elementari (non di gruppo) devono avere una clausola
PICTURE, ad eccezione dei campi con rappresentazione in virgola mobile esadecimali (COMP-1eCOMP-2). Sono supportati i seguenti campiPICTURE:- Alfabetico (
PIC A), alfanumerico (PIC X) e alfanumerico modificato (A,X,9,B,0,/). PIC G(DBCS; richiedeUSAGE DISPLAY-1).PIC N(nazionale o DBCS) e modificato a livello nazionale (N,B,0,/).PIC U(UTF-8), inclusoPIC U BYTE-LENGTH n.- Numerico (
9,S,V) e numerico modificato ($,B,/,V,Z,0,9,,,.,*,+,-,CR,DB). Tieni presente chePIC P(posizione di scalabilità) non è supportato. - I campi decimali a zone e decimali compressi con precisione fino a 18 vengono decodificati in tipi a 64 bit (
LONGoDECIMAL64) e i campi con precisione superiore vengono decodificati in tipi con precisione arbitraria (BIG_INTEGERoBIG_DECIMAL). Quandoschema_validation_modeè impostato suBIG_QUERY, la precisione massima supportata è 76 (BIGNUMERIC) e la scalabilità massima è 38 (perPOSTGRES, la precisione massima è 147.455 e la scalabilità massima è 16.383; perMYSQL, la precisione massima è 65 e la scalabilità massima è 30).
- Alfabetico (
- La rappresentazione in virgola mobile esadecimale (HFP) di IBM è supportata utilizzando
COMP-1/COMPUTATIONAL-1(precisione singola, 4 byte) eCOMP-2/COMPUTATIONAL-2(precisione doppia, 8 byte) o applicando il modificatore di campohfpnella configurazione del transcodificatore. - Le clausole
REDEFINESsono supportate nei campi di dimensioni statiche quando tutte le varianti ridefinite hanno le stesse dimensioni in byte. I campi ridefiniti non possono essere indicati come campo di lunghezza di una clausolaOCCURS DEPENDING ONo cometarget_fielddi un modificatorenull_if. - Le clausole
OCCURSsono supportate per gli array di lunghezza fissa (OCCURS n TIMES), gli array di lunghezza dinamica (OCCURS min TO max TIMES DEPENDING ON field) e gli array di lunghezza dinamica compressi (OCCURS UNBOUNDED DEPENDING ON field). Le frasiASCENDING/DESCENDING KEYeINDEXED BYin una clausolaOCCURSnon sono supportate eDEPENDING ONdeve fare riferimento a un nome di campo nell'ambito. - Sono supportate solo le seguenti clausole
USAGE:DISPLAY(valore predefinito per i campi alfanumerici e decimali con zona)DISPLAY-1(DBCS)NATIONAL(valore predefinito per i campiPIC N; codificato comeUTF-16BE)UTF-8(valore predefinito per i campiPIC U)BINARY,COMP,COMPUTATIONAL,COMP-4,COMPUTATIONAL-4,COMP-5,COMPUTATIONAL-5COMP-3,COMPUTATIONAL-3,PACKED-DECIMALCOMP-1,COMPUTATIONAL-1,COMP-2,COMPUTATIONAL-2
DATEeTIMESTAMPsono supportati utilizzando la configurazione del transcoder.- Gli indicatori null sono supportati utilizzando la configurazione del transcodificatore.
- Sono supportati i campi
PIC GePIC Ndel set di caratteri a doppio byte (DBCS). Per impostazione predefinita, ai campiPIC Nsenza una clausolaUSAGEviene assegnatoUSAGE NATIONAL(UTF-16BE). Per utilizzare un campoPIC Ncome DBCS, specificaUSAGE DISPLAY-1nel copybook o esegui l'override della codifica dei caratteri nella configurazione del transcoder. - Le stringhe di caratteri di lunghezza variabile sono supportate utilizzando la configurazione del transcoder.
- La clausola
SIGN(LEADING,TRAILING,SEPARATE CHARACTER) è supportata. - I commenti sono supportati.
Supporto per i campi di data e timestamp
Mainframe Connector supporta la decodifica e la codifica dei campi di data e timestamp utilizzando i modificatori di campo format_date e format_timestamp nella configurazione del transcodificatore (--transcode-configuration). Puoi applicare questi modificatori ai campi corrispondenti utilizzando field_suffixes o a campi specifici utilizzando field_overrides:
{
"field_suffixes": [
{
"suffix": "SUFFIX_STRING",
"modifier": {
"format_date": {
"formats": [
{
"size": FIELD_SIZE,
"pattern": "FORMAT_PATTERN"
}
]
}
}
}
]
}
Il seguente elenco descrive in modo più dettagliato le proprietà di configurazione:
suffix: corrisponde a qualsiasi campo del copybook il cui nome termina con-SUFFIX_STRINGo_SUFFIX_STRING(senza distinzione tra maiuscole e minuscole). Assicurati chesuffixnon contenga un trattino o un trattino basso iniziale. In alternativa, utilizzafield_overridescon"field": "FIELD_NAME"per scegliere come target un singolo campo.format_date/format_timestamp: definisce il modificatore utilizzato per analizzare o formattare il campo:format_datepuò essere applicato a campi di stringhe con dimensioni (PIC X) o campi numerici interi (comePIC 9(n),COMPoCOMP-3con scala0e precisione fino a 18, che vengono convertiti dinamicamente nella loro rappresentazione di stringa non firmata prima della formattazione).format_timestamppuò essere applicato ai campi stringa con dimensioni (PIC X). I timestamp vengono interpretati in UTC, a meno che nel pattern non sia incluso un fuso orario o un offset.
formats: un elenco di oggettiDateTimeFormat, ognuno dei quali specifica:size: le dimensioni del campo a cui si applica il pattern (lunghezza in byte per i campi stringa o precisione per i campi numerici).pattern: un pattern di data o timestamp. Durante la decodifica (qsam decode), i formati corrispondenti alle dimensioni del campo vengono valutati in ordine fino a quando non ne viene trovato uno corrispondente. Durante la codifica (qsam encode), viene utilizzato solo il primo formato corrispondente per le dimensioni del campo. Per saperne di più sui formati validi, consulta Formati di data e timestamp supportati.
- Rimozione dei suffissi (facoltativo): per rimuovere
-SUFFIX_STRINGo_SUFFIX_STRINGdal nome del campo di output, aggiungi una trasformazionerenameall'arraytransformationsnella configurazione del transcodificatore.
Esempi
Per formattare i campi di 8 byte che terminano con
-DT8o_DT8comeDATEcon il patternyyyyMMdde i campi di 10 byte che terminano con-DTo_DTconMM-dd-yyyyoMM/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" } ] } } } ] }Per formattare i campi di 26 byte che terminano con
-TIMESTAMP,_TIMESTAMP,-TSo_TScomeTIMESTAMPcon il patternyyyy-MM-dd HH.mm.ss.SSSSSSe rimuovere il suffisso dai nomi delle colonne di output:{ "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" } } ] }
Supporto per gli indicatori null
Mainframe Connector supporta gli indicatori null tramite il modificatore di campo null_if nella configurazione del transcodificatore (--transcode-configuration).
Per configurare un indicatore null basato su suffisso (dove un campo come COL1-NID funge da indicatore null per COL1 nello stesso record), definisci una voce in field_suffixes con "is_inverse": true e "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"
}
}
}
]
}
Il seguente elenco descrive i parametri che puoi utilizzare per configurare gli indicatori null:
suffix: corrisponde ai suffissi-NULL_INDICATORNAMEoNULL_INDICATOR_NAMEche identificano un campo indicatore null in un copybook.is_inverse: se impostato sutruein unFieldSuffix, il modificatore viene applicato al campo di pari livello il cui nome corrisponde al campo indicatore senza il suffisso (ad esempio,COL1quando l'indicatore èCOL1-NID1) e"$self"si riferisce al campo indicatore stesso. Puoi anche applicarenull_ifdirettamente a un campo specifico utilizzandofield_overridese impostaretarget_fieldsul nome del campo indicatore.null_valueonull_values: specifica il singolo valore (null_value) o l'elenco di valori (null_values) intarget_fieldche indicano che il campo di riferimento ènull.non_null_valueonon_null_values: (facoltativo) specifica il singolo valore (non_null_value) o l'elenco di valori (non_null_values) intarget_fieldper segnalare che il campo di riferimento non ènull. Se omesso, qualsiasi valore diverso danull_valueonull_valuesviene considerato non nullo. È necessario specificare almeno un valore pernull_value(s)onon_null_value(s).- Esclusione o conservazione del campo dell'indicatore null: per impostazione predefinita, il campo dell'indicatore null viene mantenuto come colonna nello schema di output. Per omettere il campo dell'indicatore null dalla tabella di output, ma utilizzarlo comunque durante la transcodifica, aggiungi una trasformazione
excludeper il campo dell'indicatore nell'arraytransformations(non applicare il modificatorefillera un campo dell'indicatore null, poichéfillersalta completamente la decodifica del campo). - Override del tipo di campo indicatore: (facoltativo) per forzare la decodifica di un campo indicatore null come
bytesobinary, aggiungi una regolafield_suffixes(ofield_overrides) non inversa per il campo indicatore con"modifier": { "bytes": {} }o"modifier": { "binary": {} }. Perbytes, espriminull_valueenon_null_valuecome stringhe esadecimali (ad esempio,"FF"o"00").
Esempi
Negli esempi seguenti, COL1-NID1 e FIELD-NID2 vengono esclusi dalla tabella di output dopo essere stati valutati come indicatori null, mentre COL2-NULL viene mantenuto nello schema di output.
Snippet di copybook:
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).
Configurazione del transcodificatore (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"
}
}
]
}
Supporto per i campi DBCS
Quando utilizzi i campi DBCS (PIC G o PIC N con USAGE DISPLAY-1), assicurati di quanto segue:
- I campi
PIC Gdevono specificare esplicitamenteUSAGE DISPLAY-1. - I campi
PIC Nsenza una clausolaUSAGEhanno come valore predefinitoUSAGE NATIONAL(UTF-16BE). Per trattare un campoPIC Ncome un campo DBCS, specificaUSAGE DISPLAY-1nel copybook (o esegui l'override della codifica nella configurazione del transcodificatore). - Per impostazione predefinita, i campi
USAGE DISPLAY-1vengono decodificati e codificati utilizzando il set di caratteri DBCScp300(x-IBM300), che prevede byte DBCS non elaborati senza caratteri di controllo shift-out (0x0E) e shift-in (0x0F). - Per utilizzare un set di caratteri DBCS diverso (ad esempio
Cp834) o un set di caratteri multi-byte (MBCS) che utilizza byte shift-out (0x0E) e shift-in (0x0F) (ad esempiox-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-IBM970ox-IBM1364), configura il modificatore di campostringnella configurazione del transcoder (--transcode-configuration).
Puoi impostare la codifica DBCS a livello globale per tutti i campi USAGE DISPLAY-1 utilizzando
defaults.dbcs
o per campi specifici utilizzando field_overrides o field_suffixes:
{
"defaults": {
"dbcs": {
"string": {
"encoding": "x-IBM930"
}
}
}
}
Supporto per stringhe di caratteri di lunghezza variabile
Il parser del copybook supporta i campi di gruppo di stringhe di caratteri di lunghezza variabile utilizzando il modificatore di campo varlen nella configurazione del transcoder:
10 VAR-GRP.
15 VAR-LEN PIC 9(4) USAGE COMP.
15 VAR-TEXT PIC X(50).
Quando utilizzi il modificatore di campo varlen, assicurati di quanto segue:
Applica il modificatore
varlenall'elemento del gruppo (ad esempioVAR-GRP) utilizzandofield_overridesofield_suffixesnella configurazione del transcodificatore:{ "field_overrides": [ { "field": "VAR-GRP", "modifier": { "varlen": {} } } ] }L'elemento del gruppo deve contenere esattamente due sottocampi:
- Il primo sottocampo deve essere decodificato in un numero intero a 64 bit (
LONG, ad esempio un campo intero binarioCOMPo decimale a zone) che specifica la lunghezza in byte dei dati della stringa. - Il secondo sottocampo deve essere un campo stringa non modificato (ad esempio
PIC X(n),PIC N(n)oPIC U(n)).
- Il primo sottocampo deve essere decodificato in un numero intero a 64 bit (
Non sono richiesti suffissi di sottocampi specifici (come
-LENo-TEXT) e la colonna risultante nello schema di output utilizza il nome dell'elemento del gruppo (VAR-GRP).
Campi e costrutti non supportati
Le sezioni seguenti descrivono i campi e i costrutti non supportati dal parser del copybook.
Costrutti COBOL non supportati
Il parser del copybook può analizzare i seguenti costrutti COBOL, anche se non sono supportati. Se utilizzi questi costrutti nel copybook, Mainframe Connector mostra un errore:
ALIGNEDBLANK WHEN ZEROCOMMON,OWN,LOCALDYNAMIC LENGTH(ad esempioPIC X DYNAMIC LENGTHoPIC U DYNAMIC LENGTH LIMIT n)INTEGER,STRINGJUSTIFIEDASCENDING/DESCENDING KEYinOCCURSINDEXED BYinOCCURSRECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
Tipi di dati non supportati
I seguenti tipi di USAGE possono essere analizzati dalla grammatica, ma non sono supportati dal compilatore del copybook:
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK