Le he echado un vistazo por encima y tiene buena pinta, básicamente ¡es lo que 
yo hago!

Javier Mora

De: [email protected] 
[mailto:[email protected]] 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 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]<mailto:[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]>
 
[mailto:[email protected]<mailto:[email protected]>]
 En nombre de ostatu ostatu
Enviado el: miércoles, 15 de marzo de 2017 10:13
Para: [email protected]<mailto:[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