1. IMS DB vs IMS DC β€” a divisΓ£o de responsabilidades

IMS tem dois subsistemas que podem funcionar juntos ou independentemente:

Arquitetura IMS DB + DC
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      IMS Control Region                      β”‚
β”‚                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚   IMS DB     β”‚          β”‚         IMS DC               β”‚ β”‚
β”‚  β”‚              β”‚          β”‚                              β”‚ β”‚
β”‚  β”‚ HDAM/HIDAM   β”‚          β”‚  Message Queues (entrada)    β”‚ β”‚
β”‚  β”‚ HISAM/HSAM   β”‚          β”‚  Scheduler (despachante)     β”‚ β”‚
β”‚  β”‚ datasets     β”‚          β”‚  Terminais 3270 / MFS        β”‚ β”‚
β”‚  β”‚ VSAM         β”‚          β”‚  Message Queues (saΓ­da)      β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚         β”‚                                 β”‚                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                                 β”‚
     DL/I calls                      IOPCB calls
     (GU/GN/ISRT...)              (GU msg / ISRT resposta)
          β”‚                                 β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
              Programa COBOL (MPP ou BMP)
SubsistemaResponsabilidadeAcesso via
IMS DB Bancos de dados hierΓ‘rquicos β€” armazenar e recuperar segmentos PCBs de banco (TYPE=DB) β€” calls GU, GN, GNP, ISRT, DLET, REPL
IMS DC Filas de mensagens β€” receber de terminais, despachar para programas, retornar respostas IOPCB (I/O PCB) β€” calls GU (ler mensagem) e ISRT (enviar resposta)
πŸ¦• IMS DC Γ© o CICS do IMS
Quem jΓ‘ conhece CICS vai reconhecer o modelo: IMS DC recebe uma mensagem de um terminal (equivalente ao EXEC CICS RECEIVE MAP), despacha para um programa MPP (equivalente ao programa CICS), que processa, atualiza o banco (via DL/I, nΓ£o SQL) e envia resposta (equivalente ao EXEC CICS SEND MAP). A diferenΓ§a Γ© que o IMS DC usa filas de mensagens em vez de chamadas diretas.

2. Tipos de programa IMS β€” MPP, BMP, JBP e DL/I batch

TipoNome completoAmbienteAcesso DBAcesso DC
DL/I batch DL/I Batch Program JCL batch puro Sim β€” PCBs tipo DB NΓ£o
MPP Message Processing Program IMS DC online Sim β€” PCBs tipo DB Sim β€” IOPCB
BMP Batch Message Processing IMS DC + batch Sim β€” PCBs tipo DB Sim β€” IOPCB (filas)
JBP Java Batch Processing IMS DC + Java Sim Sim
IFP IMS Fast Path Program IMS DC β€” alta performance Sim (DEDB) Sim
πŸ’— O que vocΓͺ vai encontrar no dia a dia
Em ambientes bancΓ‘rios, DL/I batch Γ© o mais comum para programadores COBOL β€” processar extratos, atualizar saldos, gerar relatΓ³rios. BMP aparece quando o batch precisa ler filas de entrada (mensagens geradas por outro sistema) ou escrever em filas de saΓ­da. MPP Γ© o online β€” vocΓͺ vai escrever MPP quando precisar implementar uma transaΓ§Γ£o de terminal 3270.

3. IOPCB β€” o PCB de mensagens

O IOPCB (I/O Program Communication Block) Γ© o canal de comunicaΓ§Γ£o entre o programa e o IMS DC. Diferente dos PCBs de banco (TYPE=DB), o IOPCB Γ© gerado automaticamente pelo IMS β€” vocΓͺ nΓ£o o define no PSB, mas precisa declarΓ‘-lo na LINKAGE SECTION e recebΓͺ-lo como o primeiro parΓ’metro do ENTRY 'DLITCBL'.

COBOL β€” IOPCB na LINKAGE SECTION
       LINKAGE SECTION.
*
*    IOPCB β€” sempre o PRIMEIRO PCB no ENTRY (para MPP e BMP)
*
       01  IOPCB.
           05 IO-LTERM-NAME   PIC X(08).  -- nome do terminal lΓ³gico
           05 FILLER          PIC XX.
           05 IO-STATUS       PIC XX.     -- status da operacao DC
           05 IO-LOCAL-DATE   PIC 9(04).  -- data local YYDDD
           05 IO-LOCAL-TIME   PIC 9(06).  -- hora local HHMMSS
           05 IO-MSG-SEQ-NUM  PIC 9(04).  -- numero sequencial msg
           05 IO-MOD-NAME     PIC X(08).  -- nome do MFS MOD
           05 IO-USERID       PIC X(08).  -- userid do terminal
*
*    PCBs de banco vΓͺm DEPOIS do IOPCB
*
       01  PCB-BANCOCLI.
           05 PCB-DBD-NAME   PIC X(08).
           05 PCB-SEG-LEVEL  PIC XX.
           05 PCB-STATUS     PIC XX.
           05 PCB-PROC-OPT   PIC X(04).
           05 FILLER         PIC X(04).
           05 PCB-SEG-NAME   PIC X(08).
           05 PCB-KEY-LEN    PIC S9(05) COMP.
           05 PCB-NUMB-SENS  PIC S9(05) COMP.
           05 PCB-KEY-FDBK   PIC X(21).

       PROCEDURE DIVISION.
*          IOPCB SEMPRE PRIMEIRO β€” depois os PCBs de banco
           ENTRY 'DLITCBL' USING IOPCB
                                 PCB-BANCOCLI.

Status codes do IOPCB

IO-STATUSSignificado
bb (espaΓ§os)Sucesso β€” mensagem lida ou enviada com sucesso
QCNo more messages β€” fila de entrada vazia (fim do processamento BMP)
QDQueue full β€” fila de saΓ­da cheia; tentar novamente
ADTerminal disconnected β€” terminal saiu durante envio
AKInvalid message segment β€” segmento de mensagem invΓ‘lido
AMAccess denied β€” programa nΓ£o autorizado a usar o LTERM

4. MPP β€” Message Processing Program

Um MPP processa uma mensagem por vez. O IMS DC despacha o programa quando uma mensagem chega na fila da transaΓ§Γ£o, o programa processa e termina (GOBACK), e o IMS pode despachar outra instΓ’ncia. O modelo Γ© pseudo-conversacional β€” exatamente como o CICS.

Fluxo de vida de um MPP
Terminal 3270 β†’ usuΓ‘rio digita dados e pressiona ENTER
       ↓
IMS DC recebe a mensagem e coloca na fila da transaΓ§Γ£o CONS
       ↓
IMS Scheduler invoca o programa PGMCONS (MPP)
       ↓
PGMCONS executa ENTRY 'DLITCBL' USING IOPCB PCB-BANCOCLI
       ↓
GU no IOPCB β†’ lΓͺ a mensagem do terminal (dados digitados)
       ↓
DL/I calls no PCB-BANCOCLI β†’ consulta/atualiza banco IMS
       ↓
ISRT no IOPCB β†’ envia resposta de volta ao terminal
       ↓
GOBACK β†’ programa termina, IMS retorna resposta ao terminal
       ↓
IMS estΓ‘ pronto para prΓ³xima mensagem (mesmo ou outro terminal)
⚠️ MPP não tem estado entre execuçáes
Cada invocaΓ§Γ£o do MPP comeΓ§a do zero β€” sem variΓ‘veis persistentes entre chamadas. Para manter estado entre telas (como no CICS com COMMAREA), o MPP usa a SPA (Scratchpad Area), uma Γ‘rea de dados que o IMS persiste entre invocaΓ§Γ΅es consecutivas do mesmo usuΓ‘rio na mesma transaΓ§Γ£o.

5. GU e ISRT no IOPCB β€” lendo e respondendo mensagens

