1. Sintaxe básica
A cláusula PICTURE segue este formato:
nivel nome-variavel PIC simbolo(tamanho) [VALUE valor-inicial]. * Exemplos: 01 WS-NOME PIC X(40). 01 WS-IDADE PIC 9(03). 01 WS-SALARIO PIC 9(07)V99. 01 WS-CODIGO PIC X(04) VALUE '0000'. 01 WS-CONTADOR PIC 9(05) VALUE ZEROS.
🦕 Analogia — PIC é como um formulário de papel
Imagine um formulário bancário dos anos 80. Cada campo tinha uma caixa com um número específico de caracteres: "Nome: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (20 caracteres)". A cláusula PIC faz exatamente isso no código — define quantas "casinhas" existem e que tipo de caractere pode ir nelas.
2. Símbolos básicos: X, 9, A
Os três símbolos mais usados do dia a dia:
| Símbolo | Nome | Aceita | Exemplo |
|---|---|---|---|
X | Alfanumérico | Qualquer caractere (letras, números, símbolos) | PIC X(30) |
9 | Numérico | Apenas dígitos 0–9 | PIC 9(08) |
A | Alfabético | Apenas letras e espaço | PIC A(20) |
WORKING-STORAGE SECTION. *-- PIC X: campo de texto livre 01 WS-EMAIL PIC X(60). *aceita tudo *-- PIC 9: campo estritamente numérico 01 WS-AGENCIA PIC 9(04). *ex: 0042 01 WS-CONTA PIC 9(08). *ex: 00123456 *-- PIC A: só letras (raro em sistemas modernos) 01 WS-ESTADO-CIVIL PIC A(10). *'SOLTEIRO' *-- Notação compacta: repetir o símbolo ou usar (n) 01 WS-CEP-A PIC 99999999. *8 noves — forma longa 01 WS-CEP-B PIC 9(08). *equivalente — forma curta
✅ X vs. 9 — quando usar cada um?
- Use
PIC 9quando for fazer contas com o campo (somar, subtrair, comparar numericamente) - Use
PIC Xpara campos que são "números" mas não se calculam: CPF, CNPJ, CEP, número de telefone, código de agência — você nunca soma dois CPFs PIC Aé raríssimo em sistemas reais —PIC Xé mais versátil e aceita tudo quePIC Aaceita
3. Ponto decimal: V e ponto
Em COBOL há dois tipos de ponto decimal:
V — ponto decimal assumido (implícito)
O V indica onde está o ponto decimal, mas não ocupa espaço no campo. O número é armazenado sem o ponto, e o COBOL "lembra" onde ele está. É o mais usado para campos internos de processamento.
Ponto (.) — ponto decimal real
Ocupa um byte no campo e é usado apenas em campos de edição para exibição (impressão, DISPLAY). Nunca use em campos de cálculo.
WORKING-STORAGE SECTION. *-- V: ponto implícito (para cálculos) 01 WS-SALARIO PIC 9(07)V99. * Armazena: 0100000050 (= R$ 1.000.000,50 sem o ponto) * Tamanho: 9 bytes (7 + 2 dígitos) *-- Ponto real: só para exibição (campos de edição) 01 WS-SALARIO-EDIT PIC 9(07).99. * Armazena: 1000000.50 (com o ponto físico) * Tamanho: 10 bytes (7 + 1 ponto + 2 dígitos) PROCEDURE DIVISION. 0000-INICIO. MOVE 1000000.50 TO WS-SALARIO *campo de cálculo MOVE WS-SALARIO TO WS-SALARIO-EDIT *prepara exibição DISPLAY WS-SALARIO-EDIT *mostra com ponto STOP RUN.
⚠️ NUNCA use ponto real (.) em campos de cálculo
Se você declarar PIC 9(07).99 e tentar fazer ADD WS-SALARIO-EDIT TO WS-TOTAL, vai ter resultado errado ou erro em runtime. Campos com ponto decimal real são exclusivamente para saída/exibição. Use sempre V nos campos que entram em cálculos.
4. Sinal numérico: S
O símbolo S no início da PICTURE indica que o campo pode ser positivo ou negativo. Sem o S, o campo é sempre positivo e qualquer valor negativo é tratado como zero ou causa comportamento inesperado.
*-- Sem S: só positivo 01 WS-QUANTIDADE PIC 9(05). *0 a 99999 *-- Com S: positivo ou negativo 01 WS-SALDO PIC S9(09)V99. *-999999999,99 a + 01 WS-VARIACAO PIC S9(05)V99. *pode ser negativo PROCEDURE DIVISION. MOVE -250.75 TO WS-SALDO *OK com S MOVE -250.75 TO WS-QUANTIDADE *PROBLEMA: sem S!
5. Símbolos de edição
Símbolos de edição são usados para formatar valores para exibição ou impressão. Eles nunca devem ser usados em campos de cálculo.
Supressão de zeros: Z
Z substitui zeros à esquerda por espaços — útil para exibição de números.
Vírgula, ponto e espaço: , . B
Inserem separadores na posição definida.
Sinal: + e -
Exibem o sinal do número na posição indicada.
CR e DB
Sufixos "CR" (crédito) e "DB" (débito) — aparecem apenas quando o número é negativo/positivo respectivamente.
WORKING-STORAGE SECTION. *-- Valor de trabalho (cálculo) 01 WS-VALOR PIC S9(07)V99 VALUE -1234.56. *-- Campos de edição (exibição) 01 WS-VALOR-EDIT-A PIC ZZZ.ZZZ.ZZ9,99. * resultado: " 1.234,56" (zeros suprimidos) 01 WS-VALOR-EDIT-B PIC -ZZZ.ZZZ.ZZ9,99. * resultado: "- 1.234,56" (mostra sinal negativo) 01 WS-VALOR-EDIT-C PIC 9(07),99. * resultado: "0001234,56" (sem supressão) 01 WS-VALOR-EDIT-D PIC ZZZ.ZZZ.ZZ9,99CR. * resultado: " 1.234,56 " ou " 1.234,56CR" PROCEDURE DIVISION. 0000-INICIO. MOVE WS-VALOR TO WS-VALOR-EDIT-A DISPLAY 'Valor: ' WS-VALOR-EDIT-A STOP RUN.
6. Cláusula VALUE
A cláusula VALUE define o valor inicial de uma variável. Sem ela, o conteúdo de uma variável COBOL é indefinido (lixo de memória) no início do programa.
WORKING-STORAGE SECTION. *-- Valor literal 01 WS-TITULO PIC X(30) VALUE 'RELATORIO DE SALARIOS'. *-- Figurativos: ZEROS, SPACES, HIGH-VALUES, LOW-VALUES 01 WS-CONTADOR PIC 9(05) VALUE ZEROS. *00000 01 WS-TEXTO PIC X(20) VALUE SPACES. *20 espaços 01 WS-CHAVE-MAX PIC X(08) VALUE HIGH-VALUES. *X'FFFFFFFF' 01 WS-CHAVE-MIN PIC X(08) VALUE LOW-VALUES. *X'00000000' *-- ALL: preenche o campo com o caractere repetido 01 WS-LINHA PIC X(80) VALUE ALL '-'. *80 traços 01 WS-ZEROS PIC X(10) VALUE ALL '0'. *0000000000
✅ ZEROS vs. ZEROES vs. ZERO
No COBOL, ZEROS, ZEROES e ZERO são sinônimos — todos significam a mesma coisa. O mesmo vale para SPACES e SPACE. Use o que preferir, mas seja consistente no seu código.
7. Exemplos práticos do dia a dia
Veja como declarar os campos mais comuns em sistemas financeiros brasileiros:
WORKING-STORAGE SECTION. 01 WS-DADOS-CLIENTE. *-- Identificação 05 WS-CPF PIC X(11). *'12345678901' 05 WS-NOME PIC X(50). 05 WS-DATA-NASC PIC 9(08). *AAAAMMDD *-- Contato 05 WS-CELULAR X(11). *'11999998888' 05 WS-EMAIL PIC X(80). *-- Dados financeiros 05 WS-SALDO PIC S9(13)V99 VALUE ZEROS. 05 WS-LIMITE-CRED PIC 9(09)V99 VALUE ZEROS. 05 WS-RENDA-MENSAL PIC 9(09)V99 VALUE ZEROS. *-- Status (com nível 88) 05 WS-STATUS-CLI PIC X(01). 88 CLIENTE-ATIVO VALUE 'A'. 88 CLIENTE-INATIVO VALUE 'I'. 88 CLIENTE-BLOQ VALUE 'B'. *-- Campos de edição (para impressão) 01 WS-SALDO-EDIT PIC -ZZZ.ZZZ.ZZZ.ZZ9,99. 01 WS-DATA-EDIT PIC 99/99/9999.
8. Erros comuns com PICTURE
⚠️ Os 5 erros mais comuns
- 1. Usar V em campo de exibição:
PIC 9(07)V99e tentar usar DISPLAY — o ponto não aparece. Use o campo de edição correspondente. - 2. Omitir S em campos que podem ser negativos: saldo, variação, diferença — sempre declare com
S. - 3. Usar PIC 9 para CPF e CNPJ: CPF com zero à esquerda (
012345678901) seria truncado. UsePIC X(11). - 4. Campos de edição em cálculos: qualquer campo com
Z, vírgula, ponto real ouCR/DBnão pode receber operações aritméticas. - 5. Tamanho errado no registro de arquivo: a soma dos campos do FD deve bater exatamente com o
RECORD CONTAINS n CHARACTERS— um byte a mais ou a menos e os dados saem deslocados.
🟣 Para experientes — USAGE CLAUSE e performance
A PICTURE Clause define o formato lógico dos dados. A USAGE Clause define o formato físico de armazenamento. PIC 9(04) USAGE COMP armazena o número em binário (2 bytes) em vez de EBCDIC decimal (4 bytes) — mais eficiente para contadores e índices de tabela, mas incompatível com leitura direta de arquivo. A combinação mais comum em DB2 é PIC S9(04) COMP para campos INTEGER e PIC S9(09) COMP para BIGINT. Nunca use COMP em campos que vão para arquivo sequencial sem conversão explícita.