Serie ficheros virtuales

 

 


RPG Ficheros virtuales

 

 

 

Funciones de caché básico. Núcleo del sistema

 

 

        Estructura de soporte

 

        Relación de prototipos

 

          SRAGM_CHAIN

 

        SRAGM_WRITE

 

        SRAGM_VER

 

 

                                                                                   ________

 

 

Estructura de soporte

 

 

A lo largo de este manual dedicado a los servicios de SRAGM, se irán ilustrando los procedimientos utilizando la estructura de datos DS8888c, que se compone de una subestructura de clave principal, una subestructura de clave alternativa y una subestructura de datos, que se detallan a continuación:

 

 

      **********************************************************************************************

      *  DS8888   *  Banco de pruebas de SRAGM

      **********************************************************************************************

 

      ***

      * *  Definición fichero virtual DS8888

      ***

     D DS8888c         DS                  QUALIFIED BASED(pDS8888c)            Soporte  DS8888

     D  DSK                                LIKEDS(DSCc)                         ClavesPF DS8888

     D  DSK01                              LIKEDS(DSC01c)                       ClavesLF DS8888

     D  DSD                                LIKEDS(DSDc)                         Datos    DS8888

 

      ***

      * *  Definición claves PF (Es la definición de una red [I,J], como en la emulación de una hoja de cálculo)

      ***

     D DSCc            DS                  QUALIFIED BASED(pDSCc)

     D  I                            10S 0                                      I

     D  J                            10S 0                                      J

 

      ***

      * *  Definición claves LF (Orden inverso)

      ***

     D DSC01c          DS                  QUALIFIED BASED(pDSC01c)

     D  JI                           10S 0                                      N*N - IJ + 1

 

      ***

      * *  Definición datos fichero virtual DS8888

      ***

     D DSDc            DS                  QUALIFIED BASED(pDSDc)

     D  IJ                           10S 0                                      N*(I-1) + J

     D  IMPT                         10S 0                                      [100000]+N*(I-1) + J

      * La constante [100000] se añadirá/retirará en los UPDATE de prueba

 

 

 

 

DS8888 es una definición tipo. Está basada en punteros nulos y para usarse debe instanciarse con una instrucción LIKEDS. Esto puede apreciarse en el juego entre el programa CC8888 y el programa de servicio SRAGMV.

 

 

                                                                                   ________

 

 

 

 

  Funciones de caché básico. Núcleo del sistema

 

 

 

       * Recupera un registro de un fichero virtual

 

     DSRAGM_CHAIN      PR            10I 0                                      PosiciónItem/0=Error

     D P_pFILE                         *   VALUE OPTIONS(*STRING)               Nombre Fichero   1*I

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               pCLAVE solicitada2*I

     D P_pDATO                         *   VALUE OPTIONS(*NOPASS)               pDATOS pedidos(O)3*I

     D P_LONG                        10I 0 VALUE OPTIONS(*NOPASS)               LongtdClvParcial 4*I

 

 

 

 

      * Graba un registro en un fichero virtual

 

     DSRAGM_WRITE      PR            10I 0                                      PosiciónItem/0=Error

     D P_pFILE                         *   VALUE OPTIONS(*STRING)               Nombre Fichero   1*I

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               ClaveRegAGrabar  2*I

     D P_pDATO                         *   VALUE OPTIONS(*STRING:*NOPASS)       DatosRegAGrabar  3*I

 

 

 

 

      * Determina la existencia de un ítem en memoria, y si no lo establece

 

     DSRAGM_VER        PR            10I 0                                      PosItem/0=NO existía

     D P_pFILE                         *   VALUE OPTIONS(*STRING)               Nombre Fichero    *I

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               Clv.del Item      *I

 

 

 

 

                                                                                   ________

 

 

 

  SRAGM_CHAIN. Prototipo

 

 

 

       * Recupera un registro de un fichero virtual

 

     DSRAGM_CHAIN      PR            10I 0                                      PosiciónItem/0=Error

     D P_pFILE                         *   VALUE OPTIONS(*STRING)               Nombre Fichero   1*I

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               pCLAVE solicitada2*I

     D P_pDATO                         *   VALUE OPTIONS(*NOPASS)               pDATOS pedidos(O)3*I

     D P_LONG                        10I 0 VALUE OPTIONS(*NOPASS)               LongtdClvParcial 4*I

 

 

 

 

 

 

