| Bellacosa Mainframe e o data division sem misterios |
☕ Um Café no Bellacosa Mainframe
Data Division sem Mistérios
O Guia Definitivo de Boas Práticas para Declarar Variáveis em COBOL Mainframe como os Grandes Bancos Fazem
"Um programa COBOL raramente falha porque alguém escreveu um IF errado. Ele costuma falhar porque alguém declarou uma variável errada há vinte anos."
Introdução
Existe um velho ditado entre programadores de mainframe:
"O Procedure Division executa. A Data Division pensa."
Pode parecer exagero, mas basta passar alguns meses trabalhando em um grande banco para perceber que isso é verdade.
Quando um programa COBOL possui milhares de linhas, dezenas de interfaces, centenas de arquivos VSAM, tabelas DB2, chamadas CICS e APIs REST, o verdadeiro segredo não está apenas na lógica.
Está na organização dos dados.
É justamente por isso que os maiores bancos brasileiros possuem padrões extremamente rígidos para a Data Division.
Em muitos lugares, uma variável mal declarada simplesmente não passa pela revisão de código.
Neste artigo vamos aprender como profissionais experientes organizam suas variáveis, entender o motivo dessas regras existirem e descobrir como escrever programas que continuam fáceis de manter mesmo depois de décadas.
Pegue seu café.
Vamos organizar nossa memória principal.
Antes de falar de variáveis...
Imagine construir um prédio.
Você pode contratar o melhor pedreiro do mundo.
Se o engenheiro desenhar uma planta ruim, o prédio será um caos.
No COBOL acontece exatamente isso.
A Data Division é a planta do edifício.
A Procedure Division apenas utiliza aquilo que foi planejado.
Quanto melhor for sua estrutura de dados, mais simples será escrever toda a lógica do programa.
A filosofia dos grandes bancos
Em bancos, normalmente existem padrões semelhantes a estes:
nomes padronizados
agrupamentos claros
nenhuma variável "solta"
documentação implícita
facilidade para debug
facilidade para manutenção
reaproveitamento
O objetivo nunca é escrever menos.
É escrever melhor.
A estrutura clássica
Normalmente encontramos algo parecido.
WORKING-STORAGE SECTION.
01 WS-CONTROLE.
01 WS-ENTRADA.
01 WS-SAIDA.
01 WS-CALCULOS.
01 WS-INDICADORES.
01 WS-CONSTANTES.
01 WS-TABELAS.
01 WS-AREAS-DE-TRABALHO.
Só olhando os nomes já sabemos onde procurar qualquer informação.
Essa organização economiza horas de manutenção.
Prefixos fazem diferença
Um dos maiores erros de iniciantes é escrever:
01 NOME.
01 CPF.
01 IDADE.
01 TOTAL.
Imagine um programa com 8.000 variáveis.
Boa sorte.
Os grandes bancos normalmente utilizam prefixos.
WS-NOME
WS-CPF
WS-IDADE
WS-TOTAL
WS significa:
Working Storage.
Quando existem outras áreas:
LK-
DFHCOMMAREA
LS-
CS-
SQL-
Exemplo:
WS-CLIENTE
LK-CLIENTE
LS-CLIENTE
SQL-CLIENTE
Cada uma pertence a uma área diferente.
O nome já explica sua origem.
Nunca use nomes genéricos
Evite:
WS-AUX
WS-TEMP
WS-X
WS-DADOS
WS-AREA
WS-TESTE
Isso não explica absolutamente nada.
Prefira:
WS-SALDO-ATUAL
WS-VALOR-LIMITE
WS-TOTAL-PARCELAS
WS-QTD-CLIENTES
WS-DATA-PROCESSAMENTO
Quem ler o programa daqui a vinte anos agradecerá.
O padrão VERBO + OBJETO
Muitos bancos gostam de indicar o significado da variável.
Exemplo:
WS-QTD-PRODUTOS
WS-VLR-TOTAL
WS-DT-NASCIMENTO
WS-HR-PROCESSAMENTO
WS-FL-ATIVO
WS-CD-AGENCIA
WS-NR-CONTA
Observe as abreviações.
| Prefixo | Significado |
|---|---|
| DT | Data |
| HR | Hora |
| FL | Flag |
| CD | Código |
| NR | Número |
| QTD | Quantidade |
| VLR | Valor |
| IND | Indicador |
| TP | Tipo |
| DESC | Descrição |
Essas abreviações praticamente viraram um idioma próprio do mercado financeiro.
Os níveis da Data Division
Agora chegamos ao coração do COBOL.
Os famosos Levels.
Level 01
Representa um registro completo.
01 WS-CLIENTE.
Pense nele como uma pasta.
Dentro dela existirão documentos.
Level 05
Representa divisões principais.
01 WS-CLIENTE.
05 WS-NOME.
05 WS-CPF.
05 WS-ENDERECO.
É o nível mais utilizado.
Level 10
Subdivisão.
05 WS-ENDERECO.
10 WS-RUA.
10 WS-NUMERO.
10 WS-BAIRRO.
Level 15, 20, 25...
São apenas níveis hierárquicos.
01 CLIENTE
05 ENDERECO
10 CIDADE
15 CEP
O COBOL não exige números específicos.
Apenas respeita a hierarquia.
Na prática, porém, muitos bancos adotam:
01
05
10
15
20
para manter um padrão visual.
Quando usar Level 77?
No passado era comum.
77 WS-CONTADOR PIC 9(4).
Hoje praticamente todos utilizam:
01 WS-CONTADOR PIC 9(4).
Ou agrupam dentro de áreas.
O uso do 77 tornou-se raro em novos projetos.
O poderoso Level 88
Um dos recursos mais elegantes do COBOL.
Imagine isso.
05 WS-STATUS PIC X.
88 WS-ATIVO VALUE "A".
88 WS-INATIVO VALUE "I".
Depois:
IF WS-ATIVO
Muito melhor que:
IF WS-STATUS = "A"
O código praticamente se transforma em português.
Outro exemplo.
88 WS-SIM VALUE "S".
88 WS-NAO VALUE "N".
Ou ainda:
88 WS-CONTA-CORRENTE VALUE "01".
88 WS-CONTA-POUPANCA VALUE "02".
Esse recurso é amplamente utilizado em bancos.
Agrupe informações relacionadas
Errado:
WS-NOME
WS-CPF
WS-RUA
WS-SALDO
WS-IDADE
WS-CIDADE
Correto.
01 WS-CLIENTE.
05 WS-NOME.
05 WS-CPF.
05 WS-ENDERECO.
10 WS-RUA.
10 WS-CIDADE.
05 WS-SALDO.
A estrutura fica muito mais intuitiva.
REDEFINES
Poucos recursos são tão poderosos.
Imagine um arquivo.
1234567890
Pode representar:
CPF
ou
Código interno
Não faz sentido duplicar memória.
Usamos:
01 WS-AREA.
05 WS-DADOS PIC X(10).
01 WS-CPF REDEFINES WS-DADOS.
05 WS-NUMERO PIC 9(10).
A memória é exatamente a mesma.
Apenas muda a interpretação.
Onde bancos usam REDEFINES?
Muito frequentemente em:
layouts CNAB
buffers CICS
mensagens MQ
áreas de comunicação
protocolos
APIs
conversões numéricas
interpretação de bytes
Cuidados com REDEFINES
Nunca faça isso sem entender o layout.
Porque alterar uma redefinição altera todas.
É literalmente a mesma memória.
RENAMES
Pouca gente conhece.
Exemplo.
01 WS-REGISTRO.
05 WS-NOME.
05 WS-ENDERECO.
05 WS-CIDADE.
66 WS-DADOS-CADASTRAIS
RENAMES WS-NOME THRU WS-CIDADE.
Agora podemos manipular todo esse trecho como um único grupo lógico.
Hoje aparece menos que REDEFINES, mas ainda existe em sistemas legados e alguns frameworks internos.
CONSTANTES
Nunca escreva:
IF WS-TIPO = "A"
Prefira:
78 ATIVO VALUE "A".
IF WS-TIPO = ATIVO
Ou
01 WS-CONSTANTES.
05 WS-TP-ATIVO VALUE "A".
05 WS-TP-INATIVO VALUE "I".
O significado fica explícito.
PIC correto faz diferença
Texto.
PIC X(30)
Numérico.
PIC 9(5)
Decimal.
PIC S9(9)V99 COMP-3
Valor monetário.
PIC S9(11)V99 COMP-3
Nunca utilize texto para armazenar números quando eles serão calculados.
COMP, COMP-3 e DISPLAY
Nos bancos é comum encontrar a seguinte estratégia:
DISPLAY
para entrada e saída.
COMP
para cálculos inteiros.
COMP-3
para valores financeiros.
Exemplo.
05 WS-SALDO
PIC S9(11)V99 COMP-3.
Além de economizar espaço, melhora desempenho e precisão decimal.
Inicialização
Sempre inicialize.
VALUE ZERO.
VALUE SPACES.
VALUE LOW-VALUES.
VALUE HIGH-VALUES.
Ou utilize
INITIALIZE
Evite depender do conteúdo anterior da memória.
Um erro clássico
05 WS-NOME PIC X(30).
Depois.
MOVE "JOAO" TO WS-NOME
Comparação.
IF WS-NOME = "JOAO"
Pode funcionar.
Pode não funcionar.
Por quê?
Porque existem espaços restantes.
Muitos bancos utilizam:
FUNCTION TRIM
ou
INSPECT
para evitar problemas.
Tabelas OCCURS
Sempre nomeie corretamente.
05 WS-CLIENTES OCCURS 100 TIMES.
10 WS-NOME.
10 WS-SALDO.
Índices separados.
77 WS-IDX PIC S9(4) COMP.
Ou
INDEXED BY IDX-CLIENTE
Muito mais eficiente.
Evite mágicas
Nunca faça:
MOVE 1 TO WS-X.
Depois.
IF WS-X = 1
Prefira.
88 WS-PROCESSADO VALUE 1.
Muito mais legível.
Organização visual
Bancos normalmente alinham tudo.
05 WS-NOME PIC X(40).
05 WS-CPF PIC 9(11).
05 WS-SALDO PIC S9(09)V99 COMP-3.
05 WS-DATA-NASC PIC 9(08).
Pode parecer detalhe.
Mas melhora muito a leitura.
Comentários úteis
Evite.
* Nome.
Prefira.
* Dados recebidos do cadastro central.
* Área utilizada para integração com PIX.
* Buffer utilizado pelo CICS.
Explique o motivo.
Não o óbvio.
╔══════════════════════════════════════════════════════════════════════╗
║ COBOL DATA DIVISION ║
║ "Tudo começa pelos dados." ║
╚══════════════════════════════════════════════════════════════════════╝
PROGRAMA COBOL
│
▼
WORKING-STORAGE SECTION
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
WS-CONTROLE WS-ENTRADA WS-SAÍDA
│ │ │
▼ ▼ ▼
Variáveis Arquivos Resultados
de Trabalho Entrada Processados
Hierarquia dos Levels (Níveis)
01 WS-CLIENTE
│
├──05 WS-DADOS-PESSOAIS
│ ├──10 WS-NOME
│ ├──10 WS-CPF
│ └──10 WS-DATA-NASCIMENTO
│
├──05 WS-ENDERECO
│ ├──10 WS-RUA
│ ├──10 WS-NUMERO
│ ├──10 WS-CIDADE
│ └──10 WS-CEP
│
└──05 WS-DADOS-BANCARIOS
├──10 WS-AGENCIA
├──10 WS-CONTA
└──10 WS-SALDO
Quanto maior o nível...
menor o detalhe.
01 → Registro completo
05 → Grupo principal
10 → Campo
15 → Subcampo
20+ → Especializações
Organização Recomendada
+-------------------+
| 01 WS-CLIENTE |
+-------------------+
│
┌───────────────┼───────────────┐
▼ ▼ ▼
IDENTIFICAÇÃO ENDEREÇO FINANCEIRO
│ │ │
▼ ▼ ▼
CPF / Nome Rua / CEP Conta / Saldo
Prefixos Mais Utilizados
WS- → Working Storage
LK- → Linkage Section
LS- → Local Storage
DFH- → CICS
SQL- → DB2
IX- → Índice
CT- → Constante
FL- → Flag
TP- → Tipo
DT- → Data
HR- → Hora
NR- → Número
CD- → Código
VLR- → Valor
QTD- → Quantidade
REDEFINES (Mesma memória)
+-------------------------+
| WS-DADOS |
| X(20) |
+-------------------------+
▲
│
REDEFINES │
│
+-------------------------+
| WS-CPF |
| 9(20) |
+-------------------------+
Uma única área de memória.
Duas interpretações diferentes.
RENAMES (Grupo Lógico)
01 WS-REGISTRO
│
├──05 WS-NOME
├──05 WS-ENDERECO
├──05 WS-CIDADE
└──05 WS-CEP
│
▼
66 WS-DADOS-CADASTRAIS
RENAMES WS-NOME THRU WS-CEP
Nível 88 (Legibilidade)
+-------------------+
| WS-STATUS PIC X|
+-------------------+
│
┌──────┴──────┐
▼ ▼
88 WS-ATIVO 88 WS-INATIVO
VALUE "A" VALUE "I"
Ao invés de:
IF STATUS = "A"
Escrevemos:
IF WS-ATIVO
O Fluxo de uma Variável
Declaração
│
▼
Inicialização
│
▼
Validação
│
▼
Processamento
│
▼
Saída
│
▼
Encerramento
O que um iniciante costuma fazer...
WS-X
WS-AUX
WS-TEMP
WS-AREA
WS-DADOS
😢
O que um profissional faz...
WS-VLR-SALDO-ATUAL
WS-DT-PROCESSAMENTO
WS-QTD-CLIENTES
WS-FL-CONTA-ATIVA
WS-CD-AGENCIA
😎
╔════════════════════════════════════════════════════════════╗
║ "Programas envelhecem. Dados permanecem." ║
║ ║
║ Quanto melhor a Data Division... ║
║ ...mais simples será todo o restante do programa. ║
╚════════════════════════════════════════════════════════════╝ .
╔══════════════════════════════════════════════════════════════════════╗
║ COBOL DATA DIVISION ║
║ "Tudo começa pelos dados." ║
╚══════════════════════════════════════════════════════════════════════╝
PROGRAMA COBOL
│
▼
WORKING-STORAGE SECTION
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
WS-CONTROLE WS-ENTRADA WS-SAÍDA
│ │ │
▼ ▼ ▼
Variáveis Arquivos Resultados
de Trabalho Entrada Processados
Hierarquia dos Levels (Níveis)
01 WS-CLIENTE
│
├──05 WS-DADOS-PESSOAIS
│ ├──10 WS-NOME
│ ├──10 WS-CPF
│ └──10 WS-DATA-NASCIMENTO
│
├──05 WS-ENDERECO
│ ├──10 WS-RUA
│ ├──10 WS-NUMERO
│ ├──10 WS-CIDADE
│ └──10 WS-CEP
│
└──05 WS-DADOS-BANCARIOS
├──10 WS-AGENCIA
├──10 WS-CONTA
└──10 WS-SALDO
Quanto maior o nível...
menor o detalhe.
01 → Registro completo
05 → Grupo principal
10 → Campo
15 → Subcampo
20+ → Especializações
Organização Recomendada
+-------------------+
| 01 WS-CLIENTE |
+-------------------+
│
┌───────────────┼───────────────┐
▼ ▼ ▼
IDENTIFICAÇÃO ENDEREÇO FINANCEIRO
│ │ │
▼ ▼ ▼
CPF / Nome Rua / CEP Conta / Saldo
Prefixos Mais Utilizados
WS- → Working Storage
LK- → Linkage Section
LS- → Local Storage
DFH- → CICS
SQL- → DB2
IX- → Índice
CT- → Constante
FL- → Flag
TP- → Tipo
DT- → Data
HR- → Hora
NR- → Número
CD- → Código
VLR- → Valor
QTD- → Quantidade
REDEFINES (Mesma memória)
+-------------------------+
| WS-DADOS |
| X(20) |
+-------------------------+
▲
│
REDEFINES │
│
+-------------------------+
| WS-CPF |
| 9(20) |
+-------------------------+
Uma única área de memória.
Duas interpretações diferentes.
RENAMES (Grupo Lógico)
01 WS-REGISTRO
│
├──05 WS-NOME
├──05 WS-ENDERECO
├──05 WS-CIDADE
└──05 WS-CEP
│
▼
66 WS-DADOS-CADASTRAIS
RENAMES WS-NOME THRU WS-CEP
Nível 88 (Legibilidade)
+-------------------+
| WS-STATUS PIC X|
+-------------------+
│
┌──────┴──────┐
▼ ▼
88 WS-ATIVO 88 WS-INATIVO
VALUE "A" VALUE "I"
Ao invés de:
IF STATUS = "A"
Escrevemos:
IF WS-ATIVO
O Fluxo de uma Variável
Declaração
│
▼
Inicialização
│
▼
Validação
│
▼
Processamento
│
▼
Saída
│
▼
Encerramento
O que um iniciante costuma fazer...
WS-X
WS-AUX
WS-TEMP
WS-AREA
WS-DADOS
😢
O que um profissional faz...
WS-VLR-SALDO-ATUAL
WS-DT-PROCESSAMENTO
WS-QTD-CLIENTES
WS-FL-CONTA-ATIVA
WS-CD-AGENCIA
😎
╔════════════════════════════════════════════════════════════╗
║ "Programas envelhecem. Dados permanecem." ║
║ ║
║ Quanto melhor a Data Division... ║
║ ...mais simples será todo o restante do programa. ║
╚════════════════════════════════════════════════════════════╝ .Os erros mais comuns dos iniciantes
Variáveis com nomes sem significado.
Misturar entrada, saída e trabalho na mesma área.
Não utilizar grupos.
Declarar tudo como PIC X.
Ignorar COMP-3 para valores monetários.
Não utilizar nível 88.
Criar dezenas de variáveis AUX.
Usar REDEFINES sem conhecer o layout.
Não inicializar variáveis.
Declarar estruturas sem padronização.
Copiar layouts diferentes para a mesma área.
Esquecer alinhamento e organização.
O estado da arte em 2024
Embora o COBOL tenha mais de seis décadas, a Data Division continua evoluindo.
Nos ambientes modernos do IBM Enterprise COBOL 6.x e z/OS 3.1, as melhores práticas incluem:
nomes semânticos e consistentes;
estruturas alinhadas a modelos de negócio;
uso intensivo de COPYBOOKs compartilhados para evitar duplicação;
integração com JSON, XML e APIs REST preservando tipos corretos;
preferência por COMP-3 para valores financeiros e COMP/BINARY para cálculos;
uso de USAGE INDEX, 88-level, INITIALIZE e funções intrínsecas;
validação por ferramentas de análise estática como IBM Application Delivery Foundation, SonarQube (quando integrado) e padrões internos de qualidade.
Em muitos bancos, nenhuma variável nasce por acaso. Ela segue convenções documentadas, passa por revisão técnica e, frequentemente, é reutilizada por dezenas ou centenas de programas por meio de copybooks corporativos. Isso reduz erros, facilita integrações e garante consistência entre sistemas.
Curiosidades
O COBOL foi criado em 1959, e sua estrutura hierárquica de dados influenciou diversas linguagens posteriores.
Muitos layouts bancários brasileiros (CNAB 240 e 400 posições) dependem diretamente de grupos de níveis (
01,05,10...) para mapear registros.REDEFINES foi um dos primeiros mecanismos eficientes de reutilização de memória da história das linguagens comerciais.
Grandes bancos possuem programas com mais de 40 anos em produção cujas declarações de variáveis permanecem praticamente inalteradas, justamente porque foram bem projetadas desde o início.
A Filosofia Bellacosa Mainframe
Imagine uma biblioteca.
Cada livro possui uma prateleira.
Cada prateleira possui uma categoria.
Cada categoria possui uma etiqueta.
Agora imagine uma biblioteca onde todos os livros estão jogados no chão.
Ambas funcionam.
Mas apenas uma continua funcionando depois de cinquenta anos.
A Data Division é essa biblioteca.
Cada variável é um livro.
Cada nível é uma prateleira.
Cada nome é uma etiqueta.
Quando você declara uma variável pensando apenas no programa de hoje, escreve código.
Quando a declara pensando no colega que fará manutenção daqui a vinte anos, constrói engenharia de software.
E é exatamente essa mentalidade que diferencia um programador COBOL de um verdadeiro profissional de mainframe.
No fim das contas, programas mudam, regras de negócio evoluem e tecnologias se renovam. Uma Data Division bem organizada, porém, continua sendo uma das maiores demonstrações de maturidade técnica que um desenvolvedor pode deixar como legado.