Serie ficheros virtuales

 
VBA. Ficheros virtuales



VBA. Ficheros virtuales. El READ secuencial


1 Introducción
2 Prototipo de la función READ
3 El código agregado a la hoja de muestra para mostrar el funcionamiento del READ secuencial
4 El código principal de la rutina READ
5 El código de la función núcleo PrRead
6 Fuentes


                                                             _______



1 Introducción


Tras el WRITE y el CHAIN, el READ secuencial es una consecuencia inmediata. Con él podemos ampliar la hoja de muestra como sigue

 

En donde se incluyen las nuevas columnas G, H e I que recogen los resultados del la función READ: En G el valor de control (0/1 Error), en H el valor de clave y en I los datos leídos.


                                                             _______


2 Prototipo de la función READ

El prototipo del READ presenta dos versiones, la reducida M_READ que recupera los datos, y la completa que recupera ademas de forma separada la clave. 
Cuando se utilizan los ficheros virtuales se decide si incluir la clave en los datos (digamos que es lo estándar porque abre la posibilidad a utilizar lógicos) o mantenerlas separadas para tratamientos más sencillos. En los casos en que la clave no se decida incluir en los datos, la segunda versión puede ser necesaria, en el caso contrario su utilización resulta como una comodidad adicional, pues por construcción la clave constituye la primera parte de la serie de datos.

'/*-----------------------------------------------------------------*/
'/* FUNCION....: M_READC                                            */
'/*                                                                 */
'/* DESCRIPCION: Recupera un Item de Memoria Secuencialmente        */
'/*              Como los elementos estan ordenados por clave, una  */
'/*              lectura secuncial devuelve los items ordenados.    */
'/*              Además devuelve el valor de clave del ítem,        */
'/*              la versión más sencilla READ no.                   */
'/* PARAMETROS.:                                                    */
'/* (entrada) lNIDp : Identificador del fichero virtual solicitado  */
'/*           iINDIp: Indice secuencial recuperación                */
'/*                    (formato 1..N)                               */
'/* (salida )  sDato: Datos del Item                                */
'/*           sClave: Clave del Item                                */
'/*                                                                 */
'/* RETORNO....:                                                    */
'/*                 0: Item leído satisfactoriamente                */
'/*                 1: Error de Proceso (No encontrado(EOF), ...)   */
'/*                                                                 */
'/*-----------------------------------------------------------------*/
Function M_READ (lNIDp As Long, lINDIp As Long, sDato As String) As Integer
Function M_READC(lNIDp As Long, lINDIp As Long, sDato As String, sClave As String) As Integer


                                                             _______


3 El código agregado a la hoja de muestra para mostrar el funcionamiento del READ secuencial

El código agregado en la hoja de muestra que se introdujo en la entrada anterior dedicada a las funciones núcleo WRITE y CHAIN, se presenta a continuación:

...


  ' Bucle de recuperación con READ

  For i = 1 To 10


    ' Emite operación. Graba resultado (0/1 Error) en columna G

    Range("G" & i) = M_READC(Range("C12"), i, sDato, sClave)
   
   
    ' Pasa claves y datos recuperados en columnas H e I
   
    Range("H" & i) = sClave
    Range("I" & i) = sDato
   
 Next i

. . .

                                                             _______


4 El código principal de la rutina READ

La codificación de la rutina sigue el estilo de las implementaciones anteriores, esto es, un distribuidor según el identificador del fichero solicitado y la invocación de la rutina común PrRead:


Function M_READC(lNIDp As Long, lINDIp As Long, sDato As String, sClave As String) As Integer


 ' Control de solicitud erronea
 
 If (lNIDp <= 0 Or iSTAT(lNIDp) <= 0 Or lINDIp <= 0 Or lNITEM(lNIDp) < lINDIp) Then
   
    M_READC = 1
    Exit Function
   
 End If

 
 ' Proceso común
 
 Select Case lNIDp

   Case 1
     M_READC = PrRead(lINDIp, sClave, sDato, sCLAVES1, sDATOS1, lINDICES1)

   ...
 
   Case 111
     M_READC = PrRead(lINDIp, sClave, sDato, sCLAVES111, sDATOS111, lINDICES111)

   Case Else
 
    M_READC = 1
   
 End Select


End Function

                                                             _______


5 El código de la función núcleo PrRead

La función auxiliar PrRead simplemente recupera de las series de soporte de los ficheros los elementos de la posición lINDI solicitada:

'/*-----------------------------------------------------------------*/
'/* FUNCION....: PrRead                                             */
'/*                                                                 */
'/* DESCRIPCION: Rutina central de recuperación de un Item de       */
'/*              Memoria Secuencialmente                            */
'/* PARAMETROS.:                                                    */
'/* (entrada) iINDIp: Indice secuencial recuperación                */
'/*                    (formato 1..N)                               */
'/* (salida)  sClave: Clave del Item                                */
'/*            sDato: Datos del Item                                */
'/*            sClv: Serie claves asociada al fichero virtual       */
'/*            sDat: Serie datos asociada al fichero virtual        */
'/*            lInd: Serie de índices asociada al fichero virtual   */
'/*                                                                 */
'/* RETORNO....:                                                    */
'/*                 0: Item leído satisfactoriamente                */
'/*                 1: Error de Proceso (No encontrado(EOF), ...)  
*/
'/*                                                                 */
'/*-----------------------------------------------------------------*/
Private Function PrRead(lINDIp As Long, sClave As String, sDato As String, _
                        sClv() As String, sDat() As String, lInd() As Long) As Integer
 
 Dim cH As String ' Control de Hival (Items borrados)
 
 On Error GoTo EtError
 
 
 ' Recupera el valor de la clave del ítem, compara EOF
 
 sClave = sClv(lInd(lINDIp))
 
 cH = Left(sClave, 1)
 If cH = Chr(255) Then
   
    PrRead = 1
    Exit Function
   
 End If
 

 ' Datos asociados
 
 sDato = sDat(lInd(lINDIp))
 
 
 ' Fin satisfactorio
 
 PrRead = NO_ERRO
 
 Exit Function


 ' Fin bajo error
 
EtError:
 
 PrRead = 1

End Function


                                                             _______



6 Fuentes

 

En el enlace siguiente se puede acceder al código fuente completo del módulo núcleo de los ficheros virtuales en VBA. Además, puede utilizarse el enlace que sigue para acceder al libro W, que recoge los ejemplos asociados a los primeros capítulos del blog. La hoja M del libro W corresponde al capítulo en curso.


 
                                                             _______