sábado, maio 16, 2026

Entendendo o Modelo de Lista Invertida no Adabas Mainframe

Se você trabalha ou está estudando o Adabas Mainframe, com certeza já ouviu falar que ele é um banco de dados baseado em Listas Invertidas. Mas você sabe o que isso significa na prática e por que essa arquitetura torna o Adabas um dos bancos de dados mais rápidos do mundo? O grande segredo da sua velocidade está na forma como ele indexa e encontra as informações.


O que é uma Lista Invertida?

Para entender o conceito, pense no índice remissivo no final de um livro de história. Se você quiser encontrar todas as páginas que mencionam a palavra "Mainframe", você não lê o livro inteiro. Você vai até o final, procura pela palavra "Mainframe" e vê uma lista com os números das páginas (ex: págs. 45, 112, 204). Uma lista invertida faz exatamente isso no banco de dados: ela mapeia valores específicos (chaves secundárias) e aponta diretamente para os registros que os contêm (chaves primárias ou, no caso do Adabas, os ISNs). Dizemos que a lista é "invertida" porque, em vez de abrirmos um registro para ler quais dados estão lá dentro, nós fazemos o caminho inverso: olhamos para o dado (o valor do índice) para descobrir quais registros possuem aquela informação.

Como funciona no Adabas Mainframe?

No Adabas, essa estrutura é implementada por meio do Associator. Quando você define um campo em um arquivo Adabas como um Descriptor (Descritor), o sistema cria e mantém automaticamente uma lista invertida para ele. O processo de busca funciona em três etapas simples: A Consulta: Seu programa Natural faz uma busca, por exemplo: FIND EMPLOYEES WITH CITY = 'SÃO PAULO'. A Busca na Lista Invertida: O Adabas Nucleus não vai até o arquivo principal (Data Storage) ler registro por registro. Ele vai direto ao Associator, procura o valor 'SÃO PAULO' na lista invertida do campo CITY. O Resultado: A lista invertida responde imediatamente com a lista de todos os ISNs (Internal Sequence Numbers) correspondentes. Com os ISNs em mãos, o Adabas busca os registros exatos. Essa estratégia elimina a necessidade de fazer varreduras completas nas tabelas (Table Scans), tornando as consultas incrivelmente rápidas. Vantagens e Desvantagens das Listas Invertidas Como qualquer escolha de arquitetura tecnológica, o modelo de listas invertidas possui um equilíbrio entre prós e contras que todo desenvolvedor e DBA deve conhecer.

Vantagens

Alta Eficiência de Busca: É ideal para grandes volumes de dados. O tempo de resposta para encontrar registros específicos é praticamente instantâneo, economizando muito MIPS no Mainframe. Consultas Combinadas Rápidas: O Adabas consegue cruzar listas invertidas de descritores diferentes na memória RAM (fazendo operações lógicas como AND, OR, NOT com os ISNs) antes mesmo de tocar no disco para ler os dados reais.

Desvantagens

Espaço em Disco: Embora o Adabas use técnicas avançadas de compactação, manter os índices de listas invertidas exige um espaço considerável no Associator. Custo de Atualização: Nada vem de graça. Sempre que seu programa faz um STORE, DELETE ou modifica um campo descritor com UPDATE, o Adabas precisa atualizar a lista invertida correspondente em tempo real. Se um arquivo tiver descritores demais, as operações de escrita podem se tornar mais pesadas.

Conclusão

Dominar o funcionamento do modelo de lista invertida do Adabas vai muito além de entender uma teoria de banco de dados: é um divisor de águas entre o desenvolvedor júnior e o profissional sênior de Mainframe. Quando você passa a enxergar que o Adabas resolve a maior parte das equações lógicas cruzando listas de ISNs dentro do Associator, antes mesmo de tocar no Data Storage, a sua forma de escrever código Natural muda completamente. Você para de criar estruturas que forçam o banco de dados a fazer varreduras sequenciais desnecessárias e passa a desenhar lógicas cirúrgicas, baseadas em descritores eficientes. Em uma era onde a otimização de recursos é prioridade máxima nas grandes corporações, cada milissegundo de CPU economizado se traduz em redução drástica no consumo de MIPS. Portanto, da próxima vez que você digitar um comando FIND ou READ, lembre-se do mecanismo que está rodando por baixo do capô. O seu código agradece, o desempenho do sistema decola e o DBA da sua empresa certamente vai dormir mais tranquilo.
Leia Mais

Como o Superdescritor salva a performance do seu Programa Adabas

Se você trabalha com desenvolvimento em ambiente Mainframe, já deve ter ouvido a máxima: "MIPS é dinheiro". No Adabas, a diferença entre uma consulta que roda em milissegundos e um processo batch que arrasta o ambiente inteiro está na forma como você modela e acessa suas chaves de busca. Muitos desenvolvedores (especialmente os que estão começando no mundo Natural/Adabas) criam chaves de busca de qualquer jeito. O resultado? Consultas que geram leituras sequenciais pesadas, sobrecarregam a Inverted List no Associator e disparam o consumo de CPU. Hoje, vamos entender o verdadeiro "pulo do gato" da performance no Adabas: a diferença crucial entre Subdescritores e Superdescritores, e como o segundo pode salvar a sua aplicação.

Conceito Rápido

Antes de ir para o código, vamos abrir o capô do Adabas e entender o que cada um faz:

Subdescritor: É uma chave criada a partir de um pedaço de um campo existente.
Exemplo: Você tem o campo DATA-CONTRATO (AAAAMMDD), mas cria um Subdescritor apenas para o ano (AAAA).

Superdescritor: É o verdadeiro campeão da performance. Ele permite combinar múltiplos campos (ou pedaços deles) em uma única chave de busca no Associator.
Exemplo: Você combina COD-CLIENTE + ANO-CONTRATO em um único índice.

O problema: O FIND com múltiplos campos

Imagine que você precisa buscar os contratos de um cliente específico criados no ano de 2026. Uma abordagem muito comum (e altamente ineficiente) é escrever um FIND combinando campos normais no WITH. O que acontece por baixo dos panos? Quando você faz isso, o Adabas precisa ir até a Inverted List do Associator, ler todos os ISNs do cliente X, depois ler todos os ISNs do ano de 2026 e fazer um cruzamento lógico em memória (um AND de listas de ISNs) para só então devolver o resultado. Se o cliente tiver milhões de registros, o Associator vai sofrer, o consumo de MIPS vai para o espaço e a consulta vai demorar.

A Solução: O Superdescritor em Ação

Em vez de fazer o Adabas cruzar duas listas gigantescas no Associator, nós criamos um Superdescritor (vamos chamá-lo de S1) que já nasce com a combinação pronta: COD-CLIENTE + ANO-CONTRATO. Dessa forma, o Adabas não faz cruzamento nenhum. Ele vai direto na árvore de índices do Associator, localiza a chave exata (ex: 123452026) e traz os ISNs instantaneamente. Uma operação que demoraria minutos em arquivos com dezenas de milhões de registros passa a ser imediata.

Exemplo Prático em Natural: O Antes e o Depois

