| Bellacosa Mainframe e o comando CALL e subprogramas em COBOL |
Chamando Subprogramas em COBOL – Tipos de comandos CALL
Um dos recursos mais importantes do COBOL é a capacidade de dividir uma aplicação em vários módulos menores chamados:
Subprogramas
Isso permite reutilização de código, manutenção mais simples e melhor organização das aplicações Mainframe.
O que é um Subprograma?
É um programa COBOL que é chamado por outro programa.
Estrutura
Programa Principal
↓
CALL
↓
Subprograma
↓
GOBACK
↓
Programa Principal
Exemplo Simples
Programa Principal:
CALL 'CALCULA'.
Subprograma:
IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULA.
PROCEDURE DIVISION.
DISPLAY 'ENTREI NO SUBPROGRAMA'.
GOBACK.
Resultado:
ENTREI NO SUBPROGRAMA
Tipos de CALL
Existem vários tipos de chamada.
1. CALL Estático
O nome do programa é conhecido durante a compilação.
CALL 'CALCULA'
Características:
✅ Mais rápido
✅ Verificação na Linkedição
✅ Muito usado em Batch
Fluxo:
MAIN
↓
CALL 'CALCULA'
↓
CALCULA
2. CALL Dinâmico
O nome do programa está em uma variável.
01 WS-PGM PIC X(8).
MOVE 'CALCULA' TO WS-PGM.
CALL WS-PGM.
Características:
✅ Flexibilidade
✅ Escolha em tempo de execução
✅ Muito usado em frameworks
Fluxo:
WS-PGM
↓
CALCULA
VALIDA
CONSULTA
Exemplo
IF TIPO = 'A'
MOVE 'CALCA' TO WS-PGM
ELSE
MOVE 'CALCB' TO WS-PGM
END-IF
CALL WS-PGM
3. Nested Program Call
Programa interno chamando outro.
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
PROCEDURE DIVISION.
CALL 'SUB1'.
PROGRAM-ID. SUB1.
CALL 'SUB2'.
Fluxo:
MAIN
↓
SUB1
↓
SUB2
4. CALL Recursivo
Um programa chama ele próprio.
Necessário:
RECURSIVE PROGRAM
Exemplo:
IDENTIFICATION DIVISION.
PROGRAM-ID. FATORIAL
RECURSIVE.
Fluxo:
FATORIAL
↓
FATORIAL
↓
FATORIAL
5. CALL para Módulos LE
Chamada de rotinas do Language Environment.
Exemplo:
CALL 'CEE3ABD'
Usado para:
ABEND controlado
Datas
Hora
Serviços LE
6. CALL para Rotinas Assembler
Muito comum em Mainframe.
CALL 'ROTASM01'
Fluxo:
COBOL
↓
ASSEMBLER
↓
COBOL
7. CALL para CICS
Em CICS normalmente usamos:
EXEC CICS LINK
PROGRAM('PROG2')
END-EXEC.
Ou
EXEC CICS XCTL
PROGRAM('PROG2')
END-EXEC.
LINK x XCTL
LINK
Retorna ao chamador.
PROG1
↓
LINK
↓
PROG2
↓
Retorna
XCTL
Não retorna.
PROG1
↓
XCTL
↓
PROG2
Passagem de Parâmetros
O mais comum.
Programa Principal
CALL 'CALCULA'
USING WS-VALOR.
Subprograma
LINKAGE SECTION.
01 LK-VALOR PIC 9(5).
PROCEDURE DIVISION USING LK-VALOR.
Fluxo
MAIN
↓
USING
↓
LINKAGE
Múltiplos Parâmetros
Programa Principal:
CALL 'CALCULA'
USING
WS-NOME
WS-SALDO
WS-DATA.
Subprograma:
PROCEDURE DIVISION USING
LK-NOME
LK-SALDO
LK-DATA.
BY REFERENCE
Padrão do COBOL.
Passa endereço.
CALL 'PROG1'
USING BY REFERENCE WS-NOME.
Pode alterar o valor original.
BY CONTENT
Passa cópia.
CALL 'PROG1'
USING BY CONTENT WS-NOME.
Não altera a variável original.
BY VALUE
Passa valor diretamente.
Muito usado em integração com C.
CALL 'PROG1'
USING BY VALUE WS-CODIGO.
Exemplo
MOVE 100 TO WS-VALOR
CALL 'TESTE'
USING BY CONTENT WS-VALOR
Subprograma altera:
MOVE 500 TO LK-VALOR
Resultado:
WS-VALOR = 100
CANCEL
Remove programa da memória.
CANCEL 'CALCULA'
Muito usado após CALL dinâmico.
Fluxo
CALL
↓
Executa
↓
CANCEL
↓
Memória liberada
CALL e Load Modules
O programa chamado precisa estar:
STEPLIB
JOBLIB
LINKLIST
LPA
Erros Comuns
S806
Programa não encontrado.
S806
U4038
Erro interno.
S0C4
Parâmetro incorreto.
Boas Práticas
✅ Usar GOBACK nos subprogramas
✅ Validar parâmetros recebidos
✅ Documentar USING
✅ Evitar excesso de níveis CALL
✅ Utilizar COPYBOOK para parâmetros
Exemplo Corporativo
MAIN
│
├── VALIDA
│
├── CONSULTA-DB2
│
├── CALCULA-JUROS
│
├── GERA-ARQUIVO
│
└── LOG-ERRO
Cada módulo é um subprograma especializado.
Resumo Rápido
| Tipo | Característica |
|---|---|
| CALL Estático | Nome fixo |
| CALL Dinâmico | Nome variável |
| Nested | Programa dentro de programa |
| Recursivo | Chama a si próprio |
| LINK CICS | Retorna |
| XCTL CICS | Não retorna |
| BY REFERENCE | Passa endereço |
| BY CONTENT | Passa cópia |
| BY VALUE | Passa valor |
| CANCEL | Remove da memória |
Conclusão
O comando CALL é o mecanismo que permite a modularização das aplicações COBOL. Através dele, programas podem compartilhar regras de negócio, reutilizar código e organizar grandes sistemas corporativos em componentes menores. Dominar CALL estático, dinâmico, parâmetros USING, BY REFERENCE, BY CONTENT, BY VALUE, LINK, XCTL e CANCEL é essencial para qualquer programador COBOL que deseje atuar em ambientes Mainframe modernos.