No IOPCB, apenas duas DL/I calls fazem sentido: GU para ler a prΓ³xima mensagem da fila de entrada, e ISRT para inserir uma mensagem na fila de saΓ­da (resposta ao terminal ou para outra fila).

COBOL β€” MPP completo com GU e ISRT no IOPCB
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PGMCONSULTA.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-FUNC-GU     PIC X(04) VALUE 'GU  '.
       01  WS-FUNC-ISRT   PIC X(04) VALUE 'ISRT'.
       01  WS-SSA-0       PIC S9(05) COMP VALUE 0.
       01  WS-SSA-1       PIC S9(05) COMP VALUE 1.

      *    Área da mensagem de entrada (layout do terminal 3270)
       01  WS-MSG-ENTRADA.
           05 ME-TRANSACAO PIC X(04).   -- codigo da transacao
           05 ME-CPF       PIC 9(11).   -- CPF digitado pelo usuario
           05 FILLER       PIC X(65).

      *    Área da mensagem de saída (resposta ao terminal)
       01  WS-MSG-SAIDA.
           05 MS-PREFIXO   PIC X(02).   -- LL (tamanho) e ZZ (reservado)
           05 MS-NOME      PIC X(40).
           05 MS-SALDO     PIC ZZZ.ZZZ.ZZ9,99.
           05 MS-STATUS    PIC X(30).

      *    SSA do segmento cliente (para DL/I no banco)
       01  WS-SSA-CLI-QUAL.
           05 FILLER       PIC X(08) VALUE 'CLIENTE '.
           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-SEG-CLIENTE.
           05 CLI-CPF      PIC 9(11).
           05 CLI-NOME     PIC X(40).
           05 FILLER       PIC X(29).

       LINKAGE SECTION.
       01  IOPCB.
           05 IO-LTERM     PIC X(08).
           05 FILLER       PIC XX.
           05 IO-STATUS    PIC XX.
           05 FILLER       PIC X(20).

       01  PCB-BANCOCLI.
           05 PCB-DBD-NAME  PIC X(08).
           05 PCB-SEG-LEVEL PIC XX.
           05 PCB-STATUS    PIC XX.
           05 PCB-PROC-OPT  PIC X(04).
           05 FILLER        PIC X(04).
           05 PCB-SEG-NAME  PIC X(08).
           05 PCB-KEY-LEN   PIC S9(05) COMP.
           05 PCB-NUMB-SENS PIC S9(05) COMP.
           05 PCB-KEY-FDBK  PIC X(21).

       PROCEDURE DIVISION.
           ENTRY 'DLITCBL' USING IOPCB PCB-BANCOCLI.

       0000-PRINCIPAL.
      *    1. LΓͺ a mensagem de entrada do terminal
           CALL 'CBLTDLI' USING
               WS-SSA-0
               WS-FUNC-GU
               IOPCB
               WS-MSG-ENTRADA
           IF IO-STATUS NOT = SPACES
               DISPLAY 'ERRO IOPCB GU: ' IO-STATUS
               GOBACK
           END-IF

      *    2. Busca o cliente no banco IMS
           MOVE ME-CPF TO SSA-CLI-CPF
           CALL 'CBLTDLI' USING
               WS-SSA-1
               WS-FUNC-GU
               PCB-BANCOCLI
               WS-SEG-CLIENTE
               WS-SSA-CLI-QUAL
           EVALUATE PCB-STATUS
               WHEN SPACES
                   MOVE CLI-NOME TO MS-NOME
                   MOVE 'CLIENTE ENCONTRADO' TO MS-STATUS
               WHEN 'GE'
                   MOVE 'CLIENTE NAO ENCONTRADO'
                       TO MS-STATUS
               WHEN OTHER
                   MOVE 'ERRO NO BANCO IMS'
                       TO MS-STATUS
           END-EVALUATE

      *    3. Envia resposta ao terminal
           CALL 'CBLTDLI' USING
               WS-SSA-0
               WS-FUNC-ISRT
               IOPCB
               WS-MSG-SAIDA
           IF IO-STATUS NOT = SPACES
               DISPLAY 'ERRO IOPCB ISRT: ' IO-STATUS
           END-IF

           GOBACK.
