Hola Marti:
 
Este comportamiento es así porque OS/400 así lo quiere. Me explico. Si en un CL 
se define un parámetro de 30 o menos de 30, no es necesario pasar una variable 
de ese tamaño. Sin embargo si es mayor que 30 sí. ¿Por qué? No lo sé. Lo que si 
sé es que, tanto en CL como en RPG, los parámetros se pasan todos por 
referencia, es decir, se pasa la dirección de memoria de los datos. Si el 
programa espera 256 bytes en el parámetro y sólo utilizamos los 10 primeros, el 
CL no lo sabe y sigue tomando los 246 restantes sin preguntarse si esa porción 
de la memoria corresponde o no al parámetro pasado. En definitiva, en el 
programa se observa "basura" en el valor de la variable.
 
Este funcionamiento que tiene CL con los parámetros no sé si se reproduce para 
los programas RPG. Yo creo que sí, pero puedo estar equivocado.
 
Espero haberme explicado bien.
 
Javier Mora

________________________________

De: [email protected] 
[mailto:[email protected]] En nombre de Marti Riera
Enviado el: sábado, 23 de mayo de 2009 16:27
Para: forum.help400
Asunto: Re: Mandato RTVENVVAR


Hola Javier,

Pos zi, funciona con 30, pero lo que no entiendo porque no funciona con 256 que 
el el valor maximo que esta definido en el RGLE:
 envvar                      256A   

Si hacemos un dump cuando falla veremos que la variable &ENVAR que recibe, si 
es de long. 256, contiene cerros a partir de la posicion 33 (ver imagen) y 
supongo que eso es lo que me hace fallar el programa.

A mi ya me sirve tu solucion ya que yo solo voy un string y no una variable 
cpara pasarle el paramentro, pero entiendo que es mejor limitar al maximo la 
variable que se le envia.

Gracias y Saludos

Martí Riera



2009/5/21 Javier Mora <[email protected]>


        Hola de nuevo:
         
        Efectivamente, el problema está en tu CL. Fíjate que el parámetro lo 
defines de 256, lo que te obliga a pasar una variable de 256 bytes.
         
        He cambiado el programa y he dejado el parámetro en 30 bytes y 
¡funciona!. Cuando el parámetro es menor o igual de 30 bytes el sistema no te 
obliga a pasar los 30 bytes.
         
        No sé si me he explicado bien.
         
        Un saludo.
         
        Javier Mora

________________________________

        
        De: [email protected] 
[mailto:[email protected]] En nombre de Marti Riera
        
        Enviado el: jueves, 21 de mayo de 2009 17:50
        Para: forum.help400
        Asunto: Re: Mandato RTVENVVAR
        
        
        Alex, Javier,
        
        Gracias por la informacion.
        
        Javier: El codigo que me has enviado lo tenemos igual, bueno lo 
revisare con lupa.
        
        De momento ya he descubierto algo, el programa de test que habia 
enviado estaba simplificado, he probado ese programa y tambien me funciona. 
Ahora os envio el que no me funciona, es casi igual pero...
        
        PGM        PARM(&ENVVAR)                              
        DCL        VAR(&ENVVAR) TYPE(*CHAR) LEN(256)          
        DCL        VAR(&VALUE) TYPE(*CHAR) LEN(4096)          
        RTVENVVAR  ENVVAR(&ENVVAR) RTNVAL(&VALUE)             
        SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&VALUE)
        ENDPGM                                                
        
        Con lo cual ya intuyo cual es el problema el paso de parametros entre 
el CL de prueba y el comando, ya que si pongo el nombre de la variable 
"hardcode" si funciona.
        
        Bueno mañana le doy la vuelta definitiva y os digo.
        
        Saludos
        
        Martí Riera
        
        
        
        2009/5/21 Javier Mora <[email protected]>
        

                Hola Martí:
                 
                Yo al probar esta utilidad también me encontré con problemas 
parecidos, pero creo recordar que estaban relacionados con variables de entorno 
del trabajo o del sistema. Rebuscando encontré el problema y los fuentes que 
solucionaban ese bug.
                 
                Te los envío. He probado tu ejemplo y funciona. Dime si se 
siguen reproduciendo los problemas en tu caso.
                 
                Un saludo.
                 
                Javier Mora

________________________________

                De: [email protected] 
[mailto:[email protected]] En nombre de Marti Riera
                Enviado el: jueves, 21 de mayo de 2009 14:04
                Para: Forum.Help400
                Asunto: Mandato RTVENVVAR
                
                
                Hola,
                
                Llevo un dia un poco espeso intentando hacer funcionar este 
comando bajado de la web:
                http://code.midrange.com/759f4f422d.html
                
                Hay una explicacion mas larga en:
                
http://www.mcpressonline.com/programming/rpg/what-is-the-environment.html
                
                Lo que trato de hacer es recuperar facilmente una variable de 
entorno dentro de un programa CL.
                Ya os digo que el dia que dieron RPG ILE no fui, ja, ja !!
                
                Curiosamente he hecho un programa de test par aprobarlo y si lo 
ejecuto tal cual no funciona no devuelve nada:
                
                PGM                                          
                DCL        VAR(&VALUE) TYPE(*CHAR) LEN(4096)         
                RTVENVVAR  ENVVAR('LANG') RTNVAL(&VALUE)             
                SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&VALUE)
                ENDPGM                                                
                
                Pero si ejecuto un strisdb del programa rpg a partir de ese 
momento si devuelve el valor, por ejemplo de LANG que es por omision en todos 
los sistemas:
                /QSYS.LIB/EN_US.LOCALE.
                Podeis ver la variables de entorno con WRKENVVAR.
                
                Alguna pista de que estoy haciendo mal?
                
                Gracias y saludos
                
                Martí Riera
                

                __________________________________________________
                Forum.HELP400 es un servicio m&amp;#225;s de ServerNEWS.
                &amp;#169; Publicaciones Help400, S.L. - Todos los derechos 
reservados
                http://www.help400.es
                _____________________________________________________
                
                Para darte de baja visita la siguente URL:
                http://listas.combios.es/mailman/listinfo/forum.help400
                



        __________________________________________________
        Forum.HELP400 es un servicio m&amp;#225;s de ServerNEWS.
        &amp;#169; Publicaciones Help400, S.L. - Todos los derechos reservados
        http://www.help400.es
        _____________________________________________________
        
        Para darte de baja visita la siguente URL:
        http://listas.combios.es/mailman/listinfo/forum.help400
        


__________________________________________________
Forum.HELP400 es un servicio m&amp;#225;s de ServerNEWS.
&amp;#169; Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja visita la siguente URL:
http://listas.combios.es/mailman/listinfo/forum.help400

Responder a