Translate

sábado, 27 de maio de 2017

COBOL Conversando com SAP : Quando um Programa COBOL Descobre que o SAP Não é um Planeta Distante


Bellacosa Mianframe cobol conversando com o sap

☕ Um Café no Bellacosa Mainframe

COBOL Conversando com SAP sem Mistérios para Programadores Padawan

Quando um Programa COBOL Descobre que o SAP Não é um Planeta Distante — É Apenas Outro Sistema Esperando uma Mensagem no Formato Certo

Imagine o seguinte cenário.

De um lado da galáxia corporativa existe um programa COBOL executando tranquilamente em um mainframe. Ele lê arquivos VSAM, consulta tabelas Db2, processa milhões de registros durante a madrugada e acredita sinceramente que controla todo o universo conhecido.

Do outro lado existe o SAP.

O SAP administra clientes, materiais, pedidos, notas fiscais, estoque, pagamentos, recursos humanos e praticamente qualquer outra coisa que uma empresa consiga transformar em processo, tabela ou reunião.

Em algum momento, alguém entra na sala e anuncia:

“Precisamos integrar o COBOL com o SAP.”

O programador Padawan olha para o terminal 3270, respira fundo e pergunta:

“Mas como um programa escrito para processar registros EBCDIC conversa com um sistema que trabalha com APIs, RFCs, IDocs, XML, JSON e nomes de campos que parecem feitiços alemães?”

A resposta é: por meio de uma camada de integração.

Na maioria dos projetos sérios, o COBOL não “entra” diretamente no SAP. Ele envia uma mensagem, chama um serviço ou grava informações em um canal intermediário. Esse canal traduz, valida, protege e entrega os dados ao SAP.

O segredo não está apenas em fazer a conexão funcionar.

O verdadeiro desafio é garantir que:

  • os dados tenham o formato correto;

  • os caracteres sejam convertidos corretamente;

  • o SAP não receba duplicidades;

  • os erros possam ser rastreados;

  • a transação seja segura;

  • o processamento tenha boa performance;

  • uma falha não deixe metade do pedido no COBOL e metade no SAP.

Este é o ponto em que integração deixa de ser apenas “mandar dados” e se transforma em arquitetura.


1. O que significa um programa COBOL conversar com SAP?

“Conversar com SAP” pode significar várias coisas.

Um programa COBOL pode precisar:

  • consultar um cliente cadastrado no SAP;

  • enviar um pedido de venda;

  • receber informações de materiais;

  • atualizar uma posição de estoque;

  • enviar lançamentos financeiros;

  • solicitar a criação de uma ordem;

  • transmitir dados de folha de pagamento;

  • receber o resultado de uma contabilização;

  • verificar se uma nota fiscal foi processada;

  • iniciar um processo de negócio dentro do SAP.

Portanto, antes de escolher a tecnologia, é necessário responder a algumas perguntas.

A chamada será síncrona ou assíncrona?

Comunicação síncrona

O COBOL envia uma solicitação e fica esperando uma resposta.

Exemplo:

COBOL → CONSULTAR CLIENTE → SAP
COBOL ← CLIENTE ENCONTRADO ← SAP

É semelhante a uma chamada de subprograma:

CALL 'CONSULTA'

A diferença é que o programa chamado pode estar em outro servidor, em outra plataforma e talvez em outro continente.

Essa modalidade é usada quando o COBOL precisa da resposta imediatamente para continuar.

Exemplos:

  • consultar limite de crédito;

  • validar material;

  • verificar disponibilidade;

  • obter preço;

  • confirmar uma transação.

Comunicação assíncrona

O COBOL envia uma mensagem e continua seu processamento sem esperar que o SAP termine imediatamente.

Exemplo:

COBOL → FILA MQ → MIDDLEWARE → SAP

O SAP pode processar a mensagem alguns segundos ou minutos depois.

Essa modalidade é muito utilizada para:

  • grandes volumes;

  • processamento batch;

  • pedidos;

  • movimentos de estoque;

  • atualizações financeiras;

  • integração de dados em lote;

  • cenários em que uma indisponibilidade temporária do SAP não pode interromper o mainframe.

A comunicação assíncrona costuma ser mais resiliente.

Se o SAP estiver indisponível, a mensagem pode permanecer em uma fila aguardando o retorno do sistema.


2. Os principais caminhos entre COBOL e SAP

Existem diversas formas de realizar essa integração. A escolha depende da arquitetura da empresa, da versão do SAP, das ferramentas disponíveis, do volume e da criticidade do processo.

Os caminhos mais comuns são:

  1. Arquivos batch;

  2. Banco de dados ou staging area;

  3. IBM MQ;

  4. Web Services SOAP;

  5. APIs REST;

  6. RFC e BAPI;

  7. IDoc;

  8. SAP PI/PO;

  9. SAP Integration Suite;

  10. Middleware corporativo;

  11. Eventos e mensageria.

Vamos explorar cada rota.


3. Integração por arquivos: a velha nave cargueira que nunca abandona a frota

A integração por arquivos é uma das formas mais antigas e ainda muito utilizadas.

O programa COBOL gera um arquivo com registros de tamanho fixo ou variável. Esse arquivo é transferido para uma plataforma intermediária ou diretamente para um ambiente acessível pelo SAP.

Exemplo de fluxo:

Programa COBOL
      |
      v
Arquivo sequencial
      |
      v
SFTP / Connect:Direct
      |
      v
Servidor de integração
      |
      v
SAP

Exemplo de layout COBOL