βœ… Prefixo LL/ZZ na mensagem de saΓ­da
Os primeiros 4 bytes de cada segmento de mensagem IMS tΓͺm um prefixo especial: bytes 1-2 = LL (comprimento total do segmento incluindo o prefixo, binΓ‘rio PIC S9(04) COMP) e bytes 3-4 = ZZ (reservado, deve ser SPACES ou zeros). O IMS usa LL para saber onde termina cada segmento da mensagem de saΓ­da. Em sistemas com MFS (Message Format Service), o MFS cuida disso automaticamente.

6. SPA β€” Scratchpad Area para programas conversacionais

A SPA Γ© uma Γ‘rea de memΓ³ria que o IMS persiste entre invocaΓ§Γ΅es consecutivas de um MPP conversacional. Ela permite ao programa "lembrar" o que aconteceu na tela anterior β€” como a COMMAREA do CICS.

PSB β€” definindo um MPP conversacional com SPA
         PCB    TYPE=TP,                IOPCB tipo Terminal Processamento X
                EXPRESS=YES,            RESPOSTA EXPRESSAMENTE NECESSARIA  X
                MODIFY=YES              PERMITE MODIFICAR O MOD DE SAIDA
*
*    SPA: 128 bytes de dados persistentes entre invocacoes
*
         PCB    TYPE=TP,
                ALTPCB=YES
         PSBGEN LANG=COBOL,
                PSBNAME=PGMCONSPA,
                CMPAT=YES             COMPATIBILIDADE COM SPA
         END
COBOL β€” usando SPA para guardar estado entre telas
      *    SPA β€” 128 bytes persistidos pelo IMS entre chamadas
       01  WS-SPA.
           05 SPA-TAMANHO  PIC S9(04) COMP.    -- comprimento SPA (fixo)
           05 SPA-TRANCOD  PIC X(08).           -- codigo transacao retorno
           05 SPA-ESTADO   PIC X(01).           -- 1=inicial 2=confirmacao
           05 SPA-CPF      PIC 9(11).           -- CPF da tela anterior
           05 SPA-VALOR    PIC S9(11)V99 COMP-3.
           05 FILLER       PIC X(90).

       PROCEDURE DIVISION.
           ENTRY 'DLITCBL' USING IOPCB PCB-BANCOCLI.

       0000-PRINCIPAL.
      *    GU lΓͺ mensagem E SPA simultaneamente (SPA vem junto)
           CALL 'CBLTDLI' USING
               WS-SSA-0
               WS-FUNC-GU
               IOPCB
               WS-MSG-ENTRADA    -- dados do terminal
           IF IO-STATUS NOT = SPACES
               GOBACK
           END-IF

      *    SEGUNDA invocaΓ§Γ£o (SPA-ESTADO = '2') β€” confirmar operacao
           IF SPA-ESTADO = '2'
               PERFORM 2000-CONFIRMA-OPERACAO
           ELSE
      *        PRIMEIRA invocaΓ§Γ£o β€” tela inicial
               PERFORM 1000-TELA-INICIAL
           END-IF

      *    Atualiza SPA antes de enviar resposta
           MOVE '2'       TO SPA-ESTADO
           MOVE ME-CPF    TO SPA-CPF

      *    ISRT com SPA: envia resposta E persiste SPA
           CALL 'CBLTDLI' USING
               WS-SSA-0
               WS-FUNC-ISRT
               IOPCB
               WS-SPA            -- SPA primeiro
           CALL 'CBLTDLI' USING
               WS-SSA-0
               WS-FUNC-ISRT
               IOPCB
               WS-MSG-SAIDA      -- resposta ao terminal
           GOBACK.

7. BMP β€” Batch Message Processing