Para ficar claro, vamos ver como muda o código e o comportamento do banco de dados. 🔴 Abordagem Ruim (Consome MIPS e gera overhead no Associator) Neste cenário, estamos usando dois campos descritores separados. O Adabas terá que cruzar as duas listas de ISNs em tempo de execução.
* TRADICIONAL: Filtro composto por descritores separados
FIND CONTRATOS-VIEW WITH CLIENTE-ID = #CLI-PROCURADO
                     AND ANO-CONTRATO = '2026'
  /* O Adabas lê a lista do cliente, lê a lista do ano,
  /* faz a intersecção de ISNs e depois busca no DATA Storage.
  DISPLAY CONTRATO-NUM STATUS VALOR
END-FIND

O Pulo do Gato com Superdescritor

Aqui, usamos o Superdescritor SUPER-CLI-ANO (que é a fusão de CLIENTE-ID e ANO-CONTRATO).
* OTIMIZADO: Busca direta utilizando o Superdescritor (S1)
* O formato da busca concatena as duas variáveis em uma única chave
FIND CONTRATOS-VIEW WITH SUPER-CLI-ANO = #CHAVE-COMBINADA
  /* O Adabas vai direto no endereço exato da combinação.
  /* Zero cruzamento de listas, resposta instantânea!
  DISPLAY CONTRATO-NUM STATUS VALOR
END-FIND
Dica de Performance: Repare que no segundo exemplo, a busca lógica no Associator tornou-se de indexação direta. O ganho de velocidade aqui é exponencial conforme o tamanho do arquivo cresce.

Subdescritor vs. Superdescritor

Para não errar na arquitetura do seu arquivo, siga essa regra de ouro:
Cenário Descritor Justificativa
Preciso filtrar relatórios ou telas por apenas uma parte de um campo (ex: apenas o mês de uma data, ou os primeiros dígitos de um CEP). Sub Evita que você precise criar um campo redundante no Data Storage apenas para guardar um pedaço de informação.
Tenho telas de consulta ou processos batch repetitivos que filtram por dois ou mais campos fixos (ex: Empresa + Filial + Status). Super Evita o cruzamento de listas de ISNs no Associator. A combinação cria um atalho definitivo direto para o dado.
Leia Mais

O que acontece no Adabas depois do END TRANSACTION?

Se você programa em Natural, com certeza usa os comandos STORE, UPDATE e o famoso END TRANSACTION (ET) todos os dias. Mas você já parou para pensar no que acontece "por baixo do capô" do Mainframe quando o código passa por essas linhas? Muitos desenvolvedores enxergam o Adabas como uma caixa preta. Existe uma barreira invisível entre o código Natural e o comportamento do Adabas Nucleus. Hoje, vamos quebrar essa barreira e entender a jornada do dado pelas três principais áreas do Adabas: o Work, o Data e o Associator.

Os Três Pilares do Adabas

Antes de simularmos os comandos, precisamos alinhar quem é quem na arquitetura do Adabas:

Data Storage: É onde o dado bruto realmente mora. Os registros são armazenados de forma compactada e recebem um endereço físico chamado ISN (Internal Sequence Number).

Associator: É o "cérebro" das buscas. Ele não guarda os dados textuais, mas sim os índices (Descriptors), a árvore de inversão e o mapeamento de qual ISN corresponde a qual local físico no Data Storage.
Adabas Fundamentals 035 Adabas Fundamentals 036 Adabas Fundamentals 037
Work: A área dinâmica. Funciona como o diário de bordo e a rede de segurança do Adabas. É aqui que o Nucleus gerencia as transações ativas (pesquisas, buffers de proteção e logs de rollback). A Jornada do Dado: Na Prática Vamos desenhar o cenário: você tem um mapa de arquivo (DDM) e executa um processo de atualização. O que acontece em cada etapa?

1. O comando STORE ou UPDATE Quando o seu programa Natural executa um STORE ou um UPDATE, o dado não vai direto para o disco definitivo (Data Storage) de forma imediata e síncrona.

A Fila de Comandos: O comando entra na fila do Adabas Nucleus.

A Escrita no Work (Parte 1): O Adabas registra essa intenção de mudança no Work (na área de Log de Proteção - Data Protection Log). Ele precisa guardar o "antes" e o "depois" do registro para o caso de o sistema cair ou de você digitar um BACKOUT TRANSACTION.

Memória RAM (Buffer Pool): O dado atualizado é colocado temporariamente no Buffer Pool do Adabas na memória. Para o seu programa, a operação foi rápida, mas o dado ainda está "volátil".
2. O Momento Crucial: O END TRANSACTION (ET) Aqui está o segredo que desmistifica o mainframe. Quando o Natural processa o END TRANSACTION, o Adabas Nucleus realiza os seguintes passos sequenciais:

Passo 1: Consolidação no WORK O Adabas grava imediatamente no Work o registro de que a transação foi fechada com sucesso (commit). A partir desse milissegundo, se o Mainframe sofrer uma queda de energia, o Adabas sabe que aquela transação foi consolidada e usará o Work para refazer o processo (Autorestart). Os locks (bloqueios) dos registros da sua transação são liberados para outros usuários.

3. O "Trabalho de Fundo": Atualizando o DATA e o ASSOCIATOR Muitos acham que o END TRANSACTION espera o dado gravar no arquivo físico de dados para terminar. Mito! Quem faz isso de forma assíncrona (em background) é o Nucleus, otimizando as E/S (Entradas e Saídas) de disco.

Gravando no DATA Storage: O Nucleus pega os dados que estavam no Buffer Pool (RAM) e os escreve fisicamente nos blocos do Data Storage. Se for um STORE, o registro ganha seu ISN definitivo.

Atualizando o ASSOCIATOR: Se o campo alterado ou inserido for um Descriptor (Index), o Adabas precisa atualizar a árvore de índices. Ele vai até o Associator, localiza o descritor correspondente e adiciona ou altera o vínculo daquele valor com o ISN do registro.

Por que o Programador Natural precisa saber disso? Entender esse fluxo muda o seu jogo por três motivos:

Tamanho das Transações: Se você colocar milhares de STORE/UPDATE sem dar END TRANSACTION, você vai lotar o Work (gerando o temido erro de estouro de área de Work). O Work precisa segurar todas as imagens anteriores até você decidir dar o ET.

Performance de Descriptors: Toda vez que você altera um campo que é Descriptor, lembre-se que o Adabas terá o trabalho duplo de mexer no Data e atualizar a árvore no Associator. Use descritores com sabedoria.

Concorrência: O END TRANSACTION limpa a fila de hold (registros retidos). Segurar um ET por muito tempo em um loop significa travar outros programas que tentam atualizar os mesmos registros.

Conclusão

O END TRANSACTION é o aperto de mãos definitivo entre o seu código Natural e a segurança do Adabas Work. É ele quem garante a propriedade ACID (Atomicidade, Consistência, Isolamento e Durabilidade) no ambiente de alta performance do mainframe.

Da próxima vez que digitar um ET, lembre-se: a mágica acontece no Work primeiro, para garantir a segurança, enquanto o Data e o Associator organizam a casa logo em seguida!

Gostou desse mergulho na arquitetura do Adabas? Deixe nos comentários se você já passou por algum sufoco com estouro de área de Work ou retenção de registros!
Leia Mais

sexta-feira, maio 15, 2026

Excluindo Jobs Automaticamente da Fila do Spool

Em ambientes mainframe com grande volume de processamento diário, é comum a fila do spool acumular jobs antigos, procedimentos ou esquecidos. Além de dificultar consultas operacionais, esse acúmulo pode impactar a organização do ambiente e até consumir recursos desnecessários. Para automatizar essa limpeza, é possível utilizar um JCL executando o SDSF em modo batch, enviando comandos diretamente ao JES para remover jobs antigos de acordo com critérios específicos. O exemplo abaixo mostra uma rotina automatizada para exclusão de jobs na fila do spool.

Esse é o JCL completo

//AAFSPOOL JOB (AAF,TSS),CLAUD,CLASS=S,MSGCLASS=Z
//*UQ ALLOW                                                             
//* --------------------------------------------------------------------
//*                    EXCLUIR JOBS DA FILA DO SPOOL                    
//* --------------------------------------------------------------------
//SDSF     EXEC PGM=SDSF                                                
//ISFOUT   DD SYSOUT=Z                                                  
//ISFIN    DD *                                                         
SET CONSOLE BATCH                                                       
SET DELAY 600                                                           
ULOG                                                                    
/$PO JQ,JM=AAFABSEG,A>7                                                 
/$PO JQ,JM=AAFABSEM,A>7                                                 
/$PO JQ,JM=AAFABDIA,A>1                                                 
/$PO JQ,JM=ALY*,A>6    
/$PO JQ,JM=AT*     
END                    

A opção sobre dias:
Comando Descrição
JM=AAFABSEG,A>7 Remove jobs com mais de 7 dias
JM=AAFABDIA,A>2 Remove jobs com mais de 2 dias
JM=AAFABANO,A>160 Remove jobs antigos acima de 160 dias
JM=AAFSA*,A>1 Remove jobs iniciados com AAFSA com mais de 1 dia
JM=AABS*,A>2 Remove jobs iniciados com AABS com mais de 2 dias

Observação, uso esse job para deletar os jobs dos bancos Adabas, monitoro que o jobo rodou ok e não deleto, coloquei em uma rotina que schedula todos os dias para deletar, menos trabalho e mais otimização
Leia Mais

quinta-feira, maio 14, 2026

Conferência Automatica de Aplicativos no z/OS

Monitorar aplicativos em Mainframe não precisa ser um gargalo operacional. A conferência manual, além de consumir tempo precioso, abre margem para falhas invisíveis — especialmente onde a quantidade de processos ativos é elevada. A chave para um monitoramento resiliente é a automação. Criar rotinas em Natural elimina a conferencia manual, garantindo a precisão total na verificação do ambiente. Vamos aprender a configurar um JCL e codificar dois programas em Natural que monitoram, em tempo real, as STCs essenciais. O resultado é um acompanhamento robusto, com menos carga de trabalho e maior segurança para os serviços críticos do seu ambiente.

Esse é o JCL completo

//AAFSNSTC JOB (AAF,TSS),KATIA,CLASS=S,MSGCLASS=A                               
//*UQ ALLOW                                                                     
//* ----------------------------------------------------------------            
//*       CHECANDO OS APLICATIVOS ONLINE/OFFLINE NO MAINFRAME                   
//*                     150 LINHAS - 133 COLUNAS                                
//* ----------------------------------------------------------------            
//SDSF     EXEC PGM=SDSF,PARM='++150,133'                                       
//ISFOUT   DD DSN=AAF.S.OPER1,DISP=SHR                                          
//ISFIN    DD *                                                                 
SET CONSOLE BATCH                                                               
SET DELAY 600                                                                   
ULOG                                                                            
/D A,L                                                                          
END                                                                             
//* ----------------------------------------------------------------            
//*                          FILTRO NO NATURAL                                  
//* ----------------------------------------------------------------            
//FILTRO   EXEC NATURAL,PARM1='SYS=P,MT=0,STACK=(LOGON ADABAS8)'               
//CMWKF01  DD DSN=AAF.S.OPER1,DISP=SHR                                          
//CMWKF02  DD DSN=AAF.S.OPER2,DISP=SHR                                          
//SYSOUT   DD SYSOUT=*                                              
//CMPRINT  DD SYSOUT=*                                              
//SYSPRINT DD SYSOUT=*                                              
//CMPRT01  DD SYSOUT=*                                              
//SYSIN    DD *                                                     
AAFPTSS9                                                            
//* ----------------------------------------------------------------
//*            COLOCANDO EM ORDEM ALFABETICA OS APLICATIVOS         
//* ----------------------------------------------------------------
//SORT     EXEC PGM=SORT                                            
//SYSPRINT DD SYSOUT=*                                              
//SYSOUT   DD SYSOUT=*                                              
//SORTIN   DD DSN=AAF.S.OPER2,DISP=SHR                              
//SORTWK1  DD UNIT=SYSDA,DISP=(,DELETE),SPACE=(CYL,(4),RLSE),       
//            VOL=SER=WRK001                                        
//SORTOUT  DD DSN=AAF.S.OPER3,DISP=SHR                              
//SYSIN    DD *                                                     
   SORT FIELDS=(1,8,CH,A)                                           
   RECORD TYPE=F,LENGTH=(40)                                        
//* ----------------------------------------------------------------
//*                   LISTANDO OS APLICATIVOS                       
//* ----------------------------------------------------------------
//NATD EXEC NATURAL,PARM1='SYS=P,MT=0,STACK=(LOGON ADABAS8)'       
//CMWKF01  DD DSN=AAF.S.OPER3,DISP=SHR
//CMWKF02  DD DSN=AAF.S.OPER1,DISP=SHR                              
//SYSOUT   DD SYSOUT=*                                              
//CMPRINT  DD SYSOUT=G                                              
//SYSPRINT DD SYSOUT=*                                              
//CMPRT01  DD SYSOUT=*                                              
//SYSIN    DD *                                                     
AAFPRSTC
//* ----------------------------------------------------------------

A parte muito importante que pega o comando D A,L e grava em um dataset e usa os dois programas natural acima para mostrar que aplicativos estão online - No primeiro step tem essa parte -- PARM='++150,133' -- significa que o resultado do comando (D A,L) vai separar 150 linhas com 133 de colunas para o resultado do comando, se você tem muitos aplicativos que dê mais de 150 linhas - Resultado depois de rodar o job acima - os aplicativos que estão online vai mostrar de uma forma bem simples, os aplicativos que estiverem offline vão aparecer nas primeiras linhas

1Logon accepted to library ADABAS8.     
1NEXT AAFPRSTC                           
1PAG      1                              
0              AADPRMM             ONLINE
               DB2P0020            ONLINE
               DB2P0030            ONLINE
               DB2P0040            ONLINE
               DB2P0050            ONLINE
               DB2P0060            ONLINE
               DB2P0070            ONLINE
               DB2P0080            ONLINE
               DB2P0082            ONLINE
               DB2P0100            ONLINE
               DB2P0110            ONLINE
               DB2P0120            ONLINE
               DB2P0130            ONLINE
               DB2P0140            ONLINE
               DB2P0141            ONLINE
               DB2P0150            ONLINE
               DB2P0160            ONLINE
               DB2P0170            ONLINE
               DB2P0180            ONLINE
               DB2P0190            ONLINE
               DB2P0210            ONLINE
               DB2P0230            ONLINE
               DB2P0240            ONLINE
               DB2P0241            ONLINE
               DB2P0242            ONLINE
               SERVA240            ONLINE
               SERVB230            ONLINE
               SERVC240            ONLINE
               SERVE240            ONLINE
               SERVF230            ONLINE
               SERVH240            ONLINE
               BROKEDET            ONLINE
               BROKELIN            ONLINE
               BROKENFR            ONLINE
               BROKENID            ONLINE
               BROKENIT            ONLINE
               BROKERCH            ONLINE
               BROKERNV            ONLINE
               SERVK080            ONLINE
               SERVM240            ONLINE
               SERVN240            ONLINE
               SERVR230            ONLINE
               SERVR240            ONLINE
               SERVR241            ONLINE
               SERVR242            ONLINE
               SERVR243            ONLINE
               SERVR244            ONLINE
               SERVR245            ONLINE
               SERVR246            ONLINE
               SERVR247            ONLINE
               SERVR248            ONLINE
               SERVR249            ONLINE
               SERVR250            ONLINE
               SERVR251            ONLINE
               SERVUTSS            ONLINE
               COMPLETD            ONLINE
               COMPLETP            ONLINE
               FTP1                ONLINE
               REFSMTP             ONLINE
               REFSNMP             ONLINE
               REFTCPIP            ONLINE
               REFTELNT            ONLINE
               REFTRVS             ONLINE
               REFTVTAM            ONLINE
               AOPD                ONLINE
               AOPHINVD            ONLINE
               AOPIPPD             ONLINE
               AOPLOGD             ONLINE
               AOPLPD              ONLINE
               AOPNETD             ONLINE
               AOPNETSP            ONLINE
               AOPOUTD             ONLINE
               AOPPRWAY            ONLINE
               AOPSDBD             ONLINE
               AOPSSID             ONLINE
               AOPSUBD             ONLINE
               AOPWSMD             ONLINE
1PAG      2                              
0              RACF                ONLINE
               RMF                 ONLINE
               RMFGAT              ONLINE
               TSO                 ONLINE

AAFPTSS9 - Primeiro programa que vamos fazer um filtro, vamos ler do dataset o comando D A,L e vamos pegar os aplicativos

 0010 * -------------------------------------------------------------------- *                                                       
 0020 * FUNCAO     : CHECANDO OS APLICATIVOS ONLINE NO MAINFRAME             *                                                       
 0030 * CRIADO     : KATIA UETI/CLAUDEMAR MARTINS                            *                                                       
 0040 * DATA       : 27/04/2016                                              *                                                       
 0050 * -------------------------------------------------------------------- *                                                       
 0060 * 
 0070 * 
 0080 * -------------------------------------------------------------------- *                                                       
 0090 DEFINE DATA LOCAL                                                                                                              
 0100 01 #FLAG-ON                      (N01)                                                                                         
 0110 01 #FLAG                         (A02)                                                                                         
 0120 01 #NUM                          (N03)                                                                                         
 0130 * -------------------------------------------------------------------- *                                                       
 0140 01 #LINHA                        (A133)                                                                                        
 0150 01 REDEFINE #LINHA                                                                                                             
 0160   02 FILLER                      04X                                                                                           
 0170   02 #JOBS                       (A04)                                                                                         
 0180   02 FILLER                      125X                                                                                          
 0190 01 REDEFINE #LINHA                                                                                                             
 0200   02 FILLER                      04X                                                                                           
 0210   02 #NOME1                     (A08)                                                                                          
 0220   02 REDEFINE #NOME1                                                                                                           
 0230     03 #PREFIX1                (A02)                                                                                           
 0240     03 #SUFIX1                 (A06)                                                                                           
 0250   02 FILLER                      24X                                                                                           
 0260   02 #PROC1                     (A01)                                                                                          
 0270   02 FILLER                      02X                                                                                           
 0280   02 #NOME2                     (A08)                                                                                          
 0290   02 REDEFINE #NOME2                                                                                                           
 0300     03 #PREFIX2                (A02)                                                                                           
 0310     03 #SUFIX2                 (A06)                                                                                           
 0320   02 FILLER                      24X                                                                                           
 0330   02 #PROC2                     (A01)                                                                                          
 0340   02 FILLER                      61X                                                                                           
 0350 * -------------------------------------------------------------------- *                                                       
 0360 01 #NOME-ARQ                     (A40)                                                                                         
 0370 01 REDEFINE #NOME-ARQ                                                                                                          
 0380   02 #NOME-APLICAT              (A08)                                                                                          
 0390   02 FILLER                     (A32)                                                                                          
 0400 * -------------------------------------------------------------------- *                                                       
 0410 END-DEFINE                                                                                                                     
 0420 FORMAT(1) PS=60                                                                                                                
 0430 RESET #FLAG #FLAG-ON #NUM                                                                                                      
 0440 * -------------------------------------------------------------------- *                                                       
 0450 READ WORK FILE 1 #LINHA                                                                                                        
 0460 * -------------------------------------------------------------------- *                                                       
 0470   IF  #JOBS = 'JOBS'                                                                                                           
 0480     MOVE 'OK' TO #FLAG                                                                                                         
 0490     ESCAPE TOP                                                                                                                 
 0500   END-IF                                                                                                                       
 0510 * -------------------------------------------------------------------- *                                                       
 0520   IF #FLAG = 'OK'                                                                                                              
 0530     IF #JOBS = 'JOBS' AND #NUM  GT 0                                                                                           
 0540       MOVE 1 TO #FLAG-ON                                                                                                       
 0550       ESCAPE BOTTOM                                                                                                            
 0560     END-IF                                                                                                                     
 0570 * -------------------------------------------------------------------- *                                                       
 0580 * MONITORAR TODOS OS APLICATIVOS RE - COLUNA UM                        *                                                       
 0590 * -------------------------------------------------------------------- *                                                       
 0600 *   IF #PREFIX1 = 'RE' AND #PROC1 = 'S'                                                                                        
 0610 *     ADD 1 TO #NUM                                                                                                            
 0620 *     MOVE #NOME1 TO #NOME-APLICAT                                                                                             
 0630 *     WRITE WORK FILE 2 #NOME-ARQ                                                                                              
 0640 ****    WRITE 'TSS4 = '   #NOME-ARQ                                                                                            
 0650 *   END-IF                                                                                                                     
 0660 * -------------------------------------------------------------------- *                                                       
 0670 * MONITORAR TODOS OS APLICATIVOS RE - COLUNA DOIS                      *                                                       
 0680 * -------------------------------------------------------------------- *                                                       
 0690 *   IF #PREFIX2 = 'RE' AND #PROC2 = 'S'                                                                                        
 0700 *     ADD 1 TO #NUM                                                                                                            
 0710 *     MOVE #NOME2 TO #NOME-APLICAT                                                                                             
 0720 *     WRITE WORK FILE 2 #NOME-ARQ                                                                                              
 0730 ****    WRITE 'TSS4 = '   #NOME-ARQ                                                                                            
 0740 *   END-IF                                                                                                                     
 0750 * -------------------------------------------------------------------- *                                                       
 0760 * COLUNA 1 - TODOS OS APLICATIVOS QUE MONITORAMOS                      *                                                       
 0770 * -------------------------------------------------------------------- *                                                       
 0780  IF #NOME1                                                                                                                     
 0790      = 'AADPTLMS' OR = 'DB2P0020' OR = 'DB2P0030' OR = 'DB2P0040' OR                                                           
 0800      = 'DB2P0050' OR = 'DB2P0060' OR = 'DB2P0070' OR = 'DB2P0080' OR                                                           
 0810      = 'DB2P0082' OR = 'DB2P0100' OR = 'DB2P0110' OR = 'DB2P0120' OR                                                           
 0820      = 'DB2P0130' OR = 'DB2P0140' OR = 'DB2P0150' OR = 'DB2P0160' OR                                                           
 0830      = 'DB2P0170' OR = 'DB2P0180' OR = 'DB2P0190' OR = 'DB2P0210' OR                                                           
 0840      = 'DB2P0230' OR = 'DB2P0240' OR = 'DB2P0241' OR = 'DB2P0242' OR                                                           
 0850      = 'SERVA240' OR = 'SERVC240' OR = 'SERVE240' OR = 'SERVF230' OR                                                           
 0860      = 'BROKEDET' OR = 'BROKELIN' OR = 'BROKENID' OR = 'BROKENIT' OR                                                           
 0870      = 'BROKERCH' OR = 'BROKERNV' OR = 'SERVK080' OR = 'SERVM240' OR                                                           
 0880      = 'SERVN240' OR = 'SERVR230' OR = 'SERVR240' OR = 'SERVR241' OR                                                           
 0890      = 'SERVR242' OR = 'SERVR243' OR = 'SERVR244' OR = 'SERVR245' OR                                                           
 0900      = 'SERVR246' OR = 'SERVR247' OR = 'SERVR248' OR = 'SERVR249' OR                                                           
 0910      = 'SERVR250' OR = 'SERVUTSS' OR = 'COMPLETD' OR = 'COMPLETP' OR                                                           
 0920      = 'REFSMTP ' OR = 'REFSNMP ' OR = 'REFTCPIP' OR = 'REFTRVS ' OR                                                           
 0930      = 'REFTVTAM' OR = 'AOPD    ' OR = 'AOPHINVD' OR = 'AOPIPPD ' OR                                                           
 0940      = 'AOPLOGD ' OR = 'AOPLPD  ' OR = 'AOPNETD ' OR = 'AOPNETSP' OR                                                           
 0950      = 'AOPOUTD ' OR = 'AOPPRWAY' OR = 'AOPSDBD ' OR = 'AOPSSID ' OR                                                           
 0960      = 'AOPSUBD ' OR = 'AOPWSMD ' OR = 'RMF     ' OR = 'RMFGAT  ' OR                                                           
 0970      = 'TSO     ' OR = 'RACF    ' OR = 'REFTELNT' OR = 'REDPRMM ' OR                                                           
 0980      = 'AOPPRWAY' OR = 'SERVB230' OR = 'FTP1    ' OR = 'DB2P0141' OR                                                           
 0990      = 'SERVH240' OR = 'BROKENFR' OR = 'SERVR251'                                                                              
 1000       ADD 1 TO #NUM                                                                                                            
 1010       MOVE #NOME1 TO #NOME-APLICAT                                                                                             
 1020       WRITE WORK FILE 2 #NOME-ARQ                                                                                              
 1030 ****    WRITE 'TSS4 = '   #NOME-ARQ                                                                                            
 1040     END-IF                                                                                                                     
 1050 * -------------------------------------------------------------------- *                                                       
 1060 * COLUNA 2 - TODOS OS APLICATIVOS QUE MONITORAMOS                      *                                                       
 1070 * -------------------------------------------------------------------- *                                                       
 1080  IF #NOME2                                                                                                                     
 1090      = 'AADPTLMS' OR = 'DB2P0020' OR = 'DB2P0030' OR = 'DB2P0040' OR                                                           
 1100      = 'DB2P0050' OR = 'DB2P0060' OR = 'DB2P0070' OR = 'DB2P0080' OR                                                           
 1110      = 'DB2P0082' OR = 'DB2P0100' OR = 'DB2P0110' OR = 'DB2P0120' OR                                                           
 1120      = 'DB2P0130' OR = 'DB2P0140' OR = 'DB2P0150' OR = 'DB2P0160' OR                                                           
 1130      = 'DB2P0170' OR = 'DB2P0180' OR = 'DB2P0190' OR = 'DB2P0210' OR                                                           
 1140      = 'DB2P0230' OR = 'DB2P0240' OR = 'DB2P0241' OR = 'DB2P0242' OR                                                           
 1150      = 'SERVA240' OR = 'SERVC240' OR = 'SERVE240' OR = 'SERVF230' OR                                                           
 1160      = 'BROKEDET' OR = 'BROKELIN' OR = 'BROKENID' OR = 'BROKENIT' OR                                                           
 1170      = 'BROKERCH' OR = 'BROKERNV' OR = 'SERVK080' OR = 'SERVM240' OR                                                           
 1180      = 'SERVN240' OR = 'SERVR230' OR = 'SERVR240' OR = 'SERVR241' OR                                                           
 1190      = 'SERVR242' OR = 'SERVR243' OR = 'SERVR244' OR = 'SERVR245' OR                                                           
 1200      = 'SERVR246' OR = 'SERVR247' OR = 'SERVR248' OR = 'SERVR249' OR                                                           
 1210      = 'SERVR250' OR = 'SERVUTSS' OR = 'COMPLETD' OR = 'COMPLETP' OR                                                           
 1220      = 'REFSMTP ' OR = 'REFSNMP ' OR = 'REFTCPIP' OR = 'REFTRVS ' OR                                                           
 1230      = 'REFTVTAM' OR = 'AOPD    ' OR = 'AOPHINVD' OR = 'AOPIPPD ' OR                                                           
 1240      = 'AOPLOGD ' OR = 'AOPLPD  ' OR = 'AOPNETD ' OR = 'AOPNETSP' OR                                                           
 1250      = 'AOPOUTD ' OR = 'AOPPRWAY' OR = 'AOPSDBD ' OR = 'AOPSSID ' OR                                                           
 1260      = 'AOPSUBD ' OR = 'AOPWSMD ' OR = 'RMF     ' OR = 'RMFGAT  ' OR                                                           
 1270      = 'TSO     ' OR = 'RACF    ' OR = 'REFTELNT' OR = 'REDPRMM ' OR                                                           
 1280      = 'AOPPRWAY' OR = 'SERVB230' OR = 'FTP1    ' OR = 'DB2P0141' OR                                                           
 1290      = 'SERVH240' OR = 'BROKENFR' OR = 'SERVR251'                                                                              
 1300       ADD 1 TO #NUM                                                                                                            
 1310       MOVE #NOME2 TO #NOME-APLICAT                                                                                             
 1320       WRITE WORK FILE 2 #NOME-ARQ                                                                                              
 1330 ****    WRITE 'TSS4 = '   #NOME-ARQ                                                                                            
 1340     END-IF                                                                                                                     
 1350 * -------------------------------------------------------------------- *                                                       
 1360   END-IF                                                                                                                       
 1370 END-WORK                                                                                                                       
 1380 END                                                                                                                            

AAFPRSTC - agora vamos listar no nosso job os aplicativos que estão online

 0010 * -------------------------------------------------------------------- *                                                       
 0020 * FUNCAO - VERIFICAR OS APLICATIVOS QUE ESTAO ONLINE/OFFLINE           *                                                       
 0030 * AUTOR  - CLAUDEMAR MARTINS DE SA                                     *                                                       
 0040 * -------------------------------------------------------------------- *                                                       
 0050 DEFINE DATA                                                                                                                    
 0060 LOCAL                                                                                                                          
 0070 * --- ADICIONANDO MAIS UM APLICATIVO AUMENTE O VALOR CONST                                                                                                                                                            
 0080 * --- TEMOS ATUALMENTE 81 APLICATIVOS PARA MONITORAR
 0090 *                                                                                                                              
 0100 01 #TOTAL-APPS       (I2) CONST <81>                                                                                           
 0110 01 #REGISTRO-ENTRADA (A80)                                                                                                     
 0120 01 #LISTA-PESQUISA   (A8/1:#TOTAL-APPS)                                                                                        
 0130   INIT                                                                                                                         
 0140 *                                                                                                                              
 0150 * --- APLICATIVOS A SEREM MONITORADOS - TEMOS 81 STCs
 0160 *                                                                                                                              
 0170  <'AADPTLMS','DB2P0020','DB2P0030','DB2P0040','DB2P0050',                                                                      
 0180   'DB2P0060','DB2P0070','DB2P0080','DB2P0082','DB2P0100','DB2P0110',                                                           
 0190   'DB2P0120','DB2P0130','DB2P0140','DB2P0141','DB2P0150','DB2P0160',                                                           
 0200   'DB2P0170','DB2P0180','DB2P0190','DB2P0210','DB2P0230','DB2P0240',                                                           
 0210   'DB2P0241','DB2P0242','SERVA240','SERVB230','SERVC240','SERVE240',                                                           
 0220   'SERVF230','SERVH240','BROKEDET','BROKELIN','BROKENFR','BROKENID',                                                           
 0230   'BROKENIT','BROKERCH','BROKERNV','SERVK080','SERVM240','SERVN240',                                                           
 0240   'SERVR230','SERVR240','SERVR241','SERVR242','SERVR243','SERVR244',                                                           
 0250   'SERVR245','SERVR246','SERVR247','SERVR248','SERVR249','SERVR250',                                                           
 0260   'SERVR251','SERVUTSS','COMPLETD','COMPLETP','FTP1    ','REFSMTP ',                                                           
 0270   'REFSNMP ','REFTCPIP','REFTELNT','REFTRVS ','REFTVTAM','AOPD    ',                                                           
 0280   'AOPHINVD','AOPIPPD ','AOPLOGD ','AOPLPD  ','AOPNETD ','AOPNETSP',                                                           
 0290   'AOPOUTD ','AOPPRWAY','AOPSDBD ','AOPSSID ','AOPSUBD ','AOPWSMD ',                                                           
 0300   'RACF    ','RMF     ','RMFGAT  ','TSO     '>                                                                                 
 0310 *                                                                                                                              
 0320 * -------------------------------------------------------------------- *                                                       
 0330 *                                                                                                                              
 0340 01 #JA-ENCONTRADO    (L/1:#TOTAL-APPS) INIT                                                                             
 0350 01 #I                (I2)                                                                                                      
 0360 END-DEFINE                                                                                                                     
 0370 *                                                                                                                              
 0380 * -------------------------------------------------------------------- *                                                       
 0390 *                                                                                                                              
 0400 FORMAT LS=183 PS=0                                                                                                             
 0410 * EJECT OFF                                                                                                                    
 0420 * SET CONTROL 'f+'                                                                                                             
 0430 * SET CONTROL 'H'                                                                                                              
 0440 *                                                                                                                              
 0450 * --- 1. FASE DE LEITURA (APENAS IDENTIFICACAO) ---                                                                            
 0460 *                                                                                                                              
 0470 READ WORK FILE 1 #REGISTRO-ENTRADA                                                                                             
 0480   FOR #I = 1 TO #TOTAL-APPS                                                                                                    
 0490     IF #JA-ENCONTRADO(#I)                                                                                                      
 0500       ESCAPE TOP                                                                                                               
 0510     END-IF                                                                                                                     
 0520 * -------------------------------------------------------------------- *                                                       
 0530 * -------------------------------------------------------------------- *                                                       
 0540     IF #REGISTRO-ENTRADA = SCAN #LISTA-PESQUISA(#I)                                                                            
 0550       #JA-ENCONTRADO(#I) := TRUE                                                                                               
 0560       ESCAPE BOTTOM                                                                                                            
 0570     END-IF                                                                                                                     
 0580   END-FOR                                                                                                                      
 0590 END-WORK                                                                                                                       
 0600 *                                                                                                                              
 0610 * --- PRIMEIRO OS APLICATIVOS OFFLINE ---                                                                                      
 0620 *                                                                                                                              
 0630 FOR #I = 1 TO #TOTAL-APPS                                                                                                      
 0640   IF NOT #JA-ENCONTRADO(#I)                                                                                                    
 0650 *                                                                                                                              
 0660    WRITE '             ' #LISTA-PESQUISA(#I) (AL=10)                                                                           
 0670    ' ====  OFFLINE  ===='                                                                                                    
 0680 END-IF                                                                                                                         
 0690 END-FOR                                                                                                                        
 0700 *                                                                                                                              
 0710 * --- SEGUNDO OS APLICATIVOS ONLINE ---                                                                                        
 0720 *                                                                                                                              
 0730 FOR #I = 1 TO #TOTAL-APPS                                                                                                      
 0740   IF #JA-ENCONTRADO(#I)                                                                                                        
 0750     WRITE '             ' #LISTA-PESQUISA(#I) (AL=10)                                                                          
 0760    '         ONLINE       '                                                                                                    
 0770     WRITE WORK FILE 2 #LISTA-PESQUISA(#I)                                                                                      
 0780   END-IF                                                                                                                       
 0790 END-FOR                                                                                                                        
 0800 END 

Datasets que foram criados para o nosso JCL

//AACCBR14 JOB (ALAD,DISA),'SCHED',CLASS=7,MSGCLASS=A             
//*UQ ALLOW                                                       
//* ------------------------------------------------------------  
//*                   CRIA DATASET NO MAINFRAME                   
//* ------------------------------------------------------------  
//S1       EXEC PGM=IEFBR14                                       
//CATLG1   DD DSN=AAF.S.OPER1,                   
//         DISP=(NEW,CATLG,DELETE),                               
//         DCB=(DSORG=PS,LRECL=133,BLKSIZE=1330,RECFM=FB),                    
//         VOL=SER=DISCO1,SPACE=(CYL,(4,1),RLSE),UNIT=SYSDA
//*
//CATLG1   DD DSN=AAF.S.OPER2,                   
//         DISP=(NEW,CATLG,DELETE),                               
//         DCB=(DSORG=PS,LRECL=133,BLKSIZE=1330,RECFM=FB),                    
//         VOL=SER=DISCO1,SPACE=(CYL,(4,1),RLSE),UNIT=SYSDA
//*
//CATLG1   DD DSN=AAF.S.OPER3,                   
//         DISP=(NEW,CATLG,DELETE),                               
//         DCB=(DSORG=PS,LRECL=133,BLKSIZE=1330,RECFM=FB),                    
//         VOL=SER=DISCO1,SPACE=(CYL,(4,1),RLSE),UNIT=SYSDA
//*
//CATLG1   DD DSN=AAF.S.OPER4,                   
//         DISP=(NEW,CATLG,DELETE),                               
//         DCB=(DSORG=PS,LRECL=133,BLKSIZE=1330,RECFM=FB),                    
//         VOL=SER=DISCO1,SPACE=(CYL,(4,1),RLSE),UNIT=SYSDA
//*
Leia Mais

domingo, abril 05, 2026

Transferir um programa via SYSTRANS para o Adabas

Encontrou um código essencial no GitHub da Software AG e precisa levá-lo para o seu ambiente Natural/Adabas? Se o programa for curto, o "copiar e colar" resolve. No entanto, quando lidamos com fontes de 500 linhas ou mais, o processo manual torna-se arriscado e ineficiente. Para garantir que o objeto seja catalogado, compilado e executado corretamente sem perda de dados, o Natural exige um processo formal de importação. Abaixo, detalhamos as rotas mais seguras para realizar essa transição, focando especialmente no uso do SYSTRANS.

DEFINE DATA LOCAl
1 CRUISE2VIEW VIEW OF CRUISE2
1 RECCOUNT (N5)
END-DEFINE
/* delete all records from CRUISE2
R1. READ CRUISE2VIEW
  DELETE
  COMPUTE RECCOUNT = RECCOUNT + 1
END-READ
*
END TRANSACTION
*
WRITE 'OK - all records deleted in CRUISE2:' RECCOUNT
*
END 

Para que o utilitário SYSTRANS processe com sucesso os programas que estão no seu notebook, não basta apenas ter o código fonte; é necessário garantir que o arquivo esteja formatado abaixo

*H**ENAT4104202603301403199MVS/ESA                          0AE B
*C**                                SUPORTE2A@CONVEM                        F
*D01NAT4104F SUPORTE2A@CONVEM                        DBA1055 DBA1055 6     13S
*D02            2017020912011802017020912011800000003845                   
*D03MVS/ESA COMPLETENCF414                                                
*D04                                                                      
*S**0010DEFINE DATA LOCAl
*S**00201 CRUISE2VIEW VIEW OF CRUISE2
*S**00301 RECCOUNT (N5)
*S**0040END-DEFINE
*S**0050* delete all records from CRUISE2
*S**0060R1. READ CRUISE2VIEW
*S**0070  DELETE
*S**0080  COMPUTE RECCOUNT = RECCOUNT + 1
*S**0090END-READ
*S**0100*
*S**0110END TRANSACTION
*S**0120*
*S**0130WRITE 'OK - all records deleted in CRUISE2:' RECCOUNT
*S**0140*
*S**0150END
*E 

A mágica esta no começo D01NAT4104F é onde vai estar a versão do natural - F esta falando que vamos carregar um programa - na linha de cima tem um F também - ao final tem que ir *E para passar ao SYSTRANS que o programa acabou

*H**ENAT4104202603301403199MVS/ESA                          0AE B
*C**                                SUPORTE2A@CONVEM                        F
*D01NAT4104F SUPORTE2A@CONVEM                        DBA1055 DBA1055 6     13S

Feito o FTP para o mainframe

claudemar@Claudemar:~$ cd Documentos
claudemar@Claudemar:~/Documentos$ ftp 12.1.40.5
Connected to 12.1.40.5.
220-AAFFTP1 IBM FTP CS V1R8 at JES2, 16:58:21 on 2026-04-05.
220 Connection will close if idle for more than 15 minutes.
Name (12.1.40.5:claudemar): DBA1055
331 Send password please.
Password: 
230 DBA01055 is logged on.  Working directory is "DBA01055.".
Remote system type is MVS.
ftp> cd ..
250 "" is the working directory name prefix.
ftp> 
ftp> 
ftp> put A@CONVEM.txt AAB.S.UNLOAD.DET2
local: A@CONVEM.txt remote: AAB.S.UNLOAD.DET2
229 Entering Extended Passive Mode (|||3115|)
125 Storing data set AAB.S.UNLOAD.DET2
100% |*************************************************************************************************************************************************************************************************|   852        7.88 MiB/s    --:-- ETA
250 Transfer completed successfully.
852 bytes sent in 00:00 (13.37 KiB/s)
ftp>  

Ficou assim

                                                                      R=00000001                                                    
DSN=AAB.S.UNLOAD.DET2                                   VOL=PRD908 UNIT=4579                                                        
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3..
*H**ENAT4104202603301403199MVS/ESA                          0AE B                                                                   
*C**                                SUPORTE2A@CONVEM                        P                                                       
*D01NAT4104P SUPORTE2A@CONVEM                        DBA1055 DBA1055 6     13S                                                      
*D02            2017020912011802017020912011800000003845                                                                            
*D03MVS/ESA COMPLETENCF414                                                                                                          
*D04                                                                                                                                
*S**0010DEFINE DATA LOCAl                                                                                                           
*S**00201 CRUISE2VIEW VIEW OF CRUISE2                                                                                               
*S**00301 RECCOUNT (N5)                                                                                                             
*S**0040END-DEFINE                                                                                                                  
*S**0050* delete all records from CRUISE2                                                                                           
*S**0060R1. READ CRUISE2VIEW                                                                                                        
*S**0070  DELETE                                                                                                                    
*S**0080  COMPUTE RECCOUNT = RECCOUNT + 1                                                                                           
*S**0090END-READ                                                                                                                    
*S**0100*                                                                                                                           
*S**0110END TRANSACTION                                                                                                             
*S**0120*                                                                                                                           
*S**0130WRITE 'OK - all records deleted in CRUISE2:' RECCOUNT                                                                       
*S**0140*                                                                                                                           
*S**0150END  
*E
 COMPDS0400-D --- End of Data ---   

JCL para rodar o SYSTRANS

//AABDNATB JOB (AACP,SCHD),MASTER,CLASS=S,MSGCLASS=A TYPRUN=HOLD   
//*UQ ALLOW                                                       
//* ------------------------------------------------------------- 
//*           TRANSFERENCIA PARA A BIBLIOTECA SUPORTE1            
//* ESTE JOB COPIA PROGRAMAS DE UM ARQUIVO PS P/ UMA BIB. NATURAL 
//* ------------------------------------------------------------- 
//NATUNLD EXEC NATURAL,PARM1='SYS=D,MT=0,IM=D,INTENS=1'          
//CMWKF01 DD DSN=AAB.S.UNLOAD.DET2,DISP=OLD                       
//CMPRINT DD SYSOUT=A                                             
//DADOS    DD *                                                   
L                                                                 
N|Y|Y|N|Y                                                         
*                                                                 
Y                                                                 
MIGRACAO                                                          
FIN                                                               
/*                                                                
//SYSIN   DD *                                                    
LOGON SYSTRANS                                                    
MENU                                                              
/* 

Rodou ok

1Logon accepted to library SUPORTE2.            
1NEXT LOGON SYSTRANS                            
1Function / CMD                                 
 DATA L                                         
1                                               
 General Load Options                           
0User-Defined Conversion Table ....   N  (Y/N/F)
 Report ...........................   Y  (Y/N)  
 Translate Sources to Upper Case ..   N  (Y/N)  
 Save Restart Information .........   N  (Y/N)  
 Modify Library Names .............   N  (Y/N)  
0Use Entire Connection work file ..   N  (Y/N)  
 Convert Data Area Sources ........   N  (Y/N)  
 DATA N|Y|Y|N|Y                                 
1Objects to be loaded / CMD                     
 DATA *                                         
1                                               
 Load All Objects                               
0All objects on work file 1 will be loaded|     
0Replace ............................ N  (Y/N)  
 DATA Y                                         
1                                               
 Modify Library Names                           
-Old Library Name .................   *         
-Old Library Name .................   *                                          
 New Library Name .................   *_______                                   
 DATA MIGRACAO                                                                   
119:12:56             ***** NATURAL SYSTRANS UTILITY *****            2026-04-05 
 User AABDNATB                  - Load Objects -                                 
0Object   Object      Src Vers.  Target   Date/Time of     Op.-     Remark       
 Name     Type        Cat Level  Library  Save             System                
 -------- ----------- --- ------ -------- ---------------- -------- ------------ 
0A@CONVEM Program     Src 4.1.4  MIGRACAO 2017-02-09 12:01 MVS/ESA  Replaced  
1PAG      2                                                   26-04-05  19:12:56 
0Objects loaded successfully                                                     
1Objects to be loaded / CMD                                                      
 DATA FIN                                                                        
119:12:56              ***** NATURAL SYSTRANS UTILITY *****           2026-04-05 
 User AABDNATB                 - Load Objects -                                  
                      Statistical Report of loaded Objects                       
        Global Data Area .................       0                               
        Local Data Area ..................       0                               
        Parameter Data Area ..............       0                               
        Programs .........................       1                               
        Subprograms ......................       0                               
        Subroutines ......................       0                               
        Helproutines .....................       0                               
        Copycodes ........................       0                               
        Texts ............................       0                              
        Dialogs ..........................       0                              
        Classes ..........................       0                              
        Maps .............................       0                              
        Functions ........................       0                              
0       Total Command Processors .........       0                              
        Total Natural Objects ............       1                              
        Total Predict Processing Rules ...       0                              
        Total DDMs .......................       0                              
        Total Adabas FDTs ................       0                              
        Total Error Message Texts ........       0                              
119:12:56              ***** NATURAL SYSTRANS UTILITY *****           2026-04-05
 User AABDNATB                 - Load Objects -                                 
-       Total Objects loaded .............       1                              
-                                                                               
       *** TRANSFER Load Process has been terminated successfully ***           
1NAT9995 Natural session terminated normally.                                   
UQS0009 - END OF DATA SET.                 

Carregou o programa A@CONVEM na biblioteca

 19:17:21               ***** NATURAL LIST COMMAND *****              05/04/2026                                                    
 User DBA1055             - LIST Objects in a Library -         Library MIGRACAO                                                    
                                                                                                                                    
 Cmd  Name       Type         S/C  SM Version  User ID    Date        Time                                                          
 ---  @>_______  *__________  *__  *  *______  *________  *__________ *________                                                     
 __   A@CONVEM   Program      S    S  4.1.04   DBA1055    2017-02-09  12:01:18                                                      
 __   MIDELEPN   Subprogram   S/C  S  4.1.04   DBA77057   2026-03-26  12:46:26                                                      
 __   MIEXC7PN   Program      S/C  S  4.1.04   DBA77057   2026-03-26  12:46:26                                                      
 __   MIEXC8PN   Program      S/C  S  4.1.04   DBA77057   2026-03-26  12:46:26                                                      
 __   MIEXC9PN   Program      S/C  S  4.1.04   DBA77057   2026-03-26  12:46:26                                                      
 __   MIEX99PN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:36:24                                                      
 __   MIINITNN   Subprogram   S/C  S  4.1.04   DBA77057   2026-03-26  12:48:51                                                      
 __   MIJOBAPN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:39:59                                                      
 __   MIJOBFNN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:40:50                                                      
 __   MIJOBIPN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:41:23                                                      
 __   MITABJPN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:43:23                                                      
 __   MITABPN    Program      S    S  4.1.04   DBA77057   2026-03-25  21:44:25                                                      
 __   MITABWPN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:45:28                                                      
 __   MITAB2PN   Program      S    S  4.1.04   DBA77057   2026-03-25  21:42:31                                                      
                                                               14 Objects found                                                     
 Command ===>                                                                                                                       
                                                                                                                                    
                                                                                                                                    
 Top of List.                                                                                                                       
                                                                                                                                    
 Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---                                                    
       Help  Print Exit  Sort        --    -     +     ++          >     Canc  

Editando o programa, ele esta no nosso mainframe

>                                       > +  Program     A@CONVEM Lib MIGRACAO  
All    ....+....1....+....2....+....3....+....4....+....5....+.Mode Structured. 
  0010 DEFINE DATA LOCAL                                                        
  0020 1 CRUISE2VIEW VIEW OF CRUISE2                                            
  0030 1 RECCOUNT (N5)                                                          
  0040 END-DEFINE                                                               
  0050 * delete all records from CRUISE2                                        
  0060 R1. READ CRUISE2VIEW                                                     
  0070   DELETE                                                                 
  0080   COMPUTE RECCOUNT = RECCOUNT + 1                                        
  0090 END-READ                                                                 
  0100 *                                                                        
  0110 END TRANSACTION                                                          
  0120 *                                                                        
  0130 WRITE 'OK - all records deleted in CRUISE2:' RECCOUNT                    
  0140 *                                                                        
  0150 END                                                                       
Leia Mais

terça-feira, março 24, 2026

Transferência de Objetos com SYSTRANS

Você pode utilizar o SYSTRANS para transferir objetos do ambiente Natural/Adabas de uma plataforma para outra, como por exemplo do mainframe para Linux ou Windows. Por meio dele é possível transportar programas, mapas, DDMs e até mesmo estruturas relacionadas ao banco de dados, como os FDTs do Adabas. Isso torna o processo muito mais seguro e padronizado, evitando erros que poderiam ocorrer caso essa transferência fosse feita manualmente. Muitas vezes também é necessário fazer a atualização de versões de objetos. É comum que determinados programas sejam constantemente alterados em um dos ambientes — por exemplo, no ambiente web — e essas alterações precisam ser transferidas para o outro ambiente para que ambos permaneçam sincronizados. Manter essa correlação entre os ambientes é extremamente importante para evitar inconsistências, principalmente quando existem rotinas críticas que são utilizadas em produção.

Esse fluxo garante que os dois ambientes permaneçam alinhados, reduzindo riscos de inconsistência entre versões e facilitando o controle das alterações feitas pelos desenvolvedores.

Simulando

Temos um programa chamado DBAPMENU que queremos transferir para outro mainframe/ou outro Linux Natural - no mainframe usamos esse JCL para fazer o backup
//AAFSNATB JOB (AACP,SCHD),SCHED,CLASS=S,MSGCLASS=A TYPRUN=HOLD        
//*UQ ALLOW                                                            
//* ------------------------------------------------------------------ 
//*           Transferencia do mainframe para o micro                  
//* ------------------------------------------------------------------ 
//* ESTE JOB COPIA PROGRAMAS/SUBPROGRAMAS PARA UM ARQUIVO PS UNLOAD    
//* ------------------------------------------------------------------ 
//NATUNLD EXEC NATSIAF,PARM1='SYS=D,MT=0,IM=D,INTENS=1'                
//CMWKF01 DD DSN=AAC.S.WORK01,DISP=OLD                                 
//CMWKF03 DD DSN=AAF.S.CMWKF03,DISP=OLD                                
//CMPRINT DD SYSOUT=A                                                  
//DADOS    DD *             
U                           
N|N|N|Y|Y|N|N               
N                           
SUPORTE2|DBAPMENU|*|SUPORTE2
FIN                         
/*                          
//SYSIN   DD *              
LOGON SYSTRANS              
MENU                        
/*

Rodou o SYSTRANS Unload

1Logon accepted to library SUPORTE2.          
1NEXT LOGON SYSTRANS                          
1Logon accepted to library SYSTRANS.          
1NEXT MENU                                    
1Function / CMD                               
 DATA U                                       
1                                             
 General Unload Options                       
0Conversion EBCDIC ===> ASCII .....   N  (Y/N)
 User-Defined Conversion Table ....   N  (Y/N)
 Substitute Line References .......   N  (Y/N)
 Report ...........................   Y  (Y/N)
 Include Line Numbers .............   N  (Y/N)
 Use Work File Input ..............   N  (Y/N)
 Use Selection List ...............   N  (Y/N)
0Use Entire Connection work file...   N  (Y/N)
 DATA N|N|N|Y|Y|N|N                           
1                                             
 Objects to be unloaded / CMD                 
 DATA N                                       
1                                             
 Unload Natural Objects                                                         
0S/C Type ....................... S                                             
 From Library ................... ________                                      
 Object Name .................... *_______                                      
 Object Type .................... *______________                               
 To Library ..................... ________                                      
 Data Area Format ............... * (*/O/N)                                     
 DATA SUPORTE2|DBAPMENU|*|SUPORTE2                                              
