Re: Necesito una ayudita con los subprocedimientos :-)
martin.ava...@set.ypf.com El 15 de marzo de 2017, 6:13, ostatu ostatu escribió: > Hola. > > Estoy empezando a utilizar los subprocedimientos en vez de las "clasicas" > subrutinas y me acabo de encontrar con un problema que no soy capaz de > resolver. > > Cuando trabajo con subrutinas y deseo finalizar el programa puedo > codificar un *inLR = *on y un Return en cualquier parte y el programa > finaliza, pero si intendo hacer los mismo en un subprocedimiento no hay > manera de que el programa finalize inmediatamente :-( > > Este es el pgm de ejemplo. > > H DFTACTGRP(*NO) > > /free > > dsply 'inicio main' ; > sub1() ; > dsply 'final main' ; > > *inLR = *on ; > Return ; > > /end-free > > p sub1b > d pi > /free > dsply 'inicio sub1' ; >finalizar_pgm() ; > dsply 'final sub1' ; > /end-free > p e > * > p finalizar_pgm b > d pi > /free > dsply 'inicio finalizar_pgm' ; > *inLR = *on ; > Return ; > dsply 'final finalizar_pgm' ; > /end-free > p e > > He probado a llamar a una subrutina desde el subprocedimiento (Exsr) para > hacer el LR y el Return pero al compilador no le ha gustado con lo que > deduzco que no se pueden hacer Exsr dentro de los subprocedimientos ... > > ¿Alguna idea de como solucionar el problema? > > Saludos > Ostatu > > > > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) > Forum.Help400 © Publicaciones Help400, S.L. > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 © Publicaciones Help400, S.L.
RE: Necesito una ayudita con los subprocedimientos :-)
Le he echado un vistazo por encima y tiene buena pinta, básicamente ¡es lo que yo hago! Javier Mora De: forum.help400-boun...@listas.combios.es [mailto:forum.help400-boun...@listas.combios.es] En nombre de ostatu ostatu Enviado el: miércoles, 15 de marzo de 2017 13:14 Para: forum.help400 Asunto: Re: Necesito una ayudita con los subprocedimientos :-) Hola Javier. Gracias por la ayuda. Creo que ya lo tengo resuelto pero no se si es la forma mas sencilla de lanzar un msg. de escape o la mas "limpia" Adjunto la posible solución por si le sirve a algún otro forero :-) H DFTACTGRP(*NO) D wwTheKeyS 4A d ApiEscape DS d AE_Prov 10i 0 inz(0) d AE_Avail 10I 0 inz(0) D QMHSNDPMPR ExtPgm('QMHSNDPM') D MessageID7A Const D QualMsgF20A Const D MsgData 32767A const options(*varsize) D MsgDtaLen 10I 0 Const D MsgType 10A Const D CallStkEnt 10A Const D CallStkCnt 10I 0 Const D MessageKey 4A D ErrorCode32767A options(*varsize) /free monitor ; dsply 'inicio main' ; sub1() ; dsply 'final main' ; on-error *all ; dsply 'se aborta el pgm' ; endmon ; *inLR = *on ; Return ; /end-free p sub1b d pi /free dsply 'inicio sub1' ; sub2() ; dsply 'final sub1' ; /end-free p e * p sub2b d pi /free dsply 'inicio sub2' ; finalizar_pgm() ; dsply 'final sub2' ; /end-free p e * p finalizar_pgm b d pi /free dsply 'inicio finalizar_pgm' ; QMHSNDPM( 'CPF9897' : 'QCPFMSG *LIBL' : 'error' : 5 : '*ESCAPE' : '*' : 1 : wwTheKey : ApiEscape ) ; dsply 'final finalizar_pgm' ; /end-free p e 2017-03-15 11:46 GMT+01:00 Javier Mora mailto:jm...@musgrave.es>>: Yo también sufrí este problema hace tiempo. Primero un consejo: olvídate de técnicas que con OPM RPG funcionaban muy bien, muchas de ellas no tienen sentido en ILE. Este problema yo lo he resuelto lanzando “excepciones”. En el RPG clásico podíamos tener anidadas una infinidad de llamadas EXSR y en cualquier punto de este “camino” podíamos finalizar el programa con un Return (*InLR = *ON si queríamos cerrar ficheros también). La solución de Juan Carlos es posible pero “afea” muchísimo el programa. En mi caso, yo estudié varias alternativas y, al final, opté por la opción que explico aquí. La idea consiste en “lanzar” un mensaje de escape cuando se quiera cancelar un programa. Esta no es, ni mucho menos, una técnica novedosa y se utiliza en lenguajes como Java y C++ desde hace años. El IBM i lleva integrado en el sistema operativo un control de mensajes que permite “lanzarlos” y “atraparlos”. Cuando envías un mensaje de escape, éste recorre toda la pila de llamadas hasta que es manejado por programa o por el sistema. En mis programas, una salida de este tipo siempre se produce por un motivo excepcional del cual quiero informar. Para mantener estos mensajes bajo control deberás utilizar “Monitor” en RPG o MONMSG en CL. No sé si he sido capaz de explicar la técnica. En mi caso se ha desarrollado un programa de servicio con la funcionalidad necesaria para “lanzar” (throw), “atrpar” (catch) y consultar la excepción manejada. Estas utilidades utilizan las APIs del sistema para el manejo de funciones. Saludos, Javier Mora De: forum.help400-boun...@listas.combios.es<mailto:forum.help400-boun...@listas.combios.es> [mailto:forum.help400-boun...@listas.combios.es<mailto:forum.help400-boun...@listas.combios.es>] En nombre de ostatu ostatu Enviado el: miércoles, 15 de marzo de 2017 10:13 Para: forum.help400@listas.combios.es<mailto:forum.help400@listas.combios.es> Asunto: Necesito una ayudita con los subprocedimientos :-) Hola. Estoy empezando a utilizar los subprocedimientos en vez de las "clasicas" subrutinas y me acabo de encontrar con un problema que no soy capaz de resolver. Cuando trabajo con subrutinas y deseo finalizar el programa puedo codificar un *inLR = *on y un Return en cualquier parte y el programa finaliza, pero si intendo hacer los mismo en un subprocedimiento no hay manera de que el programa finalize inmediatamente :-( Este es el pgm de ejemplo. H DFTACTGRP(*NO) /free dsply 'inicio main' ; sub1() ; dsply 'final main' ; *inLR = *on ; Return ; /end-free p sub1b d pi
Re: Necesito una ayudita con los subprocedimientos :-)
Hola Javier. Gracias por la ayuda. Creo que ya lo tengo resuelto pero no se si es la forma mas sencilla de lanzar un msg. de escape o la mas "limpia" Adjunto la posible solución por si le sirve a algún otro forero :-) H DFTACTGRP(*NO) D wwTheKeyS 4A d ApiEscape DS d AE_Prov 10i 0 inz(0) d AE_Avail 10I 0 inz(0) D QMHSNDPMPR ExtPgm('QMHSNDPM') D MessageID7A Const D QualMsgF20A Const D MsgData 32767A const options(*varsize) D MsgDtaLen 10I 0 Const D MsgType 10A Const D CallStkEnt 10A Const D CallStkCnt 10I 0 Const D MessageKey 4A D ErrorCode32767A options(*varsize) /free monitor ; dsply 'inicio main' ; sub1() ; dsply 'final main' ; on-error *all ; dsply 'se aborta el pgm' ; endmon ; *inLR = *on ; Return ; /end-free p sub1b d pi /free dsply 'inicio sub1' ; sub2() ; dsply 'final sub1' ; /end-free p e * p sub2b d pi /free dsply 'inicio sub2' ; finalizar_pgm() ; dsply 'final sub2' ; /end-free p e * p finalizar_pgm b d pi /free dsply 'inicio finalizar_pgm' ; QMHSNDPM( 'CPF9897' : 'QCPFMSG *LIBL' : 'error' : 5 : '*ESCAPE' : '*' : 1 : wwTheKey : ApiEscape ) ; dsply 'final finalizar_pgm' ; /end-free p e 2017-03-15 11:46 GMT+01:00 Javier Mora : > Yo también sufrí este problema hace tiempo. > > > > Primero un consejo: olvídate de técnicas que con OPM RPG funcionaban muy > bien, muchas de ellas no tienen sentido en ILE. > > > > Este problema yo lo he resuelto lanzando “excepciones”. En el RPG clásico > podíamos tener anidadas una infinidad de llamadas EXSR y en cualquier punto > de este “camino” podíamos finalizar el programa con un Return (*InLR = *ON > si queríamos cerrar ficheros también). > > > > La solución de Juan Carlos es posible pero “afea” muchísimo el programa. > En mi caso, yo estudié varias alternativas y, al final, opté por la opción > que explico aquí. > > > > La idea consiste en “lanzar” un mensaje de escape cuando se quiera > cancelar un programa. Esta no es, ni mucho menos, una técnica novedosa y se > utiliza en lenguajes como Java y C++ desde hace años. El IBM i lleva > integrado en el sistema operativo un control de mensajes que permite > “lanzarlos” y “atraparlos”. > > > > Cuando envías un mensaje de escape, éste recorre toda la pila de llamadas > hasta que es manejado por programa o por el sistema. En mis programas, una > salida de este tipo siempre se produce por un motivo excepcional del cual > quiero informar. > > > > Para mantener estos mensajes bajo control deberás utilizar “Monitor” en > RPG o MONMSG en CL. > > > > No sé si he sido capaz de explicar la técnica. > > > > En mi caso se ha desarrollado un programa de servicio con la funcionalidad > necesaria para “lanzar” (throw), “atrpar” (catch) y consultar la excepción > manejada. Estas utilidades utilizan las APIs del sistema para el manejo de > funciones. > > > > Saludos, > > > > Javier Mora > > > > *De:* forum.help400-boun...@listas.combios.es [mailto: > forum.help400-boun...@listas.combios.es] *En nombre de *ostatu ostatu > *Enviado el:* miércoles, 15 de marzo de 2017 10:13 > *Para:* forum.help400@listas.combios.es > *Asunto:* Necesito una ayudita con los subprocedimientos :-) > > > > Hola. > > Estoy empezando a utilizar los subprocedimientos en vez de las "clasicas" > subrutinas y me acabo de encontrar con un problema que no soy capaz de > resolver. > > Cuando trabajo con subrutinas y deseo finalizar el programa puedo > codificar un *inLR = *on y un Return en cualquier parte y el programa > finaliza, pero si intendo hacer los mismo en un subprocedimiento no hay > manera de que el programa finalize inmediatamente :-( > > Este es el pgm de ejemplo. > > H DFTACTGRP(*NO) > > /free > > dsply 'inicio main' ; > sub1() ; > dsply 'final main' ; > > *inLR = *on ; > Return ; > > /end-free > > p sub1b > d pi > /free > dsply 'inicio sub1' ; >finalizar_pgm() ; > dsply 'final sub1' ; > /end-free > p e > * > p finalizar_pgm b > d pi > /free > dsply 'inicio finalizar_pgm' ; > *inLR = *on ; > Return ; > dsply 'final finalizar_pgm' ; > /end-free > p e > > He probado a llamar a una subrutina desde el subprocedimiento (Exsr) para > hacer el LR y el Return pero al compilador no le ha gustado con lo que > deduzco que no se pueden hacer Exsr dentro de los subprocedimientos ... > > ¿A
RE: Necesito una ayudita con los subprocedimientos :-)
Yo también sufrí este problema hace tiempo. Primero un consejo: olvídate de técnicas que con OPM RPG funcionaban muy bien, muchas de ellas no tienen sentido en ILE. Este problema yo lo he resuelto lanzando “excepciones”. En el RPG clásico podíamos tener anidadas una infinidad de llamadas EXSR y en cualquier punto de este “camino” podíamos finalizar el programa con un Return (*InLR = *ON si queríamos cerrar ficheros también). La solución de Juan Carlos es posible pero “afea” muchísimo el programa. En mi caso, yo estudié varias alternativas y, al final, opté por la opción que explico aquí. La idea consiste en “lanzar” un mensaje de escape cuando se quiera cancelar un programa. Esta no es, ni mucho menos, una técnica novedosa y se utiliza en lenguajes como Java y C++ desde hace años. El IBM i lleva integrado en el sistema operativo un control de mensajes que permite “lanzarlos” y “atraparlos”. Cuando envías un mensaje de escape, éste recorre toda la pila de llamadas hasta que es manejado por programa o por el sistema. En mis programas, una salida de este tipo siempre se produce por un motivo excepcional del cual quiero informar. Para mantener estos mensajes bajo control deberás utilizar “Monitor” en RPG o MONMSG en CL. No sé si he sido capaz de explicar la técnica. En mi caso se ha desarrollado un programa de servicio con la funcionalidad necesaria para “lanzar” (throw), “atrpar” (catch) y consultar la excepción manejada. Estas utilidades utilizan las APIs del sistema para el manejo de funciones. Saludos, Javier Mora De: forum.help400-boun...@listas.combios.es [mailto:forum.help400-boun...@listas.combios.es] En nombre de ostatu ostatu Enviado el: miércoles, 15 de marzo de 2017 10:13 Para: forum.help400@listas.combios.es Asunto: Necesito una ayudita con los subprocedimientos :-) Hola. Estoy empezando a utilizar los subprocedimientos en vez de las "clasicas" subrutinas y me acabo de encontrar con un problema que no soy capaz de resolver. Cuando trabajo con subrutinas y deseo finalizar el programa puedo codificar un *inLR = *on y un Return en cualquier parte y el programa finaliza, pero si intendo hacer los mismo en un subprocedimiento no hay manera de que el programa finalize inmediatamente :-( Este es el pgm de ejemplo. H DFTACTGRP(*NO) /free dsply 'inicio main' ; sub1() ; dsply 'final main' ; *inLR = *on ; Return ; /end-free p sub1b d pi /free dsply 'inicio sub1' ; finalizar_pgm() ; dsply 'final sub1' ; /end-free p e * p finalizar_pgm b d pi /free dsply 'inicio finalizar_pgm' ; *inLR = *on ; Return ; dsply 'final finalizar_pgm' ; /end-free p e He probado a llamar a una subrutina desde el subprocedimiento (Exsr) para hacer el LR y el Return pero al compilador no le ha gustado con lo que deduzco que no se pueden hacer Exsr dentro de los subprocedimientos ... ¿Alguna idea de como solucionar el problema? Saludos Ostatu Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 © Publicaciones Help400, S.L.
Re: Necesito una ayudita con los subprocedimientos :-)
Ya lo habia pensado pero el problema es que si desde un subprocedimiento llamo a otro subprocedimiento tengo que ir controlando el valor de retorno de cada unos de los subprocedimientos hasta terminar en el main y entonces hacer el LR + el return. Buscaba "algo mas directo" ... Igualmente gracias por la sugerencia :-) 2017-03-15 11:04 GMT+01:00 Juan Carlos Paredes Castañón < juancar...@paredes.info>: > Puedes hacer que el subprocedimiento devuelva un valor indicando si tiene > que salir o no. Y al retornar, en función de ese valor, haces la salida. > > Saludos > > Juan Carlos. > > > > El 15/03/2017 10:13, ostatu ostatu escribió: > > Hola. > > Estoy empezando a utilizar los subprocedimientos en vez de las "clasicas" > subrutinas y me acabo de encontrar con un problema que no soy capaz de > resolver. > > Cuando trabajo con subrutinas y deseo finalizar el programa puedo > codificar un *inLR = *on y un Return en cualquier parte y el programa > finaliza, pero si intendo hacer los mismo en un subprocedimiento no hay > manera de que el programa finalize inmediatamente :-( > > Este es el pgm de ejemplo. > > H DFTACTGRP(*NO) > > /free > > dsply 'inicio main' ; > sub1() ; > dsply 'final main' ; > > *inLR = *on ; > Return ; > > /end-free > > p sub1b > d pi > /free > dsply 'inicio sub1' ; >finalizar_pgm() ; > dsply 'final sub1' ; > /end-free > p e > * > p finalizar_pgm b > d pi > /free > dsply 'inicio finalizar_pgm' ; > *inLR = *on ; > Return ; > dsply 'final finalizar_pgm' ; > /end-free > p e > > He probado a llamar a una subrutina desde el subprocedimiento (Exsr) para > hacer el LR y el Return pero al compilador no le ha gustado con lo que > deduzco que no se pueden hacer Exsr dentro de los subprocedimientos ... > > ¿Alguna idea de como solucionar el problema? > > Saludos > Ostatu > > > > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) > Forum.Help400 © Publicaciones Help400, S.L. > > -- > url: http://www.paredes.info > mail: juancar...@paredes.info > > > > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) > Forum.Help400 © Publicaciones Help400, S.L. > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 © Publicaciones Help400, S.L.
Re: Necesito una ayudita con los subprocedimientos :-)
Puedes hacer que el subprocedimiento devuelva un valor indicando si tiene que salir o no. Y al retornar, en función de ese valor, haces la salida. Saludos Juan Carlos. El 15/03/2017 10:13, ostatu ostatu escribió: > Hola. > > Estoy empezando a utilizar los subprocedimientos en vez de las "clasicas" subrutinas y me acabo de encontrar con un problema que no soy capaz de resolver. > > Cuando trabajo con subrutinas y deseo finalizar el programa puedo codificar un *inLR = *on y un Return en cualquier parte y el programa finaliza, pero si intendo hacer los mismo en un subprocedimiento no hay manera de que el programa finalize inmediatamente :-( > > Este es el pgm de ejemplo. > > H DFTACTGRP(*NO) > > /free > > dsply 'inicio main' ; > sub1() ; > dsply 'final main' ; > > *inLR = *on ; > Return ; > > /end-free > > p sub1 b > d pi > /free > dsply 'inicio sub1' ; > finalizar_pgm() ; > dsply 'final sub1' ; > /end-free > p e > * > p finalizar_pgm b > d pi > /free > dsply 'inicio finalizar_pgm' ; > *inLR = *on ; > Return ; > dsply 'final finalizar_pgm' ; > /end-free > p e > > He probado a llamar a una subrutina desde el subprocedimiento (Exsr) para hacer el LR y el Return pero al compilador no le ha gustado con lo que deduzco que no se pueden hacer Exsr dentro de los subprocedimientos ... > > ¿Alguna idea de como solucionar el problema? > > Saludos Ostatu > > > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd [1] ) > Forum.Help400 (c) Publicaciones Help400, S.L. -- url: http://www.paredes.info mail: juancar...@paredes.info Links: -- [1] http://bit.ly/db68dd Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 © Publicaciones Help400, S.L.