Translate

Mostrar mensagens com a etiqueta Packed Decimal. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Packed Decimal. Mostrar todas as mensagens

quarta-feira, 10 de junho de 2026

☕💣🚀 COMP-1, COMP-2, COMP-3, COMP-4 e COMP-5 para o Programador COBOL Jr.

 

Bellacosa Mainframe e as variaveis computacionais do COBOL 

☕💣🚀 COMP-1, COMP-2, COMP-3, COMP-4 e COMP-5 para o Programador COBOL Jr.

Uma das maiores fontes de confusão para quem começa em COBOL é entender por que existem tantos tipos numéricos.

A resposta está na história dos mainframes IBM.

Cada COMP surgiu para resolver um problema específico de armazenamento, desempenho ou precisão matemática. (IBM)


Linha do Tempo

TipoSurgiu
COMPDécada de 1960
COMP-1Década de 1970
COMP-2Década de 1970
COMP-3Década de 1960
COMP-4Década de 1970
COMP-5Década de 1980

Os números exatos variam conforme compilador e plataforma, mas COMP-3 e COMP já existiam nos ambientes System/360. COMP-1, COMP-2 e COMP-4 apareceram como extensões IBM. COMP-5 surgiu posteriormente para resolver limitações do BINARY tradicional. (IBM)


COMP-1

O que é

Ponto flutuante simples (single precision).

Ocupa:

  • 4 bytes

Utilizado para:

  • cálculos científicos

  • engenharia

  • estatística

Não deve ser usado para dinheiro. (IBM)


Exemplo

01 WS-TEMPERATURA COMP-1.

MOVE 23.75 TO WS-TEMPERATURA.

Vantagens

  • rápido

  • suporta expoentes

  • ocupa pouco espaço


Desvantagens

  • perde precisão decimal

  • gera arredondamentos inesperados


Exemplo clássico

COMPUTE RESULT = 0.1 + 0.2

Resultado pode não ser exatamente:

0.300000

Isso acontece porque o valor é armazenado em binário.


COMP-2

O que é

Ponto flutuante duplo (double precision).

Ocupa:

  • 8 bytes

Muito mais preciso que COMP-1. (IBM)


Exemplo

01 WS-PI COMP-2.

MOVE 3.14159265358979 TO WS-PI.

Vantagens

  • enorme faixa de valores

  • excelente precisão científica


Desvantagens

  • mais lento

  • ocupa mais memória

  • inadequado para dinheiro


COMP-3

O Rei dos Bancos

Também chamado:

PACKED DECIMAL

ou

COMPUTATIONAL-3

É o formato mais amado pelos bancos. (IBM)


Como funciona

Cada byte armazena:

2 dígitos

mais um nibble de sinal.


Exemplo

01 SALDO PIC S9(7)V99 COMP-3.

Valor:

12345.67

Internamente:

12 34 56 7C

(C = positivo)


Vantagens

  • extremamente compacto

  • precisão decimal perfeita

  • ideal para dinheiro


Desvantagens

  • CPU precisa converter para cálculo

  • não é legível em dump


Melhor uso

Contas correntes
Faturas
Cartões
Seguros
Folha de pagamento

COMP-4

O que é

Binário IBM.

Sinônimo de:

BINARY
COMP

na maioria dos compiladores IBM. (IBM)


Exemplo

01 CONTADOR PIC S9(4) COMP-4.

Tamanho

DígitosBytes
1-42
5-94
10-188

(IBM)


Vantagens

  • muito rápido

  • ideal para índices

  • excelente para contadores


Desvantagens

O comportamento depende do:

TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)

Isso já causou milhares de bugs em migrações COBOL. (IBM)


COMP-5

O que é

Binary Native.

Foi criado para eliminar limitações do COMP-4. (IBM)


Exemplo

01 WS-ID PIC S9(4) COMP-5.

Diferença Fundamental

Mesmo declarando:

PIC S9(4)

um COMP-5 de 2 bytes pode armazenar:

-32768
até
+32767

porque usa a capacidade real do campo binário. (IBM)


Vantagens

  • mais rápido

  • ideal para APIs

  • ideal para CICS

  • ideal para LE

  • ideal para interoperabilidade com C


Desvantagens

  • pode surpreender quem espera validação pelo PIC

  • programas antigos podem comportar-se diferente


Comparação Geral

CaracterísticaCOMP-1COMP-2COMP-3COMP-4COMP-5
TipoFloatFloatDecimalBinárioBinário Nativo
Bytes48Variável2/4/82/4/8
Dinheiro⚠️⚠️
VelocidadeAltaAltaMédiaMuito AltaMuito Alta
Precisão DecimalBaixaMédiaExcelenteBoaBoa
InteroperabilidadeMédiaMédiaBaixaMédiaExcelente

Opções de Compilação que Afetam Tudo

TRUNC

TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)

Principal responsável por diferenças em COMP e COMP-4. (IBM)


ARITH

ARITH(COMPAT)
ARITH(EXTEND)

Impacta precisão matemática.

Muito importante para:

COMP-3
COMPUTE
DIVIDE
MULTIPLY

NUMPROC

NUMPROC(PFD)
NUMPROC(MIG)
NUMPROC(NOPFD)

Afeta tratamento de sinais inválidos em COMP-3.


