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.
Leia Mais
sábado, maio 16, 2026
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.
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.
Leia Mais
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-FINDDica 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. |
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.
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.
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.
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
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.
|
|
|
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!
sexta-feira, maio 15, 2026
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
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
//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* ENDA 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 |
quinta-feira, maio 14, 2026
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
Leia Mais
//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 ENDAAFPRSTC - 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 CONSTDatasets que foram criados para o nosso JCL0080 * --- 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
//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 //*
domingo, abril 05, 2026
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.
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
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
Feito o FTP para o mainframe
Ficou assim
JCL para rodar o SYSTRANS
Rodou ok
Carregou o programa A@CONVEM na biblioteca
Editando o programa, ele esta no nosso mainframe
Leia Mais
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
terça-feira, março 24, 2026
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.
Leia Mais
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
Subscrever:
Mensagens (Atom)






