Mainframe Connector usa un analizador basado en ANTLR4 que admite copybooks de COBOL estándar.
En este documento, se enumeran las tareas de procesamiento previo que realiza el analizador de copybooks,
los tipos de datos admitidos y las restricciones de uso, y cómo configurar los modificadores de campos
con la configuración del transcodificador con los comandos qsam decode y qsam
encode.
Procesamiento previo:
Antes de analizar un copybook, el analizador de copybooks preprocesa los datos y realiza los siguientes pasos:
- Quita las líneas de comentarios (
*en la columna 7 o comentarios intercalados*>y*>CE). - Resuelve la continuación de línea (
-en la columna 7 seguida de un literal entre comillas). - Borra las áreas de números de secuencia (columnas 1 a 6) y la columna 73 y posteriores. El código debe comenzar en la columna 8 o una posterior.
- Conserva las declaraciones específicas del preprocesador, como
EJECT,SKIP1,SKIP2,SKIP3yTITLE. Estas declaraciones se analizan, pero se ignoran. El analizador de copybooks no admite los copybooks que contienen parámetros de preprocesador que puede usarCOPY REPLACING. En estos copybooks, los identificadores están rodeados por dos puntos (:).
Tipos de datos admitidos y restricciones
Los siguientes son los tipos de datos que admite el analizador de copybooks y las restricciones para su uso:
- Solo se permite un único registro
01de nivel superior en un copybook, y el registro01no puede tener una cláusulaOCCURS. - No se admiten los campos de nivel
66(RENAMESo alias) ni de nivel77(independiente). El nivel88(nombres de condiciones) se analiza y se ignora. - Todos los campos elementales (que no son de grupo) deben tener una cláusula
PICTURE, excepto los campos de punto flotante hexadecimales (COMP-1yCOMP-2). Se admiten los siguientes camposPICTURE:- Alfabético (
PIC A), alfanumérico (PIC X) y alfanumérico editado (A,X,9,B,0,/). PIC G(DBCS; requiereUSAGE DISPLAY-1).PIC N(nacional o DBCS) y editado nacional (N,B,0,/).PIC U(UTF-8), incluidoPIC U BYTE-LENGTH n.- Numérico (
9,S,V) y editado numérico ($,B,/,V,Z,0,9,,,.,*,+,-,CR,DB). Ten en cuenta que no se admitePIC P(posición de escalamiento). - Los campos decimales con zona y decimales empaquetados con precisión de hasta 18 se
decodifican en tipos de 64 bits (
LONGoDECIMAL64), y los campos de mayor precisión se decodifican en tipos de precisión arbitraria (BIG_INTEGERoBIG_DECIMAL). Cuandoschema_validation_modese establece enBIG_QUERY, la precisión máxima admitida es 76 (BIGNUMERIC) y la escala máxima es 38 (paraPOSTGRES, la precisión máxima es 147,455 y la escala máxima es 16,383; paraMYSQL, la precisión máxima es 65 y la escala máxima es 30).
- Alfabético (
- El punto flotante hexadecimal (HFP) de IBM se admite con
COMP-1/COMPUTATIONAL-1(precisión simple, 4 bytes) yCOMP-2/COMPUTATIONAL-2(precisión doble, 8 bytes), o aplicando el modificador de campohfpen la configuración del transcodificador. - Las cláusulas
REDEFINESse admiten en campos de tamaño estático cuando todas las variantes redefinidas tienen el mismo tamaño de bytes. No se puede hacer referencia a los campos redefinidos como el campo de longitud de una cláusulaOCCURS DEPENDING ONni como eltarget_fieldde un modificadornull_if. - Las cláusulas
OCCURSson compatibles con los arrays de longitud fija (OCCURS n TIMES), los arrays de longitud dinámica (OCCURS min TO max TIMES DEPENDING ON field) y los arrays de longitud dinámica empaquetados (OCCURS UNBOUNDED DEPENDING ON field). Las frasesASCENDING/DESCENDING KEYyINDEXED BYen una cláusulaOCCURSno son compatibles, yDEPENDING ONdebe hacer referencia a un nombre de campo en el alcance. - Solo se admiten las siguientes cláusulas
USAGE:DISPLAY(predeterminado para campos alfanuméricos y decimales con zona)DISPLAY-1(DBCS)NATIONAL(predeterminado para los camposPIC N; codificado comoUTF-16BE)UTF-8(predeterminado para los camposPIC U)BINARY,COMP,COMPUTATIONAL,COMP-4,COMPUTATIONAL-4,COMP-5,COMPUTATIONAL-5COMP-3,COMPUTATIONAL-3,PACKED-DECIMALCOMP-1,COMPUTATIONAL-1,COMP-2,COMPUTATIONAL-2
DATEyTIMESTAMPse admiten con la configuración del transcodificador.- Los indicadores nulos se admiten con la configuración del transcodificador.
- Se admiten los campos
PIC GyPIC Ndel conjunto de grupo de caracteres de doble byte (DBCS). De forma predeterminada, a los camposPIC Nsin una cláusulaUSAGEse les asignaUSAGE NATIONAL(UTF-16BE). Para usar un campoPIC Ncomo DBCS, especificaUSAGE DISPLAY-1en el copybook o anula su codificación de caracteres en la configuración del transcodificador. - Las cadenas de caracteres de longitud variable se admiten con la configuración del transcodificador.
- Se admite la
cláusula
SIGN(LEADING,TRAILING,SEPARATE CHARACTER). - Se admiten comentarios.
Compatibilidad con campos de fecha y marca de tiempo
Mainframe Connector admite la decodificación y codificación de campos de fecha y marca de tiempo con los modificadores de campo format_date y format_timestamp en la configuración del transcodificador (--transcode-configuration). Puedes aplicar estos modificadores en los campos coincidentes con field_suffixes o en campos específicos con field_overrides:
{
"field_suffixes": [
{
"suffix": "SUFFIX_STRING",
"modifier": {
"format_date": {
"formats": [
{
"size": FIELD_SIZE,
"pattern": "FORMAT_PATTERN"
}
]
}
}
}
]
}
En la siguiente lista, se describen las propiedades de configuración con más detalle:
suffix: Coincide con cualquier campo de copybook cuyo nombre termine con-SUFFIX_STRINGo_SUFFIX_STRING(no distingue mayúsculas de minúsculas). Asegúrate de quesuffixno contenga un guion ni un guion bajo iniciales. Como alternativa, usafield_overridescon"field": "FIELD_NAME"para orientar un campo individual.format_date/format_timestamp: Define el modificador que se usa para analizar o dar formato al campo:format_datese puede aplicar a campos de cadena con tamaño (PIC X) o campos numéricos enteros (comoPIC 9(n),COMPoCOMP-3con escala0y precisión de hasta 18, que se convierten de forma dinámica en su representación de cadena sin firma antes de darles formato).format_timestampse puede aplicar a campos de cadena con tamaño (PIC X). Las marcas de tiempo se interpretan en UTC, a menos que se incluya una zona horaria o un desplazamiento en el patrón.
formats: Es una lista de objetosDateTimeFormat, cada uno de los cuales especifica lo siguiente:size: Es el tamaño del campo al que se aplica el patrón (longitud en bytes para los campos de cadena o precisión para los campos numéricos).pattern: Es un patrón de fecha o marca de tiempo. Durante la decodificación (qsam decode), los formatos que coinciden con el tamaño del campo se evalúan en orden hasta que uno coincida. Durante la codificación (qsam encode), solo se usa el primer formato coincidente para el tamaño del campo. Para obtener más información sobre los formatos válidos, consulta Formatos de fecha y marca de tiempo compatibles.
- Quita sufijos (opcional): Para quitar
-SUFFIX_STRINGo_SUFFIX_STRINGdel nombre del campo de salida, agrega una transformaciónrenameal arraytransformationsen la configuración del transcodificador.
Ejemplos
Para dar formato a los campos de 8 bytes que terminan con
-DT8o_DT8comoDATEcon el patrónyyyyMMdd, y los campos de 10 bytes que terminan con-DTo_DTconMM-dd-yyyyoMM/dd/yyyy, haz lo siguiente:{ "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" } ] } } } ] }Para dar formato a los campos de 26 bytes que terminan con
-TIMESTAMP,_TIMESTAMP,-TSo_TScomoTIMESTAMPcon el patrónyyyy-MM-dd HH.mm.ss.SSSSSSy quitar el sufijo de los nombres de las columnas de salida, haz lo siguiente:{ "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" } } ] }
Compatibilidad con indicadores nulos
Mainframe Connector admite indicadores nulos a través del modificador de campo null_if en la configuración del transcodificador (--transcode-configuration).
Para configurar un indicador nulo basado en sufijos (en el que un campo como COL1-NID
actúa como el indicador nulo para COL1 en el mismo registro), define una entrada en
field_suffixes con "is_inverse": true y "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"
}
}
}
]
}
En la siguiente lista, se describen los parámetros que puedes usar para configurar los indicadores nulos:
suffix: Corresponde a los sufijos-NULL_INDICATORNAMEoNULL_INDICATOR_NAMEque identifican un campo de indicador nulo en un copybook.is_inverse: Cuando se establece entrueen unFieldSuffix, el modificador se aplica al campo hermano cuyo nombre coincide con el campo indicador sin el sufijo (por ejemplo,COL1cuando el indicador esCOL1-NID1), y"$self"se refiere al campo indicador en sí. También puedes aplicarnull_ifdirectamente en un campo específico confield_overridesy establecertarget_fielden el nombre del campo indicador.null_valueonull_values: Especifica el valor único (null_value) o la lista de valores (null_values) entarget_fieldque indican que el campo al que se hace referencia esnull.non_null_valueonon_null_values: (Opcional) Especifica el valor único (non_null_value) o la lista de valores (non_null_values) entarget_fieldpara indicar que el campo al que se hace referencia no esnull. Si se omite, cualquier valor que no seanull_valueonull_valuesse trata como no nulo. Se debe especificar al menos uno de los valoresnull_value(s)onon_null_value(s).- Excluye o conserva el campo de indicador nulo: De forma predeterminada, el
campo de indicador nulo se conserva como una columna en el esquema de salida. Para omitir el
campo de indicador nulo de la tabla de salida mientras se usa durante
la transcodificación, agrega una
transformación
excludepara el campo de indicador en el arraytransformations(no apliques el modificadorfillera un campo de indicador nulo, ya quefilleromite la decodificación del campo por completo). - Anula el tipo de campo de indicador: (Opcional) Para forzar que un campo de indicador nulo se decodifique como
bytesobinary, agrega una reglafield_suffixes(ofield_overrides) no inversa para el campo de indicador con"modifier": { "bytes": {} }o"modifier": { "binary": {} }. Parabytes, expresanull_valueynon_null_valuecomo cadenas hexadecimales (por ejemplo,"FF"o"00").
Ejemplos
En los siguientes ejemplos, COL1-NID1 y FIELD-NID2 se excluyen de la
tabla de salida después de evaluarse como indicadores nulos, mientras que COL2-NULL se
conserva en el esquema de salida.
Fragmento de 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).
Configuración del transcodificador (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"
}
}
]
}
Compatibilidad con campos de DBCS
Cuando uses campos DBCS (PIC G o PIC N con USAGE DISPLAY-1), asegúrate de lo siguiente:
- Los campos
PIC Gdeben especificarUSAGE DISPLAY-1de forma explícita. - Los campos
PIC Nsin una cláusulaUSAGEse establecen de forma predeterminada enUSAGE NATIONAL(UTF-16BE). Para tratar un campoPIC Ncomo un campo DBCS, especificaUSAGE DISPLAY-1en el copybook (o anula su codificación en la configuración del transcodificador). - De forma predeterminada, los campos
USAGE DISPLAY-1se decodifican y codifican con el grupo de caracteres DBCScp300(x-IBM300), que espera bytes DBCS sin procesar sin caracteres de control de salida (0x0E) y de entrada (0x0F). - Para usar un grupo de caracteres DBCS diferente (como
Cp834) o un grupo de caracteres de varios bytes (MBCS) que use bytes de salida (0x0E) y de entrada (0x0F) (comox-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 el modificador de campostringen la configuración del transcodificador (--transcode-configuration).
Puedes establecer la codificación DBCS de forma global para todos los campos USAGE DISPLAY-1 con
defaults.dbcs
o para campos específicos con field_overrides o field_suffixes:
{
"defaults": {
"dbcs": {
"string": {
"encoding": "x-IBM930"
}
}
}
}
Compatibilidad con cadenas de caracteres de longitud variable
El analizador de copybook admite campos de grupo de cadenas de caracteres de longitud variable con
el modificador de campo varlen en la
configuración del transcodificador:
10 VAR-GRP.
15 VAR-LEN PIC 9(4) USAGE COMP.
15 VAR-TEXT PIC X(50).
Cuando uses el modificador de campo varlen, asegúrate de lo siguiente:
Aplica el modificador
varlenal elemento del grupo (por ejemplo,VAR-GRP) confield_overridesofield_suffixesen la configuración del Transcoder:{ "field_overrides": [ { "field": "VAR-GRP", "modifier": { "varlen": {} } } ] }El elemento de grupo debe contener exactamente dos subcampos:
- El primer subcampo debe decodificarse en un número entero de 64 bits (
LONG, como un campo de número entero decimal con zona oCOMPbinario) que especifique la longitud en bytes de los datos de la cadena. - El segundo subcampo debe ser un campo de cadena sin modificar (como
PIC X(n),PIC N(n)oPIC U(n)).
- El primer subcampo debe decodificarse en un número entero de 64 bits (
No se requieren sufijos de subcampo específicos (como
-LENo-TEXT), y la columna resultante en el esquema de salida usa el nombre del elemento del grupo (VAR-GRP).
Campos y construcciones no compatibles
En las siguientes secciones, se describen los campos y las construcciones que no admite el analizador de copybooks.
Construcciones de COBOL no compatibles
El analizador de copybooks puede analizar las siguientes construcciones de COBOL, aunque no se admiten. Si usas estas construcciones en tu copybook, Mainframe Connector muestra un error:
ALIGNEDBLANK WHEN ZEROCOMMON,OWN,LOCALDYNAMIC LENGTH(comoPIC X DYNAMIC LENGTHoPIC U DYNAMIC LENGTH LIMIT n)INTEGER,STRINGJUSTIFIEDASCENDING/DESCENDING KEYenOCCURSINDEXED BYenOCCURSRECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
Tipos de datos no admitidos
La gramática puede analizar los siguientes tipos de USAGE, pero el compilador de copybook no los admite:
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK