Serie ficheros virtuales

 

 

 

 

RPG Ficheros virtuales

 

 

 

- Utillería

 

 

- Introducción

 

- Mensajería auxiliar

 

- Visión general

 

 - Ejemplo detallado. El mandato DSPM – Mensaje en línea 24

 

- Código fuente

 

 

- Control de notificación de mensajes

 

- Funciones adicionales del programa de servicio SRAGG

 

 

 ________

 

 

- Introducción

 

 

En los epígrafes previos se han presentado los servicios de SRAGM, núcleo de de los ficheros virtuales aplicados al uso en RPG, con diversos ejemplos.

 

En estos ejemplos se ha hecho uso de cierta utillería auxiliar que se va a tratar aquí con más detalle. Así, se comentarán los mandatos de visualización de mensajes en la línea 24, las utilidades auxiliares del programa de servicio SRAGG y otros temas complementarios varios que irán apareciendo paulatinamente.

 

 

 ________



- Mensajería auxiliar

 

 

 

- Visión general

 

 

El sistema proporciona los mandatos siguientes para acceder a la línea de mensajes de estado y en el joblog del trabajo:

 

 

/* Mensaje específico de borrado de la línea de mensajes en pantalla */

 

   SNDPGMMSG  MSGID(CPI9801) MSGF(QCPFMSG) TOPGMQ(*EXT) MSGTYPE(*STATUS)

 

 

/* Mensaje en la línea de mensajes de la pantalla */

 

   SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&Datos_del_mensaje) TOPGMQ(*EXT) MSGTYPE(*STATUS)

 

 

 

/* Mensaje para anotar en el joblog del trabajo */

 

   SNDPGMMSG  MSG(&Datos_del_mensaje) TOPGMQ(*PRV) MSGTYPE(*COMP)

 

 

 

Con estas herramientas de base, la aplicación utiliza los siguientes mandatos auxiliares:

 

      DSPC – Limpia la línea 24

 

                    Es una herramienta complementaria de los mandatos que siguen

 

          

      DSPM – Presenta un mensaje en la línea 24 durante un lapso de tiempo medido en segundos

 

                     Permite informar de estados de proceso en pantalla o presentar avisos

 

 

      DSPD – Presenta un mensaje en la línea 24 durante un lapso de tiempo y además lo anota en el joblog del trabajo

 

                    Es muy útil en seguimientos en línea de procesos batch

 

 

      DSPZ – En este sistema funciona como un alias de DSPD, pero en versiones más desarrolladas, ejecuta DSPD y además anota el mensaje en un fichero de seguimiento.

             

                   Sirve para análisis post-mortem de procesos.

 

 

________

 

 

 

- Ejemplo detallado. El mandato DSPM – Mensaje en línea 24

 

 

El propósito de este mandato es presentar un mensaje en la línea 24 durante un lapso de tiempo medido en segundos. Permite informar de estados de proceso emitiendo mensajes de alivio de espera o presentar mensajes y advertencias al vuelo complementando a las rutinas de validación estándar.

 

 

El mandato se diseña entonces con tres parámetros:

 

 El texto de mensaje, de hasta 80 posiciones para darle cabida en el pie de pantalla.

 Un lapso de tiempo de retardo en pantalla opcional, para cuando se utiliza como presentador de mensajes y advertencias, y

 La opción de borrado tras su presentación, para evitar su permanencia indeseada en pantalla más allá del lapso de tiempo solicitado.

 

 

