Pesquisar este blog

Mostrando postagens com marcador TSO. Mostrar todas as postagens
Mostrando postagens com marcador TSO. Mostrar todas as postagens

terça-feira, 10 de agosto de 2021

TSO ISRDDN MEMBER(xpto) - Achar onde um determinado carga esta!


Por vezes precisei procurar onde um maldito carga executado, CLIST, REXX ou que seja que era excutado direto via TSO estava .

O comando em epigrafe resolve o mistério!

Mainframe, mega dica boa



Atualizacao em 11.06.2025, via IA

Como usar o ISRDDN no Mainframe TSO/ISPF

O que é o ISRDDN?

O ISRDDN é uma ferramenta diagnóstica do z/OS, fundamental para quem trabalha com TSO/ISPF no mainframe. Ela permite listar todos os DDNAMEs (datasets, bibliotecas, arquivos) alocados na sua sessão TSO, facilitando a localização de módulos, cargas e bibliotecas em uso no momento.

Principais funcionalidades

  • Lista todos os DDNAMEs e datasets alocados na sessão TSO/ISPF.
  • Mostra em quais bibliotecas estão os módulos executáveis (load modules).
  • Ajuda a identificar duplicidades, conflitos e bibliotecas vazias.
  • Permite examinar, editar, navegar e executar comandos sobre os datasets listados.
  • Exibe a ordem de busca de módulos (STEPLIB, ISPLLIB, LINKLIST, LPA, etc.).

Como acessar o ISRDDN

  1. No ISPF, digite TSO ISRDDN ou DDLIST na linha de comando e pressione Enter.
  2. Será exibida uma tela com todos os DDNAMEs e datasets alocados na sua sessão.
  3. Você pode pesquisar, navegar, editar ou examinar qualquer dataset diretamente dessa lista.

Exemplo de uso prático

  • Descobrir de onde um programa está sendo carregado: Procure pelo nome do módulo nas bibliotecas LOAD listadas (STEPLIB, ISPLLIB, LINKLIST, etc.).
  • Verificar se uma atualização está ativa: Veja se o módulo atualizado está na biblioteca correta e em uso.
  • Diagnóstico de problemas: Identifique bibliotecas duplicadas, vazias ou conflitos de datasets.
  • Análise de ambiente: Veja todas as bibliotecas que sua sessão está usando, incluindo as do sistema e pessoais.

Recursos avançados

  • Visualizar ENQs (locks) e contendas.
  • Navegar na memória (útil para suporte avançado).
  • Adicionar bibliotecas do sistema à visualização para checar se um módulo está em LPA ou LINKLIST.

Resumo

O ISRDDN é uma ferramenta essencial para suporte, análise e troubleshooting em ambientes mainframe. Com ele, você descobre exatamente de onde está vindo qualquer módulo ou carga em uso na sua sessão, facilitando o diagnóstico e a administração do ambiente z/OS.

quinta-feira, 24 de janeiro de 2019

REXX para bom dia! - Gera arquivos de configuração do Debug Tool - Submete Hrecall para todos os membros

Scripts REXX e JCL para Automação no z/OS

Scripts REXX e JCL para Automação no z/OS

Script REXX para Automação no z/OS

BOM#DIA.REXX

/* REXX */                                                    
trace off;                                                    
CLEAR                                                          
SAY 'Ola Buga!'                                                
SAY ' '                                                        
SAY 'Seja vem vindo...'                                        
SAY ' '                                                        
SAY ' '                                                        
parse PULL rola                                                
/******************************/                              
call verifica_primeira_vez_do_dia                              
say flag                                                      
if flag = 'S' then                                            
 do                                                            
    call grava_ja_rodamos;                                    
    call aloca_debug_tool_files;                              
    call hrecall_de_tudo;                                      
 end;                                                          
ISPF                                                          
exit 0                                                        
/******************************/                              
grava_ja_rodamos:                                              
/******************************/                              
dsname = 'walbuga.apagador'                                    
"ALLOC FI(Pdsout) DA('"dsname"') new                          
    tracks space(10 10) dir(01)                                
    Recfm(F B) LRECL(80)"                                      
"FREE  FI(Pdsout)"                                            
"allocate dataset('walbuga.apagador(#15)') fi(#15) shr reuse"  
"execio 0 diskw #15 (stem o. open)"                            
o.1 = 'CEBOLA '                                                
"execio * diskw #15 (stem o. finis)"                          
"free fi(#15)"                                                
return                                                        
/******************************/                              
/******************************/                              
dsname = 'walbuga.apagador'                                    
"ALLOC FI(Pdsout) DA('"dsname"') new                          
    tracks space(10 10) dir(01)                                
    Recfm(F B) LRECL(80)"                                      
"FREE  FI(Pdsout)"                                            
"allocate dataset('walbuga.apagador(#15)') fi(#15) shr reuse"  
"execio 0 diskw #15 (stem o. open)"                            
o.1 = 'CEBOLA '                                                
"execio * diskw #15 (stem o. finis)"                          
"free fi(#15)"                                                
return                                                        
/******************************/                              
verifica_primeira_vez_do_dia:                                  
/******************************/                              
"allocate dataset('walbuga.apagador(#15)') fi(#15) shr reuse"  
"execio * diskr #15 (stem oia. finis)"                        
   if pos('CEBOLA',oia.1) > '0' then                          
      do                                                      
         say 'TSO te derrubou, neh amigao ?'                  
         flag = 'N'                                            
      end                                                      
   else                                                        
      do                                                      
         say 'Divirta-se Buga'                                
         flag = 'S'                                            
      end                                                      
return                                                        
/******************************/                              
aloca_debug_tool_files:                                        
/******************************/                              
debug_tool = "'WALBUGA.G#NG.SEMANA09(DEBUG#01)'"              
SUBMIT debug_tool                                              
return                                                        
/******************************/                              
hrecall_de_tudo:                                              
recall = "'WALBUGA.G#R0.DATA(JCL#0004)'"                      
SUBMIT recall                                                  
return                                

JCL para Alocação de Arquivos de Debug (DEBUG#01)

WALBUGA.G#NG.SEMANA09(DEBUG#01)

DEBUG#01.JCL

//WALBUGA2 JOB NG,BUGA,CLASS=K      RESTART=STEP#002                  
/*NOTIFY WALBUGA                                                      
//*--------------------------------------------------------------------
//* Aloca arquivos utilizados pelo debug tool no z/OS                  
//*--------------------------------------------------------------------
//STEP#001  EXEC PGM=IEFBR14                                          
//SAVINGS      DD DSN=WALBUGA.DBGTOOL.SAVESETS,                        
//             DISP=(NEW,CATLG,DELETE),                                
//             UNIT=SYSDA,SPACE=(CYL,(20,10)),                        
//             DCB=(LRECL=3204,BLKSIZE=0,DSORG=PS,RECFM=VB)            
//SETTINGS      DD DSN=WALBUGA.DBGTOOL.SAVEBPS,                        
//             DISP=(NEW,CATLG,DELETE),                                
//             UNIT=SYSDA,SPACE=(CYL,(20,10)),                        
//             DCB=(LRECL=3204,BLKSIZE=0,DSORG=PO,RECFM=VB),          
//             DSNTYPE=LIBRARY                                        
//*--------------------------------------------------------------------
//* Carrega configuracoes que o Buga gosta!                            
//*--------------------------------------------------------------------
//STEP#002  EXEC PGM=IEBGENER                                          
//SYSIN    DD DUMMY                                                    
//SYSPRINT DD SYSOUT=X                                                
//SYSUT1   DD *                                                        
      COMMENT YES
      SET ASSEMBLER OFF;                                              
      SET ASSEMBLER STEPOVER EXTONLY;                                  
      SET AUTOMONITOR ON NOLOG CURRENT;                                
      SET CHANGE STATEMENT;                                            
      SET COLOR TURQUOISE NONE      HIGH TITLE HEADERS;                
      SET COLOR GREEN     NONE      LOW  TITLE FIELDS;                
      SET COLOR TURQUOISE REVERSE   LOW  MONITOR AREA;                
      SET COLOR TURQUOISE REVERSE   LOW  MONITOR LINES;                
      SET COLOR WHITE     REVERSE   LOW  SOURCE AREA;                  
      SET COLOR TURQUOISE REVERSE   LOW  SOURCE PREFIX;                
      SET COLOR YELLOW    REVERSE   LOW  SOURCE SUFFIX;                
      SET COLOR RED       REVERSE   HIGH SOURCE CURRENT;              
      SET COLOR GREEN     NONE      LOW  SOURCE BREAKPOINTS;          
      SET COLOR TURQUOISE NONE      HIGH PROGRAM OUTPUT;              
      SET COLOR YELLOW    NONE      LOW  TEST INPUT;                  
      SET COLOR GREEN     NONE      HIGH TEST OUTPUT;                  
      SET COLOR BLUE      REVERSE   HIGH LOG LINES;                    
      SET COLOR WHITE     NONE      HIGH COMMAND LINE;                
      SET COLOR GREEN     REVERSE   HIGH WINDOW HEADERS;              
      SET COLOR BLUE      REVERSE   HIGH TOFEOF MARKER;                
      SET COLOR RED       NONE      HIGH TARGET FIELD;                
      SET DEFAULT LISTINGS;                                            
      SET DEFAULT DBG;                                                
      SET DEFAULT MDBG;                                                
      SET DEFAULT SCROLL PAGE;                                        
      SET DEFAULT VIEW STANDARD;                                      
      SET DEFAULT WINDOW SOURCE;                                      
      SET DISASSEMBLY OFF;                                            
      SET DYNDEBUG ON;                                                
      SET ECHO ON;                                                    
      SET EXECUTE ON;                                                  
      SET EXPLICITDEBUG OFF;                                          
      SET FIND BOUNDS 1 *;                                            
      SET HISTORY ON 100;                                              
      SET IGNORELINK OFF;                                              
      SET LDD SINGLE;                                                  
      SET LIST TABULAR OFF;                                            
      SET LIST BY SUBSCRIPT OFF;                                      
      SET LOG OFF;                                                    
      SET LOG KEEP 1000;                                              
      SET LOG NUMBERS ON;                                              
      SET LONGCUNAME ON;                                              
      SET MONITOR DATATYPE OFF;                                        
      SET MONITOR LIMIT 1000;                                          
      SET MONITOR NUMBERS ON;                                          
      SET MONITOR WRAP ON;                                            
      SET MSGID OFF;                                                  
      SET PACE 2;                                                      
      SET PF1     "?" =    ?;                                          
      SET PF2     "STEP" = STEP;                                      
      SET PF3     "QUIT" = QUIT;                              
      SET PF4     "LIST" = LIST;                              
      SET PF5     "FIND" = IMMEDIATE FIND;                    
      SET PF6     "AT/CLEAR" =AT TOGGLE;                      
      SET PF7     "UP" =   IMMEDIATE UP;                      
      SET PF8     "DOWN" = IMMEDIATE DOWN;                    
      SET PF9     "GO" =   GO;                                
      SET PF10    "ZOOM" = IMMEDIATE ZOOM;                    
      SET PF11    "ZOOM LOG" =IMMEDIATE ZOOM LOG;              
      SET PF12    "RETRIEVE" =IMMEDIATE RETRIEVE;              
      SET PF13    "?" =    ?;                                  
      SET PF14    "STEP" = STEP;                              
      SET PF15    "QUIT" = QUIT;                              
      SET PF16    "LIST" = LIST;                              
      SET PF17    "FIND" = IMMEDIATE FIND;                    
      SET PF18    "AT/CLEAR" =AT TOGGLE;                      
      SET PF19    "UP" =   IMMEDIATE UP;                      
      SET PF20    "DOWN" = IMMEDIATE DOWN;                    
      SET PF21    "GO" =   GO;                                
      SET PF22    "ZOOM" = IMMEDIATE ZOOM;                    
      SET PF23    "ZOOM LOG" =IMMEDIATE ZOOM LOG;              
      SET PF24    "RETRIEVE" =IMMEDIATE RETRIEVE;              
      SET POPUP 15;                                            
      SET PROMPT LONG;                                        
      SET REFRESH OFF;                                        
      SET RESTORE SETTINGS AUTO;                              
      SET RESTORE BPS AUTO;                                    
      SET RESTORE MONITORS AUTO;                              
      SET REWRITE 50;                                          
      SET SAVE SETTINGS AUTO;                                  
      SET SAVE BPS AUTO FILE WALBUGA.DBGTOOL.SAVEBPS;          
      SET SAVE MONITORS AUTO;                                  
      SET SCROLL DISPLAY ON;                                  
      SET SUFFIX ON;                                          
      SET WARNING ON;                                          
      WINDOW SIZE 3 LOG;                                  
      WINDOW SIZE 28 SOURCE;                              
      WINDOW SIZE 8 MONITOR;                              
      SET SCREEN ON;                                                  
      SET SCREEN 1 MONITOR SOURCE LOG;                                
      SET KEYS ON 12;                                      
      SET MONITOR COLUMN ON;                                          
//SYSUT2   DD DSN=WALBUGA.DBGTOOL.SAVESETS,                            
//             DISP=(OLD,CATLG,DELETE),                                
//             UNIT=SYSDA,SPACE=(CYL,(20,10)),                        
//             DCB=(LRECL=3204,BLKSIZE=0,DSORG=PS,RECFM=VB)            
//                                                                    
//*                                                                    
                                                                       
SET SAVE SETTINGS AUTO ;                                              
SET SAVE BPS AUTO ;                                                    
SET SAVE MONITORS AUTO ;                                              
                                                                       
SET RESTORE SETTINGS AUTO ;                                            
SET RESTORE BPS AUTO ;                                                
SET RESTORE MONITORS AUTO ;                                            
                                                                       
SET AUTO ON;                                                          
WINDOW SIZE 30 SOURCE; window size 3 log;

JCL para Recall de Datasets do Usuário

'WALBUGA.G#R0.DATA(JCL#0004)'      

//WALBUGA1 JOB R8,'BUGA',MSGLEVEL=(1,1),CLASS=K,MSGCLASS=1,RD=NC        
//*---------------------------------------------------------------------
//*                                                                    
//*   PROCEDIMENTO PARA RECALL DE TODOS OS DATASETS DE UM USUARIO      
//*                                                                    
//*---------------------------------------------------------------------
/*NOTIFY WALBUGA         ** ME NOTIFIQUE                                
/*XEQ ECA                ** RODAR EM SECA                              
//*---------------------------------------------------------------------
//    EXPORT  SYMLIST=(USUARIO,ESTRELA)                                
//    SET     USUARIO=&SYSUID                                          
//    SET     ESTRELA='*'                                              
//*---------------------------------------------------------------------
//*          SCRATCH TODOS OS ARQUIVOS DE SAIDA                        
//*---------------------------------------------------------------------
//STEP#001 EXEC PGM=IDCAMS                                              
//SYSPRINT DD SYSOUT=*                                                  
//SYSIN    DD *,DLM=FIM,SYMBOLS=JCLONLY                                
  DELETE &USUARIO..LISTCAT.OUTPUT                                      
FIM                                                                    
//*---------------------------------------------------------------------
//*       SOLICITA RECALL DOS ARQUIVOS --- OPS NAO PODE                
//*---------------------------------------------------------------------
//STEP#002 EXEC PGM=IKJEFT01                                            
//SYSTSPRT DD SYSOUT=*                                                  
//SYSTSIN  DD *,SYMBOLS=JCLONLY                                        
 HRECALL &USUARIO..&ESTRELA NOWAIT                                      
//*---------------------------------------------------------------------
//* Entra em ação o plano 'B'                                          
//*       LISTA TODOS OS DATASETS DO USUARIO                            
//*---------------------------------------------------------------------
//STEP#003 EXEC PGM=IDCAMS                                              
//SYSPRINT DD   SYSOUT=*                                                
//SYSIN    DD  *,SYMBOLS=JCLONLY                                        
 LISTCAT LEVEL(&USUARIO) -                                              
   OUTFILE(OUTDD)                                                      
//OUTDD    DD DSN=&USUARIO..LISTCAT.OUTPUT,                            
//         DCB=(RECFM=VBA,LRECL=125,BLKSIZE=629),UNIT=DASD,            
//         SPACE=(CYL,(1,1)),                                          
//         DISP=(NEW,CATLG)                                            
//*---------------------------------------------------------------------
//*    COPIA PARA ARQUIVO TEMPORARIO                                    
//*---------------------------------------------------------------------
//STEP#004 EXEC PGM=IEBGENER                                            
//SYSPRINT DD   SYSOUT=*                                                
//SYSOUT   DD SYSOUT=*                                                  
//SYSIN    DD DUMMY                                                    
//SYSUT1   DD DSN=&USUARIO..LISTCAT.OUTPUT,DISP=SHR                    
//SYSUT2   DD DSN=&&TMP1,                                              
//         DCB=(RECFM=VBA,LRECL=125,BLKSIZE=629),UNIT=DASD,            
//         SPACE=(CYL,(1,1)),                                          
//         DISP=(MOD,PASS)                                              
//*---------------------------------------------------------------------
//*    EXTRAI DO RELATORIO DO IDCAMS QUE LISTOU OS ARQUIVOS O NOME DOS  
//* DATASETS QUE SERÃO RECUPERADOSLOGO NA SEQUENCIA                    
//*---------------------------------------------------------------------
//STEP#005 EXEC  PGM=SORT    ,COND=(0,NE)                              
//SORTIN   DD DSN=&&TMP1,DISP=(OLD,DELETE)                              
//SORTOUT  DD DSN=&&TMP2,                                              
//         RECFM=FB,LRECL=00060,                                        
//         SPACE=(CYL,(10,10),RLSE),                                    
//         DISP=(MOD,PASS)                                              
//SORTIN   DD SYSOUT=*                                                  
//SYSIN    DD *,SYMBOLS=JCLONLY                                        
 SORT FIELDS=COPY                                                      
 INCLUDE COND=(22,7,EQ,C'&USUARIO'),FORMAT=CH     *** 4 BYTES DO RDW    
 OUTFIL FNAMES=SORTOUT,VTOF,                                            
 OUTREC=(C' HRECALL ',22,44,C' NOWAIT')                                
//SYSOUT   DD  SYSOUT=*                                                
//SORTMSG  DD  SYSOUT=*                                                
//*---------------------------------------------------------------------
//*    REALIZA O HRECALL DOS MEMBROS DO USUARIO                        
//*---------------------------------------------------------------------
//STEP#006 EXEC PGM=IKJEFT01                                            
//SYSTSPRT DD SYSOUT=*                                                  
//SYSTSIN  DD *                                                        
 /* Vai que alguem resolveu customizar */                              
 PROFILE NOPREFIX                                                      
//         DD DSN=&&TMP2,DISP=(OLD,DELETE)                              
//*                                                                    
//*---------------------------------------------------------------------
//*    ENVIA MENSAGEM INFORMANDO O FINAL DO PROCESSAMENTO              
//*---------------------------------------------------------------------
//STEP#007 EXEC PGM=IKJEFT01                                            
//SYSPRINT DD SYSOUT=*                                                  
//SYSTSPRT DD SYSOUT=*                                                  
//SYSTSIN  DD *,SYMBOLS=JCLONLY                                        
 SEND 'Processo de Recall de arquivos finalizado!     ' USER(&USUARIO)  
/*                                                                      

quinta-feira, 20 de setembro de 2018

Mainframe - Prova de conceito captura de telas terminal 3270 e execução de comandos via script/macro

Próximos Passos

Com essa base, você pode:

  1. Automatizar testes de programas COBOL
  2. Integrar com pipelines CI/CD
  3. Monitorar execução de jobs via scripts

Video 1 : Macro script em execução rodando comandos do windows no mainframe


Automatizando Tarefas no Mainframe: Script com ws3270 e Transferência de Arquivos

Neste video, demonstramos como automatizar conexões, transferências de arquivos e submissão de jobs no mainframe usando o emulador ws3270 e scripts batch.

Tudo capturado e documentado para reprodutibilidade!

Configuração do Ambiente

Arquivos Necessários

Na pasta C:\Ferramentas\ws3270, temos:

- x3270ifTest.bat    # Script principal
- x3270if.exe        # Utilitário de automação
- HELLOWORLD.txt     # Programa COBOL a ser transferido
- OUTPUT.TXT         # Arquivo de log das telas capturadas

Script Batch (x3270ifTest.bat)


# Autenticação e navegação inicial
x3270if -t 5000 -v "Connect(192.86.32.159)"
x3270if -t 5000 -v "Wait(InputField)"
x3270if -t 5000 -v "String(logon AU04660)"
x3270if -t 5000 -v "Enter()"

# Transferência do arquivo
x3270if -t 5000 -v "Transfer(Direction=send,Localfile=HELLOWORLD.txt,HostFile=AU04660.HELLOWRD)"

# Navegação e submissão do job
x3270if -t 5000 -v "Tab(4)"
x3270if -t 5000 -v "Enter()"
x3270if -t 5000 -v "String(sub)"
x3270if -t 5000 -v "Enter()"

Execução do Processo

Comando usado para iniciar a automação e capturar logs:

cmd> x3270ifTest.bat >> output.txt

Exemplo de Tela Capturadas no Output.txt

Captura da tela inicial pre login
Figura 1: Conexao ao z/Os pela macro


Captura do 'sub no job'

*** JOB AU04660Z (JOB09955) SUBMITTED ***

Detalhes do Job Submetido

O programa COBOL transferido (HELLOWRD):


//AU04660Z JOB R8,'BUGA',MSGLEVEL=(1,1),CLASS=K,MSGCLASS=1,RD=NC,
// NOTIFY=&SYSUID
//CLG EXEC IGYWCLG
//COBOL.SYSIN DD *
    ID DIVISION.
        PROGRAM-ID. BUGA001.
    PROCEDURE DIVISION.
        DISPLAY "Hello world!"
        STOP RUN.
/*
//LKED.SYSLMOD DD DSN=AU04660.LOADS(BUGA001),DISP=OLD

Resultados e Aplicações

  • ✅ Autenticação automática no TSO
  • ✅ Upload de arquivos via script
  • ✅ Navegação por menus do ISPF
  • ✅ Submissão de job com número JOB09955
  • ✅ Log completo em output.txt

quinta-feira, 3 de novembro de 2016

Mass Insert DB2 - Inserindo uma caralhada de dados no on-line de uma vez só! Da hora, funciona!

Pequena alteração? Só um insert...

Esses dias me deparei com uma alteração de um programa (já entregue, testado e evidenciado) que precisou de uma “pequena alteração”, só um insert dizia o pedido.

Esse tipo de situação é muito corriqueira (lembro uma vez que trabalhei um carnaval inteiro (desde a sexta feira antes do carnaval até a quarta de cinzas porque tinha que ir pra produção no almoço da quarta de cinzas – esse fiz questão (só pra saber que não era urgente porra nenhuma e que não teria a volumetria informada nunca) de colocar contador de execução e emissão de relatório pra eu saber a real utilização da parada – BINGO, nem o cara que pediu usou na tal quarta de cinzas! Um tempo depois chegou uma solicitação pra desencanar da parada (o “projeto” inicial era bem trabalhoso e saiu só um cotoquinho na quarta de cinzas – afinal milagre é outro departamento, mágica ainda vai!) acho que até hoje deve ter um texto meu no código fonte bem puto explicitando que as vezes fazemos papel de palhaço atendendo pedidos que sabemos que não vai ter futuro, mas que os chefes nas camaradagens e nas boas vizinhanças acabam aceitando (mesmo também sabendo e concordando que não vai vingar) sinceramente não entenderei jamais os meandros do mundo corporativo!

Lembrei de uma vez que o Mané pediu um lê-grava na sexta pra entregar na segunda que era boiada... humpft, outro final de semana e madrugadas, mas esse usaram bastante!

Enfim, voltando a minha pequena alteração de hoje (outubro 2016). Depois que conversei com o figura que fez a solicitação inicial e na hora que integrou tudo reparou que precisava da “alteração” porque esqueceu na hora de “especificar” ou o “cliente” mudou de ideia, enfim, me pagam para além de fazer mágica, resolver pepinos e aqui estou!

A parada era simples, de verdade! Só ler uma tabela recebida via linkage e ir inserindo os caras que não fossem “branco” numa tabela XPTO. Como trabalhei bastante tempo com sistemas on-line de alta performance e diga-se de passagem quando comecei a trabalhar com isso foi justamente retirando os acessos ao DB2 substituindo-os para acesso a arquivos VSAM e outras soluções bem interessantes (como as TS residentes para “tabelas” pequenas).

Isso posto – como diria o nosso advogado Rodrigo – sei e tenho a noção que sair da QR (o programa é CICS e não é ThreadSafe) e ir pra L8 uma porrada de vezes pra gravar no DB2 não é uma boa ideia. Sai então pra pesquisa, afinal alguem já deve ter tido uma situação parecida de fazer uma inserção em massa no DB2 de uma vez só.

A pesquisa foi relativamente simples, tem bastante coisa de DB2 que aparece quando ‘googla’ direitinho (procurei por multiple-row-insert), vi o manual do DB2 – 11 e localizei o que eu precisava. Só os exemplos que estavam meio capengas, mas nada que com uma fuçada aqui e ali não resolvesse.

A parada ficou bem legal pro que eu precisava e deixa eu colocar o código aqui pra não esquecer – afinal pra isso que fiz esse blog!...

Simplificando... a tabela ‘digamos’ que tenha só 2 campos SMALLINT e not null os 2 e a chave é os 2.

As variáveis:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
/                                                              
*---------------------------------------------------------------*
*   MASS INSERT DB2                                            
*---------------------------------------------------------------*
01  FILLER             PIC X(30) VALUE 'MASS INSERT'.
01  GD-MASS-INSERT.
   03 I                PIC S9(4) COMP VALUE 1.
   03 GD-NR-LINHAS     PIC S9(4) COMP VALUE 0.
   03 GD-CAMPO1        PIC S9(4) COMP OCCURS 1000.
   03 GD-CAMPO2        PIC S9(4) COMP OCCURS 1000.
/                                                               

Na section do insert fiz um loopzinho básico pra varrer a entrada e mover os dados válidos e acumular quantos eram eles.

O insert é bem “normal”

    EXEC SQL
        INSERT INTO BVISANET.TABELA_XPTO
        (CAMPO_HUM, CAMPO_DOIS)
        VALUES (:GD-CAMPO01, :GD-COMPO02)
        FOR :GD-NR-LINHAS ROWS
        NOT ATOMIC CONTINUE ON SQLEXCEPTION
    END-EXEC.

E no meu caso nem se deu certo ou não eu precisava, nos testes deu uns erros 253 que indica que “olha eu tentei fazer o que voce pediu, mas não garanto porque deu caca” e o 254 que olha amigo, não rolou nem unzinho! Em ambos ou se quiser analisar a parada mais a fundo tem o “GET DIAGNOSTICS” que sai do escopo desse post (afinal nem usei a criança).

O “NOT ATOMIC” é pra não parar se der erro, afinal eu quero uma inserção em massa, os erros depois vejo o que faço com eles, quer dizer, nesse caso nada!

Fiquei puto com a “pequena alteração” ainda mais sabendo que meu patrão não recebe um centavo disso - na real quem deveria saber e cobrar sequer fica sabendo ou se sabe faz o lance da boa vizinhança, e enfim, entramos no mesmo lance do mundo corporativo que não entendo. mas aprendi uma nova e como não manjo nada de DB2 acho que foi bem produtivo!

Deixa eu colocar a fotinho do TSO pra eu lembrar que sou trouxa e trabalho depois do horário (achei que fosse coisa do meu outro serviço, mas parece que é crônico, afinal tudo é urgente e pra ontem!) e mais trouxa ainda porque não entro na justiça processando meu empregador!...

Figura 1: Buga Troxa

Figura 1: Buga Troxa

Os Códigos de SQL da versão 11 do DB2 podem ser pesquisados no link abaixo

http://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/codes/src/tpc/db2z_n.html

Nota:

Ver com o Aldenon ou com o Thiago se eles ainda tem o e-mail de outra vez que trabalhei igual maluco nas madrugada pra abrir o criptograma na mão com todos os passos e tals...

Achei!
Re: Documentação da função CVN 17 de 22.06.2013 tem o anexo e tudo com o passo a passo! (esse só pra eu lembrar mesmo porque tem muita informação $40, vulgo confidencial) e pra não esquecer que se o viadinho do Chahad tivesse descolado o programinha que ele usava tinha resolvido isso instantâneamente!

quinta-feira, 12 de maio de 2016

Mainframe Tips - Quem diabos estaria segurando o arquivo ???

Resolvendo Problemas com DataSet no Mainframe: Waiting for DataSet

Essa daqui pra quem é programador é casca, ainda mais quando você bota o Job pra rodar e ele fica "Waiting for DataSet", algo corriqueiro e por vezes até normal, mas e quando um Zé Ruela qualquer, NúBi da vida resolve mandar o JCL sem DISP share?

Pelo que aprendi do virtuoso "Nelson F1", fui lá ver quem estava segurando o DataSet no TSO mesmo, opção 3.4 que é a que mais gosto para mexer com arquivos, achei o raio do arquivo, mas TEM ALGUM INFELIZ QUE ESTA SEGURANDO O ARQUIVO COM ACESSO EXCLUSIVO!

Você vai lá da o F1, mas, mas

"Since more than 72 users are using the data set, this list is incomplete"

E nada de mostrar o job vermelhinho que esta te sacaneando.

Então vai lá e executa o comando na console, ué!

Acessando a Console via ULOG

Tela de acesso à console via ULOG no mainframe

Figura 1 - Acessando a console via ULOG

Executando o Comando na Console

/D GRS,RES=(*,CICSTS23.... CICS.SDFHLOAD)

Lá no FandezHi

Execução do comando GRS na console do mainframe

Figura 2 - Execução do comando

Relatório da Execução

De boa,

Relatório de execução do comando GRS no mainframe

Figura 3 - Relatório da execução

Só pra variar não lembro qual era o arquivo que ficou preso nem em qual "mainframe", mas como não posso dar print dos sistemas que trabalho, os ilustrativos aí de cima já devem me ajudar a lembrar na próxima vez que aconteça.

quarta-feira, 11 de janeiro de 2012