Um BMP roda como job batch (via JCL), mas tem acesso ao IMS DC β€” pode ler mensagens de filas de entrada e escrever em filas de saΓ­da. Γ‰ usado principalmente para processar grandes volumes de mensagens geradas por outros sistemas, atualizando bancos IMS em modo batch com a capacidade de fazer checkpoints.

Casos de uso tΓ­picos de BMP
1. Processamento de lote de transaΓ§Γ΅es geradas por sistema externo:
   Sistema de TED gera 100.000 mensagens β†’ fila IMS DC
   BMP lΓͺ as mensagens, atualiza contas no IMS DB, faz checkpoint a cada 1000

2. GeraΓ§Γ£o de mensagens em lote para terminais:
   BMP processa extrato mensal e envia mensagens de notificaΓ§Γ£o
   via fila IMS DC para o sistema de impressΓ£o

3. Reprocessamento de mensagens com erro:
   Fila de dead-letter IMS β†’ BMP re-tenta com lΓ³gica de compensaΓ§Γ£o
COBOL β€” estrutura de um BMP com leitura de fila
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PGMTRANSF.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-FUNC-GU     PIC X(04) VALUE 'GU  '.
       01  WS-FUNC-GHU    PIC X(04) VALUE 'GHU '.
       01  WS-FUNC-REPL   PIC X(04) VALUE 'REPL'.
       01  WS-FUNC-CHKP   PIC X(04) VALUE 'CHKP'.
       01  WS-SSA-0       PIC S9(05) COMP VALUE 0.
       01  WS-SSA-1       PIC S9(05) COMP VALUE 1.
       01  WS-SSA-2       PIC S9(05) COMP VALUE 2.
       01  WS-CONTADOR    PIC S9(07) COMP-3 VALUE 0.
       01  WS-CHKPID      PIC X(08) VALUE 'CHKP0001'.

      *    Mensagem de entrada com dados de transferΓͺncia
       01  WS-MSG-TRANSF.
           05 MT-CONTA-DEB PIC X(10).
           05 MT-CONTA-CRE PIC X(10).
           05 MT-VALOR     PIC S9(11)V99 COMP-3.
           05 MT-CPF       PIC 9(11).

       01  WS-SEG-CONTA.
           05 CTA-NUM      PIC X(10).
           05 CTA-TIPO     PIC X(02).
           05 CTA-SALDO    PIC S9(13)V99 COMP-3.
           05 CTA-STATUS   PIC X(01).
           05 FILLER       PIC X(13).

       01  WS-SSA-CTA-QUAL.
           05 FILLER       PIC X(08) VALUE 'CONTA   '.
           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 ')'.

       LINKAGE SECTION.
       01  IOPCB.
           05 IO-LTERM     PIC X(08).
           05 FILLER       PIC XX.
           05 IO-STATUS    PIC XX.
           05 FILLER       PIC X(20).
       01  PCB-BANCOCLI.
           05 PCB-DBD-NAME  PIC X(08).
           05 PCB-SEG-LEVEL PIC XX.
           05 PCB-STATUS    PIC XX.
           05 PCB-PROC-OPT  PIC X(04).
           05 FILLER        PIC X(04).
           05 PCB-SEG-NAME  PIC X(08).
           05 PCB-KEY-LEN   PIC S9(05) COMP.
           05 PCB-NUMB-SENS PIC S9(05) COMP.
           05 PCB-KEY-FDBK  PIC X(21).

       PROCEDURE DIVISION.
           ENTRY 'DLITCBL' USING IOPCB PCB-BANCOCLI.

       0000-PRINCIPAL.
           PERFORM UNTIL IO-STATUS = 'QC'
               PERFORM 1000-LE-MENSAGEM
               IF IO-STATUS NOT = 'QC'
                   PERFORM 2000-PROCESSA-TRANSFERENCIA
                   ADD 1 TO WS-CONTADOR
                   IF WS-CONTADOR >= 1000
                       PERFORM 3000-CHECKPOINT
                       MOVE 0 TO WS-CONTADOR
                   END-IF
               END-IF
           END-PERFORM
           DISPLAY 'BMP CONCLUIDO'
           GOBACK.

       1000-LE-MENSAGEM.
           CALL 'CBLTDLI' USING
               WS-SSA-0
               WS-FUNC-GU
               IOPCB
               WS-MSG-TRANSF
           EVALUATE IO-STATUS
               WHEN SPACES  CONTINUE
               WHEN 'QC'    CONTINUE  -- fila vazia, fim normal
               WHEN OTHER   PERFORM 9999-ERRO-DC
           END-EVALUATE.

       2000-PROCESSA-TRANSFERENCIA.
      *    Debita conta de origem
           MOVE MT-CONTA-DEB TO SSA-CTA-NUM
           CALL 'CBLTDLI' USING
               WS-SSA-2 WS-FUNC-GHU PCB-BANCOCLI
               WS-SEG-CONTA WS-SSA-CLI-QUAL WS-SSA-CTA-QUAL
           IF PCB-STATUS = SPACES
               SUBTRACT MT-VALOR FROM CTA-SALDO
               CALL 'CBLTDLI' USING
                   WS-SSA-0 WS-FUNC-REPL PCB-BANCOCLI WS-SEG-CONTA
           END-IF

      *    Credita conta de destino
           MOVE MT-CONTA-CRE TO SSA-CTA-NUM
           CALL 'CBLTDLI' USING
               WS-SSA-2 WS-FUNC-GHU PCB-BANCOCLI
               WS-SEG-CONTA WS-SSA-CLI-QUAL WS-SSA-CTA-QUAL
           IF PCB-STATUS = SPACES
               ADD MT-VALOR TO CTA-SALDO
               CALL 'CBLTDLI' USING
                   WS-SSA-0 WS-FUNC-REPL PCB-BANCOCLI WS-SEG-CONTA
           END-IF.