Esto se codifica a nivel del mandato como

 

  /******************************************************************************/

  /* DSPM * PRESENTA UN MENSAJE DURANTE UN LAPSO DE TIEMPO EN LA LÍNEA 24       */

  /******************************************************************************/

               CMD        PROMPT('Mensaje en línea 24')                          

 

 

  /* Texto del mensaje a presentar en la línea 24.                              */

  /*  El valor por defecto es *BLANK que se reconoce como línea en blanco       */

  /*  El texto puede ser el resultado de una expresión en línea                 */

 

               PARM       KWD(MSG) TYPE(*CHAR) LEN(80) DFT(*BLANK) +             

                           EXPR(*YES) PROMPT('Texto mensaje para la línea 24')                                           

                                                                                 

                                                                                 

  /* Lapso de retardo de presentación del mensaje, en segundos.                 */

  /*  El valor por defecto es 000000 que se reconoce como "sin DLY"             */ (Se define como alfanumérico porque DLYJOB lo procesa así)

 

               PARM       KWD(DLY) TYPE(*CHAR) LEN(6) DFT(000000) +                

                            RANGE(000000 999999) PROMPT('DLY 000000 a 999999 segundos')                                    

 

 

  /* Borrar después de la presentación el mensaje.                              */

  /*  El valor por defecto es *NO, que se reconoce como "Dejar sin borrar"      */ (Sólo admite los valores *NO | *YES)       

  /* (Precisamente, el mandato DSPC simplemente limpia la línea 24)             */

 

                PARM       KWD(CLR) TYPE(*CHAR) LEN(4) RSTD(*YES) +                   

                            DFT(*NO) VALUES(*NO *YES) SPCVAL((*NO)(*YES)) +

                            PROMPT('Limpiar despues')  

                 

 

 

Un mandato se ejecuta mediante un programa asociado, denominado programa de proceso del mandato, que se especifica al crear el mandato mediante la instrucción

 

CRTCMD CMD(DSPM) PGM(MDCLDSPM)

 

En este caso tan sencillo, sólo precisa del requerimiento mínimo de nombre de mandato y nombre del programa de proceso del mandato. Para mandatos más complejos, que traten listas de selección y otras posibilidades, las opciones de generación son más complejas.

 

El programa de proceso recibirá los parámetros definidos en el mandato y el sistema se encargará de pasar el valor capturado de cada uno, bien al llamar al mandato directamente o bien vía la pantalla de petición ampliada, a la que se accede pulsando F4. En nuestro caso, el programa de proceso es el que sigue:

 

 

  /******************************************************************************/

  /*      *                                                                     */

  /* DSPM * PRESENTA UN MENSAJE DURANTE UN LAPSO DE TIEMPO EN LA LÍNEA 24       */

  /*      *                                                                     */

  /*      *    COMPILAR CON LOG(*NO) PARA MINIMIZAR LAS ANOTACIONES DEL TRABAJO */

  /******************************************************************************/

  MDCLDSPM:   PGM        PARM(&XXMSG &XXDLY &XXCLR)                               

 

 

   /* VARIABLES */                                                                

 

              DCL        VAR(&XXMSG) TYPE(*CHAR) LEN(80) /* Mensaje */           

              DCL        VAR(&XXDLY) TYPE(*CHAR) LEN(6) /* Dly */                 

              DCL        VAR(&XXCLR) TYPE(*CHAR) LEN(4) /* Clear (*YES|*NO) */                                         

 

 

  /* Emite mensaje en la línea de mensajes de la pantalla */         

 

               IF COND(&XXMSG *EQ '*BLANK') THEN(DO)                     

                  DSPC /* Especial "línea en blanco" */                             

               ENDDO                                                             

 

               ELSE CMD(DO)                                                 

                  SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&XXMSG) TOPGMQ(*EXT) MSGTYPE(*STATUS)                        

               ENDDO                                                             

 

 

 /* Emite DLYJOB si se requiere */                                              

 

               IF COND((&XXDLY *GT '000000') *AND (&XXDLY *LT '999999')) THEN(DO)                                  

                  DLYJOB DLY(&XXDLY)                                             

               ENDDO                                                             

 

 

 /* En su caso, emite mensaje específico de borrado de la línea de mensajes   */

 

              IF COND(&XXCLR *EQ '*YES') THEN(DO)                   

                 SNDPGMMSG  MSGID(CPI9801) MSGF(QCPFMSG) TOPGMQ(*EXT) MSGTYPE(*STATUS)                                 

              ENDDO                                                         

 

 

 /* Fin de programa */                                                       

 ETFIN:                                                                     

              ENDPGM   

 

 

________

 

 

                                                    

- Código fuente

 

 

DSPC – Limpia la línea 24

 

