Hay que llevar mucho cuidado con manipular el contenido de una variable pasada 
por referencia y, además, no se ha pasado del tamaño esperado. Como anécdota, 
en una ocasión tuve un problema con un programa que, por error, pasaba una 
variable más pequeña de lo esperado. Pero el programa cambiaba el contenido del 
tamaño esperado. Misteriosamente, habían otros parámetros y variables que 
cambiaban su valor y no se modificaban en todo el programa. ¿Qué ocurría? Que 
al modificar el contenido del parámetro mal pasado, estábamos machacando en el 
contenido del resto de variables.
 
Un saludo.
 
Javier Mora

________________________________

De: [email protected] 
[mailto:[email protected]] En nombre de Marti Riera
Enviado el: lunes, 25 de mayo de 2009 10:35
Para: forum.help400
Asunto: Re: Mandato RTVENVVAR


Hola Javier,

Te has explicado perfectamente, y me has hecho recordar que alguna vez me 
habian pasado problemas similares y los habia arreglado rellenando a blancos la 
variable antes, en el caso de un comando no lo puedo hacer, por tanto MUCHAS 
GRACIAS por tu informacion, siempre hay algo que aprender cada dia.

Un Saludo

Martí Riera



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


        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
        


__________________________________________________
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