01  REGISTRO-PEDIDO.
    05 RP-TIPO-REGISTRO       PIC X(01).
    05 RP-NUMERO-PEDIDO       PIC 9(10).
    05 RP-CODIGO-CLIENTE      PIC X(10).
    05 RP-CODIGO-MATERIAL     PIC X(18).
    05 RP-QUANTIDADE          PIC 9(07)V99.
    05 RP-DATA-PEDIDO         PIC 9(08).
    05 RP-VALOR               PIC 9(11)V99.

O programa grava milhares de registros e, ao final, pode gerar um registro de trailer:

01  REGISTRO-TRAILER.
    05 RT-TIPO-REGISTRO       PIC X(01) VALUE '9'.
    05 RT-QTDE-REGISTROS      PIC 9(09).
    05 RT-VALOR-TOTAL         PIC 9(13)V99.

O trailer funciona como um controle de integridade.

O SAP ou middleware pode verificar:

  • quantidade de registros;

  • valor total;

  • data de geração;

  • nome do arquivo;

  • identificador do lote;

  • checksum;

  • sequência do arquivo.

Vantagens

  • Simplicidade;

  • fácil auditoria;

  • bom para grandes volumes;

  • reinício relativamente simples;

  • não exige resposta imediata;

  • funciona bem em processamento batch.

Desvantagens

  • não é tempo real;

  • pode haver arquivos duplicados;

  • erros só aparecem depois;

  • exige controle de sequência;

  • exige definição rigorosa de layout;

  • conversão de caracteres pode causar problemas.

Erro clássico

O COBOL envia um arquivo em EBCDIC, mas o ambiente intermediário espera ASCII ou UTF-8.

Resultado:

CLIENTE JOSÉ

pode virar:

CLIENTE JOS?

ou algo ainda mais exótico, digno de um idioma falado apenas por droids de manutenção.

Solução

Defina claramente:

  • encoding de origem;

  • encoding de destino;

  • página de código;

  • tratamento de acentos;

  • delimitadores;

  • formato de campos numéricos;

  • formato de data;

  • representação de sinal;

  • uso de packed decimal.

Nunca envie diretamente um campo COMP-3 para um sistema que espera texto.

Converta:

MOVE CAMPO-COMP-3 TO CAMPO-NUMERICO-EDITADO

4. Integração por IBM MQ: o hiperpropulsor corporativo

Uma das formas mais robustas de conectar COBOL e SAP é por meio do IBM MQ.

O programa COBOL publica uma mensagem em uma fila. Um middleware consome essa mensagem, transforma o conteúdo e envia ao SAP.

Fluxo típico:

Programa COBOL
      |
      | MQPUT
      v
Fila de Requisição
      |
      v
Middleware
      |
      v
SAP
      |
      v
Fila de Resposta
      |
      | MQGET
      v
Programa COBOL

Essa arquitetura reduz o acoplamento.

O COBOL não precisa conhecer todos os detalhes internos do SAP. Ele precisa conhecer apenas:

  • nome da fila;

  • formato da mensagem;

  • identificador da transação;

  • timeout;

  • estrutura da resposta.

Exemplo conceitual usando MQ

IDENTIFICATION DIVISION.
PROGRAM-ID. ENVIASAP.

DATA DIVISION.

WORKING-STORAGE SECTION.

01  WS-MQ-COMPCODE             PIC S9(9) COMP VALUE ZERO.
01  WS-MQ-REASON               PIC S9(9) COMP VALUE ZERO.
01  WS-BUFFER-LENGTH           PIC S9(9) COMP VALUE ZERO.

01  WS-MENSAGEM.
    05 WS-TIPO                 PIC X(10) VALUE 'PEDIDO'.
    05 WS-ID-PEDIDO            PIC X(20).
    05 WS-CLIENTE              PIC X(10).
    05 WS-MATERIAL             PIC X(18).
    05 WS-QUANTIDADE           PIC 9(07)V99.

PROCEDURE DIVISION.

    MOVE 'PED00000000000012345' TO WS-ID-PEDIDO
    MOVE 'CLI0009876'           TO WS-CLIENTE
    MOVE 'MAT000000000012345'   TO WS-MATERIAL
    MOVE 15.00                  TO WS-QUANTIDADE

    MOVE LENGTH OF WS-MENSAGEM TO WS-BUFFER-LENGTH

    CALL 'MQPUT'
        USING
        WS-MQ-COMPCODE
        WS-MQ-REASON
        WS-BUFFER-LENGTH
        WS-MENSAGEM

    IF WS-MQ-COMPCODE NOT = ZERO
        DISPLAY 'ERRO MQPUT'
        DISPLAY 'COMPCODE: ' WS-MQ-COMPCODE
        DISPLAY 'REASON  : ' WS-MQ-REASON
        PERFORM TRATA-ERRO
    END-IF

    GOBACK.

Esse código é simplificado. Em um programa real, o MQPUT usa estruturas como:

  • MQOD;

  • MQMD;

  • MQPMO;

  • identificador de conexão;

  • identificador de objeto;

  • opções de persistência;

  • correlator;

  • message ID.

Mensagem persistente ou não persistente?

Persistente

A mensagem deve sobreviver a uma falha do queue manager.

Use em:

  • transações financeiras;

  • pedidos;

  • estoque;

  • faturamento;

  • processos críticos.

Não persistente

Pode ser usada quando perder a mensagem não causa impacto grave.

Exemplos:

  • telemetria;

  • dados temporários;

  • consultas descartáveis;

  • notificações não críticas.

Dica Jedi