Mandato  DSPC    : http://iSeries.ficherosvirtuales.com/QCMDSRC/QCMDSRC.DSPC

Programa MDLDSPC : http://iSeries.ficherosvirtuales.com/QCLSRC/QCLSRC.MDCLDSPC

 

 

 

DSPM – Presenta un mensaje en la línea 24 durante un lapso de tiempo medido en segundos

 

Mandato  DSPM    : http://iSeries.ficherosvirtuales.com/QCMDSRC/QCMDSRC.DSPM

Programa MDLDSPM : http://iSeries.ficherosvirtuales.com/QCLSRC/QCLSRC.MDCLDSPM

 

 

 

DSPD – Presenta un mensaje en la línea 24 durante un lapso de tiempo y además lo anota en el joblog del trabajo

 

Mandato  DSPD    : http://iSeries.ficherosvirtuales.com/QCMDSRC/QCMDSRC.DSPD

Programa MDLDSPD : http://iSeries.ficherosvirtuales.com/QCLSRC/QCLSRC.MDCLDSPD

 

 

 

________

 

 

- Control de notificación de mensajes

 

 

Es habitual cambiar el control de notificación de mensajes para evitar interrupciones por notificaciones simples. El control más fino se establece utilizando un programa de filtrado como sigue:

 

 

CHGMSGQ    MSGQ(*WRKSTN) DLVRY(*BREAK) PGM(AGCLMSGRPY)

CHGMSGQ    MSGQ(*USRPRF) DLVRY(*BREAK) PGM(AGCLMSGRPY)

 

 

 

El programa de filtrado normalmente deja pasar los mensajes de error como interrupciones de pantalla y presenta una copia del resto de notificaciones en la línea del sistema sin interrumpir el trabajo. Un ejemplo de este tipo de programa se muestra a continuación: 

 

 

 /********************************************************************/

 /* AGCLMSGRPY * CHGMSGQ *BREAK S/SEVERIDAD                          */

 /********************************************************************/      

 /* (Compilar con LOG(*NO) para minimizar anotaciones en el trabajo) */

 /********************************************************************/

 AGCLMSGRPY: PGM        PARM(&XXMSGQ &XXMSGL &XXMCLV)                 

 

 

 

  /* VARIABLES DE ENTRADA (ESPECÍFICAS DE UN MANEJADOR DE CHGMSGQ) */                                                      

 

              DCL        VAR(&XXMSGQ) TYPE(*CHAR) LEN(10) /* Cola de + 

                           Mensajes */                                  

              DCL        VAR(&XXMSGL) TYPE(*CHAR) LEN(10) /* Librería */

              DCL        VAR(&XXMCLV) TYPE(*CHAR) LEN(4) /* Clave +    

                           Mensaje */  

                    

 

 

  /* VARIABLES DE TRABAJO */                                                       

 

              DCL        VAR(&TTMSID) TYPE(*CHAR) LEN(7) /* Id.Msg */  

              DCL        VAR(&TTMSGT) TYPE(*CHAR) LEN(128) /* Txt.Msg +

                           completo */                                  

              DCL        VAR(&TTMSGP) TYPE(*CHAR) LEN(80) /* +         

                           Txt.parcial (DSPM) */                       

              DCL        VAR(&TTMSGX) TYPE(*CHAR) LEN(150) /* +        

                           Txt.ampliado */                             

              DCL        VAR(&TTMSDT) TYPE(*CHAR) LEN(128) /* Datos +  

                           mensaje */                                  

              DCL        VAR(&TTSEV) TYPE(*DEC) LEN(2 0) /* Nivel +    

                           severidad */                                

              DCL        VAR(&TTRTNT) TYPE(*CHAR) LEN(2) /* Tipo. +    

                           P.e.: 21=Copia de Respuesta */                             

 

                                                                        

/* RECEPCIÓN MENSAJE */    

                                          

              RCVMSG     MSGQ(&XXMSGL/&XXMSGQ) MSGKEY(&XXMCLV) +       

                         RMV(*NO) MSG(&TTMSGT) MSGDTA(&TTMSDT) +     

                         MSGID(&TTMSID) SEV(&TTSEV) RTNTYPE(&TTRTNT) 

 

 

 