111:42:15             ***** NATURAL SYSTRANS UTILITY *****            2026-03-24
 User AAFSNATB                 - Unload Objects -                               
0Object   Object      Src  Vers.  Target   Date/Time of     User ID  Operating  
 Name     Type        Cat  Level  Library  Save             of save  System     
 -------- ----------- ---  ------ -------- ---------------- -------- ---------  
0DBAPMENU Program     Src  4.1.4  SUPORTE2 2025-07-09 14:15 DBAP048  MVS/ESA    
1                                                                               
 Objects to be unloaded / CMD                                                   
 DATA FIN                                                                       
111:42:15              ***** NATURAL SYSTRANS UTILITY *****           2026-03-24
 User AAFSNATB                - Unload Objects -                                
                      Statistical Report of unloaded Objects                    
        Global Data Area .................       0                              
        Local Data Area ..................       0                              
        Parameter Data Area ..............       0                              
        Programs .........................       1                              
        Subprograms ......................       0                              
        Subroutines ......................       0                              
        Helproutines .....................       0                              
        Copycodes ........................       0                              
        Texts ............................       0                              
        Dialogs ..........................       0                              
        Classes ..........................       0                              
        Maps .............................       0                              
        Functions ........................       0                              
0       Total Command Processors .........       0                              
        Total Natural Objects ............       1                              
        Total Predict Processing Rules ...       0                              
        Total DDMs .......................       0                              
        Total Adabas FDTs ................       0                              
        Total Error Message Texts ........       0                              