RULES(NOEVENPACK)

Detecta packed decimals com número par de dígitos, ajudando a otimizar COMP-3. (IBM)


Problemas Conhecidos

1. Dinheiro em COMP-1

Erro clássico.

01 SALDO COMP-1.

Nunca faça isso.


2. Migração COBOL V4 → V6

Mudanças em:

TRUNC
ARITH
OPTIMIZATION

geraram diferenças de resultados em milhares de aplicações. (IBM)


3. COMP-3 Corrompido

Dump:

12 34 5F

Sinal inválido.

Pode gerar:

S0C7

4. Overflow Silencioso

Muito comum em:

COMP
COMP-4

quando TRUNC(BIN) está ativo.


Easter Eggs e Curiosidades

1. O banco não gosta de FLOAT

Em muitos bancos você encontrará:

0 ocorrências de COMP-1
0 ocorrências de COMP-2

em milhões de linhas COBOL.


2. COMP-3 domina Wall Street

Grande parte dos sistemas financeiros de alto volume ainda utiliza COMP-3 para valores monetários devido à precisão decimal exata.


3. TRUNC(BIN) "transforma" COMP em COMP-5

Na prática, muitos comportamentos tornam-se equivalentes para operações binárias. (IBM)


4. Packed Decimal foi uma genialidade da IBM

Quando memória custava fortunas, armazenar dois dígitos por byte era uma enorme vantagem econômica.


Regra de Ouro para o Programador COBOL Jr.

Se estiver em dúvida:

Dinheiro      -> COMP-3
Contadores    -> COMP-5
Índices       -> COMP-5
Percentuais   -> COMP-3
Cálculos científicos -> COMP-2
Integração C/C++ -> COMP-5

Em ambientes modernos z/OS com Enterprise COBOL 6.x, a combinação mais comum e segura é:

COMP-3 para valores financeiros
COMP-5 para inteiros e contadores

Essa dupla cobre praticamente 95% das necessidades de aplicações corporativas em bancos, seguradoras e grandes empresas. (IBM)

domingo, 1 de junho de 2025

☕💣🚀 PADAWAN, O ASSEMBLER NÃO É UMA LINGUAGEM. É O MOMENTO EM QUE VOCÊ PARA DE DISCUTIR COM O COMPUTADOR E COMEÇA A CONVERSAR DIRETAMENTE COM A CPU!

Bellacosa Mainframe e a linguagem assembler em mainframe o mitico hlasm

☕💣🚀 PADAWAN, O ASSEMBLER NÃO É UMA LINGUAGEM. É O MOMENTO EM QUE VOCÊ PARA DE DISCUTIR COM O COMPUTADOR E COMEÇA A CONVERSAR DIRETAMENTE COM A CPU!

As Lições Ocultas do Curso IBM z/Architecture Assembler Language – Part 2

Existe um momento na vida de todo profissional de Mainframe em que COBOL deixa de ser suficiente.

Não porque COBOL seja limitado.

Não porque o Mainframe seja antigo.

Mas porque surge uma pergunta perigosa:

"O que realmente acontece quando meu programa executa?"

É nesse momento que nasce o interesse pelo Assembler.

O curso IBM EZ341G — z/Architecture Assembler Language Part 2: Machine Instructions — não ensina apenas instruções. Ele ensina como o processador IBM Z pensa.

E isso muda tudo.


O Grande Segredo: Tudo é Registrador

Durante o curso inteiro existe uma mensagem escondida:

LH    3,NUM
AR    3,4
CR    3,5
BE    IGUAL

Tudo gira em torno dos registradores.

Quando um programador COBOL escreve:

ADD VALOR-A TO VALOR-B

o compilador transforma isso em dezenas de instruções de máquina.

O processador não entende COBOL.

Não entende Java.

Não entende Python.

Ele entende apenas instruções.

E quase todas elas envolvem registradores.


A Regra de Ouro: Se Tem G, Pense em 64 Bits

Uma das maiores pegadinhas do curso é distinguir instruções de 32 e 64 bits.

O padrão da IBM é elegantemente simples:

G = Grande = 64 bits

Exemplos:

LG
LGR
LGFI
AG
AGFI
CG
CGR

Todos trabalham sobre o registrador completo.

Já:

L
A
C
AFI

operam apenas sobre a low half do registrador.

Essa pequena letra "G" aparece em dezenas de questões do exame.


O Mistério do Condition Code

O Condition Code é provavelmente o conceito mais importante do curso.

Após uma comparação:

CR  3,4

a CPU grava um valor invisível dentro do PSW.

Esse valor é:

CC=0 Equal
CC=1 Low
CC=2 High

Depois disso:

JE    IGUAL
JL    MENOR
JH    MAIOR

tomam decisões baseadas nesse resultado.

Perceba a beleza do mecanismo.

O processador não executa "IF".

Ele apenas produz Condition Codes.

Todo o resto é interpretação.


O Macete 8421

Outro conceito que aparece repetidamente no exame:

8 = Zero
4 = Minus
2 = Plus
1 = Overflow

Esse é o famoso padrão das máscaras de branch.

Por isso:

JZ
JM
JP
JO

são apenas apelidos amigáveis para máscaras numéricas.

Quando você entende isso, dezenas de Extended Mnemonics deixam de ser um problema.


