Serie ficheros virtuales

 

 

 


RPG Ficheros virtuales

 

 

 

Funciones  del grupo de emulación de pilas (LIFO)

 

 

        Estructura de soporte

 

        Programa de muestra

 

        Relación de prototipos

 

       SRAGM_LIFO_NEW

 

        SRAGM_LIFO_NOW

 

        SRAGM_LIFO_READ

 

        SRAGM_LIFO_WRIT

 

 

                                                                                                   ________

 

 

 

Estructura de soporte

 

 

En la presentación de las funciones de pilas se va a introducir una estructura de soporte auxiliar. En el uso ordinario no se precisaría, pero en este capítulo las muestras que se van a crear se tratarán con sus instrucciones específicas de pilas y además con las instrucciones generales de los ficheros virtuales, a efectos ilustrativos.

 

Para esta última visión, se va a utilizar la definición de estructura de datos DS8830c, que se compone de una subestructura de clave principal y una subestructura de datos, que se detallan a continuación:

 

 

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

      *  DS8830   *  Wk.Carga sfl CC8830

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

 

      ***

      * *  Definición fichero virtual DS8830

      ***

     D DS8830c         DS                  QUALIFIED BASED(pDS8830c)            Soporte  DS8830

     D  DSK                                LIKEDS(DSWKc)                        ClavesPF DS8830

     D  DSD                                LIKEDS(DSWKd)                        Datos    DS8830

 

      ***

      * *  Definición claves

      ***

     D DSWKc           DS                  QUALIFIED BASED(pDSWKc)

     D  CCSTAM                       24S 0                                      EstampilladoYnºorden

      *                                                                     AAAAMMDDHHMMSSNNNNNNNNNN

      *                                                                     123456789012345678901234

      *                                                                              1         2

 

      ***

      * *  Definición datos fichero virtual DS8830

      ***

     D DSWKd           DS                  QUALIFIED BASED(pDSWKd)

     D  CCDATO                       40                                         Datos almacenados

 

 

 

                                                                                                   ________

 

 

Programa de muestra

 

DS8830 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 programa de muestra CC8830 (de interfaz visual CCD8830) que se va a utilizar como referencia en este capítulo.

 

 

Veamos las instrucciones principales relativas al uso de los servicios de emulación de pilas:

 

 

         . . .

 

 

         // Crea la pila si no existe previamente

 

 

         TTNID = SRAGM_LIFO_NOW(XXFILE:%size(DSENTR));

 

         . . .

 

 

         // Bucle de presentación

 

 

            . . . (exfmt)

 

 

 

            // Recupera ítem de pila

 

            if *IN08;

 

 

               // Recupera ítem

 

               clear DSEXIT;

               TTErro = SRAGM_LIFO_READ(XXFILE:%addr(DSEXIT));

 

 

               // Recarga pantalla

 

               clear TTCLV;

               iter;

 

            endif;

 

 

 

            . . .

 

            // Graba ítem de pila

 

            if DSENTR <> *BLANKS;

               TTResu = SRAGM_LIFO_WRIT(XXFILE:%addr(DSENTR));

            endif;

 

           . . .

 

 

Con una presentación visual como sigue

 

 

 

                                                                                         ________

 

 

 

 

 

  Grupo emulación pilas (LIFO: Last input, first output)

 

 

 

 

      * Genera una pila LIFO virtual. Si existe previamente, la limpia.

 

     DSRAGM_LIFO_NEW   PR            10I 0                                      Identificador0=Error

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

     D P_DIMD                        10I 0 VALUE                                DIM(TAMAÑO)DATOS 2*I

     D P_MAXR                        10I 0 VALUE OPTIONS(*NOPASS)               MAXIMO NUM.ITEMS 3*I

 

 

 

 

      * Genera una pila LIFO virtual, si no existe previamente.

 

     DSRAGM_LIFO_NOW   PR            10I 0                                      Identificador0=Error

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

     D P_DIMD                        10I 0 VALUE                                DIM(TAMAÑO)DATOS 2*I

     D P_MAXR                        10I 0 VALUE OPTIONS(*NOPASS)               MAXIMO NUM.ITEMS 3*I

 

 

 

 

      * Lee un ítem de una pila virtual

 

     DSRAGM_LIFO_READ  PR            10I 0                                      0/1 Error

     D P_pLIFO                         *   VALUE OPTIONS(*STRING)               Nombre Pila     1*I

     D P_pDATO                         *   VALUE                                pDatosObtenidos 2*I

     D P_OPCI                          N   VALUE OPTIONS(*NOPASS)               0/1 Borrar Item 3*I

 

 

 

 

      * Graba un ítem en una pila virtual

 

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

     D P_pLIFO                         *   VALUE OPTIONS(*STRING)               Nombre Pila      *I

     D P_pDATO                         *   VALUE OPTIONS(*STRING)               pDatosGrabados   *I

 

 

 

 

 

                                                                                         ________

 

 

 

 

 

  SRAGM_LIFO_NEW. Prototipo

 

 

 

 

      * Genera una pila LIFO virtual. Si existe previamente, la limpia.

 

     DSRAGM_LIFO_NEW   PR            10I 0                                      Identificador0=Error

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

     D P_DIMD                        10I 0 VALUE                                DIM(TAMAÑO)DATOS 2*I

     D P_MAXR                        10I 0 VALUE OPTIONS(*NOPASS)               MAXIMO NUM.ITEMS 3*I

 

 

 

 

 

Ejemplo

 

 

         TTNID = SRAGM_LIFO_NEW(XXFILE:%size(DSENTR));

 

 