8. Checkpoints β€” CHKP call

O checkpoint Γ© o mecanismo de controle de integridade em jobs IMS longos. A call CHKP comita todas as mudanΓ§as feitas atΓ© aquele ponto no banco IMS e salva o posicionamento atual na fila de mensagens. Se o job falhar, ele pode ser reiniciado a partir do ΓΊltimo checkpoint em vez de recomeΓ§ar do zero.

COBOL β€” CHKP call
       01  WS-FUNC-CHKP   PIC X(04) VALUE 'CHKP'.
       01  WS-CHKPID      PIC X(08).  -- identificador do checkpoint
       01  WS-CHKP-LEN    PIC S9(05) COMP VALUE 0.
       01  WS-CHKP-AREA   PIC X(01).  -- area de dados do usuΓ‘rio (opcional)

       3000-CHECKPOINT.
      *    Gera ID ΓΊnico para o checkpoint (ex: sequencial)
           ADD 1 TO WS-CHKP-SEQ
           MOVE WS-CHKP-SEQ TO WS-CHKPID  -- ex: '00001   '

      *    CHKP: comita tudo e salva posiΓ§Γ£o na fila
           CALL 'CBLTDLI' USING
               WS-SSA-1
               WS-FUNC-CHKP
               IOPCB
               WS-CHKPID        -- ID para identificar este checkpoint
               WS-CHKP-LEN      -- tamanho da area de dados usuario (0 = nenhuma)
               WS-CHKP-AREA     -- area de dados usuario (ignorada se LEN=0)
           IF IO-STATUS NOT = SPACES
               DISPLAY 'ERRO NO CHECKPOINT: ' IO-STATUS
               PERFORM 9999-ERRO-DC
           END-IF
           DISPLAY 'CHECKPOINT: ' WS-CHKPID
                   ' REGISTROS: ' WS-CONTADOR.