Packed Decimal: A Religião Financeira do Mainframe

Se existe uma tecnologia que sobreviveu a todas as modas da computação, é o Packed Decimal.

Enquanto o restante do mundo usa floating point para tudo, bancos continuam confiando bilhões de dólares diariamente em instruções como:

AP
SP
MP
DP
CP

O motivo é simples.

Dinheiro não tolera aproximações.


Como Reconhecer um Packed Decimal Válido

Muitos alunos perdem pontos porque esquecem uma regra básica.

Os dígitos devem conter:

0-9

E o último nibble deve conter um sinal:

C
D
F

Exemplos válidos:

123C
123D
550F

Exemplos inválidos:

12AC
00C1
1ABC

Quando isso acontece:

S0C7
Data Exception

O famoso terror dos programadores COBOL.


O Verdadeiro Significado do S0C7

Muitos iniciantes acreditam que:

S0C7 = erro de COBOL

Errado.

O S0C7 é um erro da CPU.

Ela tentou executar uma operação decimal e encontrou dados inválidos.

O COBOL apenas estava no lugar errado na hora errada.


Multiplicação: Onde Todo Mundo Erra

As instruções:

M
MR
MP

parecem simples.

Mas escondem algumas das regras mais cruéis da arquitetura.

Por exemplo:

MR 2,3

não multiplica R2 por R3.

Na verdade utiliza:

Par R2-R3

e coloca o resultado distribuído entre os dois registradores.

Essa é uma das pegadinhas favoritas da IBM.


Divisão: A Arte de Produzir S0CB

A instrução:

DP

é responsável por um dos abends mais famosos do mundo Mainframe:

S0CB
Decimal Divide Exception

Ele ocorre quando:

  • O divisor é zero.

  • O quociente não cabe no campo de destino.

Ou seja, a CPU está protegendo seus dados.


SRP: A Instrução que Parece Magia

Poucas instruções impressionam tanto quanto:

SRP

Shift and Round Packed.

Com ela podemos:

123.95 -> 123
123.95 -> 124
55 -> 5500

Tudo sem realizar multiplicações ou divisões explícitas.

Na prática, SRP é uma calculadora financeira embutida no hardware.


ED: O Momento em que o Mainframe Aprende a Falar com Humanos

Packed Decimal é excelente para cálculos.

Mas humanos não gostam de ler:

12345C

É aí que entra:

ED

A instrução EDIT.

Ela transforma números internos em formatos amigáveis:

12.345,67
24.00
999.99

O ED é literalmente a ponte entre o mundo da CPU e o mundo dos relatórios.


O Poder das Máscaras

A maioria dos alunos demora para perceber que:

ED

não faz a formatação.

Quem faz é a máscara.

Por isso encontramos padrões como:

20
21
4B
6B
40

onde:

20 = Digit Selector
21 = Significance Starter
4B = Ponto Decimal
6B = Vírgula
40 = Espaço

É um mecanismo brilhante criado décadas antes da maioria das linguagens modernas.


O Que o Curso Realmente Ensina

Oficialmente o curso fala sobre:

  • LOAD

  • STORE

  • ADD

  • SUBTRACT

  • MULTIPLY

  • DIVIDE

  • COMPARE

  • BRANCH

  • CHARACTERS

  • PACKED DECIMAL

Mas na prática ele ensina algo muito mais profundo.

Ele mostra que toda linguagem moderna, toda API, todo framework e toda aplicação corporativa acabam reduzidos a algumas operações fundamentais:

Mover dados
Somar
Subtrair
Comparar
Desviar
Formatar

O Mainframe apenas faz isso de forma extremamente explícita.


Conclusão

☕💣🚀 PADAWAN, quando você aprende Assembler, descobre um segredo que poucos profissionais conhecem.

O computador nunca executou COBOL.

Nunca executou Java.

Nunca executou Python.

Ele sempre executou instruções de máquina.

O Assembler apenas remove o tradutor e permite que você converse diretamente com a arquitetura IBM Z.

E quando isso acontece, você deixa de ser apenas um programador.

Você começa a entender como a própria CPU pensa.


sexta-feira, 21 de janeiro de 2022

COBOL : Muito Além do PIC S9(7)V99 COMP-3

 

Bellacosa Mainframe analisa as variaveis estilo cobol

☕ Um Café no Bellacosa Mainframe

Muito Além do PIC S9(7)V99 COMP-3

O Que Todo Programador COBOL Padawan Precisa Saber Sobre a Anatomia de uma Variável, Como o IBM Z Enxerga Seus Dados e Por Que Essa Sintaxe Continua Dominando o Mundo Financeiro

"Qual é a variável mais importante do COBOL?"

A maioria dos programadores iniciantes responde algo como:

"WS-NOME."

Ou talvez:

"WS-SALARIO."

Mas essa pergunta possui uma resposta muito mais interessante.

A variável mais importante do COBOL não é uma variável específica.

É o conceito por trás de todas elas.

Uma simples declaração como esta:

05 WS-MONTANTE PIC S9(7)V99 COMP-3.

parece pequena.

São apenas alguns caracteres.

Entretanto, essa única linha descreve muito mais informações do que praticamente qualquer linguagem moderna consegue expressar de forma tão compacta.

