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.

Responder a