DDALOC
/* 2011/2012 MCSERRA */
/* MODULO DE OUTRA FUNCAO. */
/* POR FAVOR NAO ALTERAR */
/* */
/*REXX catnate
OS390/MVS TSO
Aloca uma livraria/PDS a um DDNAME
Alternativa: ALTLIB ACTIVATE APPLICATION(EXEC) DSN(library/pds)
*/
/* Parametros */
parse arg ddname_para_alocar dsn_para_alocar
/* Inicializa */
array_index = 0
array_index_max = 0
/* o que sera allocado */
dsn_final = ""
/* a primeira lib/pds actualmente alocada ao ddname */
dsn_inicial = ""
Ver_cmd_alocacao_final = "NAO" /* Mudar para SIM se desejado */
existe_ddname = "NAO"
primeira_vez = "SIM"
/* Processo */
call obter_input
call validar_input
call validar_ambiente
call do_listalc
call loop_leitura_listalc
call gerar_dsn_final
call tenta_alocar
exit
/* FIM do Processo-PROGRAMA */
obter_input:
if ddname_para_alocar = "" then do
say "Introduza o DDNAME ao qual quer concatenar o DATASET"
pull ddname_para_alocar
end
if dsn_para_alocar = "" then do
say "Introduza o DATASET (PDS) para alocar"
say "nome completo, com plicas"
pull dsn_para_alocar
end
return /* obter input */
validar_input:
if length(ddname_para_alocar) = 0 then signal ddname_erro
if length(ddname_para_alocar) > 8 then signal ddname_erro
if datatype(ddname_para_alocar) = "NUM" then signal ddname_erro
if length(dsn_para_alocar) = 0 then signal dsn_erro
if length(dsn_para_alocar) > 44 then signal dsn_erro
if datatype(dsn_para_alocar) = "NUM" then signal dsn_erro
if sysdsn(dsn_para_alocar) <> "OK" then do
say "Impossivel usar este dataset: " dsn_para_alocar
say sysdsn(dsn_para_alocar)
signal dsn_erro
end /* sysdsn bad*/
call listdsi dsn_para_alocar
if sysdsorg <> "PO" then do
say "O dataset a alocar" dsn_para_alocar " deve ser um PDS"
signal nao_pds
end
call Verifica_ddname_ISPF
return /* validate input*/
validar_ambiente:
if address() <> "TSO" then signal nao_no_tso
if sysvar(sysispf) = "ACTIVE" ,
& ispf_ddname = "SIM" then do
say "Cuidado, ISPF esta iniciado"
say "podera nao ser possivel alocar o dataset"
end /* aviso */
return /* validar ambiente */
do_listalc:
call outtrap "line.", "*"
"LISTALC STATUS"
call outtrap "OFF"
return /* do listalc */
loop_leitura_listalc:
do i = 1 to line.0
temp_ddname = substr(line.i,3,8)
/* se LISTALC mudar, isto tb deve mudar */
if temp_ddname = ddname_para_alocar then do
existe_ddname = "SIM"
call load_array
call trata_ddname
leave
end /* found */
end /* do loop */
return /* loop leitura listalc output */
trata_ddname:
do i = i + 1 to line.0
/* se LISTALC mudar, isto tb deve mudar */
if substr(line.i,1,2) == " ",
& substr(line.i,3,1) ¬== " " then leave i /* novo ddname */
call load_array
end i
return /* ddname existente */
load_array:
i_minus_1 = i - 1
/*if LISTALC changes, this may too*/
if substr(line.i_minus_1,1,2) ¬== " " then do /* só se dsn */
array_index = array_index + 1
array_index_max = array_index
array.array_index = substr(line.i_minus_1,1,44)
array.array_index = space(array.array_index,0) /* espacos */
call guarda_dsn_inicial array.array_index
end
return
gerar_dsn_final:
do i3 = 1 to array_index_max
dsn_final = dsn_final "'"array.i3"'"
end i3
return /* gerar_dsn_final */
guarda_dsn_inicial:
arg dsn_passed
if primeira_vez = "NAO" then NOP
else do
primeira_vez = "NAO"
dsn_inicial = "'"dsn_passed"'"
end /* else*/
return /* guarda_dsn_inicial */
tenta_alocar:
call valida_atributos
if existe_ddname <> "SIM" then signal ddname_nao_usado
if dsn_inicial = "" then signal nao_dsns
if pos(dsn_para_alocar,dsn_final) > 0 then signal dsn_ja_alocado
call msg "on"
if Ver_cmd_alocacao_final = "YES" then
say,
"allocate ddname("ddname_para_alocar") shr reuse",
"dsname("dsn_para_alocar ,
dsn_final ")"
"allocate ddname("ddname_para_alocar") shr reuse",
"dsname("dsn_para_alocar ,
dsn_final ")"
if rc > 0 then signal impossivel_alocar
if rc = 0 then say "Alocacao efectuada com sucesso: ",
ddname_para_alocar dsn_para_alocar
return /* tenta alocar */
valida_atributos:
call listdsi dsn_para_alocar
novo_sysrecfm = sysrecfm;novo_sysblksize = sysblksize
call listdsi dsn_inicial
if novo_sysrecfm <> sysrecfm then do
say "Possivel incompatibilidade com o formato do registo"
SAY "DSN inicial: " dsn_inicial " recfm: " sysrecfm " blksize: " sysblksiz
SAY "REXX DSN recfm: " novo_sysrecfm " blksize: " novo_sysblksize
end
if novo_sysblksize <> sysblksize then do
say "Possivel incompatibilidade com o tamanho do bloco"
SAY "DSN inicial: " dsn_inicial " recfm: " sysrecfm " blksize: " sysblksiz
SAY "REXX DSN recfm: " novo_sysrecfm " blksize: " novo_sysblksize
end
return /* valida atributos */
Verifica_ddname_ISPF:
if ddname_para_alocar = "ISPPLIB" then ispf_ddname = "SIM"
if ddname_para_alocar = "ISPSLIB" then ispf_ddname = "SIM"
if ddname_para_alocar = "ISPMLIB" then ispf_ddname = "SIM"
if ddname_para_alocar = "ISPLLIB" then ispf_ddname = "SIM"
if ddname_para_alocar = "ISPTLIB" then ispf_ddname = "SIM"
if ddname_para_alocar = "ISPTABL" then ispf_ddname = "SIM"
if ddname_para_alocar = "ISPLLIB" then ispf_ddname = "SIM"
return /*Verifica_ddname_ISPF*/
ddname_erro:
say "O ddname introduzido," ddname_para_alocar
say "nao e valido. ddname deve ter entre 1 a 8 caracteres,"
say "iniciado com uma letra e as restantes, letras ou numeros."
say "Nenhuma accao efectuada!"
exit
dsn_erro:
say "O dataset introduzido," dsn_para_alocar
say "nao é valido. ddname deve ter entre 1 a 44 caracteres,"
say "e devera existir."
say "Nenhuma accao efectuada!"
exit
nao_dsns:
say "nao existem datasets alocados ao"
say "ddname " ddname_para_alocar
say "Nenhuma accao efectuada!"
exit
ddname_nao_usado:
say "O ddname " ddname_para_alocar
say "nao esta a ser utilizado. Alocacao impossivel"
say "Nenhuma accao efectuada!"
exit
nao_pds:
say "O dataset introduzido," dsn_para_alocar
say "nao é uma livraria/PDS"
say "Nenhuma accao efectuada!"
exit
nao_no_tso:
say "Este programa REXX apenas funciona no TSO do OS390"
say "Nenhuma accao efectuada!"
exit
dsn_ja_alocado:
say "O dataset introduzido," dsn_para_alocar
say "ja se encontra concatenado."
say "Nenhuma accao efectuada!"
exit
free_failed:
say "O ddname introduzido," ddname_para_alocar
say "nao pode ser libertado e reutilizado"
say "deve estar aberto e em uso por outro programa"
say "ou nao esta em uso pela actual sessao de TSO."
say "nao é possivel efectuar a alocacao."
say "Nenhuma accao efectuada!"
exit
impossivel_alocar:
say "O dataset introduzido," dsn_para_alocar
say "nao foi alocado ao respectivo"
say "ddname," ddname_para_alocar
say "Razoes possiveis:"
say " - O ddname foi definido nom procedimento de logon ao TSO"
say " - ISPF foi iniciado e é impossivel libertar e realocar "
say " ficheiros que o ISPF esteja a utilizar desse ddname "
say " - Algum programa esta a usar o DDNAME ou DSN pretendidos"
say " e o ficheiro esta aberta"
say " "
say "Nenhuma accao efectuada!"
exit
/* 2011/2012 MCSERRA */
Comentários
Enviar um comentário