Não escolha mensagens não persistentes apenas porque são mais rápidas.

Performance sem confiabilidade pode se transformar em um sistema veloz para perder dados.


5. Integração por REST API

APIs REST são cada vez mais utilizadas em ambientes SAP modernos.

Nesse modelo, o programa COBOL envia uma requisição HTTP para uma API.

Exemplo:

POST /api/pedidos
Content-Type: application/json
Authorization: Bearer <token>

Corpo:

{
  "pedido": "12345",
  "cliente": "9876",
  "material": "MAT-001",
  "quantidade": 15
}

O SAP ou uma camada intermediária retorna:

{
  "status": "SUCESSO",
  "documentoSap": "4500012345"
}

Como um COBOL chama uma API REST?

No mainframe, algumas opções incluem:

  • z/OS Connect Enterprise Edition;

  • CICS Web Support;

  • cliente HTTP em COBOL;

  • Java intermediário;

  • API gateway;

  • middleware;

  • programas USS;

  • bibliotecas HTTP fornecidas pela empresa.

Uma arquitetura moderna pode ser:

COBOL
  |
  v
z/OS Connect
  |
  v
API Gateway
  |
  v
SAP Integration Suite
  |
  v
SAP S/4HANA

O z/OS Connect pode expor serviços COBOL como APIs ou permitir que aplicações z/OS consumam APIs externas, dependendo da configuração e arquitetura adotada.

Exemplo de JSON criado pelo COBOL

01  WS-JSON.
    05 FILLER PIC X(12) VALUE '{"pedido":"'.
    05 WS-JSON-PEDIDO PIC X(10).
    05 FILLER PIC X(13) VALUE '","cliente":"'.
    05 WS-JSON-CLIENTE PIC X(10).
    05 FILLER PIC X(14) VALUE '","material":"'.
    05 WS-JSON-MATERIAL PIC X(18).
    05 FILLER PIC X(02) VALUE '"}'.

Entretanto, montar JSON manualmente pode gerar erros.

Problemas comuns:

  • aspas não escapadas;

  • campos truncados;

  • espaços indesejados;

  • caracteres inválidos;

  • tamanho incorreto;

  • vírgula sobrando;

  • encoding incorreto.

Uma alternativa melhor é utilizar recursos do Enterprise COBOL, como JSON GENERATE, quando disponíveis e adequados ao ambiente.

Exemplo conceitual:

JSON GENERATE WS-JSON-TEXT
    FROM WS-DADOS-PEDIDO
    COUNT IN WS-JSON-LENGTH
    ON EXCEPTION
        DISPLAY 'ERRO AO GERAR JSON'
END-JSON

6. Integração por SOAP Web Service

Antes da popularização de REST, muitas integrações SAP eram implementadas com SOAP.

SOAP utiliza XML e contratos WSDL.

Exemplo simplificado:

<soapenv:Envelope>
   <soapenv:Body>
      <CriarPedido>
         <Cliente>0000123456</Cliente>
         <Material>MAT001</Material>
         <Quantidade>10</Quantidade>
      </CriarPedido>
   </soapenv:Body>
</soapenv:Envelope>

Vantagens

  • contrato formal;

  • boa padronização;

  • suporte corporativo;

  • segurança avançada;

  • validação por esquema;

  • ainda muito comum em ambientes SAP.

Desvantagens

  • XML verboso;

  • mensagens maiores;

  • processamento mais pesado;

  • configuração mais complexa;

  • namespaces podem causar erros difíceis de encontrar.

Erro clássico

O campo existe no XML, mas está no namespace errado.

Para um humano, o XML parece correto.

Para o serviço:

ELEMENTO OBRIGATÓRIO AUSENTE

A lição é simples:

Em SOAP, o nome é importante, mas o namespace é parte do nome.


7. RFC e BAPI: falando a língua nativa do SAP

RFC significa Remote Function Call.

É um mecanismo tradicional do SAP para executar funções remotamente.

Uma BAPI é uma interface de negócio padronizada, normalmente construída sobre funções SAP.

Exemplos conceituais:

  • consultar cliente;

  • criar pedido;

  • obter material;

  • contabilizar documento;

  • alterar fornecedor.

O fluxo pode ser:

COBOL
  |
  v
Middleware ou SAP Connector
  |
  v
RFC/BAPI
  |
  v
SAP

Normalmente, o programa COBOL não implementa diretamente o protocolo RFC sem uma biblioteca ou componente intermediário.

É comum usar:

  • SAP Java Connector;

  • SAP .NET Connector;

  • middleware corporativo;

  • SAP PI/PO;

  • SAP Integration Suite;

  • produto de integração instalado no mainframe.

Uma armadilha importante: commit no SAP

Algumas BAPIs criam ou alteram dados, mas exigem uma chamada posterior de confirmação.

Por exemplo, conceitualmente:

1. Chamar BAPI de criação
2. Verificar mensagens de retorno
3. Executar commit

Sem o commit, a função pode responder aparentemente bem, mas a alteração não permanecer.

É como executar um programa COBOL, alterar dados e esquecer o:

EXEC SQL
    COMMIT
END-EXEC

O universo SAP também respeita a velha lei:

Sem commit, a certeza é apenas uma variável temporária.


8. IDoc: o mensageiro oficial do Império SAP

IDoc significa Intermediate Document.

É uma estrutura padronizada de troca de dados usada amplamente pelo SAP.

Um IDoc possui:

  • registro de controle;

  • segmentos de dados;

  • registros de status.

Exemplos de uso:

  • pedidos;

  • materiais;

  • clientes;

  • fornecedores;

  • notas;

  • movimentos;

  • informações financeiras.

Fluxo típico:

COBOL
  |
  v
Arquivo ou MQ
  |
  v
Middleware
  |
  v
IDoc
  |
  v
SAP

O middleware transforma o layout COBOL no formato esperado pelo IDoc.

Status de IDoc

O SAP registra estados durante o processamento.

Conceitualmente, o documento pode estar:

  • recebido;

  • aguardando processamento;

  • processado com sucesso;

  • processado com erro;

  • pronto para reprocessamento.

Esses status são fundamentais para suporte.

Quando alguém disser:

“O mainframe enviou, mas não chegou ao SAP.”

Não aceite a frase como diagnóstico.

Pergunte:

  1. O COBOL gravou o registro?

  2. O MQPUT terminou com sucesso?

  3. A mensagem saiu da fila?

  4. O middleware consumiu?

  5. A transformação funcionou?

  6. O IDoc foi criado?

  7. Qual é o status do IDoc?

  8. Houve erro funcional?

  9. Houve erro técnico?

  10. O retorno foi enviado ao mainframe?

Integração precisa de evidência, não de adivinhação.


9. SAP PI/PO e SAP Integration Suite

Em muitas empresas, o COBOL não se conecta diretamente ao SAP.

Ele conversa com uma plataforma de integração.

Entre as tecnologias conhecidas estão:

  • SAP Process Integration;

  • SAP Process Orchestration;

  • SAP Integration Suite;

  • Enterprise Service Bus;

  • API Management;

  • brokers de mensageria.

Essa camada pode:

  • converter EBCDIC para UTF-8;

  • transformar copybooks em XML;

  • transformar XML em JSON;

  • validar campos;

  • aplicar regras;

  • autenticar chamadas;

  • rotear mensagens;

  • executar retry;

  • registrar logs;

  • controlar duplicidade;

  • monitorar falhas.

Arquitetura:

COBOL
  |
  | Arquivo, MQ, API ou SOAP
  v
Plataforma de Integração
  |
  | Transformação e roteamento
  v
SAP

Essa camada funciona como um tradutor universal.

O COBOL fala em:

PIC X(10)
PIC 9(07)V99
COMP-3
EBCDIC

O SAP fala em:

BAPI
IDoc
OData
XML
JSON
RFC

O middleware fica no meio dizendo:

“Calma, eu traduzo.”


10. Passo a passo completo de uma integração COBOL–SAP

Agora vamos construir mentalmente um processo real.

Cenário

Um programa COBOL processa pedidos recebidos no mainframe e precisa criar pedidos no SAP.

Passo 1 — Identificar o evento de negócio

O evento é:

PEDIDO APROVADO NO MAINFRAME

Não comece pela tecnologia.

Comece pelo negócio.

Defina:

  • quando o pedido está pronto;

  • quais campos são obrigatórios;

  • quem é o sistema proprietário;

  • o que significa sucesso;

  • o que significa rejeição;

  • como corrigir erros;

  • quem pode reenviar.

Passo 2 — Criar um identificador único

Cada transação deve possuir um identificador único.

Exemplo:

MF20260721000001234567

Esse identificador deve acompanhar todo o fluxo:

COBOL
MQ
MIDDLEWARE
SAP
LOG
RESPOSTA

Sem um identificador de correlação, investigar erros vira arqueologia digital.

Passo 3 — Definir o contrato da mensagem

Exemplo lógico:

ID_TRANSACAO
TIPO_OPERACAO
NUMERO_PEDIDO
CLIENTE
MATERIAL
QUANTIDADE
VALOR
DATA
HORA
ORIGEM
VERSAO_LAYOUT

A versão do layout é essencial.

VERSAO_LAYOUT = 001

Quando um novo campo for criado, talvez a versão passe para:

VERSAO_LAYOUT = 002

Isso permite evolução controlada.

Passo 4 — Validar dados no COBOL

Antes de enviar:

  • pedido está preenchido?

  • cliente é numérico?

  • quantidade é maior que zero?

  • material está informado?

  • data é válida?

  • valor está dentro do limite?

  • campos possuem caracteres permitidos?

Exemplo:

IF WS-CLIENTE = SPACES
    MOVE '001' TO WS-CODIGO-ERRO
    MOVE 'CLIENTE NAO INFORMADO'
      TO WS-MENSAGEM-ERRO
    PERFORM GRAVA-ERRO
    GO TO FINALIZA
END-IF

Não envie lixo esperando que o SAP o transforme em ouro.

Passo 5 — Criar a mensagem

Pode ser:

  • copybook fixo;

  • XML;

  • JSON;

  • mensagem MQ;

  • arquivo delimitado;

  • estrutura intermediária.

Passo 6 — Enviar

Exemplo com MQ:

MQPUT REQUEST.QUEUE

Exemplo com API:

HTTP POST /pedidos

Exemplo com arquivo:

WRITE REGISTRO-PEDIDO

Passo 7 — Registrar o envio

Grave:

  • ID da transação;

  • data e hora;

  • pedido;

  • destino;

  • status;

  • tentativa;

  • retorno técnico;

  • retorno funcional.

Exemplo:

ID=MF20260721000001234567
STATUS=ENVIADO
TENTATIVA=01

Passo 8 — Receber a resposta

Resposta de sucesso:

{
  "idTransacao": "MF20260721000001234567",
  "status": "SUCESSO",
  "documentoSap": "4500012345"
}

Resposta funcional:

{
  "status": "ERRO",
  "codigo": "CLIENTE_BLOQUEADO",
  "mensagem": "Cliente bloqueado para vendas"
}

Resposta técnica:

{
  "status": "ERRO_TECNICO",
  "codigo": "TIMEOUT",
  "mensagem": "SAP indisponível"
}

Passo 9 — Atualizar o sistema de origem

O COBOL deve marcar o pedido como:

  • enviado;

  • processado;

  • rejeitado;

  • pendente;

  • em retry;

  • intervenção manual.

Passo 10 — Implementar reprocessamento

Toda integração séria precisa responder:

“Como reprocessamos uma transação que falhou?”

Nunca dependa exclusivamente de alguém editar um arquivo manualmente às três da manhã.

Crie mecanismos como:

  • fila de erro;

  • tabela de pendências;

  • programa batch de retry;

  • tela de consulta;

  • comando de reenvio;

  • limite de tentativas;

  • trilha de auditoria.


11. Tipos de erros e suas soluções

11.1 Erro de conectividade

Exemplos:

  • host inacessível;

  • porta fechada;

  • DNS incorreto;

  • firewall bloqueando;

  • TLS falhando;

  • queue manager indisponível;

  • API gateway fora do ar.

Solução

  • testar rede;

  • validar host e porta;

  • verificar firewall;

  • confirmar certificado;

  • validar configuração do canal MQ;

  • consultar logs;

  • verificar timeout;

  • testar fora do programa COBOL.

Não altere o programa antes de confirmar que a estrada existe.


11.2 Timeout

O COBOL envia uma solicitação, mas a resposta demora demais.

Causas

  • SAP sobrecarregado;

  • consulta pesada;

  • lock;

  • middleware lento;

  • timeout muito curto;

  • rede degradada;

  • grande volume de dados.

Solução

  • definir timeout realista;

  • usar processamento assíncrono;

  • reduzir tamanho da resposta;

  • otimizar consulta;

  • usar cache quando permitido;

  • separar transações longas;

  • criar retry controlado.

Cuidado: repetir automaticamente uma transação pode gerar duplicidade.


11.3 Erro de autenticação

Exemplos:

HTTP 401
INVALID USER
INVALID TOKEN
CERTIFICATE ERROR

Solução

  • renovar token;

  • validar usuário técnico;

  • verificar senha;

  • conferir certificado;

  • validar client ID;

  • verificar escopo;

  • confirmar autorização no SAP.

Nunca grave senha diretamente no fonte COBOL.

Use mecanismos protegidos, como:

  • RACF;

  • cofre de segredos;

  • certificados;

  • configuração externa;

  • credenciais gerenciadas.


11.4 Erro de autorização

A autenticação funcionou, mas o usuário não pode executar a operação.

Exemplo:

HTTP 403
NOT AUTHORIZED

Solução

Verificar:

  • perfil do usuário;

  • objeto de autorização SAP;

  • função atribuída;

  • escopo da API;

  • ambiente correto;

  • operação permitida.

Autenticação responde:

“Quem é você?”

Autorização responde:

“O que você pode fazer?”


11.5 Erro de layout

Exemplos:

  • campo deslocado;

  • tamanho incorreto;

  • campo obrigatório ausente;

  • valor truncado;

  • decimal errado;

  • sinal inválido;

  • copybook desatualizado.

Solução

  • versionar copybooks;

  • validar comprimento;

  • comparar layout enviado e recebido;

  • usar testes automatizados;

  • criar amostras de mensagem;

  • documentar posições;

  • conferir redefinições;

  • evitar mudanças silenciosas.

Um campo aumentado de PIC X(10) para PIC X(12) pode deslocar todo o restante do registro.


11.6 Erro de conversão EBCDIC/ASCII/UTF-8

Sintomas

  • acentos incorretos;

  • caracteres estranhos;

  • JSON inválido;

  • XML não parseável;

  • campos preenchidos com símbolos.

Solução

Definir explicitamente:

  • CCSID;

  • página de código;

  • UTF-8;

  • conversão no MQ;

  • conversão no middleware;

  • origem e destino do arquivo.

Nunca confie em “conversão automática” sem teste.

Automático significa apenas que alguém configurou algo e talvez não tenha contado para você.


11.7 Erro de dados inválidos

Exemplos:

  • cliente inexistente;

  • material bloqueado;

  • quantidade negativa;

  • centro inválido;

  • moeda não permitida;

  • período contábil fechado.

Solução

Classifique como erro funcional.

Não adianta repetir cinquenta vezes um pedido cujo cliente está bloqueado.

Retry serve para falhas transitórias, não para regras de negócio.


11.8 Duplicidade

O COBOL envia uma transação, ocorre timeout e não sabe se o SAP processou. Então envia novamente.

Resultado: dois pedidos.

Solução

Implementar idempotência.

O SAP ou middleware deve verificar o identificador único.

Exemplo:

ID_TRANSACAO = MF20260721000001234567

Se esse ID já foi processado, o sistema retorna o mesmo resultado em vez de criar outro documento.

Idempotência é uma das palavras mais importantes em integração.


11.9 Erro de commit ou rollback

O SAP processa parcialmente uma transação.

Solução

  • usar unidade lógica de trabalho;

  • definir fronteira transacional;

  • executar commit apenas após sucesso;

  • executar rollback em falha;

  • evitar atualizações parciais;

  • compensar operações quando necessário.

Em sistemas distribuídos, não existe um único commit mágico resolvendo tudo.

Às vezes é necessário usar:

  • confirmação;

  • compensação;

  • eventos;

  • status intermediários;

  • reconciliação.