Ejemplo

 

 

         clear DS8888;

 

         DS8888.DSK.I = 1;

         DS8888.DSK.J = 2;

 

         T_Resu = SRAGM_CHAIN('DS8888':%addr(DS8888));

 

 

En este ejemplo se accede al registro (1,2) del fichero virtual 'DS8888'. TTResu recoge la posición relativa del registro solicitado en el  fichero. Si TTResu = 0 es que no se ha encontrado ese registro en el fichero, en ese caso DS8888 no cambia. Si TTResu > 0, es que el registro se ha encontrado y DS8888 se devuelve completamente rellena.

 

Este ejemplo pertenece al código del programa CC8851, programa detalle del ejemplo de mantenimiento de DS8888 registro a registro.

 

 

 

 

El formato extendido está diseñado para usarlo en vías lógicas como en el siguiente ejemplo

 

 

         // Construye campos para rellenar la vía de acceso lógica

 

         T_I  = 1;

         T_J  = 2;

         T_N  = 15;                            // Dimensión límite I,J: 1 ... N

 

         T_IJ = T_N * (T_I - 1) + T_J;         // Clave condensada IJ. En el ejemplo IJ = 2

 

 

 

         // Rellena la vía de acceso lógica y accede por ella

 

         clear DS8888;

 

         DS8888.DSK01.JI = T_N*T_N - T_IJ + 1; // Clave inversa condensada. En el ejemplo JI = 224

 

 

 

         T_Resu = SRAGM_CHAIN('DS888801':%addr(DS8888.DSK01):%addr(DS8888));

 

 

 

Aquí se accede por la vía de acceso lógica, utilizando la clave inversa alternativa condensada. Como la clave y los datos no se solapan desde el comienzo, es necesario utilizar el formato extendido del CHAIN.

 

Si TTResu > 0 el acceso es satisfactorio y DS8888 viene rellena completamente, tanto en la parte de claves primarias y secundarias como en la de datos.

 

 

Este ejemplo pertenece al código del programa de servicio SRAGMV, núcleo del banco de pruebas del sistema.

 

 

 

 

 

El formato extendido largo está diseñado para recuperar el primer ítem de un cierto grupo. Es equivalente a utilizar SRAGM_SETLL + READ, pero resumidas en una sola instrucción.

 

 

 

Funciones relacionadas

 

   SRAGM_DELETE  Suprime un registro de un fichero virtual  

 

   SRAGM_INF     Recupera estadísticos de un fichero virtual. 

 

   SRAGM_UPDATE  Actualiza un registro de un fichero virtual.

 

   SRAGM_VER     Verifica y establece la existencia de un ítem en memoria.

 

   SRAGM_WRITE   Graba un registro en un fichero virtual.

 

 

Además del grupo SETLL y READ para accesos secuenciales.  

 

 

                                                                                   ________

 

 

 

  SRAGM_WRITE. Prototipo

 

 

 

      * Graba un registro en un fichero virtual

 

     DSRAGM_WRITE      PR            10I 0                                      PosiciónItem/0=Error

     D P_pFILE                         *   VALUE OPTIONS(*STRING)               Nombre Fichero   1*I

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               ClaveRegAGrabar  2*I

     D P_pDATO                         *   VALUE OPTIONS(*STRING:*NOPASS)       DatosRegAGrabar  3*I

 

 

 

 

 

Ejemplo

 

 

               // Construye el registro a guardar

 

               clear DS8888;

 

               DS8888.DSK.I = 1;

               DS8888.DSK.J = 2;

 

               DS8888.DSK01.JI = 224; // Supuesto N = 15,  IJ = (I-1)*N + J = 2,  JI = N**2 – IJ + 1 = 224 

 

               DS8888.DSD.IJ   = 2;

               DS8888.DSD.IMPT = 2;

 

 

               // Graba el registro construido

 

               T_Resu = SRAGM_WRITE('DS8888':%addr(DS8888));

 

 

 

En este ejemplo se graba el registro (1,2) del fichero virtual 'DS8888'. TTResu recoge la posición relativa del registro grabado en el fichero.

 

Si TTResu = 0 es que no se ha podido grabar el registro, normalmente porque ya existía. Otras causas pueden ser la omisión de la creación del fichero con la instrucción SRAGM_NEW o el desbordamiento del tamaño máximo asignado.

 

