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.
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
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:
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ímbolo | Por extenso | Significado |
|---|---|---|
= | EQUAL TO | Igual |
> | GREATER THAN | Maior que |
< | LESS THAN | Menor que |
>= | GREATER THAN OR EQUAL TO | Maior ou igual |
<= | LESS THAN OR EQUAL TO | Menor ou igual |
NOT = | NOT EQUAL TO | Diferente |
* 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:
* 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:
* 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:
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.
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
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
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:
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
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
* 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)
* 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.