111:42:15              ***** NATURAL SYSTRANS UTILITY *****           2026-03-24
 User AAFSNATB                - Unload Objects -                                
-       Total Objects unloaded ...........       1                              
-                                                                     
      *** TRANSFER Unload Process has been terminated successfully ***
1NAT9995 Natural session terminated normally.                         
UQS0009 - END OF DATA SET.                                                                                                 

Vamos ver o dataset - o programa esta lá

                                                                      R=00000001
DSN=AAC.S.WORK01                                        VOL=PRD305 UNIT=1522    
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
*H**ENAT4104202603241142152MVS/ESA                          0AE B               
*C**                                SUPORTE2DBAPMENU                        F   
*D01NAT4104F SUPORTE2DBAPMENU                        DBAP048 DBAP048 4     23R  
*D02            2025070914153122025070914153120000002651                        
*D03MVS/ESA COMPLETENCF414                                                      
*D04                                                                            
*S**0010* ==================================================================== *
*S**0020* FUNCAO: MENU DE OPCOES PARA O DBA ADABAS                             *
*S**0030*  AUTOR: CLAUDEMAR MARTINS                                            *
*S**0040*  DATA : 08/02/2021                                                   *
*S**0050* ==================================================================== *
*S**0060DEFINE DATA LOCAL                                                       
*S**00701 #ARQ1 (N3)                                                            
*S**0080END-DEFINE                                                              
*S**0090* ==================================================================== *
*S**0100FORMAT KD=ON                                                            
*S**0110SET KEY                                                                 
*S**0120  TREQ        NAMED ' '   /* NOVAS PFS /*                               
*S**0130PF3  = PGM  NAMED 'EXIT'                                                
*S**0140PF12 = PGM  NAMED 'QUIT'                                                
*S**0150* ==================================================================== *
*S**0160REPEAT                                                                  
*S**0170  INPUT (IP=OFF SG=OFF AD=MIL'_')                                       
*S**0180    02T '-' (78)                                                        
*S**0190    /02T *USER                                                          
*S**0200    20T 'SUPERINTENDENCIA DA GESTAO DA INFORMACAO' (I)                  
*S**0210    72T *PROGRAM                                                        
*S**0220    /02T *TIME(AL=8) 11T '-' (60) 72T  *DATE                            
*S**0230    /72T *LIBRARY-ID /                                                  
*S**0240    /02T '-' (78)                                                       
*S**0250/8T '10 - MONITORANDO ESPACOS '(I) 47T' 80 - CALCULO DO ESPACO      '(I)
*S**0260/8T '20 - MIGRATE FILES ADABAS'(I) 47T' 90 - MANUTENCAO NOS FILES   '(I)
*S**0270/8T '30 - BACKUP BANCO/FILE   '(I) 47T'100 - PROCEDIMENTOS HISTORICO'(I)
*S**0280/8T '40 - LIMPAR CHECKPOINTS  '(I) 47T'110 - ALOCACAO DOS FILES     '(I)
*S**0290/8T '50 - ADAREP DOS BANCOS   '(I) 47T'120 - LIMPANDO BUFFER POOL   '(I)
*S**0300/8T '60 - REORDB/REORFILE     '(I) 47T'130 - RESTRUTURACAO          '(I)
*S**0310/8T '70 - NOMES BANCOS PREDICT'(I) 47T'                             '(I)
*S**0320    /2T'-' (78)                                                         
*S**0330* ==================================================================== *
*S**0340    // 27T'DIGITE A OPCAO DESEJADA'(YE) #ARQ1(AD=MIL'_')                

Essa é a biblioteca que vou restaurar o DBAPMENU - poderia ser em um ambiente em outro mainframe/outro linux

 11:46:18               ***** NATURAL LIST COMMAND *****              24/03/2026
 User DBAP048             - LIST Objects in a Library -         Library SUPORTE1
                                                                                
 Cmd  Name       Type         S/C  SM Version  User ID    Date        Time      
 ---  *________  *__________  *__  *  *______  *________  *__________ *________ 
 __   VIEW01     Program      S    R  4.1.04   DBAP048    2025-08-14  10:26:45  
 __   VIEW02     Program      S/C  S  4.1.04   DBAP048    2025-08-14  12:33:03  
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                2 Objects found 
 Top of List.                                                                   
 Command ===>                                                                   
 Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
       Help  Print Exit  Sort        --    -     +     ++          >     Canc   

Vamos restaura o programa que foi salvo no dataset via SYSTRANS

//AAFSNATB JOB (AACP,SCHD),KATIA,CLASS=S,MSGCLASS=A TYPRUN=HOLD        
//*UQ ALLOW                                                            
//* -------------------------------------------------------------      
//*           TRANSFERENCIA PARA A BIBLIOTECA SUPORTE1                 
//* -------------------------------------------------------------      
//* ESTE JOB COPIA PROGRAMAS DE UM ARQUIVO PS P/ UMA BIB. NATURAL      
//* -------------------------------------------------------------      
//NATUNLD EXEC NATURAL,PARM1='SYS=D,MT=0,IM=D,INTENS=1'                
//CMWKF01 DD DSN=AAB.S.UNLOAD.DET2,DISP=OLD                            
//CMPRINT DD SYSOUT=A                                                  
//DADOS    DD *
L              
N|Y|Y|N|Y      
*              
Y              
SUPORTE1       
FIN            
/*             
//SYSIN   DD * 
LOGON SYSTRANS 
MENU           
/*             

Restaurou

1Logon accepted to library SUPORTE2.            
1NEXT LOGON SYSTRANS                            
1Logon accepted to library SYSTRANS.            
1NEXT MENU                                      
1Function / CMD                                 
 DATA L                                         
1                                               
 General Load Options                           
0User-Defined Conversion Table ....   N  (Y/N/F)
 Report ...........................   Y  (Y/N)  
 Translate Sources to Upper Case ..   N  (Y/N)  
 Save Restart Information .........   N  (Y/N)  
 Modify Library Names .............   N  (Y/N)  
0Use Entire Connection work file ..   N  (Y/N)  
 Convert Data Area Sources ........   N  (Y/N)  
 DATA N|Y|Y|N|Y                                 
1Objects to be loaded / CMD                     
 DATA *                                         
1                                               
 Load All Objects                               
0All objects on work file 1 will be loaded|     
0Replace ............................ N  (Y/N)                                  
 DATA Y                                                                         
1                                                                               
 Modify Library Names                                                           
-Old Library Name .................   *                                         
 New Library Name .................   *_______                                  
 DATA SUPORTE1                                                                  
111:47:20             ***** NATURAL SYSTRANS UTILITY *****            2026-03-24
 User AAFSNATB                  - Load Objects -                                
0Object   Object      Src Vers.  Target   Date/Time of     Op.-     Remark      
 Name     Type        Cat Level  Library  Save             System               
 -------- ----------- --- ------ -------- ---------------- -------- ------------
0DBAPMENU Program     Src 4.1.4  SUPORTE1 2025-07-09 14:15 MVS/ESA  Loaded      
1PAG      2                                                   26-03-24  11:47:19
0Objects loaded successfully                                                    
1Objects to be loaded / CMD                                                     
 DATA FIN                                                                       
111:47:20              ***** NATURAL SYSTRANS UTILITY *****           2026-03-24
 User AAFSNATB                 - Load Objects -                                 
                      Statistical Report of loaded Objects                      
        Global Data Area .................       0                              
        Local Data Area ..................       0                              
        Parameter Data Area ..............       0                              
        Programs .........................       1                              
        Subprograms ......................       0                              
        Subroutines ......................       0                              
        Helproutines .....................       0                              
        Copycodes ........................       0                              
        Texts ............................       0                              
        Dialogs ..........................       0                              
        Classes ..........................       0                              
        Maps .............................       0                              
        Functions ........................       0                              
0       Total Command Processors .........       0                              
        Total Natural Objects ............       1                              
        Total Predict Processing Rules ...       0                              
        Total DDMs .......................       0                              
        Total Adabas FDTs ................       0                              
        Total Error Message Texts ........       0                              
111:47:20              ***** NATURAL SYSTRANS UTILITY *****           2026-03-24
 User AAFSNATB                 - Load Objects -                                 
-       Total Objects loaded .............       1                              
-                                                                    
       *** TRANSFER Load Process has been terminated successfully ***
1NAT9995 Natural session terminated normally.                        
UQS0009 - END OF DATA SET.                                           

Restaurou

 11:49:02               ***** NATURAL LIST COMMAND *****              24/03/2026
 User DBAP048             - LIST Objects in a Library -         Library SUPORTE1
                                                                                
 Cmd  Name       Type         S/C  SM Version  User ID    Date        Time      
 ---  *________  *__________  *__  *  *______  *________  *__________ *________ 
 ed   DBAPMENU   Program      S    R  4.1.04   DBAP048    2025-07-09  14:15:31  
 __   VIEW01     Program      S    R  4.1.04   DBAP048    2025-08-14  10:26:45  
 __   VIEW02     Program      S/C  S  4.1.04   DBAP048    2025-08-14  12:33:03  
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                3 Objects found 
 Top of List.                                                                   
 Command ===>                                                                   
 Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
       Help  Print Exit  Sort        --    -     +     ++          >     Canc   

Editando - esta lá o programa

 >                                       > +  Program     DBAPMENU Lib SUPORTE1 
 Top    ....+....1....+....2....+....3....+....4....+....5....+....6....+....7..
   0010 * ==================================================================== *
   0020 * FUNCAO: MENU DE OPCOES PARA O DBA ADABAS                             *
   0030 *  AUTOR: CLAUDEMAR MARTINS                                            *
   0040 *  DATA : 08/02/2021                                                   *
   0050 * ==================================================================== *
   0060 DEFINE DATA LOCAL                                                       
   0070 1 #ARQ1 (N3)                                                            
   0080 END-DEFINE                                                              
   0090 * ==================================================================== *
   0100 FORMAT KD=ON                                                            
   0110 SET KEY                                                                 
   0120   TREQ        NAMED ' '   /* NOVAS PFS /*                               
   0130 PF3  = PGM  NAMED 'EXIT'                                                
   0140 PF12 = PGM  NAMED 'QUIT'                                                
   0150 * ==================================================================== *
   0160 REPEAT                                                                  
   0170   INPUT (IP=OFF SG=OFF AD=MIL'_')                                       
   0180     02T '-' (78)                                                        
   0190     /02T *USER                                                          
   0200     20T 'SUPERINTENDENCIA DA GESTAO DA INFORMACAO' (I)                  
   0210     72T *PROGRAM                                                        
   0220     /02T *TIME(AL=8) 11T '-' (60) 72T  *DATE                            
   0230     /72T *LIBRARY-ID /                                                  
   0240     /02T '-' (78)                                                       
   0250 /8T '10 - MONITORANDO ESPACOS '(I) 47T' 80 - CALCULO DO ESPACO      '(I)
   0260 /8T '20 - MIGRATE FILES ADABAS'(I) 47T' 90 - MANUTENCAO NOS FILES   '(I)
   0270 /8T '30 - BACKUP BANCO/FILE   '(I) 47T'100 - PROCEDIMENTOS HISTORICO'(I)
   0280 /8T '40 - LIMPAR CHECKPOINTS  '(I) 47T'110 - ALOCACAO DOS FILES     '(I)
   0290 /8T '50 - ADAREP DOS BANCOS   '(I) 47T'120 - LIMPANDO BUFFER POOL   '(I)
   0300 /8T '60 - REORDB/REORFILE     '(I) 47T'130 - RESTRUTURACAO          '(I)
   0310 /8T '70 - NOMES BANCOS PREDICT'(I) 47T'                             '(I)
   0320     /2T'-' (78)                                                         
   0330 * ==================================================================== *
   0340     // 27T'DIGITE A OPCAO DESEJADA'(YE) #ARQ1(AD=MIL'_')                
   0350     // 30T'TECLE PF3 PARA SAIR'(I)                                      
   0360 * ==================================================================== *
   0370   IF #ARQ1 EQ  10   FETCH 'DBAMCS10'                                    
   0380   IF #ARQ1 EQ  20   FETCH 'DBAMCS20'                                    
   0390   IF #ARQ1 EQ  30   FETCH 'DBAMCS30'                                    
   0400   IF #ARQ1 EQ  40   FETCH 'DBAPJ879'          /* 'DBAMCS80'             
        ....+....1....+....2....+....3....+....4....+....5....+... S 54   L 21  
Leia Mais