| Bellacosa Mainframe uso correto do resp1 e resp2 em comandos cics |
☕🔥 CICS NA PRÁTICA — EXEMPLOS REAIS COM RESP E RESP2
Como Programadores Enterprise Tratam Erros, Controle Transacional e Exceções no Mundo IBM Z
No CICS profissional…
não basta executar comandos.
Você precisa:
validar retorno,
tratar erro,
evitar abend,
proteger integridade,
controlar concorrência,
garantir recovery.
E é aqui que entram:
RESP()
RESP2()
🔥 O QUE É RESP?
RESP:
retorna o código principal do resultado do comando CICS.
Exemplo:
EXEC CICS READ
FILE('CLIENTE')
RIDFLD(WS-CHAVE)
INTO(WS-REG)
RESP(WS-RESP)
END-EXEC
☕ O QUE É RESP2?
RESP2:
retorna detalhes adicionais do erro.
É o “subcódigo”.
Exemplo clássico
RESP:
NOTFND
RESP2:
80
Indica detalhe interno específico do recurso.
🔥 PADRÃO PROFISSIONAL
Todo sistema enterprise usa algo parecido com isto:
01 WS-RESP PIC S9(8) COMP.
01 WS-RESP2 PIC S9(8) COMP.
☕ EXEMPLO 1 — READ FILE COM VALIDAÇÃO
Objetivo
Ler cliente VSAM.
EXEC CICS READ
FILE('CLIENTE')
RIDFLD(WS-CLIENTE-ID)
INTO(WS-CLIENTE)
LENGTH(WS-LEN)
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
EVALUATE WS-RESP
WHEN DFHRESP(NORMAL)
DISPLAY 'CLIENTE ENCONTRADO'
WHEN DFHRESP(NOTFND)
DISPLAY 'CLIENTE NAO EXISTE'
DISPLAY 'RESP2: ' WS-RESP2
WHEN DFHRESP(NOTOPEN)
DISPLAY 'ARQUIVO FECHADO'
WHEN OTHER
DISPLAY 'ERRO CICS'
DISPLAY 'RESP=' WS-RESP
DISPLAY 'RESP2=' WS-RESP2
END-EVALUATE
🔥 EXPLICAÇÃO DOS PARÂMETROS
| Parâmetro | Função |
|---|---|
| FILE | Nome lógico do FCT |
| RIDFLD | Chave VSAM |
| INTO | Área destino |
| LENGTH | Tamanho do registro |
| RESP | Código principal |
| RESP2 | Detalhe técnico |
☕ EXEMPLO 2 — WRITE COM DUPREC
EXEC CICS WRITE
FILE('CLIENTE')
FROM(WS-REGISTRO)
RIDFLD(WS-CHAVE)
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
IF WS-RESP = DFHRESP(DUPREC)
DISPLAY 'CHAVE DUPLICADA'
DISPLAY 'RESP2=' WS-RESP2
END-IF
🔥 O QUE É DUPREC?
Duplicate Record.
Ocorre quando:
chave já existe no KSDS.
☕ EXEMPLO 3 — READ UPDATE + REWRITE
Cenário
Atualização segura com lock.
EXEC CICS READ
FILE('CLIENTE')
RIDFLD(WS-CHAVE)
INTO(WS-REG)
UPDATE
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
UPDATE
Esse parâmetro:
trava o registro,
impede alteração simultânea.
Depois:
MOVE 'ATIVO' TO WS-STATUS
EXEC CICS REWRITE
FILE('CLIENTE')
FROM(WS-REG)
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
☕ ERRO COMUM
Esquecer:
REWRITE
UNLOCK
SYNCPOINT
Resultado:
🔥 lock pendurado.
🔥 EXEMPLO 4 — HANDLE CONDITION
EXEC CICS HANDLE CONDITION
NOTFND(SEM-REG)
DUPREC(REG-DUP)
ERROR(ERRO-GERAL)
END-EXEC
Como funciona?
Se ocorrer:
NOTFND → desvia para SEM-REG
DUPREC → REG-DUP
ERROR → ERRO-GERAL
Vantagem
Evita:
IF RESP = ...
em todos comandos.
☕ EXEMPLO 5 — LINK
EXEC CICS LINK
PROGRAM('CADCLI')
COMMAREA(WS-COMMAREA)
LENGTH(LENGTH OF WS-COMMAREA)
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
Explicação
| Parâmetro | Função |
|---|---|
| PROGRAM | Programa chamado |
| COMMAREA | Área compartilhada |
| LENGTH | Tamanho |
| RESP | Resultado |
O LINK retorna
Diferente do XCTL.
☕ EXEMPLO 6 — XCTL
EXEC CICS XCTL
PROGRAM('MENU001')
COMMAREA(WS-COMM)
LENGTH(100)
END-EXEC
Diferença crítica
| LINK | XCTL |
|---|---|
| retorna | não retorna |
| empilha | substitui |
| subrotina | transferência |
🔥 EXEMPLO 7 — RETURN COMMAREA
EXEC CICS RETURN
TRANSID('MEN1')
COMMAREA(WS-COMM)
LENGTH(LENGTH OF WS-COMM)
END-EXEC
TRANSID
Transação reiniciada quando usuário pressionar ENTER.
COMMAREA
Preserva contexto.
☕ EXEMPLO 8 — SEND MAP
EXEC CICS SEND MAP('TELA01')
MAPSET('MAPSET1')
FROM(WS-MAPA)
ERASE
CURSOR
RESP(WS-RESP)
END-EXEC
Explicação
| Parâmetro | Função |
|---|---|
| MAP | Nome do mapa |
| MAPSET | Biblioteca BMS |
| FROM | Dados |
| ERASE | Limpa tela |
| CURSOR | Posiciona cursor |
☕ EXEMPLO 9 — RECEIVE MAP
EXEC CICS RECEIVE MAP('TELA01')
MAPSET('MAPSET1')
INTO(WS-MAPA)
RESP(WS-RESP)
END-EXEC
O RECEIVE captura
ENTER
PFKEY
campos digitados
🔥 EXEMPLO 10 — WRITEQ TS
EXEC CICS WRITEQ TS
QUEUE('FILA001')
FROM(WS-DADOS)
LENGTH(200)
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
TS Queue
Usada para:
sessão,
paginação,
cache,
workflow.
☕ EXEMPLO 11 — READQ TS
EXEC CICS READQ TS
QUEUE('FILA001')
INTO(WS-DADOS)
ITEM(1)
RESP(WS-RESP)
END-EXEC
ITEM
Lê item específico da fila.
🔥 EXEMPLO 12 — STARTBR + READNEXT
STARTBR
EXEC CICS STARTBR
FILE('CLIENTE')
RIDFLD(WS-CHAVE)
GTEQ
RESP(WS-RESP)
END-EXEC
GTEQ
Começa:
na chave,
ou próxima maior.
READNEXT
EXEC CICS READNEXT
FILE('CLIENTE')
INTO(WS-REG)
RIDFLD(WS-CHAVE)
RESP(WS-RESP)
END-EXEC
ENDFILE
Fim do browse.
☕ EXEMPLO 13 — SYNCPOINT
EXEC CICS SYNCPOINT
RESP(WS-RESP)
RESP2(WS-RESP2)
END-EXEC
O que ele faz?
Commit de:
VSAM
DB2
MQ
TS recoverable
ROLLBACK
EXEC CICS SYNCPOINT ROLLBACK
END-EXEC
🔥 EXEMPLO 14 — ABEND CONTROLADO
EXEC CICS ABEND
ABCODE('ER01')
NODUMP
END-EXEC
ABCODE
Código customizado.
NODUMP
Evita dump completo.
☕ EXEMPLO 15 — GETMAIN
EXEC CICS GETMAIN
SET(WS-PTR)
LENGTH(1024)
INITIMG(X'00')
RESP(WS-RESP)
END-EXEC
INITIMG
Inicializa memória.
☕ EXEMPLO 16 — FREEMAIN
EXEC CICS FREEMAIN
DATAPOINTER(WS-PTR)
RESP(WS-RESP)
END-EXEC
ERRO CLÁSSICO
Não liberar storage:
🔥 SOS CONDITION.
🔥 EXEMPLO 17 — ENQ / DEQ
ENQ
EXEC CICS ENQ
RESOURCE('CLIENTE001')
LENGTH(10)
RESP(WS-RESP)
END-EXEC
RESOURCE
Nome lógico protegido.
DEQ
EXEC CICS DEQ
RESOURCE('CLIENTE001')
END-EXEC
☕ EXEMPLO 18 — START
EXEC CICS START
TRANSID('TRN1')
FROM(WS-DADOS)
LENGTH(100)
INTERVAL(000500)
RESP(WS-RESP)
END-EXEC
INTERVAL
Dispara:
após 5 minutos.
🔥 EXEMPLO 19 — DELAY
EXEC CICS DELAY
FOR SECONDS(5)
END-EXEC
DELAY
Suspende task.
☕ EXEMPLO 20 — WRITE OPERATOR
EXEC CICS WRITE OPERATOR
TEXT('ERRO CRITICO')
TEXTLENGTH(13)
RESP(WS-RESP)
END-EXEC
Envia mensagem para
console operador,
automação,
suporte.
🔥 O SEGREDO DOS SISTEMAS ENTERPRISE
Os melhores sistemas CICS:
validam RESP sempre,
usam HANDLE CONDITION estrategicamente,
controlam locks,
fazem rollback corretamente,
evitam storage leak,
minimizam pseudo-conversação incorreta.
☕ CONCLUSÃO
Programar CICS profissionalmente não é apenas “executar comandos”.
É entender:
concorrência,
recovery,
sincronização,
gerenciamento de recursos,
integridade transacional,
comportamento interno da região CICS.
E é exatamente isso que separa:
um programador COBOL comum,
deum verdadeiro engenheiro IBM Z enterprise.