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 wwTheKey S 4A
d ApiEscape DS
d AE_Prov 10i 0 inz(0)
d AE_Avail 10I 0 inz(0)
D QMHSNDPM PR ExtPgm('QMHSNDPM')
D MessageID 7A Const
D QualMsgF 20A 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 ErrorCode 32767A 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 sub1 b
d pi
/free
dsply 'inicio sub1' ;
sub2() ;
dsply 'final sub1' ;
/end-free
p e
*
p sub2 b
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 <[email protected]>:
> 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:* [email protected] [mailto:
> [email protected]] *En nombre de *ostatu ostatu
> *Enviado el:* miércoles, 15 de marzo de 2017 10:13
> *Para:* [email protected]
> *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 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 )
> Forum.Help400 © Publicaciones Help400, S.L.
>
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.