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:

Anatomia completa de um SSA
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)
└────────────────┴───┘
✅ O asterisco substitui o espaço
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.

SSA booleano — estrutura AND (#)
       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'
SSA booleano — estrutura OR (|)
       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'
Uso prático — varrer apenas contas CC ativas
       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.
⚠️ AND e OR não podem ser misturados no mesmo SSA
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 CodeNomeEfeito principal
CPathRetorna o segmento E todos os seus pais em uma única call (path call)
DDeleteMarca o segmento para delete em path call
FFirstPosiciona no primeiro twin do pai (ignora posicionamento atual)
LLastPosiciona no último twin do pai
NNot sensitiveUsa o segmento para navegação mas não retorna seus dados
PParentageEstabelece o pai do GNP sem retornar dados do segmento
QEnqueueEnfileira o segmento para lock exclusivo (usado com DEQ call)
UUnconditionalRetorna dados mesmo se o segmento não existir (para ISRT)
Como colocar command code num SSA
      *    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.

Path call — ler cliente + conta + movimento em 1 call
      *    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.
🦕 Path call é como um JOIN de uma linha só
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.
⚠️ Regras da path call
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.

CC=D — deletar conta e todos os seus movimentos em 1 call
      *    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.

CC=F — ler a primeira conta de cada cliente
       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.
CC=L — ler o último movimento de uma conta (mais recente)
       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.
✅ CC=L é muito usado para inserção no fim
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.

CC=N — descer para movimentos ignorando dados da conta
      *    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.
🟣 CC=N e PSBs parciais
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.

CC=P — estabelecer pai para GNP sem ler o 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.

CC=Q e DEQ — lock de segmento por mais tempo
       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.
🟣 Token de fila no CC=Q
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.

CC=U — inserir no pai atualmente posicionado
      *    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.

Hierarquia de 4 níveis — banco de financiamentos
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
GU em 4 níveis — buscar pagamento específico
      *    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.
GNP em hierarquia profunda — varrer pagamentos de uma parcela
       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çãoRecursoJustificativa
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
Exemplo combinado — path call com SSA booleano
      *    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.
💗 Resumo dos SSAs avançados
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.