Serie ficheros virtuales

 

 


RPG Ficheros virtuales

 

 

 

Funciones derivadas directas

 

 

        Estructura de soporte

 

        Relación de prototipos

 

          SRAGM_DELETE

 

        SRAGM_UPDATE

 

        SRAGM_REORGANIZ

 

 

                                                                                   ________

 

 

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 derivadas directas

 

 

 

 

      * Elimina un registro en un fichero virtual

 

     DSRAGM_DELETE     PR            10I 0                                      PosicItemBAJ/0=Error

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

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               ClaveRegAEliminar2*I

     D P_Long                        10I 0 VALUE OPTIONS(*NOPASS)               LongitudParcialK 3*I

 

 

 

 

      * Actualiza un registro en un fichero virtual

 

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

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

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               ClaveRegAActualiz2*I

     D P_pDATO                         *   VALUE OPTIONS(*STRING:*NOPASS)       DatosRegAActualiz3*I

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

 

 

 

 

      * Reorganiza un fichero virtual depurando bajas y reordenándolo s/claves

 

     DSRAGM_REORGANIZ  PR            10I 0                                      0/1 ErrorProceso

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

     D P_NBorr                       10I 0       OPTIONS(*NOPASS)               NºReg.Borrados   2*O

 

 

 

 

                                                                                   ________

 

 

 

  SRAGM_DELETE. Prototipo

 

 

 

      * Elimina un registro en un fichero virtual

 

     DSRAGM_DELETE     PR            10I 0                                      PosicItemBAJ/0=Error

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

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               ClaveRegAEliminar2*I

     D P_Long                        10I 0 VALUE OPTIONS(*NOPASS)               LongitudParcialK 3*I

 

 

 

 

 

 

Ejemplo

 

 

         clear DS8888;

 

         DS8888.DSK.I = 1;

         DS8888.DSK.J = 2;

 

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

 

 

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

 

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

 

 

Internamente, el registro aún se encuentra en el fichero, pero marcado como borrado y directamente no está accesible en un acceso por clave. Sin embargo SRAGM_INF devolvería como número total de ítems los que había antes de la supresión aunque indicaría también el número de registros borrados. Los registros borrados aún son accesibles en un acceso secuencial por número relativo de registro, pero hay que tener en cuenta que si bien su parte de datos está intacta, la parte de clave se ha quemado con el valor *HIVAL en la primera posición.

 

Para reorganizar los datos y depurar los registros borrados se puede usar SRAGM_REORGANIZ, a fin de mejorar el rendimiento de un fichero de gran tamaño y con un elevado porcentaje de elementos suprimidos. Esta situación no suele darse en la práctica. Además el sistema incorpora un vaciado automático de datos si se llega al caso de que todos los registros de un fichero resulten eliminados.

 

 

El formato extendido está diseñado para usarlo en bucles de borrado por clave parcial.

 

 

Funciones relacionadas

 

   SRAGM_CHAIN      Accede a un registro de un fichero virtual por clave.

 

   SRAGM_INF        Recupera estadísticos de un fichero virtual. 

 

   SRAGM_REORGANIZ  Reorganiza un fichero virtual depurándole de registros suprimidos

 

   SRAGM_UPDATE     Actualiza un registro de un fichero virtual.

 

   SRAGM_WRITE      Graba un registro en un fichero virtual.

 

 

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

 

 

                                                                                   ________

 

 

 

  SRAGM_UPDATE. Prototipo

 

 

 

      * Actualiza un registro en un fichero virtual

 

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

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

     D P_pCLAV                         *   VALUE OPTIONS(*STRING)               ClaveRegAActualiz2*I

     D P_pDATO                         *   VALUE OPTIONS(*STRING:*NOPASS)       DatosRegAActualiz3*I

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

 

 

 

 

 

Ejemplo

 

 

               // Construye la clave del registro a actualizar

 

               clear DS8888;

 

               DS8888.DSK.I = 1;

               DS8888.DSK.J = 2;

 

 

               // Accede al contenido anterior

 

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

 

 

 

               // Actualiza el importe deseado

 

 

               DS8888.DSD.IMPT = 100002;

 

 

 

               // Actualiza el registro 

 

               TTResu = SRAGM_UPDATE('DS8888':%addr(DS8888));

 

 

 

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

 

Si TTResu = 0 es que no se ha podido actualizar el registro, normalmente porque no existía previamente.

 

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

 

Este ejemplo sigue una técnica de acceso previo al registro para tomar los datos previos y cambiar explícitamente sólo el campo que nos interesa. En el programa CC8851, detalle del ejemplo de mantenimiento de DS8888 registro a registro, se ofrece la técnica alternativa de actualizar sin CHAIN previo utilizando el formato ordinario. Un ejemplo del tipo de actualización directa, pero utilizando el formato extendido, se presenta a continuación.

 

 

 

 

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

 

 

               // Construye el registro a actualizar

 

               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 = 100002;

 

 

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

 

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

 

 

 

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

 

Si TTResu = 0 es que no se ha podido actualizar el registro, normalmente porque no existía previamente o por la omisión del paso de la creación del fichero lógico 'DS888801' con la instrucción SRAGM_CRTLF sobre el fichero primario 'DS8888'.

 

Si TTResu > 0, es que el registro se ha actualiazado 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.

 

 

 

El formato ampliado con clave parcial está pensado para la actualización del primer registro de un grupo en bucles algorítmicos especiales.

 

 

 

 

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_WRITE   Graba un registro en un fichero virtual.

 

 

 

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

 

 

 

                                                                                   ________

 

 

 

  SRAGM_REORGANIZ. Prototipo

 

 

 

      * Reorganiza un fichero virtual depurando bajas y reordenándolo s/claves

 

     DSRAGM_REORGANIZ  PR            10I 0                                      0/1 ErrorProceso

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

     D P_NBorr                       10I 0       OPTIONS(*NOPASS)               NºReg.Borrados   2*O

 

 

 

 

Ejemplo

 

 

   TTErro = SRAGM_REORGANIZ('DS8888');

 

 

 

Con esta instrucción se reorganizan los datos de 'DS8888' depurando los registros borrados, a fin de mejorar el rendimiento particularmente si se trata de un fichero de gran tamaño y con un elevado porcentaje de elementos suprimidos. Con el formato utilizado no se recoge el número de ítems depurados.

 

Sin embargo, conviene señalar que la situación extrema de gran tamaño y elevada supresión no suele darse en la práctica. Por otro lado, el sistema incorpora un vaciado automático de datos si se llega al caso de que todos los registros de un fichero resulten eliminados.

 

 

Funciones relacionadas

 

   SRAGM_DELETE  Suprime un registro de un fichero virtual.

 

   SRAGM_INF     Recupera estadísticos de un fichero virtual. 

 

   SRAGM_WRITE   Graba un registro en un fichero virtual.

 

                                                                                   ________