Serie ficheros virtuales




 
VBA. Ficheros virtuales



 
 
VBA Ficheros virtuales. La función conjunta VER


1 Introducción

2 El código de construcción de la hoja de muestra


3 La implementación de la rutina VER

  3.1 El interfaz W_VER

  3.2 El núcleo M_VER


4 Fuentes

                                                                                                   ________



1 Introducción

VER es una función conjunta WRITE+CHAIN que sirve para determinar si un cierto ítem ya ha sido tratado previamente.  En la figura vemos una muestra de uso


En este ejemplo ya se utiliza la versión W que utiliza nombres de fichero. En este caso se usa el nombre "VER" que se indica en la fila 2.

En el ejemplo se va preguntando por los ítems que aparecen en la columna A. La primera vez que se pregunta por un ítem el resultado es 0. En posteriores solicitudes se devuelve la posición actual en memoria en que se encuentra el ítem en el fichero virtual VER.

                                                                                                    ________

2 El código de construcción de la hoja de muestra

Option Explicit
Option Base 1

Sub GenVer()

 Dim Er As Integer    ' Control de errores intermedios
 Dim i As Long        ' Contador de for
 Dim j As Long        ' Contador de for
 Dim k As Long        ' Contador de for
 Dim l As Long        ' Contador de for
 Dim Num As Integer   ' Item de datos de muestra
 Dim lNID As Long     ' Identificador de fichero
 Dim lResul As Long   ' Control de resultados W
 Dim sClave As String ' Paso auxiliar de claves en W_Read


' Variables para W_INF

Dim lDimC As Long  ' Longitud de clave
Dim lDimD As Long  ' Longitud de datos
Dim lNITEM As Long ' NºDe ítems (De los que ...)
Dim lBAJAS As Long ' NºDe bajas (... un total de lBAJAS están suprimidos)
Dim lNIDD As Long  ' NºDisponible de ítems que aún puede grabarse


 ' Inhibe actualización de pantalla

 Application.ScreenUpdating = False


 ' Limpia la hoja de muestra

 Sheets("VER").Select
 Cells.Select
 Selection.ClearContents


 ' Construye datos

 Range("A1") = "Nombre"
 Range("B1") = "Tamaño clave"
 Range("C1") = "Identificador asignado"
 
 Range("A2") = "VER"
 Range("B2") = 2
 
 Range("A4") = "Datos"
 Range("B4") = "Resultado-VER"
 Range("C4") = "NºItems VER"
 Range("D4") = "Contenido en curso"
 
 
 Range("A5:DD105").Select
 Selection.NumberFormat = "@" ' Especifica contenido alfanumérico


 ' Genera el fichero virtual de soporte
 
 Range("C2") = W_NEW(Range("A2"), Range("B2"))
 

 ' Bucle de prueba
 
 For i = 1 To 100
  
  
   ' Genera el dato en curso
  
   Num = 99 * Rnd() + 1
  
  
   ' Fuerza a 2 digitos
  
   If Num < 10 Then
  
      i = i - 1
      GoTo EtNext_i
     
   End If
 
 
   ' Nuevo ítem a verificar
  
   j = i + 4
  
   Range("A" & j) = Num
  
  
   ' Emite VER
  
   Range("B" & j) = W_VER(Range("A2"), CStr(Num))
  
  
   ' Toma estadísticos de VER
  
   lResul = W_INF(Range("A2"), lDimC, lDimD, lNITEM, lBAJAS, lNIDD)
  
  
   ' Expone contenido actual de VER
  
   Range("C" & j) = lNITEM
  
   For k = 1 To lNITEM
  
      lResul = W_READ(Range("A2"), k, sDato)
      Cells(j, 3 + k) = sDato
     
   Next k
  
  
EtNext_i:

 Next i
 

 ' Desmarcado
 
 Range("AA1").Select


 
 ' Refresca actualización de pantalla
 
 Application.ScreenUpdating = True
 
 
End Sub

                                                                                                   ________

3 La implementación de la rutina VER


3.1 El interfaz W_VER

W_VER es en esencia un interfaz de M_VER, al que se le antepone el código necesario para enlazar el nombre de fichero con un identificador de tipo M. Esto será recurrente en el resto de funciones de W, de la que ésta en este punto puede considerarse arquetipo.

'//-------------------------------------------------------------------------------------
'// Función  W_VER
'//
'// Descripción: Determina la existencia de un ítem en memoria
'//              Función resumen simple de CHAIN + WRITE (Item)
'//              Supone una generación previa del fichero virtual de soporte
'//
'// Parámetros
'//  (entrada)  sFILE: Fichero virtual de soporte de la verificación
'//             sClav: Clave del ítem a verificar
'//
'// Retorno
'//                -1: Error de proceso
'//                 0: Primera grabación de ítem no pre-existente
'//                >0: Índice en memoria-clave encontrado pre-existente, formato 1..N
'//-------------------------------------------------------------------------------------
Function W_VER(sFILE As String, sClav As String) As Long

 Dim lNIDw As Long   ' Valor de retorno en formato numérico
 
 Dim sName As String * 33 ' Normalización de sFILE


 ' Normaliza nombre
 
 sName = W_NAME(sFILE)


 ' NID del file solicitado
 
 lNIDw = W_NID(sName)
 If lNIDw <= 0 Then
   
    W_VER = -1
    Exit Function
   
 End If


 ' Proceso
 
 W_VER = M_VER(lNIDw, sClav)

End Function

                                                                                                    ________


3.2 El núcleo M_VER

Por su parte, el código núcleo de M_VER se expone a continuación

'//-------------------------------------------------------------------------------------
'// Función  M_VER
'//
'// Descripción: Determina la existencia de un ítem en memoria
'//              Función resumen simple de CHAIN + WRITE (Item)
'//              Supone un NID asociado generado previamente
'//
'// Parámetros
'//  (entrada)  lNIDp: Identificador de fichero virtual solicitado
'//             sCLVp: Clave del ítem a verificar
'//
'// Retorno
'//                -1: Error de proceso
'//                 0: Primera grabación de ítem no pre-existente
'//                >0: Índice en memoria-clave encontrado pre-existente, formato 1..N
'//-------------------------------------------------------------------------------------
Function M_VER(lNIDp As Long, sCLVp As String) As Long

 Dim lResul As Long ' Control de resultados parciales


 ' Pre-existencia
 
 lResul = M_SETEQ(lNIDp, sCLVp)
 If lResul > 0 Then
 
    M_VER = lResul
    Exit Function
   
 End If


 ' Graba el nuevo ítem
 
 lResul = M_WRITE(lNIDp, sCLVp, sCLVp)
 If lResul <= 0 Then
 
    M_VER = -1
    Exit Function
   
 End If
 
 
 ' Retorna marca de primera grabación de ítem no-preexistente
 
 M_VER = NO_ERRO

End Function
                                                                                                   ________


4 Fuentes

 

En el enlace siguiente se puede acceder al libro VER, que recoge el ejemplo considerado en el capítulo.



                                                                                                   ________