1. Sintaxe básica

A cláusula PICTURE segue este formato:

COBOL Sintaxe da PICTURE Clause
       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ímboloNomeAceitaExemplo
XAlfanuméricoQualquer caractere (letras, números, símbolos)PIC X(30)
9NuméricoApenas dígitos 0–9PIC 9(08)
AAlfabéticoApenas letras e espaçoPIC A(20)
COBOL X, 9 e A na prática
       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 9 quando for fazer contas com o campo (somar, subtrair, comparar numericamente)
  • Use PIC X para 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 que PIC A aceita

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.

COBOL Ponto decimal: V vs. ponto real
       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.

COBOL Campo com e sem sinal
             *-- 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.

COBOL Campos de edição para exibição
       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.

COBOL Cláusula VALUE — formas de uso
       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:

COBOL Campos típicos de sistema financeiro
       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)V99 e 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. Use PIC X(11).
  • 4. Campos de edição em cálculos: qualquer campo com Z, vírgula, ponto real ou CR/DB nã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.