βœ… FrequΓͺncia de checkpoint
A frequΓͺncia ideal de checkpoint depende do volume e criticidade. Checkpoints frequentes (a cada 100–500 registros) reduzem o trabalho perdido em caso de falha, mas aumentam overhead de I/O. Checkpoints raros (a cada 10.000) reduzem overhead mas exigem reprocessar muito em caso de falha. Em bancos de alto volume, checkpoints a cada 1.000–2.000 registros Γ© um ponto de equilΓ­brio comum.
🟣 Checkpoint com Ñrea de dados do usuÑrio
O terceiro e quarto parΓ’metros do CHKP permitem salvar dados de contexto do programa junto com o checkpoint β€” por exemplo, contadores, chaves do ΓΊltimo registro processado ou flags de estado. Esses dados sΓ£o recuperados pelo XRST no restart, permitindo que o programa retome exatamente de onde parou sem perder contexto.

9. Restart β€” XRST e recuperaΓ§Γ£o apΓ³s falha

XRST (Extended Restart) Γ© a call que permite ao BMP retomar a partir do ΓΊltimo checkpoint depois de uma falha. Ela deve ser a primeira DL/I call do programa β€” antes de qualquer GU ou operaΓ§Γ£o de banco. Se o job estΓ‘ sendo executado pela primeira vez (nΓ£o Γ© um restart), o XRST simplesmente Γ© ignorado sem efeito.

COBOL β€” XRST no inΓ­cio do BMP
       01  WS-FUNC-XRST   PIC X(04) VALUE 'XRST'.
       01  WS-XRST-LEN    PIC S9(05) COMP VALUE 0.
       01  WS-XRST-AREA   PIC X(01).
       01  WS-CHKPID-XRST PIC X(08) VALUE SPACES.

       PROCEDURE DIVISION.
           ENTRY 'DLITCBL' USING IOPCB PCB-BANCOCLI.

       0000-PRINCIPAL.
      *    XRST DEVE SER A PRIMEIRA CALL DO PROGRAMA
      *    Se for restart, IMS reposiciona na fila e retorna o CHKPID
      *    Se nΓ£o for restart, XRST retorna status QC e o programa continua
           CALL 'CBLTDLI' USING
               WS-SSA-1
               WS-FUNC-XRST
               IOPCB
               WS-CHKPID-XRST    -- retorna ID do ultimo checkpoint (se restart)
               WS-XRST-LEN       -- tamanho area usuario (0 = nΓ£o hΓ‘)
               WS-XRST-AREA
           EVALUATE IO-STATUS
               WHEN SPACES
      *            E restart: IMS reposicionou a fila no ultimo CHKP
                   DISPLAY 'RESTART A PARTIR DO CHKP: ' WS-CHKPID-XRST
               WHEN 'QC'
      *            Nao e restart: primeira execucao normal
                   DISPLAY 'PRIMEIRA EXECUCAO - SEM RESTART'
               WHEN OTHER
                   DISPLAY 'ERRO XRST: ' IO-STATUS
                   PERFORM 9999-ERRO-DC
           END-EVALUATE

      *    A partir daqui, continua o processamento normal
           PERFORM UNTIL IO-STATUS = 'QC'
               PERFORM 1000-LE-MENSAGEM
               IF IO-STATUS NOT = 'QC'
                   PERFORM 2000-PROCESSA
                   ADD 1 TO WS-CONTADOR
                   IF WS-CONTADOR >= 1000
                       PERFORM 3000-CHECKPOINT
                       MOVE 0 TO WS-CONTADOR
                   END-IF
               END-IF
           END-PERFORM
           GOBACK.
JCL β€” reiniciando um BMP a partir do ΓΊltimo checkpoint
/* Restart: adicionar o DD IMSLOGR apontando para o log IMS */
//RESTART  EXEC PGM=DFSRRC00,
//    PARM='BMP,PGMTRANSF,PGMTRANSP,,,,,,,,,,Y,N'
//STEPLIB  DD DSN=IMS.RESLIB,DISP=SHR
//         DD DSN=PROD.LOADLIB,DISP=SHR
//IMS      DD DSN=IMS.PSBLIB,DISP=SHR
//         DD DSN=IMS.DBDLIB,DISP=SHR
//IMSLOGR  DD DSN=IMS.RLOGRECD,DISP=SHR   /* LOG DE RESTART */
//SYSPRINT DD SYSOUT=*
//IEFRDER  DD SYSOUT=*