11.10 Fila cheia ou mensagem parada

No IBM MQ, uma fila pode atingir sua profundidade máxima.

Sintomas

  • MQPUT falha;

  • mensagens acumuladas;

  • consumidor parado;

  • processamento atrasado.

Solução

  • monitorar profundidade;

  • validar consumidor;

  • revisar MAXDEPTH;

  • analisar dead-letter queue;

  • avaliar backout queue;

  • criar alertas;

  • ajustar taxa de produção e consumo.

Aumentar o tamanho da fila pode aliviar o sintoma, mas não resolve um consumidor quebrado.


12. Retry: repetir sem criar um monstro

Um retry bem desenhado deve possuir:

  • número máximo de tentativas;

  • intervalo crescente;

  • classificação do erro;

  • registro de cada tentativa;

  • idempotência;

  • destino de erro final.

Exemplo:

Tentativa 1: após 10 segundos
Tentativa 2: após 30 segundos
Tentativa 3: após 2 minutos
Tentativa 4: após 10 minutos

Esse mecanismo é conhecido como backoff.

Não use:

PERFORM UNTIL SUCESSO
    TENTA-DE-NOVO
END-PERFORM

Isso pode criar um loop infinito, consumir CPU e transformar o LPAR em uma churrasqueira tecnológica.


13. Exemplo de programa COBOL conceitual

Abaixo temos uma estrutura simplificada de integração.

IDENTIFICATION DIVISION.
PROGRAM-ID. PEDSAP01.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

01  WS-CONTROLES.
    05 WS-STATUS              PIC X(10).
    05 WS-TENTATIVA           PIC 9(02) VALUE ZERO.
    05 WS-MAX-TENTATIVAS      PIC 9(02) VALUE 03.
    05 WS-RETURN-CODE         PIC 9(04) VALUE ZERO.

01  WS-PEDIDO.
    05 WS-ID-TRANSACAO        PIC X(24).
    05 WS-NUMERO-PEDIDO       PIC X(12).
    05 WS-CLIENTE             PIC X(10).
    05 WS-MATERIAL            PIC X(18).
    05 WS-QUANTIDADE          PIC 9(07)V99.
    05 WS-VALOR               PIC 9(11)V99.

01  WS-RESPOSTA.
    05 WS-RESP-STATUS         PIC X(10).
    05 WS-RESP-CODIGO         PIC X(20).
    05 WS-RESP-MENSAGEM       PIC X(100).
    05 WS-DOCUMENTO-SAP       PIC X(20).

PROCEDURE DIVISION.

0000-PRINCIPAL.

    PERFORM 1000-INICIALIZAR
    PERFORM 2000-LER-PEDIDO
    PERFORM 3000-VALIDAR-PEDIDO

    IF WS-RETURN-CODE NOT = ZERO
        PERFORM 9000-FINALIZAR
    END-IF

    PERFORM 4000-GERAR-ID
    PERFORM 5000-ENVIAR-SAP

    IF WS-RESP-STATUS = 'SUCESSO'
        PERFORM 6000-ATUALIZAR-SUCESSO
    ELSE
        PERFORM 7000-TRATAR-ERRO
    END-IF

    PERFORM 9000-FINALIZAR.

1000-INICIALIZAR.

    MOVE ZERO TO WS-RETURN-CODE
    MOVE SPACES TO WS-RESPOSTA.

2000-LER-PEDIDO.

    MOVE 'PED000012345'       TO WS-NUMERO-PEDIDO
    MOVE '0000987654'         TO WS-CLIENTE
    MOVE 'MAT000000000123456' TO WS-MATERIAL
    MOVE 10.00                TO WS-QUANTIDADE
    MOVE 1500.00              TO WS-VALOR.

3000-VALIDAR-PEDIDO.

    IF WS-CLIENTE = SPACES
        MOVE 8 TO WS-RETURN-CODE
        MOVE 'CLIENTE NAO INFORMADO'
          TO WS-RESP-MENSAGEM
    END-IF

    IF WS-QUANTIDADE <= ZERO
        MOVE 8 TO WS-RETURN-CODE
        MOVE 'QUANTIDADE INVALIDA'
          TO WS-RESP-MENSAGEM
    END-IF.

4000-GERAR-ID.

    MOVE 'MF-20260721-0000012345'
      TO WS-ID-TRANSACAO.

5000-ENVIAR-SAP.

    ADD 1 TO WS-TENTATIVA

    CALL 'SAPINT01'
        USING WS-PEDIDO
              WS-RESPOSTA
              WS-RETURN-CODE.

6000-ATUALIZAR-SUCESSO.

    DISPLAY 'PEDIDO PROCESSADO'
    DISPLAY 'DOCUMENTO SAP: ' WS-DOCUMENTO-SAP.

7000-TRATAR-ERRO.

    EVALUATE WS-RESP-CODIGO

        WHEN 'TIMEOUT'
        WHEN 'CONNECTION_ERROR'

            IF WS-TENTATIVA < WS-MAX-TENTATIVAS
                PERFORM 5000-ENVIAR-SAP
            ELSE
                PERFORM 7100-GRAVAR-PENDENCIA
            END-IF

        WHEN 'CLIENTE_BLOQUEADO'
        WHEN 'MATERIAL_INVALIDO'

            PERFORM 7200-GRAVAR-ERRO-FUNCIONAL

        WHEN OTHER

            PERFORM 7300-GRAVAR-ERRO-TECNICO

    END-EVALUATE.