Ela informa ao compilador:

  • onde o dado pertence;

  • qual seu significado;

  • como será armazenado;

  • como será processado pela CPU;

  • quanto espaço ocupará;

  • se aceita números negativos;

  • onde está a posição decimal;

  • como será gravado em disco;

  • como será enviado ao DB2;

  • como participará das operações matemáticas.

Em outras palavras...

Ela descreve completamente a vida daquele dado.

Hoje vamos abrir essa declaração como um engenheiro desmonta um motor Rolls-Royce.

Pegue seu café.

Vamos viajar para dentro da memória do IBM Z.


Bellacosa Mainframe e a anatomia de uma variavel

COBOL pensa diferente

Quem vem de Java, Python, C# ou JavaScript costuma enxergar uma variável assim:

double salario;

ou

salario = 1500.50

Pronto.

Acabou.

Mas o COBOL nasceu em uma época completamente diferente.

Na década de 60 memória era absurdamente cara.

Processadores eram lentos.

Discos eram pequenos.

Cada byte economizado representava milhares de dólares.

Por isso o COBOL não pergunta apenas:

"Que tipo de variável é essa?"

Ele pergunta:

"Como exatamente esse dado existirá dentro do computador?"

Essa filosofia mudou toda a arquitetura da linguagem.


Primeiro elemento: o nível

05 WS-MONTANTE ...

O número 05 não possui absolutamente nenhuma relação com tamanho.

Ele representa hierarquia.

Imagine um organograma de uma empresa.

Empresa

    Financeiro

        Contabilidade

            Funcionários

O COBOL organiza dados exatamente assim.

Exemplo:

01 CLIENTE.

   05 DADOS-PESSOAIS.

      10 NOME.

      10 CPF.

   05 DADOS-FINANCEIROS.

      10 LIMITE.

      10 SALDO.

Visualmente:

CLIENTE
│
├── DADOS-PESSOAIS
│      ├── NOME
│      └── CPF
│
└── DADOS-FINANCEIROS
       ├── LIMITE
       └── SALDO

Percebe?

O COBOL constrói verdadeiras árvores de dados.

É uma linguagem extremamente orientada à estrutura.

Muito antes de XML.

Muito antes de JSON.

Muito antes de objetos.


O nome importa muito

Observe:

WS-MONTANTE

Isso não é apenas um identificador.

É documentação.

Durante décadas milhares de desenvolvedores trabalharam simultaneamente no mesmo sistema.

Ninguém tinha IDE colorida.

Não existia autocomplete.

Então surgiram convenções.

Por exemplo:

WS-

significa:

Working-Storage

Já:

LS-

é Local Storage.

LK-

Linkage.

SQL-

variáveis utilizadas pelo DB2.

DFH-

estruturas do CICS.

Quando você vê um nome começando por WS-, imediatamente sabe onde aquela variável foi declarada.

Isso aumenta muito a legibilidade.


O verdadeiro coração da declaração

Chegamos ao famoso:

PIC

PIC significa:

Picture

Muitos imaginam que ele define apenas o tamanho.

Não.

Ele descreve a forma como o dado será representado.

É quase um DNA.

Vamos ver alguns exemplos.

Texto:

PIC X(30)

Trinta caracteres.

Somente letras:

PIC A(20)

Numérico:

PIC 9(8)

Numérico com casas decimais:

PIC 9(7)V99

Editado para impressão:

PIC $$$,$$9.99

Cada Picture possui uma finalidade diferente.


O significado do "9"

Na nossa variável aparece:

9(7)

O nove significa:

um dígito decimal.

Logo:

9

aceita:

0 até 9

Enquanto

99

aceita

00 até 99

9(7)

é apenas uma forma elegante de escrever:

9999999

Ou seja:

sete dígitos.

Nada mais.

Nada menos.


O misterioso S

Agora observe:

S9(7)

O "S" significa:

Signed.

Número com sinal.

Sem ele:

0
até

9999999

Com ele:

-9999999

até

+9999999

Mas aqui existe uma curiosidade interessante.

O sinal normalmente não ocupa um byte inteiro.

No formato COMP-3 ele é armazenado dentro do último nibble do número.

Uma solução extremamente elegante criada quando memória era um recurso precioso.


A genialidade da vírgula invisível

Agora chegamos ao personagem mais incompreendido do COBOL.

A letra:

V

A maioria dos iniciantes acredita que ela representa uma vírgula.

Na realidade...

Ela representa a posição lógica da vírgula.

A vírgula nunca é gravada.

Nunca.

Suponha:

PIC 9(5)V99

Na memória teremos:

1234567

Mas o COBOL interpreta como:

12345,67

Onde foi parar a vírgula?

Ela nunca existiu.

O compilador apenas sabe que, ao interpretar aquele número, deve considerar duas casas decimais.

Parece um detalhe.

Mas imagine milhões de registros.

Economizar um byte em cada registro significava reduzir discos inteiros.


A importância da precisão

Vamos comparar.

Python:

0.1 + 0.2

Resultado:

0.30000000000000004

Não é erro do Python.

É matemática binária.

Agora veja o COBOL usando Packed Decimal.

0.10

+

0.20

=

0.30

Sempre.

Sem aproximações.

Sem surpresas.

Sem arredondamentos inesperados.

É exatamente por isso que bancos utilizam COMP-3 há décadas.

Dinheiro exige precisão absoluta.


O que é COMP-3?

Agora chegamos ao astro da declaração.

COMP-3

Também conhecido como:

Packed Decimal.

BCD.

Decimal Empacotado.

Ao contrário do DISPLAY, onde cada dígito ocupa um byte inteiro, o COMP-3 armazena dois dígitos por byte.

Cada dígito utiliza apenas quatro bits.

Ou seja:

12

cabe em um único byte.

Muito mais eficiente.


Como o número fica na memória?

Suponha:

123456789

Em DISPLAY:

F1 F2 F3 F4 F5 F6 F7 F8 F9

Nove bytes.

No COMP-3:

12 34 56 78 9C

Cinco bytes.

O "C" representa positivo.

Se fosse negativo:

9D

Essa codificação ainda hoje é utilizada por praticamente todos os grandes bancos do planeta.


Quantos bytes essa variável ocupa?

Existe uma fórmula famosa.

(dígitos + 2) / 2

Arredondando para cima.

Nossa variável possui:

7

+

2

=

9 dígitos

Logo:

(9 + 2) / 2

=

5 bytes

Apenas cinco bytes.


Parece pouco?

Imagine um cadastro contendo:

300 milhões

de clientes.

Economizar quatro bytes por registro significa aproximadamente:

1,2 GB

Apenas em um campo.

Agora multiplique isso por centenas de campos.

Depois por milhares de tabelas.

Depois por backups.

Depois por replicações.

Agora você entende por que arquitetos de mainframe pensam diferente.


O compilador faz muito mais do que imaginamos

Quando escrevemos:

05 WS-MONTANTE PIC S9(7)V99 COMP-3.

Nós enxergamos apenas texto.

O compilador enxerga uma enorme quantidade de metadados.

Ele sabe:

✔ É numérico.

✔ É decimal.

✔ Possui sinal.

✔ Tem duas casas decimais.

✔ Ocupa cinco bytes.

✔ Pode participar de operações aritméticas.

✔ Será armazenado em Packed Decimal.

✔ É compatível com DECIMAL do DB2.

✔ Pode ser usado em comandos ADD, SUBTRACT, MULTIPLY e COMPUTE.

Tudo isso antes mesmo do programa começar a executar.


Por que DB2 gosta tanto de COMP-3?

Observe esta coluna SQL.

SALDO DECIMAL(9,2)

Em COBOL normalmente teremos:

PIC S9(7)V99 COMP-3

Os dois formatos representam exatamente o mesmo conceito.

Resultado?

Conversões mínimas.

Mais velocidade.

Menor consumo de CPU.

Menor custo operacional.


VSAM, IMS e CICS também entendem esse formato

Quando um programa COBOL grava um registro VSAM contendo COMP-3, os números são gravados exatamente nesse formato empacotado.

Quando outro programa COBOL lê esse registro, nenhuma conversão é necessária.

Tudo continua extremamente eficiente.

Por isso sistemas desenvolvidos há quarenta anos continuam rápidos até hoje.


O preço dessa eficiência

Existe um lado curioso.

Abra um arquivo contendo COMP-3 em um editor hexadecimal.

Você verá algo parecido com:

12 34 56 7C

Não parece um número.

Porque não é texto.

É uma representação física otimizada.

Por isso ferramentas modernas precisam converter esses bytes antes de exibi-los.


E quando falamos em APIs REST?

Hoje muitas aplicações COBOL conversam com Java, Python, Node.js e microsserviços.

Entretanto JSON não entende Packed Decimal.

Então ocorre uma conversão.

Internamente:

12 34 56 7C

Externamente:

{
  "saldo": 12345.67
}

É exatamente esse trabalho que tecnologias como IBM z/OS Connect, CICS Web Services e diversos frameworks de integração realizam.

Eles traduzem o universo do IBM Z para um formato compreendido pelas aplicações modernas, preservando a precisão decimal do COBOL.


Uma lição para o Programador Padawan

Talvez você esteja pensando:

"Tudo isso para declarar uma variável?"

Exatamente.

Essa é a beleza do COBOL.

Em linguagens modernas, muitas decisões ficam escondidas dentro da máquina virtual, do compilador ou da biblioteca de execução.

No COBOL, elas são explícitas.

O programador descreve com precisão quase cirúrgica como seus dados devem existir.

Essa filosofia nasceu da necessidade, mas transformou-se em uma das maiores virtudes da linguagem.

Não é por acaso que os maiores bancos, seguradoras, bolsas de valores e órgãos governamentais do mundo continuam confiando no IBM Z para processar trilhões de dólares diariamente.

Quando um PIX é liquidado, um cartão é autorizado, um financiamento é calculado ou uma aposentadoria é paga, há uma grande chance de que, em algum ponto dessa jornada, exista uma variável muito parecida com a nossa velha conhecida:

05 WS-MONTANTE PIC S9(7)V99 COMP-3.

Ela pode parecer simples.

Mas dentro dela vivem mais de seis décadas de engenharia, otimização, compatibilidade e confiabilidade.

