Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

Saturday, October 4, 2014

SETON LR Versus RETURN
















Bienvenidos a  Iseries Venezuela!        

En esta oportunidad tratamos la diferencia entre SETON LR y RETURN

He observado varios programas que para "finalizar" utilizan SETON LR otros utilizan RETURN y otros utilizan ambos colocando uno y luego otro. Una manera de asegurarse de que el programa en realidad terminó y no se quedó activo como pasa con Terminator II.

Coloco entrecomillado finalizar porque muchos podrán comprobar que si colocan una instrucción luego del seton lr el programa continúa.

El SETON LR tiene la función de cerrar los archivos abiertos, liberar los espacios de memoria y limpiar la pila de programas eliminado de ella, al programa actual activo de la misma y las variables de trabajo que se almacenan en ella. Un seton LR es interpretado de la siguiente manera por el sistema operativo: "Continúa ejecutando la hoja C hasta el final y luego abandona el programa".

En la siguiente secuencia de instrucciones:

                                        Var1 = 1
                                        Seton LR
                                        VAr1 = VAr1 + 1
                                         Write REC
                                         Return

El programa no se detiene en el SETON LR, porque todavía la hoja C, tiene instrucciones pendientes de ejecución por tanto, el programa suma 1 a la variable Var1 y luego graba en el archivo. Finalmente ejecuta el RETURN y en ese momento sí finaliza el programa.

El resultado final es el siguiente

  • Var1 queda con el valor 2 y
  •  En el archivo se graba un nuevo registro.
Si cambiamos el orden de las instrucciones como en este ejemplo:


                                        Var1 = 1
                                        RETURN
                                        VAr1 = VAr1 + 1
                                         Write REC
                                        Seton LR

El programa se detiene al ejecutar el RETURN y no ejecuta el resto de las instrucciones.
Es decir, no incrementa la variable Var1 y no graba un nuevo registro en el archivo.

El resultado final es el siguiente:

  • Var1 queda con valor 1
  • El programa se detiene inmediatamente.
Hasta ahora podemos concluir lo siguiente.

1.-Esta secuencia de instrucciones:
                                         RETURN
                                          SETON LR
NO tiene sentido porque  el seton LR nunca se va a ejecutar.

2.-El Return suspende inmediatamente la ejecución del programa; el seton LR no lo suspende necesariamente

3.-La mayoría de nosotros colocamos seton lr como ultima instrucción de la hoja C puesto que después de ejecutar el SETON LR, no colocamos mas instrucciones después, no queda otra opción para el sistema operativo que finalizar el programa. Por esta razón es que funciona la intención del programador de finalizar el programa. Si colocásemos otras instrucciones luego del SETON LR, muchos verían con asombro que el programa continúa.

Llamada entre programas.

Hice mención anteriormente que el SETON LR limpia la pila de ejecución. En cambio, el RETURN conserva el valor de las variables en memoria y la pila de programas.
¿Qué significa esto? vamos a verlo con un ejemplo.


Cuando un programa PGM1 llama a un programa PGM2 y éste último finaliza con un RETURN el caso es distinto a cuando el programa finaliza con SETON LR.

Para el RPG III clásico y tradicional, podemos ver el siguiente ejemplo.

       PROGRAMA 1                                                PROGRAMA 2
                                                                    
 *IN03     DOWEQ'0'                                               ADD 1 NROPER

                   EXFMTW1                                          WRITE REGISTRO
   *IN03     IFEQ '1'                                                  RETRN
                   LEAVE                                                 
                  ENDIF                                                   
                                                                           
                  CALL 'PGM2'     ========>              *INZSR BEGSR
                                                                                Z-ADD 3 NROPER
                   EXFMTW1                                           ENDSR
                 ENDDO                         

La primera vez que se llama al programa 2 sucede la siguiente:

    1.-Se ejecuta el *INZSR, colocando el campo NROPER = 3
    2.-Adiciona 1 a NROPER para alcanzar el valor 4
     3.-Graba un nuevo registro
    4.-Abandona el programa. 
 
La siguiente vez que se llama al programa 2 sucede lo siguiente:

      1.-No se ejecuta el*INZSR
      2.-Adiciona 1 a la variable NROPER para alcanzar el valor 5
      3.-Graba un nuevo registro
      4.-Abandona el programa
                   
El return conserva en memoria el valor de NROPER y como el programa 2 sigue activo en la pila de llamadas, el sistema operativo  considera que en la siguiente llamada no está entrando por primera vez al programa 2 por esta razón no se ejecuta el *inzsr.  Recordemos que el *INZSR se ejecuta solo al entrar por primera vez al programa.
Un SETON LR, limpiaría la pila de llamadas y cada vez que el programa 2 es llamado ejecutaría el *INZSR.


¿Que pasa cuando es ILE?

Si ustedes hacen esta misma prueba con dos programa en RPG-ILE, se darán cuenta de que el RETURN funciona como SETON LR, es decir no limpia la pila de programas. Este cambio se deba a que ILE tiene muchos otros recursos como el uso de módulos, Grupos de activación, el binding de módulos y directorios y el uso de variables globales que hacen posible mantener o no en memoria los valores que nos interesan, por tanto este "truco" que se utiliza en RPG III debe ser reprogramado con ILE. 
En general el objetivo de conservar la pila activa entre un programa y otro se debe por ejemplo a  procesos bancarios que requieren mantener en memoria el estado de una transacción, cobro de cheque, retiro, etc, hasta que haya culminado totalmente la secuencia de la transacción que está realizando el cliente. Si el diseño del sistema requiere la llamada de varios programas es fundamental conservar en memoria la situación de la cuenta del cliente o -a nuestros efectos-, el estado de la variables en memoria, hasta que la operación se haya completado.


 Si te pareció interesante, reenvíalo a un amigo haciendo click en el sobrecito que está al final del artículo. El conocimiento es valioso, compártelo. 

Autor: Ing. Liliana Suárez

No comments: