A instrução SUBTRACT no COBOL é usada para subtrair valores numéricos e armazenar o resultado. Pode ser usada com diferentes formatos para subtração direta, com destino intermediário (GIVING) ou em estruturas com campos de nomes iguais (CORRESPONDING).

📌 Para que serve

  • Subtrair um ou mais valores de outros valores.

  • Armazenar o resultado diretamente no(s) operandos ou em um campo de destino.

  • Reduzir valores em campos de grupos automaticamente com CORRESPONDING.

  • Tratar erros de estouro com ON SIZE ERROR.

🧾 Sintaxe básica

SUBTRACT valor-1 FROM destino.
SUBTRACT valor-1 FROM destino-1 destino-2 ROUNDED.
SUBTRACT valor-1 FROM valor-2 GIVING resultado.
SUBTRACT CORRESPONDING grupo-1 FROM grupo-2.

✅ Exemplos práticos

Formato 1 – Subtração direta no mesmo campo

01 A        PIC 9(3) VALUE 50.
01 B        PIC 9(3) VALUE 20.

SUBTRACT B FROM A.
DISPLAY A.  *> Resultado: 30

Formato 2 – Subtração com GIVING

01 A        PIC 9(3) VALUE 100.
01 B        PIC 9(3) VALUE 25.
01 RESULT   PIC 9(3).

SUBTRACT B FROM A GIVING RESULT.
DISPLAY RESULT.  *> Resultado: 75

Formato 3 – Subtração com CORRESPONDING

01 GRUPO-A.
   05 X     PIC 9(3) VALUE 80.
   05 Y     PIC 9(3) VALUE 40.

01 GRUPO-B.
   05 X     PIC 9(3) VALUE 30.
   05 Y     PIC 9(3) VALUE 10.

SUBTRACT CORRESPONDING GRUPO-B FROM GRUPO-A.
DISPLAY GRUPO-A.  *> X: 50, Y: 30

⚙️ Como funciona internamente

  • No Formato 1, o valor de identifier-1 ou literal-1 é subtraído de identifier-2, e o resultado substitui o valor de identifier-2.

  • No Formato 2, o resultado da subtração é armazenado em um campo separado com a cláusula GIVING.

  • No Formato 3, os campos de mesmo nome em dois grupos são subtraídos automaticamente entre si.

  • A subtração é feita da esquerda para a direita, respeitando a ordem dos operandos.

⚠️ Regras importantes

  • Todos os campos envolvidos devem ser numéricos elementares (exceto em GIVING, onde o resultado pode ser editado).

  • Se o resultado exceder a capacidade do campo, ocorre erro de tamanho — pode ser tratado com ON SIZE ERROR.

  • ROUNDED aplica arredondamento antes da verificação de erro de tamanho.

  • SUBTRACT pode operar com campos de data compatível, respeitando regras do compilador para campos com DATE FORMAT.

🔄 Diferenças entre os formatos

Formato O que faz
Formato 1 Subtrai diretamente e atualiza o campo destino.
Formato 2 Subtrai e grava o resultado em campo específico com GIVING.
Formato 3 Subtrai automaticamente campos com o mesmo nome entre grupos.

🧠 Dicas práticas

  • Use GIVING para preservar os operandos e armazenar o resultado separadamente.

  • Combine com ROUNDED e ON SIZE ERROR para evitar problemas em cálculos financeiros.

  • Em estruturas com muitos campos numéricos, CORRESPONDING reduz a repetição de código.

  • Sempre valide o uso com campos de data: pode exigir formato compatível e configurado no compilador.

✅ Conclusão

A instrução SUBTRACT é essencial para operações matemáticas no COBOL. Seus três formatos oferecem flexibilidade para cálculos simples ou complexos, com segurança adicional usando ROUNDED e SIZE ERROR. Dominar SUBTRACT é um passo fundamental para qualquer desenvolvedor COBOL que deseja criar programas precisos e confiáveis.