E talvez essa seja a maior lição para todo Programador Padawan: no universo do Mainframe, uma linha de código raramente faz apenas uma coisa. Cada declaração carrega décadas de experiência acumulada, decisões arquiteturais cuidadosamente pensadas e um compromisso absoluto com precisão, desempenho e estabilidade. Aprender a "ler" uma variável COBOL é aprender a enxergar a lógica invisível que sustenta alguns dos sistemas mais críticos do planeta. Quando você dominar essa linguagem dos dados, deixará de apenas escrever programas e passará a compreender como o IBM Z realmente pensa.

sábado, 15 de junho de 2013

☕🔥 ABEND S0C7 — O “COLAPSO DECIMAL” DO MAINFRAME

 

Bellacosa Mainframe abend s0c7

☕🔥 ABEND S0C7 — O “COLAPSO DECIMAL” DO MAINFRAME

Quando o IBM Z Olha Para Seus Dados e Diz:

“ISSO NÃO É UM NÚMERO VÁLIDO.”

Se existe um ABEND que traumatiza TODO programador COBOL iniciante…

é o lendário:

🚨 S0C7

O verdadeiro ritual de passagem do mundo mainframe.

E normalmente ele aparece assim:

SYSTEM COMPLETION CODE=0C7

ou:

DATA EXCEPTION

ou ainda:

ASRA/S0C7

no CICS.

E naquele momento…

o Junior Padawan entra em crise existencial:

“MAS O CAMPO É NUMÉRICO!”
“O COBOL ME TRAIU!”
“O ARQUIVO ESTÁ AMALDIÇOADO?”
“O HEXADECIMAL VIROU DEMÔNIO?”

☕ Respira.

Porque o S0C7 é um dos ABENDs MAIS IMPORTANTES da história do mainframe.


🔥 O QUE É O S0C7?

O S0C7 é um:

🚨 DATA EXCEPTION

Traduzindo:

A CPU IBM Z TENTOU EXECUTAR UMA OPERAÇÃO NUMÉRICA COM DADOS INVÁLIDOS.


☕ A FILOSOFIA DO S0C7

O mainframe leva números MUITO a sério.

No mundo COBOL:

NUMÉRICO NÃO É “PARECE NÚMERO”.

Numérico precisa ser:

matematicamente válido em nível hexadecimal.


🔥 O QUE REALMENTE ACONTECE

Imagine:

ADD WS-VALOR TO WS-TOTAL

O COBOL gera instruções decimais do IBM Z.

A CPU lê:

packed decimal
zoned decimal
binary
display numeric

Mas encontra:

lixo

Resultado:

💥 S0C7


☕ ANALOGIA BELLACOSA MAINFRAME

Imagine um caixa eletrônico.

Você digita:

100

Tudo certo.

Mas imagine digitar:

ABACAXI

O sistema trava.

O S0C7 é isso.


🔥 O MAIOR SEGREDO

O S0C7 NÃO É “ERRO DO COBOL”.

É:

erro de DADOS.


☕ O MAIOR VILÃO DO UNIVERSO MAINFRAME

🚨 COMP-3

O lendário:

PACKED DECIMAL


🔥 O QUE É COMP-3?

Formato compactado decimal.

Exemplo:

PIC S9(7)V99 COMP-3

Armazenado em hexadecimal.


☕ COMO O PACKED FUNCIONA

Número:

12345

vira algo parecido com:

12 34 5C

O último nibble:

C

significa:

positivo


🔥 O PROBLEMA

Se aparecer:

12 34 AF

a CPU olha e diz:

❌ “ISSO NÃO É DECIMAL VÁLIDO.”

Resultado:

☠️ S0C7


☕ O S0C7 É HARDWARE

Isso é incrível.

O erro NÃO nasce no COBOL.

Nasce:

na própria CPU IBM Z.

O processador decimal detecta inconsistência.


🔥 O ERRO MAIS CLÁSSICO DA HISTÓRIA

MOVE 'ABC' TO WS-VALOR-NUM

Depois:

ADD 1 TO WS-VALOR-NUM

Resultado:

💥 S0C7


☕ O “MOVE MALDITO”

Outro clássico:

MOVE SPACES TO WS-VALOR

em campo numérico.

Mais tarde:

COMPUTE WS-TOTAL = WS-VALOR + 1

Boom.


🔥 O S0C7 FANTASMA

O mais assustador.

Erro acontece LONGE da causa real.


☕ EXEMPLO

Linha 100:

MOVE SPACES TO WS-NUM

Linha 5000:

ADD WS-NUM TO WS-TOTAL

Explosão.

O erro nasceu MUITO antes.


🔥 O VERDADEIRO DEMÔNIO: LAYOUT ERRADO

O campeão absoluto em produção.


☕ EXEMPLO

Arquivo real:

CAMPO-A = 10 bytes

COPYBOOK antigo:

CAMPO-A = 8 bytes

Agora TODOS os campos seguintes deslocam.

Campo numérico recebe lixo.

Resultado:

☠️ S0C7


🔥 O REDEFINES DA MORTE

Outro clássico.

01 REGISTRO.
   05 VALOR-NUM PIC 9(05).

01 REGISTRO-R REDEFINES REGISTRO.
   05 VALOR-TXT PIC X(05).

Depois:

MOVE 'ABCDE' TO VALOR-TXT
ADD 1 TO VALOR-NUM

Resultado:

💥 S0C7


☕ O S0C7 NO CICS

No CICS geralmente aparece como:

🚨 ASRA + S0C7

Porque o CICS intercepta o program check.