10. JCL para BMP

O JCL de um BMP Γ© similar ao de um DL/I batch, mas com PARM='BMP' em vez de 'DLI' e com DDs adicionais para as filas de mensagens IMS DC.

JCL β€” execuΓ§Γ£o de BMP
//BMPTRANS JOB (ACCT),'BMP TRANSFERENCIAS',CLASS=A,MSGCLASS=X
//STEP1    EXEC PGM=DFSRRC00,
//    PARM='BMP,PGMTRANSF,PGMTRANSP,,,,,,,,,,Y,N'
//          ^    ^          ^
//          |    |          PSB name (PGMTRANSP)
//          |    Programa COBOL (PGMTRANSF)
//          BMP = Batch Message Processing
//
//STEPLIB  DD DSN=IMS.RESLIB,DISP=SHR
//         DD DSN=PROD.LOADLIB,DISP=SHR
//IMS      DD DSN=IMS.PSBLIB,DISP=SHR
//         DD DSN=IMS.DBDLIB,DISP=SHR
//DFSVSAMP DD DSN=IMS.PROCLIB(DFSVSMHP),DISP=SHR
//IEFRDER  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DFSRESLB DD DSN=IMS.RESLIB,DISP=SHR
//
//* DD para o dataset VSAM do banco IMS
//BANCOCLID DD DSN=IMS.BANCOCLI.DATA,DISP=SHR
//
//* DD para filas IMS DC (nome definido no sistema IMS)
//DFSYSDMP DD SYSOUT=*
⚠️ BMP não pode rodar sem IMS DC ativo
Diferente do DL/I batch (que roda de forma completamente independente), o BMP precisa que o subsistema IMS DC esteja ativo e acessΓ­vel. Se o IMS DC estiver down, o BMP falha na inicializaΓ§Γ£o com PARM invΓ‘lido. Em ambientes com janela de manutenΓ§Γ£o do IMS DC, os BMPs precisam ser suspendidos enquanto o DC estΓ‘ offline.

11. Comparativo dos tipos de programa

CaracterΓ­sticaDL/I BatchMPPBMP
InvocaΓ§Γ£o JCL batch (scheduler) IMS DC (mensagem chega) JCL batch (scheduler)
IOPCB NΓ£o Sim β€” obrigatΓ³rio Sim β€” lΓͺ filas de mensagens
Acesso a IMS DB Sim β€” direto Sim β€” via PCBs Sim β€” via PCBs
Requer IMS DC ativo NΓ£o Sim Sim
Checkpoint / Restart NΓ£o (use COMMIT via SMF) NΓ£o (pseudo-conversacional) Sim β€” CHKP + XRST
Termina com GOBACK ou STOP RUN GOBACK (apΓ³s cada msg) GOBACK (quando fila vazia)
MΓΊltiplas mensagens N/A Uma por vez Loop atΓ© QC (fila vazia)
Estado entre chamadas VariΓ‘veis WS persistem Apenas via SPA VariΓ‘veis WS persistem no loop
PARM do JCL DLI,pgm,psb Definido no MFS / transaΓ§Γ£o DC BMP,pgm,psb
πŸ’— Resumo da trilha IMS
VocΓͺ chegou ao fim da trilha IMS com uma base sΓ³lida: entende o modelo hierΓ‘rquico, sabe escrever e depurar todas as DL/I calls, domina SSAs avanΓ§ados com command codes, consegue ler e interpretar DBD e PSB, e agora entende como programas online (MPP) e batch com mensagens (BMP) funcionam no IMS DC. O prΓ³ximo nΓ­vel Γ© praticar com bancos reais β€” e para isso, cada empresa tem seu ambiente e seus DBDs especΓ­ficos que vocΓͺ vai aprender lendo a documentaΓ§Γ£o interna e consultando o DBA.