7100-GRAVAR-PENDENCIA.

    DISPLAY 'TRANSACAO PENDENTE: '
            WS-ID-TRANSACAO.

7200-GRAVAR-ERRO-FUNCIONAL.

    DISPLAY 'ERRO FUNCIONAL: '
            WS-RESP-MENSAGEM.

7300-GRAVAR-ERRO-TECNICO.

    DISPLAY 'ERRO TECNICO: '
            WS-RESP-MENSAGEM.

9000-FINALIZAR.

    MOVE WS-RETURN-CODE TO RETURN-CODE
    GOBACK.

Em produção, o SAPINT01 poderia ser:

  • wrapper para MQ;

  • cliente de API;

  • chamada a um módulo C;

  • chamada Java;

  • transação CICS;

  • serviço z/OS Connect;

  • componente de middleware.

Separar a lógica de negócio da lógica de comunicação facilita manutenção e testes.


14. Configurações importantes

Timeouts

Defina timeouts diferentes para:

  • conexão;

  • envio;

  • leitura;

  • processamento total.

Um timeout infinito não é robustez.

É apenas uma forma educada de dizer que o programa ficará esperando até o próximo IPL.

Tamanho de mensagem

Verifique:

  • tamanho máximo no MQ;

  • tamanho permitido pela API;

  • tamanho do JSON;

  • tamanho do XML;

  • limite do middleware;

  • limite de memória do programa.

TLS

Use criptografia em trânsito.

Validar:

  • certificado;

  • autoridade certificadora;

  • validade;

  • hostname;

  • protocolo;

  • cipher suite.

Credenciais

Não armazene:

01 WS-SENHA PIC X(08) VALUE 'SAP12345'.

Isso é praticamente deixar a chave da Enterprise debaixo do tapete.

Filas MQ

Configure e monitore:

  • request queue;

  • reply queue;

  • dead-letter queue;

  • backout queue;

  • persistência;

  • prioridade;

  • expiração;

  • profundidade máxima.

Logging

Registre o suficiente para investigar, mas não exponha:

  • senhas;

  • tokens;

  • dados pessoais;

  • números sensíveis;

  • conteúdo completo de documentos confidenciais.


15. Performance

15.1 Evite chamada por registro

Imagine um batch com um milhão de registros.

Fazer uma chamada síncrona ao SAP para cada registro pode ser extremamente lento.

Melhorias possíveis:

  • agrupar registros;

  • enviar lotes;

  • usar processamento assíncrono;

  • comprimir mensagens quando apropriado;

  • reduzir chamadas;

  • reutilizar conexões;

  • executar paralelismo controlado.

15.2 Use conexão persistente

Abrir e fechar uma conexão para cada transação aumenta custo.

Quando suportado:

  • reutilize sessão;

  • use connection pool;

  • mantenha canal;

  • evite autenticações repetidas.

15.3 Não envie campos desnecessários

Uma mensagem com 200 campos quando apenas 20 são necessários:

  • consome rede;

  • aumenta parsing;

  • dificulta manutenção;

  • amplia risco de erro;

  • cria acoplamento.

15.4 Controle o paralelismo

Mais threads ou tasks não significam automaticamente mais performance.

Paralelismo excessivo pode:

  • saturar SAP;

  • aumentar lock;

  • encher filas;

  • provocar throttling;

  • consumir CPU;

  • aumentar contenção.

A regra Jedi é:

Paralelize até o ponto em que o sistema fica mais rápido, não até o ponto em que ele começa a emitir fumaça.

15.5 Faça commit em intervalos adequados

Em batch:

  • commits muito frequentes aumentam overhead;

  • commits muito espaçados aumentam locks e dificultam restart.

Escolha o intervalo com base em:

  • volume;

  • criticidade;

  • tempo de reprocessamento;

  • capacidade de rollback;

  • política transacional.


16. Monitoramento

Uma integração precisa de observabilidade.

Monitore:

  • quantidade enviada;

  • quantidade processada;

  • quantidade rejeitada;

  • tempo médio;

  • percentil de resposta;

  • fila acumulada;

  • quantidade de retry;

  • erros por tipo;

  • indisponibilidade;

  • divergência entre sistemas.

Exemplo de painel:

Pedidos enviados:        125.000
Pedidos processados:     124.950
Erros funcionais:             35
Erros técnicos:               15
Fila pendente:                10
Tempo médio:               1,8 s
Maior tempo:              12,4 s

Sem métricas, a integração pode estar falhando silenciosamente.


17. Reconciliação

Mesmo com todos os controles, compare periodicamente os sistemas.

Exemplo:

Mainframe:
1000 pedidos enviados

SAP:
998 pedidos criados

Diferença:
2 pedidos

A reconciliação ajuda a localizar:

  • mensagens perdidas;

  • duplicidades;

  • falhas parciais;

  • respostas não processadas;

  • alterações manuais;

  • erros de status.

Uma boa integração não confia apenas no fluxo em tempo real.

Ela também verifica depois se a realidade corresponde ao esperado.


18. Dicas e truques do Mestre Jedi do COBOL

Dica 1 — Crie um copybook de integração

Centralize:

  • códigos de retorno;

  • status;

  • estrutura da mensagem;

  • versão;

  • campos de auditoria.

Dica 2 — Não misture erro técnico com erro funcional

Erro técnico:

SAP indisponível

Erro funcional:

Cliente bloqueado

O primeiro pode merecer retry.

O segundo exige correção de negócio.

Dica 3 — Grave o payload original

Quando permitido pela política de segurança, preserve o conteúdo enviado ou ao menos uma representação auditável.

