Porque esse código trava?

Porque esse código trava?

Mensagempor wendel-sm em 14 Jan 2010, 01:55

O seguinte código pega os dados de um membro de um dataset particionado e converte eles usando a função x2c e grava os dados convertidos em um outro membro de um dataset.

"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
"execio * disk d(stem lines. finis"
do i=0 to lines.0
texto.i = lines.i
texto.i = x2c(texto.i)
"execio * diskw d1(stem texto finis"
end
exit
"free fi(d)"
"free fi(d1)"
wendel-sm
Novo
Novo
 
Mensagens: 49
Data de registro: 08 Mar 2009, 12:13

Re: Porque esse código trava?

Mensagempor ehrocha em 14 Jan 2010, 08:35

Amigo,

O seu problema é nessa linha :

"execio * diskw d1(stem texto finis"

o FINIS você só utiliza quando quer finalizar, ou seja, quando gravar a ultima linha.
você vai ter que fazer um IF e só fazer o diskw com FINIS quando i = lines.0
Abraço
Eduardo Henrique Rocha
Avatar de usuário
ehrocha
Guru
Guru
 
Mensagens: 444
Data de registro: 06 Dez 2008, 17:48
Localização: Campinas, São Paulo

Re: Porque esse código trava?

Mensagempor 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
gaetaconsulting
Amador
Amador
 
Mensagens: 86
Data de registro: 24 Mar 2008, 17:38


Retornar para :: REXX ::

Quem está online

Usuários neste fórum: Nenhum usuário registrado on-line e 1 visitante