1. IF básico e END-IF

A estrutura mais simples: se a condição for verdadeira, executa o bloco. Sempre feche com END-IF — é a forma moderna e segura de delimitar o bloco condicional.

COBOL Sintaxe do IF
       IF condição
           instruções
       END-IF

             * Exemplo prático:
       IF WS-SALDO < 0
           MOVE 'NEGATIVO' TO WS-STATUS
           PERFORM 9000-TRATA-SALDO-NEG
       END-IF

⚠️ Ponto final no IF — armadilha clássica

No COBOL antigo, o IF terminava com ponto (.). O problema: um ponto encerra todos os IFs abertos, incluindo os aninhados. Código legado está cheio de bugs causados por pontos no lugar errado. No COBOL moderno, use sempre END-IF e evite pontos dentro de blocos condicionais.

2. IF / ELSE

COBOL IF / ELSE
       IF WS-TIPO-CONTA = 'CC'
           PERFORM 2100-PROCESSA-CORRENTE
       ELSE
           PERFORM 2200-PROCESSA-POUPANCA
       END-IF

             * IF / ELSE IF / ELSE (encadeado)
       IF WS-NOTA >= 90
           MOVE 'A' TO WS-CONCEITO
       ELSE IF WS-NOTA >= 70
           MOVE 'B' TO WS-CONCEITO
       ELSE IF WS-NOTA >= 50
           MOVE 'C' TO WS-CONCEITO
       ELSE
           MOVE 'F' TO WS-CONCEITO
       END-IF

🦕 Analogia — IF é uma bifurcação na estrada

Imagine que seu programa é um carro. O IF é uma placa de sinalização: "Se a condição for verdadeira, vire à esquerda. Senão, siga em frente." O END-IF é onde as duas estradas se encontram novamente e o programa segue junto.

3. IF aninhado

IFs dentro de IFs são comuns em COBOL, mas exigem atenção à indentação para não perder o fio da lógica:

COBOL IF aninhado
       IF WS-CLIENTE-ATIVO = 'S'
           IF WS-SALDO > 0
               IF WS-TIPO = 'VIP'
                   PERFORM 3000-PROCESSA-VIP
               ELSE
                   PERFORM 3100-PROCESSA-PADRAO
               END-IF
           ELSE
               PERFORM 9100-SALDO-INSUF
           END-IF
       ELSE
           PERFORM 9200-CLIENTE-INATIVO
       END-IF

✅ Dica — mais de 3 níveis? Use EVALUATE

Quando o IF fica com mais de 2 ou 3 níveis de aninhamento, o código começa a ficar difícil de ler e manter. Esse é o sinal para refatorar usando EVALUATE ou quebrando a lógica em parágrafos separados chamados via PERFORM.

4. Operadores de comparação

O COBOL aceita tanto a forma simbólica quanto a forma por extenso — ambas são equivalentes:

SímboloPor extensoSignificado
=EQUAL TOIgual
>GREATER THANMaior que
<LESS THANMenor que
>=GREATER THAN OR EQUAL TOMaior ou igual
<=LESS THAN OR EQUAL TOMenor ou igual
NOT =NOT EQUAL TODiferente
COBOL Operadores na prática
             * Forma simbólica (mais comum em código moderno)
       IF WS-CODIGO = '001'  ...
       IF WS-VALOR  > 1000    ...
       IF WS-IDADE  <= 18     ...

             * Forma por extenso (comum em código legado)
       IF WS-CODIGO EQUAL TO              '001'  ...
       IF WS-VALOR  GREATER THAN          1000   ...
       IF WS-IDADE  LESS THAN OR EQUAL TO 18     ...

5. AND, OR e NOT

Para combinar múltiplas condições em um único IF:

COBOL Condições compostas
             * AND: ambas as condições precisam ser verdadeiras
       IF WS-ATIVO = 'S' AND WS-SALDO > 0
           PERFORM 2000-PROCESSA
       END-IF

             * OR: basta uma ser verdadeira
       IF WS-TIPO = 'VIP' OR WS-TIPO = 'PRE'
           PERFORM 2100-BENEFICIOS
       END-IF

             * NOT: inverte a condição
       IF NOT WS-ATIVO = 'S'
           PERFORM 9000-INATIVO
       END-IF

             * Combinando com parênteses para clareza
       IF (WS-SALDO > 0 AND WS-ATIVO = 'S')
          OR WS-TIPO = 'ESP'
           PERFORM 2000-PROCESSA
       END-IF

💗 Para iniciantes — condição abreviada

