por gaetaconsulting em 14 Jan 2010, 10:23
Opa
O seu travamento é em decorrência de você ter emitido um EXECIO com *, sem o STEM especificar o número de linhas. Esse utilitário, quando utilizado nessa condição entra em read term, análogo ao PULL do rexx.
Tem alguns problemas esse programa :
alloc fi(d) da('bra1106.bra1106.zos.part2(data1)') volume(xxxxxx) shr"
"alloc fi(d) da('bra1106.bra1106.zos.part2(data)') volume(xxxxxx) shr"
if rc=0 then do /* se você está tantando ler o member data1, seu RC testado nesse IF nao refletirá o que você pensou em fazer... */
"execio * disk d(stem lines. finis"
do i=0 to lines.0 /* pelo que entendi, esse seu loop deveria sim começar de 1, uma vez que você pretende usar o STEM lines. */
/* do contrário, você irá incluir o elemento 0, esse conterá o número de elementos do STEM lines. */
texto.i = lines.i
texto.i = x2c(texto.i) /* redundante, primeiro você colocar lines.i em texto.i, depois usa o mesmo elemento i para atributir um valor caracter*/
"execio * diskw d1(stem texto finis" /* d1 o que? você tem 2 allocs para o mesmo ddname */
end
exit
"free fi(d)"
"free fi(d1)" /* cade o D1? */
Seu programa está totalmente confuso, se você quer gravar 1 linha apenas, você pode substituir o * do comando EXECIO pelo número de linhas a ser salvo no arquivo. Claro que entendi o que você tinha intenção de fazer, mas tente colocar a coisa de forma mais clara, até para perguntarmos devemos ser coerentes.
Independente do número de linhas que você colocou no EXECIO, você está informando o STEM texto, como você nao colocou o ponto para informar um array, ele vai buscar por texton, onde "n" é o elemento ordinal dessa variável repetida.
É imporante salientar que no REXX, temos duas modalidades de STEM :
Por exemplo para a variável "LIXO" :
podemos ter LIXOn... LIXO1, LIXO2, LIXO3...
o detalhe nesse caso é que caso você queira indexar LIXOn com uma variável você teria de construir a seguinte expressao :
i=1
interpret "say LIXO"||i
seria equivalmente a exibir o conteúdo de LIXO1
ou ainda LIXO.n... LIXO.1, LIXO.2, LIXO3... (esse é mais interessante, pois a ocorrência ordinal também pode ser uma variável)
caso você queira indexar nesse exemplo, ficaria mais claro e objetivo :
i=1
say LIXO.i
Ambos exemplos são normalmente utilizados na linguagem... uma agride mais a forma de programação, outra menos. No fundo teremos o mesmo resultado.
Quanto ao FINIS, ele faz um CLOSE no arquivo com posterior FREE do DDNAME.
abcs
Daniel Gaeta
IBM System Programmer
MVS/VM