🔥 COMO INVESTIGAR O S0C7 PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O OFFSET

Exemplo:

OFFSET X'01FA'

Esse é o endereço da explosão.


✅ PASSO 2 — PEGUE O LISTING COBOL

Cruze offset com:

  • SYSADATA

  • compile listing

  • Abend-AID

  • Fault Analyzer


✅ PASSO 3 — IDENTIFIQUE A LINHA

Exemplo:

ADD WS-SALDO TO WS-TOTAL

✅ PASSO 4 — DESCUBRA QUAL CAMPO ESTÁ SUJO

Agora começa CSI Mainframe.


🔥 O SEGREDO DOS HEXADECIMAIS

Veteranos olham dump em HEX.

Porque o problema REAL está lá.


☕ EXEMPLO VÁLIDO

F1 F2 F3

EBCDIC:

123

☕ EXEMPLO INVÁLIDO

C1 C2 C3

EBCDIC:

ABC

Em campo numérico:

☠️ S0C7


🔥 COMO LER O DUMP


☕ PSW

GPS do desastre.


☕ REGISTERS

Especialmente:

R1
R13
R14
R15

☕ STORAGE DUMP

Aqui mora a verdade.

Veterano encontra:

  • packed inválido

  • espaço em numérico

  • sinal incorreto

  • overlay


🔥 O HEXADECIMAL MAIS TEMIDO

40404040

EBCDIC:

espaços

Campo numérico cheio de espaços.

Clássico S0C7.


☕ O S0C7 E O FILE STATUS

Junior acha:

arquivo abriu = tudo bem

Não.

O conteúdo pode estar:

corrompido.


🔥 O S0C7 E O DB2

Outro clássico.

COLUNA:

DECIMAL(9,2)

Programa espera:

PIC 9(5)

Mismatch.

Resultado:

💥 dados inválidos


☕ O S0C7 E O SORT

Arquivo alterado por SORT errado.

Campos deslocados.

Resultado:

☠️ S0C7


🔥 COMO EVITAR S0C7


✅ Nunca mover spaces para numérico


✅ Validar NUMERIC

IF WS-CAMPO NUMERIC

✅ Revisar layouts


✅ Sincronizar copybooks


✅ Cuidado com REDEFINES


✅ Validar entrada externa


✅ Revisar COMP-3


☕ O TEST-NUMVAL — MAGIA MODERNA

COBOL moderno possui:

FUNCTION TEST-NUMVAL

Excelente defesa contra S0C7.


🔥 CURIOSIDADE HISTÓRICA

O S0C7 nasceu junto com:

System/360

Década de:

🏛️ 1960

IBM criou hardware decimal porque bancos precisavam:

  • precisão financeira

  • decimal real

  • sem erro binário


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0C7 é o imposto obrigatório para virar programador COBOL.”

Porque TODO mundo toma pelo menos um.


🔥 O MAIOR ERRO DO PADAWAN

Ver:

S0C7

e corrigir apenas a linha do ADD.

Não.

A causa pode ter nascido:

milhares de linhas antes.


☕ A VERDADE FINAL

O S0C1 destrói instruções.
O S0C4 destrói memória.
Mas…

☕ O S0C7 DESTRÓI A ILUSÃO DE QUE “PARECE NÚMERO” É SUFICIENTE.

Porque no IBM Z…

CADA BYTE DECIMAL PRECISA SER ABSOLUTAMENTE PURO.


terça-feira, 6 de fevereiro de 2007

Variáveis COBOL: COMP-1, COMP-2, COMP-3, COMP-4, COMP-5, Tipos Numéricos, LEVEL 01, 66, 77, 88

 

Bellacosa Mainframe e a estrutura do cobol com suas variaveis 

Variáveis COBOL: COMP-1, COMP-2, COMP-3, COMP-4, COMP-5, Tipos Numéricos, LEVEL 01, 66, 77, 88

Uma das partes mais importantes do COBOL é o:

tratamento de dados.

O COBOL foi criado para:

  • negócios;

  • bancos;

  • contabilidade;

  • processamento financeiro.

Por isso ele possui um sistema extremamente rico de:

  • variáveis;

  • formatos;

  • níveis;

  • tipos numéricos.


O que é uma variável no COBOL?

Variável é:

uma área de memória usada para armazenar dados.


Exemplo simples

01 WS-NOME PIC X(30).
01 WS-SALDO PIC 9(9)V99.

Estrutura básica de variável COBOL

LEVEL  NOME      PIC

Exemplo

01 WS-IDADE PIC 9(3).

LEVEL NUMBER

O número inicial indica:

nível hierárquico.


Exemplo

01 CLIENTE.
   05 NOME PIC X(30).
   05 IDADE PIC 9(3).

Hierarquia visual

01 CLIENTE
   ↓
05 NOME
05 IDADE

Tipos básicos de dados COBOL


Numérico

Usa:

PIC 9

Exemplo

01 WS-VALOR PIC 9(5).

Aceita:

12345

Alfanumérico

Usa:

PIC X

Exemplo

01 WS-NOME PIC X(20).

Aceita:

  • letras;

  • números;

  • símbolos.


Alfabético

Usa:

PIC A

Exemplo

01 WS-LETRAS PIC A(10).

Aceita:

apenas letras e espaços.


O que é PIC?

Picture Clause

Define:

formato da variável.


Exemplos importantes


PIC X(10)

Texto.


PIC 9(5)

Número inteiro.


PIC 9(5)V99

Decimal implícito.


O que significa V?

Vírgula decimal implícita.


Exemplo

PIC 9(5)V99

Valor:

1234567

Interpretado como:

12345,67

Tipos COMP no COBOL

Os COMP representam:

formatos internos de armazenamento.

Usados para:

  • performance;

  • economia memória;

  • cálculos rápidos.


COMP

Também chamado:

binário.


Exemplo

01 WS-VALOR PIC S9(4) COMP.

Muito usado para:

  • contadores;

  • índices;

  • performance.


COMP-1

Floating Point Simples Precisão


Usa ponto flutuante


Exemplo

01 WS-REAL PIC S9(5)V99 COMP-1.

Muito usado em:

  • cálculos científicos;

  • engenharia.


COMP-2

Floating Point Dupla Precisão


Mais precisão que COMP-1


Exemplo

01 WS-DOUBLE PIC S9(10)V99 COMP-2.

COMP-3

O mais famoso do COBOL.

Packed Decimal


Armazena números compactados

Muito usado em:

  • bancos;

  • financeiro;

  • batch.


Exemplo

01 WS-SALDO PIC S9(7)V99 COMP-3.

Vantagens

  • economiza espaço;

  • excelente precisão decimal.


Muito importante em:

  • dinheiro;

  • contabilidade.


O que causa S0C7?

Frequentemente:

erro em COMP-3 inválido.


COMP-4

Representação:

binária.

Dependente compilador/plataforma.


Exemplo

01 WS-CONTADOR PIC S9(4) COMP-4.

COMP-5

Binário nativo

Mais próximo da arquitetura máquina.


Muito usado em:

  • integração;

  • performance;

  • chamadas sistema.


Exemplo

01 WS-INDICE PIC S9(9) COMP-5.

Diferença simplificada

TipoCaracterística
COMP-1Float simples
COMP-2Float dupla
COMP-3Decimal compactado
COMP-4Binário
COMP-5Binário nativo

O que é VARCHAR no COBOL?

COBOL tradicional não possui VARCHAR nativo como SQL.

Mas pode simular usando:

  • tamanho;

  • conteúdo variável.


Exemplo comum

01 WS-NOME.
   49 WS-NOME-LEN PIC S9(4) COMP.
   49 WS-NOME-TXT PIC X(100).

Muito usado com DB2

Especialmente em:

VARCHAR DB2.


LEVEL NUMBERS no COBOL


LEVEL 01

Maior estrutura lógica.


Exemplo

01 CLIENTE.

LEVEL 05

Subcampo.


LEVEL 49

Muito usado em VARCHAR.


LEVEL 66

RENAMES

Cria nome alternativo para grupo.


Exemplo

66 DADOS-CLIENTE RENAMES NOME THRU SALDO.

LEVEL 77

Variável independente simples.


Exemplo

77 WS-TOTAL PIC 9(5).

Não possui subníveis


LEVEL 88

Condition Name

Muito poderoso no COBOL.

Cria:

condições legíveis.


Exemplo

01 WS-STATUS PIC X.

   88 STATUS-OK VALUE 'S'.
   88 STATUS-ERRO VALUE 'N'.

Uso

IF STATUS-OK

Muito mais legível.


Sem 88 seria:

IF WS-STATUS = 'S'

Vantagens do LEVEL 88

  • legibilidade;

  • manutenção;

  • semântica negócio.


Exemplo real completo

01 CLIENTE.
   05 NOME        PIC X(30).
   05 SALDO       PIC S9(7)V99 COMP-3.
   05 STATUS      PIC X.

      88 ATIVO    VALUE 'A'.
      88 BLOQUEADO VALUE 'B'.

Como isso aparece no dia a dia?

Praticamente em:

  • bancos;

  • PIX;

  • cartões;

  • DB2;

  • batch;

  • CICS.


Curiosidades incríveis

1. COMP-3 é um dos formatos mais famosos do mundo mainframe


2. Muitos sistemas financeiros dependem fortemente de packed decimal


3. LEVEL 88 é amado por programadores COBOL experientes


4. Grande parte dos ABEND S0C7 envolve COMP-3


Erros comuns de iniciantes


1. Confundir PIC X com PIC 9


2. Não entender decimal implícito


3. Usar COMP inadequadamente


4. Ignorar LEVEL 88


Dicas importantes

Use COMP-3 para valores monetários


Use LEVEL 88 para regras negócio


Organize variáveis hierarquicamente


Entenda packed decimal


Resumo rápido

ElementoFunção
PIC XTexto
PIC 9Numérico
PIC AAlfabético
COMP-1Float simples
COMP-2Float dupla
COMP-3Packed decimal
COMP-4Binário
COMP-5Binário nativo
01Estrutura principal
66RENAMES
77Variável isolada
88Condição lógica

Conclusão

O sistema de variáveis do COBOL é extremamente poderoso e foi projetado para suportar processamento corporativo de alta confiabilidade.

Tipos COMP, níveis hierárquicos e estruturas como LEVEL 88 tornam o COBOL ideal para sistemas financeiros críticos no ambiente mainframe IBM Z.