O conector de mainframe usa um analisador baseado em ANTLR4 que é compatível com copybooks COBOL padrão.
Neste documento, listamos as tarefas de pré-processamento realizadas pelo analisador de copybook,
os tipos de dados compatíveis e as restrições de uso, além de como configurar modificadores de campo
usando a configuração do transcodificador com os comandos qsam decode e qsam
encode.
Pré-processamento
Antes de analisar um copybook, o analisador pré-processa os dados e executa as seguintes etapas:
- Remove linhas de comentário (
*na coluna 7 ou comentários inline*>e*>CE). - Resolve a continuação de linha (
-na coluna 7 seguido por um literal entre aspas). - Apaga as áreas de número de sequência (colunas 1 a 6) e a coluna 73 em diante. O código precisa começar na coluna 8 ou posterior.
- Preserva instruções específicas do pré-processador, como
EJECT,SKIP1,SKIP2,SKIP3eTITLE. Essas instruções são analisadas, mas ignoradas. Os copybooks que contêm parâmetros de pré-processador que podem ser usados porCOPY REPLACINGnão são compatíveis com o analisador de copybooks. Nesses copybooks, os identificadores são delimitados por dois-pontos (:).
Tipos de dados e restrições aceitos
Confira a seguir os tipos de dados compatíveis com o analisador de copybook e as restrições de uso:
- Apenas um único registro
01de nível superior é permitido em um copybook, e o registro01não pode ter uma cláusulaOCCURS. - Os campos de nível
66(RENAMES/ alias) e nível77(independente) não são compatíveis. O nível88(nomes de condição) é analisado e ignorado. - Todos os campos elementares (não de grupo) precisam ter uma cláusula
PICTURE, exceto os campos de usar pontos flutuantes hexadecimal (COMP-1eCOMP-2). Os seguintes camposPICTUREsão compatíveis:- Alfabético (
PIC A), alfanumérico (PIC X) e alfanumérico editado (A,X,9,B,0,/). PIC G(DBCS; requerUSAGE DISPLAY-1).PIC N(nacional ou DBCS) e editado nacionalmente (N,B,0,/).PIC U(UTF-8), incluindoPIC U BYTE-LENGTH n.- Numérico (
9,S,V) e editado numericamente ($,B,/,V,Z,0,9,,,.,*,+,-,CR,DB). Observe quePIC P(posição de escalonamento) não é compatível. - Os campos decimais zonados e decimais compactados com precisão de até 18 são
decodificados em tipos de 64 bits (
LONGouDECIMAL64), e os campos de maior precisão são decodificados em tipos de precisão arbitrária (BIG_INTEGERouBIG_DECIMAL). Quandoschema_validation_modeé definido comoBIG_QUERY, a precisão máxima aceita é 76 (BIGNUMERIC) e a escala máxima é 38 (paraPOSTGRES, a precisão máxima é 147.455 e a escala máxima é 16.383; paraMYSQL, a precisão máxima é 65 e a escala máxima é 30).
- Alfabético (
- O ponto flutuante hexadecimal (HFP, na sigla em inglês) da IBM é compatível com
COMP-1/COMPUTATIONAL-1(precisão única, 4 bytes) eCOMP-2/COMPUTATIONAL-2(precisão dupla, 8 bytes) ou com a aplicação do modificador de campohfpna configuração do transcodificador. - As cláusulas
REDEFINESsão compatíveis com campos de tamanho estático quando todas as variantes redefinidas têm o mesmo tamanho de byte. Os campos redefinidos não podem ser referenciados como o campo de comprimento de uma cláusulaOCCURS DEPENDING ONou como otarget_fieldde um modificadornull_if. - As cláusulas
OCCURSsão compatíveis com matrizes de comprimento fixo (OCCURS n TIMES), matrizes de comprimento dinâmico (OCCURS min TO max TIMES DEPENDING ON field) e matrizes de comprimento dinâmico compactadas (OCCURS UNBOUNDED DEPENDING ON field). As frasesASCENDING/DESCENDING KEYeINDEXED BYem uma cláusulaOCCURSnão são compatíveis, eDEPENDING ONprecisa referenciar um nome de campo no escopo. - Somente as seguintes cláusulas
USAGEsão compatíveis:DISPLAY(padrão para campos alfanuméricos e decimais zonados)DISPLAY-1(DBCS)NATIONAL(padrão para camposPIC N; codificado comoUTF-16BE)UTF-8(padrão para 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
DATEeTIMESTAMPsão compatíveis com a configuração do transcodificador.- Os indicadores nulos são compatíveis com a configuração do transcodificador.
- Os campos
PIC GePIC Ndo conjunto de caracteres de byte duplo (DBCS, na sigla em inglês) são compatíveis. Por padrão, os camposPIC Nsem uma cláusulaUSAGErecebemUSAGE NATIONAL(UTF-16BE). Para usar um campoPIC Ncomo DBCS, especifiqueUSAGE DISPLAY-1no copybook ou substitua a codificação de caracteres na configuração do transcodificador. - Strings de caracteres de comprimento variável são compatíveis com a configuração do transcodificador.
- A
cláusula
SIGN(LEADING,TRAILING,SEPARATE CHARACTER) é compatível. - É possível usar comentários.
Suporte para campos de data e carimbo de data/hora
O Mainframe Connector é compatível com a decodificação e codificação de campos de data e carimbo de data/hora usando os modificadores de campo format_date e format_timestamp na configuração do transcodificador (--transcode-configuration). É possível aplicar esses modificadores em campos correspondentes usando field_suffixes ou em campos específicos usando field_overrides:
{
"field_suffixes": [
{
"suffix": "SUFFIX_STRING",
"modifier": {
"format_date": {
"formats": [
{
"size": FIELD_SIZE,
"pattern": "FORMAT_PATTERN"
}
]
}
}
}
]
}
A lista a seguir descreve as propriedades de configuração em mais detalhes:
suffix: corresponde a qualquer campo de copybook cujo nome termine com-SUFFIX_STRINGou_SUFFIX_STRING(não diferencia maiúsculas de minúsculas). Verifique sesuffixnão contém um hífen ou sublinhado no início. Como alternativa, usefield_overridescom"field": "FIELD_NAME"para segmentar um campo individual.format_date/format_timestamp: define o modificador usado para analisar ou formatar o campo:format_datepode ser aplicado a campos de string dimensionados (PIC X) ou campos numéricos inteiros (comoPIC 9(n),COMPouCOMP-3com escala0e precisão de até 18, que são convertidos dinamicamente para a representação de string sem sinal antes da formatação).format_timestamppode ser aplicado a campos de string dimensionados (PIC X). Os carimbos de data/hora são interpretados em UTC, a menos que um fuso horário ou deslocamento seja incluído no padrão.
formats: uma lista de objetosDateTimeFormat, cada um especificando:size: o tamanho do campo ao qual o padrão se aplica (comprimento de bytes para campos de string ou precisão para campos numéricos).pattern: um padrão de data ou carimbo de data/hora. Durante a decodificação (qsam decode), os formatos que correspondem ao tamanho do campo são avaliados em ordem até que um deles corresponda. Durante a codificação (qsam encode), apenas o primeiro formato correspondente ao tamanho do campo é usado. Para mais informações sobre formatos válidos, consulte Formatos de data e carimbo de data/hora compatíveis.
- Remover sufixos (opcional): para remover
-SUFFIX_STRINGou_SUFFIX_STRINGdo nome do campo de saída, adicione uma transformaçãorenameà matriztransformationsna configuração da transcodificação.
Exemplos
Para formatar campos de 8 bytes que terminam com
-DT8ou_DT8comoDATEcom o padrãoyyyyMMdde campos de 10 bytes que terminam com-DTou_DTcomMM-dd-yyyyouMM/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" } ] } } } ] }Para formatar campos de 26 bytes que terminam com
-TIMESTAMP,_TIMESTAMP,-TSou_TScomoTIMESTAMPcom o padrãoyyyy-MM-dd HH.mm.ss.SSSSSSe remover o sufixo dos nomes das colunas de saída:{ "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" } } ] }
Suporte para indicadores nulos
O Mainframe Connector é compatível com indicadores nulos usando o modificador de campo null_if na configuração do transcodificador (--transcode-configuration).
Para configurar um indicador nulo baseado em sufixo (em que um campo como COL1-NID
atua como o indicador nulo para COL1 no mesmo registro), defina uma entrada em
field_suffixes com "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"
}
}
}
]
}
A lista a seguir descreve os parâmetros que podem ser usados para configurar indicadores nulos:
suffix: corresponde aos sufixos-NULL_INDICATORNAMEouNULL_INDICATOR_NAMEque identificam um campo indicador nulo em um copybook.is_inverse: quando definido comotrueem umFieldSuffix, o modificador é aplicado ao campo irmão cujo nome corresponde ao campo indicador sem o sufixo (por exemplo,COL1quando o indicador éCOL1-NID1), e"$self"se refere ao próprio campo indicador. Também é possível aplicarnull_ifdiretamente em um campo específico usandofield_overridese definirtarget_fieldcomo o nome do campo indicador.null_valueounull_values: especifica o valor único (null_value) ou a lista de valores (null_values) emtarget_fieldque sinalizam que o campo referenciado énull.non_null_valueounon_null_values: (opcional) especifica o valor único (non_null_value) ou a lista de valores (non_null_values) emtarget_fieldpara sinalizar que o campo referenciado não énull. Se omitido, qualquer valor diferente denull_valueounull_valuesserá tratado como não nulo. É preciso especificar pelo menosnull_value(s)ounon_null_value(s).- Excluir ou manter o campo indicador de nulo: por padrão, o campo indicador de nulo é mantido como uma coluna no esquema de saída. Para omitir o
campo indicador de nulo da tabela de saída enquanto ele ainda é usado durante
a transcodificação, adicione uma
transformação
excludepara o campo indicador na matriztransformations. Não aplique o modificadorfillera um campo indicador de nulo, já quefillerignora a decodificação do campo. - Substituição do tipo de campo do indicador: (opcional) para forçar um
campo de indicador nulo a ser decodificado como
bytesoubinary, adicione uma regrafield_suffixes(oufield_overrides) não inversa para o campo do indicador com"modifier": { "bytes": {} }ou"modifier": { "binary": {} }. Parabytes, expressenull_valueenon_null_valuecomo strings hexadecimais (por exemplo,"FF"ou"00").
Exemplos
Nos exemplos a seguir, COL1-NID1 e FIELD-NID2 são excluídos da
tabela de saída após serem avaliados como indicadores nulos, enquanto COL2-NULL é
mantido no esquema de saída.
Snippet do 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).
Configuração do Transcoder (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"
}
}
]
}
Suporte para campos DBCS
Ao usar campos DBCS (PIC G ou PIC N com USAGE DISPLAY-1), verifique o
seguinte:
- Os campos
PIC Gprecisam especificar explicitamenteUSAGE DISPLAY-1. - Os campos
PIC Nsem uma cláusulaUSAGEusamUSAGE NATIONAL(UTF-16BE) como padrão. Para tratar um campoPIC Ncomo um campo DBCS, especifiqueUSAGE DISPLAY-1no copybook (ou substitua a codificação dele na configuração do transcodificador). - Por padrão, os campos
USAGE DISPLAY-1são decodificados e codificados usando o conjunto de caracteres DBCScp300(x-IBM300), que espera bytes DBCS brutos sem caracteres de controle shift-out (0x0E) e shift-in (0x0F). - Para usar um conjunto de caracteres DBCS diferente (como
Cp834) ou um conjunto de caracteres de vários bytes (MBCS) que usa bytes de deslocamento para fora (0x0E) e de deslocamento para dentro (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-IBM970oux-IBM1364), configure o modificador de campostringna configuração do transcodificador (--transcode-configuration).
É possível definir a codificação DBCS globalmente para todos os campos USAGE DISPLAY-1 usando
defaults.dbcs
ou para campos específicos usando field_overrides ou field_suffixes:
{
"defaults": {
"dbcs": {
"string": {
"encoding": "x-IBM930"
}
}
}
}
Suporte para strings de caracteres de comprimento variável
O analisador de copybook é compatível com campos de grupo de strings de caracteres de comprimento variável usando
o modificador de campo varlen na
configuração do transcodificador:
10 VAR-GRP.
15 VAR-LEN PIC 9(4) USAGE COMP.
15 VAR-TEXT PIC X(50).
Ao usar o modificador de campo varlen, verifique se:
Aplique o modificador
varlenao item do grupo (por exemplo,VAR-GRP) usandofield_overridesoufield_suffixesna configuração da transcodificação:{ "field_overrides": [ { "field": "VAR-GRP", "modifier": { "varlen": {} } } ] }O item de grupo precisa conter exatamente dois subcampos:
- O primeiro subcampo precisa ser decodificado em um número inteiro de 64 bits (
LONG, como um campo de número inteiro decimalCOMPbinário ou zoneado) que especifica o comprimento em bytes dos dados da string. - O segundo subcampo precisa ser um campo de string não modificado (como
PIC X(n),PIC N(n)ouPIC U(n)).
- O primeiro subcampo precisa ser decodificado em um número inteiro de 64 bits (
Não são necessários sufixos de subcampo específicos (como
-LENou-TEXT), e a coluna resultante no esquema de saída usa o nome do item do grupo (VAR-GRP).
Campos e construções sem suporte
As seções a seguir descrevem os campos e as construções que não são compatíveis com o analisador de copybook.
Construções COBOL sem suporte
O analisador de copybook pode analisar as seguintes construções COBOL, mesmo que elas não sejam compatíveis. Se você usar essas construções no copybook, o Mainframe Connector vai mostrar um erro:
ALIGNEDBLANK WHEN ZEROCOMMON,OWN,LOCALDYNAMIC LENGTH(comoPIC X DYNAMIC LENGTHouPIC U DYNAMIC LENGTH LIMIT n)INTEGER,STRINGJUSTIFIEDASCENDING/DESCENDING KEYemOCCURSINDEXED BYemOCCURSRECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
Tipos de dados não compatíveis
Os seguintes tipos de USAGE podem ser analisados pela gramática, mas não são compatíveis
com o compilador de copybook:
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK