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.
Nenhum comentário:
Postar um comentário