En este ejemplo se genera un fichero virtual en formato de pila con el nombre que se indica en la variable XXFILE, con tamaño de datos como el de la variable de entrada en pantalla DSENTR. El número máximo de registros se toma por defecto.

 

Si XXFILE existiera previamente, SRAGM_LIFO_NEW lo limpia dejando su número de registros a cero. Si se desea respetar el contenido anterior utilícese SRAGM_LIFO_NOW.

 

TTNID recoge el identificador asignado por el sistema al nuevo fichero.

 

 

Otro ejemplo de uso sería:

 

 

              TTNID = SRAGM_LIFO_NEW('DS8830':%size(DSENTR));

 

 

              En donde el nombre se explicita como la constante 'DS8830'.

 

 

 

SRAGM_LIFO_NEW equivale a una instrucción como la siguiente

 

 

         TTNID = SRAGM_NEW(XXFILE:25:%size(DSENTR));

 

En donde se crea un fichero virtual con tamaño de clave 25, posiciones reservadas al estampillador inverso [Siguiendo el formato  aaaammddnnnnnnnnnn\ con  aaaammdd = 99999999 – AAAAMMDD con AAAA=Año, MM=Mes y DD=Día actuales, nnnnnnnnnn = 214783647 - NNNNNNNNNN = Contador secuencial  y  \ = Terminador C ANSI, que se elude en presentación], y tamaño de datos %size(DSENTR).

 

Normalmente los ficheros virtuales se crean con Dimensión Datos > Dimensión Claves y solapamiento de Claves y Datos. Sin embargo, en la emulación de pilas y pilas no se usa el solapamiento, que se sustituye por interfaces específicas que eluden el tratamiento de claves, puesto que son de asignación automática. En cualquier caso, también pueden usarse los procedimientos ordinarios, como hace el programa de muestra CC8830.

 

 

Funciones relacionadas

 

   SRAGM_LIFO_NOW   Tiene el mismo funcionamiento que SRAGM_LIFO_NEW, pero no limpia datos previos si hay pre-existencia.

 

 

 

                                                                                         ________

 

 

 

 

 

  SRAGM_LIFO_NOW. Prototipo

 

 

 

 

      * Genera una pila LIFO virtual, si no existe previamente.

 

     DSRAGM_LIFO_NOW   PR            10I 0                                      Identificador0=Error

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

     D P_DIMD                        10I 0 VALUE                                DIM(TAMAÑO)DATOS 2*I

     D P_MAXR                        10I 0 VALUE OPTIONS(*NOPASS)               MAXIMO NUM.ITEMS 3*I

 

 

 

 

 

Ejemplo

 

 

         TTNID = SRAGM_LIFO_NEW(XXFILE:%size(DSENTR));

 

 

En este ejemplo se genera un fichero virtual en formato de pila con el nombre que se indica en la variable TTFILE con tamaño de datos como el de la variable de entrada en pantalla DSENTR. El número máximo de registros se toma por defecto. Si TTFILE existiera previamente, SRAGM_LIFO_NOW no actuaría. La alternativa SRAGM_LIFO_NEW garantiza un fichero vacío tras su ejecución.

 

 

SRAGM_LIFO_NOW internamente ejecuta un SRAGM_NID que si resulta con contenido provoca su terminación y en caso contrario emite un SRAGM_LIFO_NEW.

 

 

Las notas de SRAGM_LIFO_NEW son por tanto de aplicación también aquí.

 

 

 

                                                                                         ________

 

 

 

 

 

  SRAGM_LIFO_READ. Prototipo

 

 

 

 

      * Lee un ítem de una pila virtual

 

     DSRAGM_LIFO_READ  PR            10I 0                                      0/1 Error

     D P_pLIFO                         *   VALUE OPTIONS(*STRING)               Nombre Pila     1*I

     D P_pDATO                         *   VALUE                                pDatosObtenidos 2*I

     D P_OPCI                          N   VALUE OPTIONS(*NOPASS)               0/1 Borrar Item 3*I

 

 

 

 

Ejemplo

 

 

                  TTErro = SRAGM_LIFO_READ(XXFILE:%addr(DSEXIT));

 

 

 

En el ejemplo, se recupera el siguiente ítem de pila del montón existente en XXFILE; además el elemento extraído se consume.

 

El ejemplo está tomado del código del programa de muestra CC8830.

 

 

 

Si partimos de la situación de expuesta en la imagen

 

 

 

 

Al emitir la instrucción SRAGM_LIFO_READ pasaríamos a la situación siguiente tras consumir el primer ítem apilado:

 

 

 

Funciones relacionadas

 

  

   SRAGM_LIFO_WRIT  Graba un ítem en una pila.

 

 

 

                                                                                         ________

 

 

 

 

 

  SRAGM_LIFO_WRIT. Prototipo

 

 

 

 

      * Graba un ítem en una pila virtual

 

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

     D P_pLIFO                         *   VALUE OPTIONS(*STRING)               Nombre Pila      *I

     D P_pDATO                         *   VALUE OPTIONS(*STRING)               pDatosGrabados   *I

 

 

 

 

Ejemplo

 

 

            TTResu = SRAGM_LIFO_WRIT(XXFILE:%addr(DSENTR));

 

 

 

Con esta instrucción se graba el contenido de la variable DSENTR en la pila virtual XXFILE.

 

 

El ejemplo está tomado del código del programa de muestra CC8830. Una muestra visual tras la emisión de varias grabaciones sería

 

 

 

Es interesante comparar la forma de archivo de los ítems de pila frente a los ítems de cola que se presentaron en el capítulo anterior.

 

 

Funciones relacionadas

 

   SRAGM_LIFO_READ   Recupera un ítem de una pila

 

 

                                                                                         ________