O COBOL permite abreviar condições com o mesmo sujeito. Em vez de WS-TIPO = 'A' OR WS-TIPO = 'B' OR WS-TIPO = 'C', você pode escrever WS-TIPO = 'A' OR 'B' OR 'C'. Funciona apenas com OR e o mesmo operador de comparação.

             * Forma longa
       IF WS-UF = 'SP' OR WS-UF = 'RJ' OR WS-UF = 'MG'

             * Forma abreviada — equivalente
       IF WS-UF = 'SP' OR 'RJ' OR 'MG'

6. Condições de classe e sinal

O COBOL tem condições especiais para verificar o tipo e o sinal de um campo, sem precisar comparar com valores específicos:

COBOL Condições de classe
             * IS NUMERIC: verifica se o conteúdo é numérico válido
       IF WS-CAMPO IS NUMERIC
           MOVE WS-CAMPO TO WS-VALOR-NUM
       ELSE
           PERFORM 9000-DADO-INVALIDO
       END-IF

             * IS ALPHABETIC: só letras e espaços
       IF WS-NOME IS ALPHABETIC
           PERFORM 2000-GRAVA-NOME
       END-IF

             * Condições de sinal (campo numérico)
       IF WS-SALDO IS POSITIVE   PERFORM 2100-CREDITO  END-IF
       IF WS-SALDO IS NEGATIVE   PERFORM 2200-DEBITO   END-IF
       IF WS-SALDO IS ZERO       PERFORM 2300-NEUTRO   END-IF

✅ IS NUMERIC — seu aliado contra S0C7

Antes de usar um campo PIC X lido de arquivo em um cálculo, sempre valide com IS NUMERIC. Se o campo vier com espaços ou letras e você tentar usá-lo como número, o programa vai dar abend S0C7. A validação prévia evita esse erro clássico.

7. Nível 88 com IF

Os condition names (nível 88) são a forma mais elegante de fazer comparações em COBOL. Em vez de comparar com strings ou números diretamente, você dá um nome à condição:

COBOL Nível 88 com IF
       WORKING-STORAGE SECTION.
       01  WS-STATUS-CLIENTE    PIC X(01).
           88  CLIENTE-ATIVO        VALUE 'A'.
           88  CLIENTE-INATIVO      VALUE 'I'.
           88  CLIENTE-BLOQUEADO    VALUE 'B'.

       01  WS-FAIXA-ETARIA      PIC 9(03).
           88  MENOR-DE-IDADE       VALUE 0 THRU 17.
           88  ADULTO               VALUE 18 THRU 59.
           88  IDOSO                VALUE 60 THRU 999.

       PROCEDURE DIVISION.
             * Sem nível 88 — pouco legível
       IF WS-STATUS-CLIENTE = 'A'
           PERFORM 2000-PROCESSA
       END-IF

             * Com nível 88 — muito mais claro
       IF CLIENTE-ATIVO
           PERFORM 2000-PROCESSA
       END-IF

       IF MENOR-DE-IDADE
           PERFORM 3000-RESTRICAO-MENORES
       END-IF

             * SET TO TRUE para atribuir o valor
       SET CLIENTE-ATIVO TO TRUE  *move 'A' para WS-STATUS-CLIENTE

🦕 Analogia — nível 88 é um apelido para um valor

O nível 88 é como dar apelidos para valores. Em vez de espalhar 'A', 'I' e 'B' pelo código inteiro (e precisar adivinhar o que significam), você declara uma vez o significado e usa o nome em todos os IFs. Se o domínio mudar, você muda só na declaração.

8. EVALUATE — o switch do COBOL

O EVALUATE é a versão COBOL do switch/case — mas muito mais poderoso. Quando você tem muitas condições sobre a mesma variável, ele é mais legível e fácil de manter do que uma cadeia de IF/ELSE IF.

COBOL EVALUATE básico
       EVALUATE WS-TIPO-TRANSACAO
           WHEN 'CRE'
               PERFORM 2100-PROCESSA-CREDITO
           WHEN 'DEB'
               PERFORM 2200-PROCESSA-DEBITO
           WHEN 'TED'
               PERFORM 2300-PROCESSA-TED
           WHEN 'PIX'
               PERFORM 2400-PROCESSA-PIX
           WHEN OTHER
               MOVE 'TIPO INVALIDO' TO WS-ERRO
               PERFORM 9000-TRATA-ERRO
       END-EVALUATE

EVALUATE com faixas de valores

