Pesquisar este blog

quinta-feira, 14 de fevereiro de 2019

REXX para localizar string em pacotes do Changeman

Atualizado em 2025 06 11 - Reescreve o post com ajuda do perplexity, nao testei o fonte e nem comparei pra ver se ele mudou alguma coisa, mas bonito devo dizer que ficou!


REXX para localizar string em pacotes do Changeman

Este script REXX realiza uma busca por uma string em todos os membros de um pacote do Changeman, gerando um relatório com os resultados encontrados. Útil para quem precisa localizar rapidamente trechos de código ou referências em ambientes mainframe integrados ao ChangeMan.

Exemplo de uso

Execute o script informando a sigla do sistema, o número do pacote e a string a ser pesquisada.

Código REXX

FINDCHG.REXX

/**  REXX  **/                                                        
arg sigla pacote texto                                                
call valida_parametros;                                                
call verifica_se_pacote_existe;                                        
/* aqui a magica acontece! */                                          
call outtrap "mbrs."                                                  
"LISTD" "'"pdsname"'" "MEMBERS"                                        
call outtrap "off"                                                    
                                                                       
do ndx=1 to mbrs.0                                                    
   if mbrs.ndx = "--MEMBERS--" then leave                              
end                                                                    
ndx=ndx+1                                                              
qtd_membros = mbrs.0 - ndx + 1                                        
say 'Procuraremos a string em ' qtd_membros ' membros.'                
/* "ALLOC FI(RELAT) DA('WALBUGA.OUTDD.SAIDA') MOD REUSE" */            
log = USERID()'.OUTDD.SAIDA'                                          
say log                                                                
/* "ALLOC FI(RELAT) DA(log) MOD REUSE"                                
   "ALLOC F(SYS010) DS('"particionado"("membro")') SHR REUSE"          
   "ALLOC FI(RELAT) DA('WALBUGA.OUTDD.SAIDA') MOD REUSE"  */          
 "ALLOC FI(RELAT) DA('"log"') MOD REUSE"                              
IF RC \= 0 THEN                                                        
   DO                                                                  
      say "----------------------------------------"                  
      say "Erro na alocacao do arquivo de relatorio"                  
      say "----------------------------------------"                  
     EXIT 0                                                            
   END                                                                
/* aqui a magica acontece 2! */                                        
call listdsi "'"pdsname"'"                                            
particionado=sysdsname                                                
/**-----------------------------------------------------------------**/
linha.1="------------------------------------------------"            
linha.2="Inicio do processamento ------------------------"            
linha.3="------------------------------------------------"              
linha.4="Procurando " pdsname " por <" texto ">"                        
linha.5="------------------------------------------------"              
linha.0=5                                                              
"EXECIO" linha.0 "DISKW RELAT (STEM linha."                            
do curmbr = ndx to mbrs.0                                              
   parse value mbrs.curmbr with membro                                  
   membro=strip(membro)                                                
   flag=1                                                              
/* say "member="particionado"("membro")" */                            
/* assim sai o membro */                                                
/* aqui =  'particionadome' ||(membro) */                              
/* aqui = "'"(membro)"'" */                                            
/* say aqui */                                                          
/* "ALLOC F(SYS010) DS('"particionado"("membro")') SHR REUSE" */        
   "ALLOC F(SYS010) DS('"particionado"("membro")') SHR REUSE"          
/* "ALLOC F(SYS010) DS("'"aqui"'") SHR REUSE" */                        
   "EXECIO * DISKR SYS010 (FINIS STEM in."                              
   "FREE F(SYS010)"                                                    
   fnd=0                                                                
   do recid=1 to in.0                                                  
      if pos(texto,in.recid) > 0 then                                  
        do                                                              
           if flag = 1 then                                            
             do                                                        
              linha.1="------------------------------------------------"
              linha.2="----> " membro " contem <" texto ">"            
              say linha.2                                              
              linha.3 = in.recid                                        
              linha.0=3                                                
              "EXECIO" linha.0 "DISKW RELAT (STEM linha."              
              flag=0                                                    
             end                                                        
           linha.1 = in.recid                                          
           linha.0=1                                                    
           "EXECIO" linha.0 "DISKW RELAT (STEM linha."                  
        end                                                            
   end                                                                  
end                                                                    
say '*** Pesquisa finalizada com sucesso ***'                          
linha.1="////////////////////////////////////////////////"            
linha.2="////////////////////////////////////////////////"            
linha.3="////////////////////////////////////////////    "            
linha.4="//////////////////////////////////////////// FIM"            
linha.5="////////////////////////////////////////////////"            
linha.0=5                                                              
"EXECIO" linha.0 "DISKW RELAT (STEM linha."                            
"EXECIO 0 DISKW RELAT (FINIS"                                          
"FREE F(RELAT)"                                                        
exit 0                                                                
                                                                       
/*----------------------- */                                          
valida_parametros:                                                    
/*----------------------- */                                          
if sigla = "" | pacote = "" | texto = "" then                          
 do                                                                    
   clear                                                              
   say ""                                                              
   say "Bem vindo "  USERID()                                          
   say ""                                                              
   say  "Informe: "                                                    
   say  " - sigla do sistema"                                          
   say  " - numero do pacote "                                        
   say  " - string a ser pesquisada"                                  
   say ""                                                              
   say  "Como não foi informado abrirei a opcao de informar abaixo."  
   say ""                                                              
   say  "Digite SAI para sair, tecle ENTER para continuar..."          
   pull ok                                                            
   say ""                                                              
   /* if parse upper (ok) = 'SAI' then         -- VER USO DO UPPER */  
   if ok = 'SAI' then                                                  
    do                                                                
      exit 0                                                          
    end                                                                
 end                                                                  
if sigla = "" then                                                    
   do                                                                  
      say "----------------------------------------------------"      
      say "Erro: Informe a sigla do sistema com duas posicoes"        
      say "----------------------------------------------------"      
      say ""                                                          
      say 'Digite a sigla:'                                            
      pull sigla                                                      
   end                                                                
if pacote = "" then                                                    
   do                                                                  
      say "--------------------------------"                          
      say "Erro: Não foi informado o pacote"                          
      say "--------------------------------"                          
      say ""                                                          
      say "Procuraremos em DESICBIB.CHGMAN.STG.NG0I.#pacote.SRC"      
      say ""                                                          
      say 'Digite o numero do pacote com 6 numeros :'                  
      pull pacote                                                      
   end                                                                
if texto = "" then                                                    
   do                                                                  
      say "-----------------------------------------------------------"
      say "Erro: Não foi informada a string a ser pesquisada no pacote"
      say "-----------------------------------------------------------"
      say ""                                                          
      say 'Digite a string:'                                          
      pull texto                                                      
   end                                                                
return                                                                
                                                                       
                                                                       
/*------------------------------------- */                            
verifica_se_pacote_existe:                                            
/*------------------------------------- */                            
                                                                       
/*         DESICBIB.CHGMAN.STG.NG0I.#000651.SRC */                    
pdsname = 'DESICBIB.CHGMAN.STG.'sigla'0I.#'pacote'.SRC'                
    say '---------------------------------------------------------------'
    say 'Procurando' texto ' em 'pdsname''                                
    say '---------------------------------------------------------------'
    x = SYSDSN("'"pdsname"'")      /* só pros feras!!! ODEIO ISSO */      
    say x ', vamos em frente que o pacote ta lá!'                        
    say '---------------------------------------------------------------'
    if x <> "OK" then                                                    
       do                                                                
          say "Erro: Não conseguimos localizar o pacote #" pacote        
          say "Erro: Não conseguimos localizar o pacote:" pdsname        
          say "Error: " pdsname " > " sysdsn(pdsname)                    
          say "Press Enter to continue"                                  
          pull uresp                                                      
          exit 8                                                          
       end                                                                
    return                                            

Como funciona

  • Valida os parâmetros de entrada (sigla, pacote, texto).
  • Verifica se o pacote existe no Changeman.
  • Lista todos os membros do pacote e busca a string informada em cada um.
  • Gera um relatório de saída com os membros e linhas onde a string foi encontrada.

Observações

  • O script pode ser adaptado para outros padrões de pacotes ou ambientes.
  • Certifique-se de ter as permissões necessárias para executar comandos de alocação e leitura de membros no ambiente mainframe.

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)  
/*                                                                      

Testes Unitários em COBOL

Testes Unitários em COBOL

Walter BUGA Ramos
buga.bug.buga@gmail.com


Testes unitarios cobol - NeoPragmav.pptx
Testes unitarios cobol - NeoPragmav.pdf

Fontes disponiveis em 
https://github.com/buga-buga-buga/paradinhas_mainframe/tree/main/CUT
------------------------------------------------------------------------
INDICE  - Esse documento                                                
------------------------------------------------------------------------
CLG#001 - Compila. linka e executa modulo fonte Cobol                   
CLG#002 - Compila linka e executa modulo fonte Cobol  (evolucao)        
CLG#003 - Compila linka e executa modulo fonte Cobol  (evolucao 2)      
------------------------------------------------------------------------
ZUTZCPC - Código Fonte do Pre-compilador                                
------------------------------------------------------------------------
ZUTZCPD - Book de instruções do pre-compilador                          
------------------------------------------------------------------------
ZUTZCWS - Book de variaveis do pre-compilador                           
------------------------------------------------------------------------
SAMPLE  - Programa Cobol que sera objeto do teste                       
------------------------------------------------------------------------
SAMPLET - Instrucoes do que quer que seja testado                       
                       Não consegui rodar como particionado             
                            utilize de 'BUGAARQ.SIGLA.SAMPLET'           
------------------------------------------------------------------------
UTSTCFG - Configuration file                                            
------------------------------------------------------------------------


Entendendo o cenário de desenvolvimento de Software

Cobol Unit Test - CUT

  • Projeto colaborativo disponível no GitHub
  • Pré-Compilador escrito em Cobol que gera um programa Cobol específico com o caso de testes a ser executado

Pirâmide de Testes


            /        \
           /          \
          /            \
         /Exploratórios \
        /________________\
       / End to End       \
      /____________________\
     / Testes de Componente \  
    /________________________\
   /       Integração         \
  /____________________________\
 /           UNITÁRIO           \
/________________________________\
  • Exploratórios: Testes manuais para descobrir comportamentos inesperados.
  • End to End: Testes que validam o fluxo completo do sistema.
  • Testes de Componente: Validam partes isoladas do sistema.
  • Integração: Verificam a interação entre componentes.
  • Unitário: Testam unidades individuais de código.

Metodologia de desenvolvimento

A arquitetura mainframe é diferente da distribuída e da nuvem.
A linguagem procedural (Cobol/PL1/Rexx) é diferente da orientação a objetos.
Entretanto, vamos utilizar conceitos de outras arquiteturas e linguagens para melhorar a qualidade de nosso código e facilitar a codificação!


(Des)conceituando o teste unitário

Procura verificar se o código está correto, em sua menor parte.
A menor parte do fonte a ser testado é um método de uma classe.
Sendo assim, os testes unitários são aplicados a esses métodos, a partir da criação de classes de testes.


Então o que testar no COBOL?

Ainda não temos um conceito formado sobre isso, mas esperamos que seja algo parecido com o mock de outras linguagens.
Num dos exemplos do projeto da ferramenta, o teste versa sobre o conteúdo de variável esperada depois da execução de uma section.


Funcionamento da ferramenta

Por algum motivo que desconheço, não tem nada sobre como rodar a ferramenta no mainframe; no micro funciona de boa, só seguir o texto base que tem lá no Git.
A importação dos fontes e adaptações foram tranquilas e alguns ajustes foram necessários.
O que mais demorou e que apanhei um bocado foi pra gerar o JCL “redondinho”.


Etapas

Depois da ferramenta ter sido compilada e linkeditada, temos:

  • Rodar a ferramenta informando o programa e os casos de teste
  • Compilar/Linkeditar o “programa” gerado
  • Executar esse ‘programa’ com os casos de teste

Mãos à obra!

Particionado com os componentes necessários está disponível em:
WALBUGA.SIGLA.CUT.COBOL


Obrigado!

terça-feira, 15 de janeiro de 2019

Bolsonaro Rojão - Hotel seleção Itália

Bolsonaro soltando rojões na frente do repórter

Um dia ainda acho a entrevista completa com ele soltando os rojões na frente do repórter!

0:00 a federal jair bolsonaro do pp soltou 0:02 morteiros na calçada em frente ao 0:04 sheraton da barra ele diz que fez isso 0:06 em protesto contra o barulho provocado 0:08 por equipamentos instalados pela tutela 0:10 sobre humano 0:11 o condomínio onde o deputado mora fica 0:13 nos fundos do hotel ele disse que já 0:15 pediu providências mas até agora nada 0:17 foi feito a gente procurou a direção do 0:19 sheraton que reconheceu o problema

sexta-feira, 19 de outubro de 2018

Material - Certificação Lean IT Foundation

Certificações, Carreira e Lean IT

Atualização 2024 09 25 - Não rolou de sair pra vereador nem na de 2020 que foi pandemia e tals e nem nessa de 2024, quem sabe na de 2028, vou perguntar pro sunega como que foi esse rola.

Sobre as certificações, firme e forte, não faço mais provas faz um tempo, mas é sempre bom um papel que certifique seus conhecimentos.

Uns anos atrás, seilá uns 5 (estamos em 2018), não me ligava em certificação, sempre quis fazer, mas nunca fui atrás, seja porque onde eu trabalhava ninguém tinha e quando eu puxava o assunto recebia sempre críticas do tipo... a gente nunca precisou, pare com essa ideia de aprender coisas novas, gastar tempo e dinheiro à toa, enfim, eu tinha vontade de fazer certificação de PMP - Project Management Professional tinha dois amigos meus que tinham, o Allan e o Flavio, cheguei a conversar com eles, mas tinha que ler o tal do livro da Rita, fazer 352 mil exercícios e ficar um dia todo fazendo prova além do que era uma graninha considerável o processo todo, e acabei deixando pra lá.

Depois que vim para o "mercado" o pessoal começou a cobrar e como não tenho formação na área de computação abracei a ideia e fui mandando ver nas certificações básicas pra saber ao menos o essencial pra poder conversar com o pessoal que manja dos assuntos... pra eu parar com os achismos e ter um pouco mais de conhecimento, afinal conhecimento nunca é demais.

Nessa jornada das certificações, fiz algumas bem "diferentes" mas que me fizeram ter uma visão mais mercadológica ou mesmo acadêmica das disciplinas que eu tinha contato, mas estava aprendendo ou fazia as coisas na orelhada, sem muito embasamento teórico. O caso do Lean é um desses casos! Trabalhei com metodologias ágeis e desenvolvimento enxuto na IBM mas lá eles deram uma customizadinha das boas nos processos e embora eu já tivesse trabalhado com SCRUM anteriormente na Stefanini e parando pra pensar no próprio Banco do Brasil a gente se organizava e trabalhava bem alinhado com o manifesto ágil, mas voltando ao Lean, estou atualmente trabalhando com "Lean Digital Transformation" recebi uma enxurrada de material, consegui garimpar bastante, aprendi muito no dia a dia, mas pra variar falta o "reconhecimento", nem que seja pra eu mesmo pra saber que sei o que o pessoal está falando, consigo entendê-los e conversar na mesma língua!

Sempre curti estudar, o problema é priorizar isso com todos os eventos da vida atualmente, mas consegui parar um tempinho, estudar, fiz um treinamento on-line pela TIEXAMES, que abordou praticamente tudo que caiu na prova, a dinâmica do treinamento deixa um pouco a desejar, mas ajuda bastante quem estiver inseguro ou meio perdido com os textos.... Sem falar que só pode fazer o exame depois de ter cursado um treinamento de alguma entidade associada.

O site da Lean IT é o https://www.leanitassociation.com/

e os PDFs pra você estudar sozinho estão aqui:

Foi isso, boa sorte, a prova é super tranquila, se você tem bom senso e já trabalhou com Lean, dá pra passar sem sequer ler um texto! É básico! Café com leite pra quem, assim como eu, já está trabalhando com o assunto, entretanto, como disse, um papel pra mim significa bastante, não sei porque, talvez um dia junto com minha psicóloga consiga descobrir, mas por enquanto continuo sob a mesma condição!...

Colecionando certificados!

Aproveito aqui pra deixar a hashtag #Buga2020 pois pretendo sair de vereador aqui por campinas em 2020 e nada melhor que começar a campanha cedo!

Certificação de LITA Lean IT Foundation do Buga

Figura 1: Certificação de LITA Lean IT Foundation do Buga

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

segunda-feira, 10 de setembro de 2018

javafx scene builder download - esse funciona de verdade! Curso em Video Java

JavaFX Scene Builder: download e configuração

Atualização 2024 09 25

Apenas pela historia, nada deve funcionar mais hoje em dia ou perdeu a função.

Aqui o link que esta ativo em 11.09.2018 pra baixar o JAVAFX SCENE BUILDER pra usar no curso em video junto com o NetBeans ou com alguma outra, seilá, vai que voce esta precisando igual eu!

http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html

Estou a fazer um treinamento de Java pela internet em videos dum tal de "curso em video", como tenho noçoes super reduzidas de linguagens não mainframe ou mesmo orientadas a objeto, embarquei da aula 1 pra frente e vamos ver o que dá.

Um dos problemas que encontrei foi o raio do javafx scene builder, que quando o zé fez o video tinha pra baixar de boas no site da Oracle e hoje (2018) ninguém mais acha em lugar nenhum!

Depois de muito bater a cabeça cheguei ao site do link acima que deixa baixar de boa, era pra ter vindo junto com meu NetBeans (sim, instalei o NetBeans pra fazer o curso, tambem tem o IntelliJ e o Eclipse pra usar aqui na maquina, mas vamos seguir a receita de bolo pra ver se aprendo certinho seguindo os exemplos no passo a passo). E foi justamente isso que fez eu escrever essa postagem que é pra eu nao esquecer mais!...

Bom, pega lá o .fxml que não abrir no tal do Scene Builder e vamos a configuração, afinal já baixei o programa ali do link la em cima ou aqui de baixo do pcloud

esse daqui é o da Oracle mesmo

https://drive.google.com/file/d/1cadbrJ5sPcVDI9PGaxE0_smP5Pag5ZwL/view?usp=sharing

e instalei ele em :

"C:\Program Files (x86)\Oracle\JavaFX Scene Builder 2.0"

Vou lá no NetBeans na opcao de ferramentas e

Clica em Ferramentas seguido de Opções no NetBeans
Figura 1 - Clica em Ferramentas seguido de Opções

Lá nas opções, ah, como fiquei no desespero baixei um outro Scene Builder e instalei ele em

"C:\Users\bugolino\AppData\Local\SceneBuilder"

voltando... lá nas opções :

Java, JavaFX, procurar onde está o Scene Builder
Figura 2 - Java, JavaFX, Procurar onde esta o Scene Builder

Pronto, agora dando dois cliques no fxml vai abrir a interface do Scene Builder!...

Java FX Scene Builder - Splash Screen
Figura 3 - Java FX Scene Builder - Splash Screen

é isso, deixa eu colocar aqui uma imagem do MTM 2018 (Master The Mainframe) que achei bem legal e vai que perco depois no google photos e nao acho nunca mais, igual o logo da BugaSoft

Banner Master The Mainframe 2018
Figura 4 - Banner Master The Mainframe que achei da horinha