1. Revisão — tipos básicos de SSA
Antes de entrar nos recursos avançados, vale fixar a estrutura de um SSA na memória:
SSA NÃO-QUALIFICADO (9 bytes):
┌────────────────┬───┐
│ NOME-SEG (8) │ b │ b = espaço em branco
└────────────────┴───┘
SSA QUALIFICADO (variável):
┌────────────────┬───┬────────────────┬────┬──────────┬───┐
│ NOME-SEG (8) │ ( │ NOME-FLD (8) │ OP │ VALOR(n) │ ) │
└────────────────┴───┴────────────────┴────┴──────────┴───┘
OP = '= ', '< ', '<=', '> ', '>=', 'NE'
SSA COM COMMAND CODE (não-qualificado):
┌────────────────┬───┐
│ NOME-SEG (8) │ * │ CC1 CC2 ... b
└────────────────┴───┘
^ asterisco = indica command code(s)
SSA COM COMMAND CODE (qualificado):
┌────────────────┬───┐
│ NOME-SEG (8) │ * │ CC1 CC2 ... (NOME-FLD OP VALOR)
└────────────────┴───┘
No SSA não-qualificado, o 9º byte é um espaço em branco. Quando há command codes, esse espaço é substituído por um asterisco (
*), seguido dos códigos de comando. A presença do asterisco no 9º byte sinaliza ao IMS que há command codes a processar antes de executar a call.
2. SSA booleano — AND e OR
Um SSA qualificado pode conter múltiplas condições combinadas com os operadores booleanos # (AND) e | (OR). Isso equivale ao WHERE campo1 = x AND campo2 = y do SQL dentro de um único segmento.
01 WS-SSA-CTA-BOOL-AND.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CTATIPO '.
05 FILLER PIC X(02) VALUE '= '.
05 FILLER PIC X(02) VALUE 'CC'.
05 FILLER PIC X(01) VALUE '#'. -- AND
05 FILLER PIC X(08) VALUE 'CTASTTS '.
05 FILLER PIC X(02) VALUE '= '.
05 FILLER PIC X(01) VALUE 'A'.
05 FILLER PIC X(01) VALUE ')'.
* Equivalente SQL:
* WHERE CTATIPO = 'CC' AND CTASTTS = 'A'
01 WS-SSA-CTA-BOOL-OR.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CTATIPO '.
05 FILLER PIC X(02) VALUE '= '.
05 FILLER PIC X(02) VALUE 'CC'.
05 FILLER PIC X(01) VALUE '|'. -- OR
05 FILLER PIC X(08) VALUE 'CTATIPO '.
05 FILLER PIC X(02) VALUE '= '.
05 FILLER PIC X(02) VALUE 'PP'.
05 FILLER PIC X(01) VALUE ')'.
* Equivalente SQL:
* WHERE CTATIPO = 'CC' OR CTATIPO = 'PP'
3000-VARRE-CC-ATIVAS.
* GU no cliente primeiro
MOVE '12345678901' TO SSA-CLI-CPF
CALL 'CBLTDLI' USING
WS-SSA-1 WS-FUNC-GU PCB-BANCO
WS-SEG-CLIENTE WS-SSA-CLI-QUAL
IF PCB-STATUS NOT = SPACES
GOBACK
END-IF
* GNP com SSA booleano — apenas CC e status A
PERFORM UNTIL PCB-STATUS = 'GE'
CALL 'CBLTDLI' USING
WS-SSA-1 WS-FUNC-GNP PCB-BANCO
WS-SEG-CONTA WS-SSA-CTA-BOOL-AND
IF PCB-STATUS = SPACES
DISPLAY 'CONTA CC ATIVA: ' CTA-NUM
END-IF
END-PERFORM.
Você usa
# (AND) ou | (OR), mas não os dois no mesmo SSA. O IMS processa todas as condições com o mesmo operador booleano. Se precisar de lógica mista (A=x AND (B=y OR B=z)), use dois GNPs separados ou processe no COBOL após o retorno.
3. Command codes — visão geral
Command codes são letras adicionadas ao SSA após o asterisco que modificam o comportamento da DL/I call. Cada letra tem um efeito específico e podem ser combinados.
| Command Code | Nome | Efeito principal |
|---|---|---|
| C | Path | Retorna o segmento E todos os seus pais em uma única call (path call) |
| D | Delete | Marca o segmento para delete em path call |
| F | First | Posiciona no primeiro twin do pai (ignora posicionamento atual) |
| L | Last | Posiciona no último twin do pai |
| N | Not sensitive | Usa o segmento para navegação mas não retorna seus dados |
| P | Parentage | Estabelece o pai do GNP sem retornar dados do segmento |
| Q | Enqueue | Enfileira o segmento para lock exclusivo (usado com DEQ call) |
| U | Unconditional | Retorna dados mesmo se o segmento não existir (para ISRT) |
* SSA não-qualificado COM command code F
01 WS-SSA-CTA-F.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'. -- indica CC
05 FILLER PIC X(01) VALUE 'F'. -- command code F
05 FILLER PIC X(01) VALUE ' '. -- fim dos CCs
* SSA qualificado COM command code C
01 WS-SSA-CLI-C.
05 FILLER PIC X(08) VALUE 'CLIENTE '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'C'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CLICPF '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CLI-CPF PIC 9(11).
05 FILLER PIC X(01) VALUE ')'.
4. Command code C — Path Call
O command code C é o mais poderoso do IMS. Uma path call retorna múltiplos segmentos de diferentes níveis hierárquicos em uma única DL/I call — reduzindo drasticamente o número de round-trips ao IMS.
Sem path call, para ler cliente + conta + movimento você precisaria de 3 calls GU. Com path call, uma única call retorna os três segmentos de uma vez.
* Cada segmento tem sua própria área de dados na WS
01 WS-SEG-CLIENTE.
05 CLI-CPF PIC 9(11).
05 CLI-NOME PIC X(40).
05 FILLER PIC X(29).
01 WS-SEG-CONTA.
05 CTA-NUM PIC X(10).
05 CTA-SALDO PIC S9(13)V99 COMP-3.
05 FILLER PIC X(18).
01 WS-SEG-MOVIMENT.
05 MOV-DATA PIC 9(08).
05 MOV-VALOR PIC S9(11)V99 COMP-3.
05 MOV-TIPO PIC X(01).
05 FILLER PIC X(05).
* SSAs com CC=C nos segmentos pai, sem CC no último
01 WS-SSA-CLI-C.
05 FILLER PIC X(08) VALUE 'CLIENTE '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'C'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CLICPF '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CLI-CPF PIC 9(11).
05 FILLER PIC X(01) VALUE ')'.
01 WS-SSA-CTA-C.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'C'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CTANUM '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CTA-NUM PIC X(10).
05 FILLER PIC X(01) VALUE ')'.
* SSA do segmento destino — sem CC=C (é o target)
01 WS-SSA-MOV-UNQUAL.
05 FILLER PIC X(09) VALUE 'MOVIMENT '.
PROCEDURE DIVISION.
4000-PATH-CALL-EXEMPLO.
MOVE '12345678901' TO SSA-CLI-CPF
MOVE '001234-5 ' TO SSA-CTA-NUM
* GU com path call: 3 SSAs, 3 áreas de dados
CALL 'CBLTDLI' USING
WS-SSA-3
WS-FUNC-GU
PCB-BANCO
WS-SEG-CLIENTE -- recebe dados do CLIENTE
WS-SSA-CLI-C -- CC=C: retorna CLIENTE e continua
WS-SEG-CONTA -- recebe dados da CONTA
WS-SSA-CTA-C -- CC=C: retorna CONTA e continua
WS-SEG-MOVIMENT -- recebe dados do MOVIMENT
WS-SSA-MOV-UNQUAL -- sem CC=C: target final
IF PCB-STATUS = SPACES
DISPLAY 'CLIENTE: ' CLI-NOME
DISPLAY 'CONTA : ' CTA-NUM ' SALDO: ' CTA-SALDO
DISPLAY 'MOV : ' MOV-DATA ' VALOR: ' MOV-VALOR
END-IF.
No SQL,
SELECT c.nome, a.saldo, m.valor FROM cliente c JOIN conta a ... JOIN moviment m ... retorna tudo de uma vez. A path call faz o mesmo no IMS: uma única call ao IMS retorna dados de 2, 3 ou mais níveis da hierarquia, com cada segmento sendo populado na sua própria área de dados na WORKING-STORAGE. A redução de calls ao IMS pode ser de 60-80% em programas de leitura intensiva.
1. CC=C vai em todos os SSAs exceto no último (o segmento alvo da call). 2. A call deve receber tantas áreas de dados quantos forem os segmentos com CC=C, mais o área de dados do segmento alvo — na mesma ordem que os SSAs. 3. Se um segmento com CC=C não existir, o IMS retorna GE e os dados das áreas de segmentos abaixo ficam indefinidos.
5. Command code D — Delete em path
O command code D marca um segmento para ser deletado como parte de uma path call com GHU. Permite deletar pai e filhos em uma única call, sem precisar navegar para cada filho individualmente.
* SSA da CONTA com CC=D: marcada para delete
01 WS-SSA-CTA-D.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'D'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CTANUM '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CTA-NUM PIC X(10).
05 FILLER PIC X(01) VALUE ')'.
* SSA do MOVIMENT com CC=D: movimentos também serão deletados
01 WS-SSA-MOV-D.
05 FILLER PIC X(08) VALUE 'MOVIMENT'.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'D'.
05 FILLER PIC X(01) VALUE ' '.
6000-ENCERRA-CONTA.
MOVE '001234-5 ' TO SSA-CTA-NUM
MOVE '12345678901' TO SSA-CLI-CPF
* GHU com CC=D: posiciona e marca para delete cascata
CALL 'CBLTDLI' USING
WS-SSA-3
WS-FUNC-GHU
PCB-BANCO
WS-SEG-CONTA
WS-SSA-CLI-QUAL -- navega até o cliente (sem delete)
WS-SSA-CTA-D -- marca CONTA para delete
WS-SSA-MOV-D -- marca MOVIMENTs para delete cascata
IF PCB-STATUS NOT = SPACES
PERFORM 9999-ERRO-IMS
END-IF
* DLET sem SSAs — executa o delete marcado pelo CC=D
CALL 'CBLTDLI' USING
WS-SSA-0 WS-FUNC-DLET PCB-BANCO WS-SEG-CONTA
IF PCB-STATUS NOT = SPACES
PERFORM 9999-ERRO-IMS
END-IF.
6. Command codes F e L — First e Last
F (First) posiciona no primeiro twin de um tipo de segmento sob o pai atual. L (Last) posiciona no último twin. Ambos ignoram o posicionamento atual e recomeçam do início ou vão direto ao fim.
01 WS-SSA-CTA-F.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'F'.
05 FILLER PIC X(01) VALUE ' '.
5000-PRIMEIRA-CONTA-POR-CLIENTE.
* Posiciona no cliente
MOVE '12345678901' TO SSA-CLI-CPF
CALL 'CBLTDLI' USING
WS-SSA-1 WS-FUNC-GU PCB-BANCO
WS-SEG-CLIENTE WS-SSA-CLI-QUAL
IF PCB-STATUS NOT = SPACES
GOBACK
END-IF
* GNP com CC=F: vai direto para o primeiro filho CONTA
CALL 'CBLTDLI' USING
WS-SSA-1 WS-FUNC-GNP PCB-BANCO
WS-SEG-CONTA WS-SSA-CTA-F
IF PCB-STATUS = SPACES
DISPLAY 'PRIMEIRA CONTA: ' CTA-NUM
END-IF.
01 WS-SSA-MOV-L.
05 FILLER PIC X(08) VALUE 'MOVIMENT'.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'L'.
05 FILLER PIC X(01) VALUE ' '.
5100-ULTIMO-MOVIMENTO.
* Posiciona cliente + conta
CALL 'CBLTDLI' USING
WS-SSA-2 WS-FUNC-GU PCB-BANCO
WS-SEG-CONTA
WS-SSA-CLI-QUAL WS-SSA-CTA-QUAL
IF PCB-STATUS NOT = SPACES
GOBACK
END-IF
* GNP com CC=L: vai direto para o último MOVIMENT
CALL 'CBLTDLI' USING
WS-SSA-1 WS-FUNC-GNP PCB-BANCO
WS-SEG-MOVIMENT WS-SSA-MOV-L
IF PCB-STATUS = SPACES
DISPLAY 'ULTIMO MOV: ' MOV-DATA ' ' MOV-VALOR
END-IF.
Antes de um ISRT, usar GNP com CC=L posiciona o IMS no último filho existente. O ISRT subsequente insere o novo segmento na posição correta de acordo com o sequence field, sem precisar varrer todos os gêmeos. Em bancos HDAM com muitos twins, isso evita uma varredura desnecessária.
7. Command code N — Not sensitive
N instrui o IMS a usar o segmento apenas para navegação (posicionamento) sem retornar seus dados. Útil quando você precisa descer na hierarquia mas não tem interesse nos dados de um nível intermediário — e também quando o PSB não dá acesso sensitivo a um segmento que existe no caminho.
* SSA da CONTA com CC=N: navega mas não retorna dados
01 WS-SSA-CTA-N.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'N'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CTANUM '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CTA-NUM PIC X(10).
05 FILLER PIC X(01) VALUE ')'.
7000-SOMA-MOVIMENTOS-SEM-CONTA.
MOVE '12345678901' TO SSA-CLI-CPF
MOVE '001234-5 ' TO SSA-CTA-NUM
* GU com CC=N na conta: navega até a conta sem preencher WS-SEG-CONTA
* O IMS retorna diretamente o primeiro MOVIMENT
CALL 'CBLTDLI' USING
WS-SSA-2
WS-FUNC-GU
PCB-BANCO
WS-SEG-MOVIMENT -- área de dados = MOVIMENT (não CONTA)
WS-SSA-CLI-QUAL
WS-SSA-CTA-N -- CC=N: usa CONTA para navegar, não retorna
IF PCB-STATUS = SPACES
DISPLAY 'PRIMEIRO MOV: ' MOV-DATA
END-IF.
Quando o PSB do programa não inclui um segmento intermediário (PROCOPT=GO ou segmento omitido no SENSEG), o IMS trata esse segmento como "not sensitive" automaticamente. O CC=N no SSA explicita essa intenção e é obrigatório quando o programa quer qualificar por um campo de um segmento que não tem PROCOPT de leitura no PSB.
8. Command code P — Parentage
P estabelece o ponto de parentesco para chamadas GNP subsequentes sem retornar dados do segmento. Diferente do CC=N (que apenas navega), o CC=P também define quem é o "pai atual" para o GNP — útil para varrer filhos de um segmento sem primeiro fazer um GU no pai.
01 WS-SSA-CLI-P.
05 FILLER PIC X(08) VALUE 'CLIENTE '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'P'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CLICPF '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CLI-CPF PIC 9(11).
05 FILLER PIC X(01) VALUE ')'.
8000-VARRE-CONTAS-COM-P.
MOVE '12345678901' TO SSA-CLI-CPF
* GNP com CC=P no cliente: estabelece CLIENTE como pai
* sem retornar dados do CLIENTE em WS-SEG-CLIENTE
CALL 'CBLTDLI' USING
WS-SSA-2
WS-FUNC-GNP
PCB-BANCO
WS-SEG-CONTA -- área de dados = CONTA (não CLIENTE)
WS-SSA-CLI-P -- CC=P: define CLIENTE como pai do GNP
WS-SSA-CTA-UNQUAL
EVALUATE PCB-STATUS
WHEN SPACES
DISPLAY 'PRIMEIRA CONTA: ' CTA-NUM
WHEN 'GE'
DISPLAY 'NENHUMA CONTA ENCONTRADA'
END-EVALUATE
* GNPs subsequentes continuam no mesmo pai (CLIENTE)
PERFORM UNTIL PCB-STATUS = 'GE'
CALL 'CBLTDLI' USING
WS-SSA-1 WS-FUNC-GNP PCB-BANCO
WS-SEG-CONTA WS-SSA-CTA-UNQUAL
IF PCB-STATUS = SPACES
DISPLAY 'PROXIMA CONTA: ' CTA-NUM
END-IF
END-PERFORM.
9. Command code Q — Enqueue
Q coloca o segmento em uma fila de lock exclusivo (enqueue). Diferente do Get Hold (GHU/GHN/GHNP), que dura apenas até o próximo REPL/DLET, o CC=Q mantém o lock até que o programa emita um DEQ call ou termine. Útil quando você precisa reservar um segmento por um período mais longo, como durante uma transação de múltiplos passos.
01 WS-FUNC-DEQ PIC X(04) VALUE 'DEQ '.
* SSA com CC=Q — reserva o segmento
01 WS-SSA-CTA-Q.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'Q'.
05 FILLER PIC X(01) VALUE 'A'. -- token de fila ('A'-'Z')
05 FILLER PIC X(01) VALUE ' '.
9000-RESERVA-CONTA.
* GU com CC=Q: lê a conta e a coloca em lock pela fila 'A'
MOVE '12345678901' TO SSA-CLI-CPF
CALL 'CBLTDLI' USING
WS-SSA-2 WS-FUNC-GU PCB-BANCO
WS-SEG-CONTA
WS-SSA-CLI-QUAL WS-SSA-CTA-Q
IF PCB-STATUS NOT = SPACES
PERFORM 9999-ERRO-IMS
END-IF
* Aqui o programa pode fazer outras calls
* O lock da fila 'A' permanece ativo
* Quando terminar: libera o lock com DEQ
CALL 'CBLTDLI' USING
WS-SSA-1
WS-FUNC-DEQ
PCB-BANCO
WS-SEG-CONTA
WS-SSA-CTA-Q -- mesma fila 'A'
IF PCB-STATUS NOT = SPACES
PERFORM 9999-ERRO-IMS
END-IF.
O byte após o 'Q' é o token da fila — uma letra de 'A' a 'Z'. Você pode ter até 26 filas de lock ativas simultaneamente no mesmo programa. Usar tokens diferentes permite reservar grupos distintos de segmentos e liberar cada grupo independentemente com DEQ específico para aquela letra.
10. Command code U — Unconditional
U é usado em calls ISRT para inserir um segmento filho mesmo quando o SSA do pai não encontrar exatamente o pai especificado — o IMS usa o pai atualmente posicionado na hierarquia. Também é usado para inserir em posição específica independente do sequence field.
* Após um GU ou GNP que posicionou num CLIENTE,
* ISRT com CC=U no SSA do CLIENTE usa o posicionamento atual
* sem precisar re-qualificar o pai
01 WS-SSA-CLI-U.
05 FILLER PIC X(08) VALUE 'CLIENTE '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'U'.
05 FILLER PIC X(01) VALUE ' '.
7500-INSERE-CONTA-POSICIONADA.
* Assume que GU/GNP já posicionou no cliente correto
MOVE '888888-0 ' TO CTA-NUM
MOVE 'PP' TO CTA-TIPO
MOVE ZEROS TO CTA-SALDO
MOVE 'A' TO CTA-STATUS
* ISRT com CC=U: não requalifica o cliente, usa posicionamento
CALL 'CBLTDLI' USING
WS-SSA-2
WS-FUNC-ISRT
PCB-BANCO
WS-SEG-CONTA
WS-SSA-CLI-U -- CC=U: usa cliente já posicionado
WS-SSA-CTA-UNQUAL
IF PCB-STATUS NOT = SPACES
PERFORM 9999-ERRO-IMS
END-IF.
11. Múltiplos SSAs em hierarquias profundas
Em hierarquias com 4 ou mais níveis, o número de SSAs aumenta e o código pode ficar confuso. A regra é clara: um SSA por nível hierárquico percorrido, do raiz até o segmento alvo.
CLIENTE (nível 1) — root
└── CONTRATO (nível 2) — contrato de financiamento
└── PARCELA (nível 3) — parcelas do contrato
└── PAGAMENTO (nível 4) — pagamentos de cada parcela
* 4 SSAs: um por nível
01 WS-SSA-CLI-QUAL. -- nível 1: CLIENTE
(... definição com CLICPF ...)
01 WS-SSA-CTR-QUAL. -- nível 2: CONTRATO
(... definição com CTRNUM ...)
01 WS-SSA-PAR-QUAL. -- nível 3: PARCELA
(... definição com PARNUM ...)
01 WS-SSA-PAG-QUAL. -- nível 4: PAGAMENTO
(... definição com PAGDATA ...)
1000-BUSCA-PAGAMENTO.
MOVE '12345678901' TO SSA-CLI-CPF
MOVE 'FIN2026001 ' TO SSA-CTR-NUM
MOVE '012' TO SSA-PAR-NUM
MOVE '20260615' TO SSA-PAG-DATA
CALL 'CBLTDLI' USING
WS-SSA-4 -- 4 SSAs
WS-FUNC-GU
PCB-BANCO
WS-SEG-PAGAMENTO -- área de dados = segmento alvo
WS-SSA-CLI-QUAL -- nível 1
WS-SSA-CTR-QUAL -- nível 2
WS-SSA-PAR-QUAL -- nível 3
WS-SSA-PAG-QUAL -- nível 4 (alvo)
EVALUATE PCB-STATUS
WHEN SPACES
DISPLAY 'PAGAMENTO: ' PAG-DATA ' ' PAG-VALOR
WHEN 'GE'
DISPLAY 'PAGAMENTO NAO ENCONTRADO'
WHEN OTHER
PERFORM 9999-ERRO-IMS
END-EVALUATE.
2000-VARRE-PAGAMENTOS-PARCELA.
* Posiciona em 3 níveis com GU qualificado
CALL 'CBLTDLI' USING
WS-SSA-3
WS-FUNC-GU
PCB-BANCO
WS-SEG-PARCELA -- retorna dados da PARCELA
WS-SSA-CLI-QUAL -- nível 1
WS-SSA-CTR-QUAL -- nível 2
WS-SSA-PAR-QUAL -- nível 3 (alvo do GU)
IF PCB-STATUS NOT = SPACES
PERFORM 9999-ERRO-IMS
END-IF
* GNP varre PAGAMENTOs filhos da PARCELA atual
PERFORM UNTIL PCB-STATUS = 'GE'
CALL 'CBLTDLI' USING
WS-SSA-1
WS-FUNC-GNP
PCB-BANCO
WS-SEG-PAGAMENTO
WS-SSA-PAG-UNQUAL
IF PCB-STATUS = SPACES
ADD PAG-VALOR TO WS-TOTAL-PAGO
END-IF
END-PERFORM
DISPLAY 'TOTAL PAGO PARCELA: ' WS-TOTAL-PAGO.
12. Padrões práticos — quando usar cada recurso
| Situação | Recurso | Justificativa |
|---|---|---|
| Buscar segmento com múltiplos critérios no mesmo nível | SSA booleano (#) | Evita calls extras; filtra no IMS antes de retornar ao programa |
| Ler pai + filho em uma só call | CC=C (path call) | Reduz número de calls; melhora throughput |
| Ir direto ao último movimento (mais recente) | CC=L | Evita varrer todos os gêmeos até o fim |
| Navegar nível intermediário sem interesse em seus dados | CC=N | Reduz I/O; não precisa preencher área de dados desnecessária |
| Deletar pai e todos os filhos em cascata | CC=D em path com GHU | Uma call em vez de varrer e deletar cada filho individualmente |
| Varrer filhos sem fazer GU no pai primeiro | CC=P no SSA do pai | Economiza uma call GU quando o pai já é conhecido pelo contexto |
| Lock de segmento por múltiplos passos de processamento | CC=Q + DEQ | Mantém reserva enquanto outras operações ocorrem |
| Inserir filho no pai já posicionado | CC=U no SSA do pai | Evita requalificar o pai quando o posicionamento já é conhecido |
* Ler cliente + primeira conta poupança ativa em 1 call
01 WS-SSA-CLI-C-QUAL.
05 FILLER PIC X(08) VALUE 'CLIENTE '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'C'.
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CLICPF '.
05 FILLER PIC X(02) VALUE '= '.
05 SSA-CLI-CPF PIC 9(11).
05 FILLER PIC X(01) VALUE ')'.
01 WS-SSA-CTA-F-BOOL.
05 FILLER PIC X(08) VALUE 'CONTA '.
05 FILLER PIC X(01) VALUE '*'.
05 FILLER PIC X(01) VALUE 'F'. -- primeiro twin
05 FILLER PIC X(01) VALUE ' '.
05 FILLER PIC X(01) VALUE '('.
05 FILLER PIC X(08) VALUE 'CTATIPO '.
05 FILLER PIC X(02) VALUE '= '.
05 FILLER PIC X(02) VALUE 'PP'. -- poupança
05 FILLER PIC X(01) VALUE '#'. -- AND
05 FILLER PIC X(08) VALUE 'CTASTTS '.
05 FILLER PIC X(02) VALUE '= '.
05 FILLER PIC X(01) VALUE 'A'. -- ativa
05 FILLER PIC X(01) VALUE ')'.
1000-BUSCA-POUPANCA-ATIVA.
MOVE '12345678901' TO SSA-CLI-CPF
CALL 'CBLTDLI' USING
WS-SSA-2
WS-FUNC-GU
PCB-BANCO
WS-SEG-CLIENTE -- recebe dados do CLIENTE (via CC=C)
WS-SSA-CLI-C-QUAL -- CC=C: path + qualificado por CPF
WS-SEG-CONTA -- recebe dados da primeira PP ativa
WS-SSA-CTA-F-BOOL -- CC=F + bool AND (tipo=PP e status=A)
EVALUATE PCB-STATUS
WHEN SPACES
DISPLAY 'CLIENTE: ' CLI-NOME
DISPLAY 'POUPANCA: ' CTA-NUM ' ' CTA-SALDO
WHEN 'GE'
DISPLAY 'SEM POUPANCA ATIVA PARA ESTE CLIENTE'
WHEN OTHER
PERFORM 9999-ERRO-IMS
END-EVALUATE.
Você não vai precisar de todos esses recursos no seu primeiro programa IMS. Comece com GU + SSA qualificado + GNP + SSA não-qualificado — isso resolve 80% dos casos. Volte a este artigo quando precisar de performance (path call CC=C), filtros compostos (booleano), ou navegação de posição específica (CC=F, CC=L). O artigo 04 vai aprofundar o DBD e PSB que suportam toda essa estrutura.