COBOL EVALUATE com THRU
       EVALUATE WS-RETURN-CODE
           WHEN 0
               PERFORM 2000-SUCESSO
           WHEN 4
               PERFORM 2100-AVISO
           WHEN 8 THRU 12
               PERFORM 9000-ERRO-CRITICO
           WHEN 16
               PERFORM 9900-ERRO-FATAL
           WHEN OTHER
               PERFORM 9800-RC-DESCONHECIDO
       END-EVALUATE

EVALUATE com múltiplos WHENs para a mesma ação

COBOL Múltiplos WHEN
       EVALUATE WS-DIA-SEMANA
           WHEN 1
           WHEN 7
               MOVE 'FIM DE SEMANA' TO WS-TIPO-DIA
           WHEN 2 THRU 6
               MOVE 'DIA UTIL'      TO WS-TIPO-DIA
       END-EVALUATE

9. EVALUATE TRUE

O EVALUATE TRUE é onde o COBOL supera qualquer switch/case. Você avalia condições completamente diferentes em cada WHEN — é como uma cadeia de IF/ELSE IF, mas muito mais legível:

COBOL EVALUATE TRUE
       EVALUATE TRUE
           WHEN WS-SALDO < 0
               PERFORM 9100-SALDO-NEGATIVO
           WHEN WS-SALDO = 0
               PERFORM 2000-SALDO-ZERADO
           WHEN WS-SALDO > 0 AND WS-TIPO = 'VIP'
               PERFORM 2100-VIP-CREDITO
           WHEN WS-SALDO > 0
               PERFORM 2200-PADRAO-CREDITO
       END-EVALUATE

🟣 Para quem já programa — EVALUATE com múltiplos sujeitos

O COBOL permite avaliar múltiplas variáveis ao mesmo tempo em um único EVALUATE, combinando-as no WHEN com ALSO. É raro em código legado, mas poderoso:

       EVALUATE WS-TIPO ALSO WS-STATUS
           WHEN 'CC'  ALSO 'A'
               PERFORM 2100-CORRENTE-ATIVO
           WHEN 'PP'  ALSO 'A'
               PERFORM 2200-POUPANCA-ATIVA
           WHEN ANY   ALSO 'I'
               PERFORM 9000-CONTA-INATIVA
       END-EVALUATE
                  * ANY significa "qualquer valor para esta posição"

10. Erros comuns

1. Comparar PIC X com número

COBOL Comparação de tipos
       01  WS-CODIGO  PIC X(03) VALUE '001'.

             * ERRADO: comparando PIC X com número — resultado imprevisível
       IF WS-CODIGO = 1   ...   *não vai funcionar como esperado

             * CORRETO: comparar com string
       IF WS-CODIGO = '001'  ...  *correto

2. Esquecer o WHEN OTHER no EVALUATE

COBOL WHEN OTHER obrigatório
             * Sem WHEN OTHER: se WS-TIPO não for 'A' nem 'B',
             * o EVALUATE simplesmente passa — sem erro, sem aviso
       EVALUATE WS-TIPO
           WHEN 'A'  PERFORM 2100-PROC-A
           WHEN 'B'  PERFORM 2200-PROC-B
                 * E se vier 'C'? Silêncio total — bug difícil de achar
       END-EVALUATE

             * CORRETO: sempre trate o caso imprevisto
       EVALUATE WS-TIPO
           WHEN 'A'  PERFORM 2100-PROC-A
           WHEN 'B'  PERFORM 2200-PROC-B
           WHEN OTHER
               MOVE 'TIPO INESPERADO' TO WS-ERRO
               PERFORM 9000-TRATA-ERRO
       END-EVALUATE

3. Ponto no meio do IF (código legado)

COBOL Ponto indevido
             * BUG CLÁSSICO: o ponto encerra o IF externo
       IF WS-ATIVO = 'S'
           IF WS-SALDO > 0
               PERFORM 2000-OK.   *ponto aqui encerra AMBOS os IFs!
           ELSE                    *esse ELSE agora não tem IF par
               PERFORM 9000-ERRO  *erro de compilação ou lógica errada

             * CORRETO: use END-IF, sem pontos no meio
       IF WS-ATIVO = 'S'
           IF WS-SALDO > 0
               PERFORM 2000-OK
           ELSE
               PERFORM 9000-ERRO
           END-IF
       END-IF

⚠️ Código legado e pontos

Ao fazer manutenção em código COBOL antigo, tome muito cuidado com os pontos. Um ponto no lugar errado pode fazer um bloco inteiro de código ser "engolido" sem executar, ou um ELSE passar a pertencer ao IF errado — sem que o compilador reclame. Sempre que possível, modernize o código adicionando END-IF e END-EVALUATE.