/* IGNORA COPIAS (Ver el manual-CL-RCVMSG para el significado de los códigos) */          

                                        

              IF         COND(&TTRTNT *EQ '06') THEN(RETURN)

 

               IF         COND(&TTRTNT *EQ '21') THEN(RETURN)

               IF         COND(&TTRTNT *EQ '22') THEN(RETURN)

               IF         COND(&TTRTNT *EQ '23') THEN(RETURN)

               IF         COND(&TTRTNT *EQ '24') THEN(RETURN)

               IF         COND(&TTRTNT *EQ '25') THEN(RETURN)

 

 

 

/* SEV < 10. SON ANOTACIONES. PRESENTA SIN INTERRUMPIR */      

                        

               IF         COND((&TTSEV *LT 10) *OR (&TTMSID *EQ +         

                           CPF1241) *OR (&TTMSID *EQ CPI2401)) THEN(DO) 

 

 

            /* PRESENTA EN LÍNEA 24 SIN INTERRUMPIR */     

 

              CHGVAR     VAR(&TTMSGP) VALUE(&TTMSGT)                    

              DSPM       MSG(&TTMSGP)                                   

 

 

 

            /* ANOTA EN LOG DEL TRABAJO PARA CONSULTA DETALLADA -F10- */     

    

              CHGVAR     VAR(&TTMSGX) VALUE(&TTMSID *CAT '.- ' *CAT +   

                           &TTMSGT)                                      

              SNDPGMMSG  MSG(&TTMSGX) TOPGMQ(*PRV) MSGTYPE(*COMP)       

                   

 

              RETURN

                                       

              ENDDO                                                     

 

 

                                                                        

/* SEV > 10. INTERVENCIÓN NECESARIA */                                 

 

               DSPMSG     MSGQ(&XXMSGL/&XXMSGQ)                      

 

                             

 

 

/* FIN DE PROGRAMA */         

 ETFIN:                     

             ENDPGM            

 

 

 

 ________

 

 

 

 

Este código fuente se puede encontrar también en el enlace http://iSeries.ficherosvirtuales.com/QCLSRC/QCLSRC.AGCLMSGRPY

 

 

 

 

 ________

 

 

 

- Funciones adicionales del programa de servicio SRAGG

 

 

En una entrada previa de iSeries.ficherosvirtuales se han presentado las utilidades más espectaculares del programa de servicio SRAGG y se incluyó además un enlace a su código fuente completo.

 

Aunque las demás funciones de SRAGG tiene un carácter más humilde, no dejan de ser recursos útiles, en particular el moldeador de paso de cantidades numéricas SRAGG_DEC que es una extensión de %dec(h) con control de máximos, de manera que al usarlo bajo free o eval no se incurrirá en excepción de desbordamiento, devolviendo en caso de superarse los topes del campo de destino, un valor a 9’s con signo.

 

Así, fuéramos a presentar en pantalla un porcentaje mediante un campo de presentación de tamaño limitado D1IMP de 5.2 desde un campo de base de datos de mayor capacidad %, y nos limitamos a codificar una asignación directa como

 

D1IMPT = DSIMPT;

 

 

tendríamos garantizado un error en ejecución por desbordamiento, mientras que bajo SRAGG_Dec  podríamos dejar D1IMPT = 999.99  sin producirse ninguna interrupción en el programa de presentación simplemente codificando

 

 

D1IMPT = SRAGG_Dec(0:%len(D1IMPT):%decpos(D1IMPT):DSIMPT);

 

Ó

 

D1IMPT = SRAGG_Dec(0:5:2:DSIMPT);

 

 

ó también

 

 

D1IMPT = SRAGG_Dec(DSIMPT:5:2); // Formato a utilizar cuando DSIMPT se trate de un campo en coma flotante.

 

 

El código de SRAGG_Dec consiste en establecer el límite de salida según la solicitud de entrada llamando al preocedimiento auxiliar PrN999, comparar con la cantidad recibida y devolver 9’s o -9’s en desbordamientos y %dech en otro caso.

 

________