Isso ajuda a provar o que realmente saiu do mainframe.

Dica 4 — Use correlation ID

O mesmo ID precisa aparecer em todos os logs.

Dica 5 — Teste caracteres especiais

Inclua nos testes:

José
Ação
São Paulo
João D'Ávila
Comércio & Serviços

Dica 6 — Teste campos no limite

Teste:

  • valor máximo;

  • campo vazio;

  • campo completo;

  • zero;

  • número negativo;

  • data inválida;

  • mensagem máxima;

  • caracteres inesperados.

Dica 7 — Teste indisponibilidade

Desligar o serviço em ambiente de teste pode ensinar mais do que cem testes de sucesso.

Verifique:

  • comportamento do timeout;

  • retry;

  • rollback;

  • fila de erro;

  • mensagem ao operador;

  • retomada após recuperação.

Dica 8 — Não use DISPLAY como estratégia completa de observabilidade

DISPLAY ajuda durante o desenvolvimento.

Produção exige:

  • log estruturado;

  • SMF quando aplicável;

  • registros de auditoria;

  • monitoramento de MQ;

  • métricas de API;

  • rastreamento distribuído.

Dica 9 — Versione o contrato

Nunca altere uma mensagem produtiva sem controlar compatibilidade.

Dica 10 — Planeje o restart antes do primeiro erro

O melhor momento para desenhar o reprocessamento é antes da produção.

O segundo melhor momento é antes de o diretor financeiro descobrir que faltam documentos no SAP.


19. Easter eggs para quem chegou até aqui

Easter egg 1 — O SAP também tem seus próprios ABENDs espirituais

Eles podem não se chamar S0C7, mas aparecem como:

  • dumps;

  • falhas de RFC;

  • erros de autorização;

  • documentos incompletos;

  • locks;

  • status de IDoc;

  • exceções de serviço.

Todo sistema possui uma maneira particular de dizer:

“Algo impossível aconteceu, embora alguém tenha programado exatamente essa possibilidade.”

Easter egg 2 — O verdadeiro vilão é a duplicidade

Em muitas integrações, perder uma mensagem é grave.

Criar duas transações financeiras idênticas pode ser ainda pior.

Por isso, o identificador único é o sabre de luz da idempotência.

Easter egg 3 — O copybook é o pergaminho sagrado

Uma alteração de duas posições em um copybook pode derrubar uma integração mais rápido que um disparo no reator principal da Estrela da Morte.

Easter egg 4 — “Funcionou no teste” não é uma certificação galáctica

O teste provavelmente usou:

  • um cliente válido;

  • um material válido;

  • uma quantidade pequena;

  • um SAP disponível;

  • nenhum acento;

  • nenhuma duplicidade;

  • nenhuma falha de rede.

Produção conhece todos os lados sombrios que o teste ignorou.


20. Arquitetura recomendada

Uma arquitetura robusta pode ser:

┌───────────────────────────────┐
│ Programa COBOL                │
│ Validação + ID da Transação   │
└───────────────┬───────────────┘
                │
                │ MQPUT
                v
┌───────────────────────────────┐
│ IBM MQ                        │
│ Persistência + Buffer         │
└───────────────┬───────────────┘
                │
                v
┌───────────────────────────────┐
│ Middleware                    │
│ Conversão EBCDIC/UTF-8        │
│ Validação                     │
│ Transformação                 │
│ Retry                         │
│ Segurança                     │
└───────────────┬───────────────┘
                │
                │ IDoc / BAPI / API
                v
┌───────────────────────────────┐
│ SAP                           │
│ Processamento do Negócio      │
└───────────────┬───────────────┘
                │
                │ Resposta
                v
┌───────────────────────────────┐
│ Fila de Retorno               │
└───────────────┬───────────────┘
                │
                v
┌───────────────────────────────┐
│ COBOL Atualiza Status         │
│ Sucesso / Erro / Pendência    │
└───────────────────────────────┘

Essa arquitetura oferece:

  • desacoplamento;

  • tolerância a falhas;

  • escalabilidade;

  • auditoria;

  • rastreabilidade;

  • reprocessamento;

  • segurança;

  • controle de performance.


Conclusão

Um programa COBOL pode conversar com SAP de diversas maneiras:

  • arquivos;

  • IBM MQ;

  • APIs REST;

  • SOAP;

  • RFC;

  • BAPI;

  • IDoc;

  • middleware;

  • plataformas de integração.

O método escolhido importa, mas não é o único fator decisivo.

Uma boa integração precisa possuir:

  • contrato claro;

  • identificador único;

  • validação;

  • segurança;

  • tratamento de erros;

  • retry controlado;

  • idempotência;

  • monitoramento;

  • auditoria;

  • reprocessamento;

  • reconciliação.

O programador Padawan talvez comece pensando:

“Só preciso mandar um pedido para o SAP.”

Depois de conhecer o universo da integração, ele percebe:

“Preciso garantir que o pedido seja enviado, recebido, processado, confirmado, auditado, protegido, rastreado e nunca duplicado.”

E nesse momento nasce um verdadeiro arquiteto de integração.

Porque conectar dois sistemas não significa apenas fazer com que eles troquem mensagens.

Significa garantir que ambos contem a mesma história sobre o que aconteceu.

E quando COBOL e SAP finalmente concordam sobre clientes, materiais, valores, pedidos e commits, o equilíbrio retorna à galáxia corporativa.

Pelo menos até alguém alterar o layout sem avisar.


Sem comentários:

Enviar um comentário