Si TTResu > 0, es que el registro se ha grabado satisfactoriamente tanto en la vía principal como en las secundarias asociadas.

 

Este ejemplo pertenece al código del programa CC8851, programa detalle del ejemplo de mantenimiento de DS8888 registro a registro.

 

 

 

 

Alternativamente podríamos haber grabado en la vía lógica utilizando el formato extendido como sigue

 

 

               // Construye el registro a guardar

 

               clear DS8888;

 

               DS8888.DSK.I = 1;

               DS8888.DSK.J = 2;

 

               DS8888.DSK01.JI = 224; // Supuesto N = 15,  IJ = (I-1)*N + J = 2,  JI = N**2 – IJ + 1 = 224 

 

               DS8888.DSD.IJ = 2;

               DS8888.DSD.IMPT = 2;

 

 

               // Graba el registro construido utilizando la vía lógica

 

               T_Resu = SRAGM_WRITE('DS888801':%addr(DS8888.DSK01):%addr(DS8888));

 

 

 

En este ejemplo se graba el registro (224) del fichero virtual lógico 'DS888801'. TTResu recoge la posición relativa del registro grabado en el fichero lógico.

 

Si TTResu = 0 es que no se ha podido grabar el registro, normalmente porque ya existía. Otras causas pueden ser la omisión de la creación del fichero lógico 'DS888801' con la instrucción SRAGM_CRTLF o el desbordamiento del tamaño máximo asignado al crear el fichero primario 'DS8888'.

 

Si TTResu > 0, es que el registro se ha grabado satisfactoriamente tanto en la vía principal como en las secundarias asociadas.

 

 

 

Este ejemplo pertenece al código del programa de servicio SRAGMV, núcleo del banco de pruebas del sistema.

 

 

 

 

Funciones relacionadas

 

   SRAGM_CHAIN   Accede a un registro por clave.

 

   SRAGM_DELETE  Suprime un registro de un fichero virtual  

 

   SRAGM_INF     Recupera estadísticos de un fichero virtual. 

 

   SRAGM_UPDATE  Actualiza un registro de un fichero virtual.

 

   SRAGM_VER     Verifica y establece la existencia de un ítem en memoria.

 

 

Además del grupo SETLL y READ para accesos secuenciales.  

 

 

                                                                                   ________

 

 

 

  SRAGM_VER. Prototipo

 

 

 

      * Determina la existencia de un ítem en memoria, y si no lo establece

 

     DSRAGM_VER        PR            10I 0                                      PosItem/0=NO existía

     D P_pFILE                         *   VALUE OPTIONS(*STRING)               Nombre Fichero    *I

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               Clv.del Item      *I

 

 

 

 

Ejemplo

 

 

   TTNID = SRAGM_NEW('DSI':%size(T_I));

 

 

   for T_K = 1 to T_N;

 

      ...    

 

      for T_I = 1 to T_N;

 

        ...    

 

         for T_J = 1 to T_N;

 

            ...    

 

            T_Resu = SRAGM_VER('DSI':%addr(T_I));

 

            if T_Resu > *ZEROS;

              

               T_Cont = PrProceso_I(T_I);

           

            endif;

   

            ...

        

          endfor;

 

      endfor;

 

   endfor;

 

 

 

SRAGM_VER esta diseñado para garantizar tratamientos únicos por ítem cuando el diseño nos obliga a actuar en una situación de orden distinto al natural del ítem a tratar.

 

En este ejemplo artificial, SRAGM_VER nos garantiza que PrProceso_I sólo se ejecute una vez por cada I distinto, aunque la instrucción se emita en un ambiente de orden en K-I-J. En ejemplos prácticos nos encontraremos en situaciones de bucle X impredecible en I.

 

Vemos también en el ejemplo que la instrucción SRAGM_NEW se emite en su formato condensado, porque se crea un fichero virtual auxiliar en que la parte de datos coincide exactamente con la de clave, concretamente con una variable contador T_I.

 

Internamente SRAGM_VER emite un CHAIN devolviendo su índice resultado si hay preexistencia y si no la hay emite un WRITE a continuación.

 

 

Funciones relacionadas

 

   SRAGM_CHAIN   Accede a un registro por clave.

 

   SRAGM_INF     Recupera estadísticos de un fichero virtual. 

 

   SRAGM_WRITE   Graba un registro en un fichero virtual.

 

                                                                                   ________