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

Mensagens populares deste blogue

CC

ED

Z#SQLCOD