Serie ficheros virtuales
 



VBA. Ficheros virtuales




VBA Ficheros virtuales. Pilas y colas


1 Introducción
2 El código del libro de presentación "PilasYcolas"

3 El código de los servicios para pilas y colas
4 Fuentes

 


                                                                                                       ________

 



1 Introducción

 

Las pilas funcionan como las pilas de platos, el último que se coloca es el primero que se retira. Por eso en inglés se dice que siguen el sistema LIFO “last input first output”.

 

 

Por el contrario, las colas funcionan como las colas de los cines, el primero que se coloca es el primero que se atiende. Por eso en inglés se dice que siguen el sistema FIFO “first input first output”.

 

 

Como una imagen vale más que mil palabras, veamos un par de ejemplos de hojas dedicadas a pilas y colas

 


En la columna A se muestran datos que se van generando y grabando con W_FIFO_WRITE, además se garantiza la unicidad de los ítems tratados por pura cuestión estética utilizando el recurso W_VER.

Se presenta a la derecha el contenido que va teniendo el fichero y las claves de estampillado directo que se generan automáticamente.

Posteriormente los datos se leen con W_FIFO_READ, primero en un bloque sin consumir y luego en otro en que si se consumen.


                                                                                                       ________



 

 

Esta muestra se puede comparar con el ejemplo similar ejecutado para pilas que sigue

 


                                                                                                       ________

2 El código del libro de presentación "PilasYcolas"

El código para generar la hoja de pilas sigue a continuación (Para la hoja de colas es prácticamente igual)

Option Explicit
Option Base 1

Sub GenPila()

 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 sNum As String   ' Num - alfa
 Dim lNID As Long     ' Identificador de fichero
 Dim lResul As Long   ' Control de resultados W
 Dim sClave As String ' Paso auxiliar de claves en M_Read
 Dim sDato As String  ' Paso auxiliar de datos  en M_Chain

' 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("PILAS").Select
 Cells.Select
 Selection.ClearContents


 ' Construye datos

 Range("A1") = "Nombre"
 Range("B1") = "Tamaño datos"
 Range("C1") = "Identificador asignado"
 
 Range("A2") = "PILA"
 Range("B2") = 3
 Range("B3") = "Resultado-Op"
 
 Range("A4") = "Datos"
 Range("B4") = "WRITE"
 Range("C4") = "NºItems PILA"
 Range("D4") = "Contenido en curso"
 
 Range("B15") = "READ_LIFO[0]"
 
 Range("B21") = "READ_LIFO[1]"
 
 Range("A5:DD105").Select
 Selection.NumberFormat = "@"


 ' Genera los ficheros virtuales de soporte
 
 Range("C2") = W_LIFO_NEW(Range("A2"), Range("B2"))

 lResul = W_NEW(Range("A2") & "@", Range("B2")) ' Aux. eludir repeticiones


 ' Bucle de prueba. Carga de datos
 
 For i = 1 To 10
  
  
   ' Genera el dato en curso
  
   Num = 99 * Rnd() + 101
     
     
   ' Elude repeticiones
  
   sNum = CStr(Num)
   lResul = W_VER(Range("A2") & "@", sNum)
   If lResul > 0 Then
      i = i - 1
   Else
  
     ' Nuevo ítem a grabar
  
     j = i + 4
  
     Range("A" & j) = Num
  
  
     ' Emite Write
  
     Range("B" & j) = W_LIFO_WRITE(Range("A2"), CStr(Num))
  
  
     ' Toma estadísticos de PILA
  
     lResul = W_INF(Range("A2"), lDimC, lDimD, lNITEM, lBAJAS, lNIDD)
  
  
     ' Expone contenido actual de PILA
  
     Range("C" & j) = lNITEM
  
     For k = 1 To lNITEM
  
       lResul = W_READ(Range("A2"), k, sDato, sClave)
       Cells(j, 3 + k) = sDato
       Cells(j, 15 + k) = sClave
     
     Next k
 
   End If
  
 Next i
 
 

 ' Bucle de prueba. Descarga sin consumir
 
 For i = 1 To 5
  
   j = i + 15
  
  
   ' Lee sin consumir
  
   Range("B" & j) = W_LIFO_READ(Range("A2"), sDato)
  
   Range("A" & j) = sDato
 
  
   ' Toma estadísticos de PILA
  
   lResul = W_INF(Range("A2"), lDimC, lDimD, lNITEM, lBAJAS, lNIDD)
  
  
   ' Expone contenido actual de PILA
  
   Range("C" & j) = lNITEM
  
   For k = 1 To lNITEM
  
      lResul = W_READ(Range("A2"), k, sDato, sClave)
      Cells(j, 3 + k) = sDato
      Cells(j, 15 + k) = sClave
  
   Next k
 
 Next i
 
 

 ' Bucle de prueba. Descarga consumiendo
 
 For i = 1 To 9
  
   j = i + 21
  
  
   ' Lee consumiendo
  
   Range("B" & j) = W_LIFO_READ(Range("A2"), sDato, 1)
  
   Range("A" & j) = sDato
 
  
   ' Toma estadísticos de PILA
  
   lResul = W_INF(Range("A2"), lDimC, lDimD, lNITEM, lBAJAS, lNIDD)
  
  
   ' Expone contenido actual de PILA
  
   Range("C" & j) = lNITEM - lBAJAS
  
   For k = 1 To lNITEM - lBAJAS
  
      lResul = W_READ(Range("A2"), k, sDato, sClave)
      Cells(j, 3 + k) = sDato
      Cells(j, 15 + k) = sClave
  
   Next k
 
 Next i
 


 ' Desmarcado
 
 Range("AA1").Select


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

                                                                                                       ________
 


3 El código de los servicios para pilas y colas

En cuanto al código de los servicios asociados, es singularmente sencillo:

'//-------------------------------------------------------------------------------------
'//
'// Función W_LIFO_NEW
'//
'// Descripción  Genera una pila (LIFO)
'//
'// Parámetros
'//
'// (entrada) sLIFO  Nombre de pila asociada
'//           lDimD  Dimensión de datos a guardar en la pila
'//        lMaxNreg  NºMáximo de registros a guardar (Opcional)
'//
'// Retorno
'//           0  Error de proceso
'//          >0  Nid asociado
'//
'//--------------------------------------------------------------------------------------
Function W_LIFO_NEW(sLIFO As String, lDimD As Long, Optional lMaxNregp As Long) As Long
 
 Dim lMaxNreg As Long ' Paso de lMaxNregp
 
 lMaxNreg = lMAXNRG
 If Not IsMissing(lMaxNregp) And lMaxNregp > 0 Then lMaxNreg = lMaxNregp
 
 W_LIFO_NEW = W_NEW(sLIFO, 24, lDimD, lMaxNreg)
 
End Function

                                                                                                       ________


'//--------------------------------------------------------------------------------------
'//
'// Función W_LIFO_READ
'//
'// Descripción  Lee un ítem de la pila
'//
'//
'// Parámetros
'//
'// (entrada) sLIFO  Nombre de pila
'// (salida)  sDato  Datos del ítem
'// (entrada) sOpci  Opción 0/1 borrar elemento leído (Opcional)
'//
'// Retorno
'//           0  OK
'//          >0  Error de proceso
'//----------------------------------------------------------------------------------------
Function W_LIFO_READ(sLIFO As String, sDato As String, Optional iOpcip As Integer) As Integer

 Dim sClav As String * 24 ' Aux.paso de clave
 Dim Er As Integer        ' Control de errores intermedios
 Dim lResul As Long       ' Control de resultados intermedios

 
 ' Paso de parámetros opcionales
 
 Dim iOpci As Integer
 iOpci = 0
 If Not IsMissing(iOpcip) And iOpcip > 0 Then iOpci = iOpcip
 

 ' Lee ítem
 
 Er = W_READ(sLIFO, 1, sDato, sClav)
 If Er > 0 Then
 
    W_LIFO_READ = Er
    Exit Function
   
 End If


 ' Fin de proceso por lectura sin consumo
 
 If iOpci = 0 Then
 
    W_LIFO_READ = NO_ERRO
    Exit Function
   
 End If


 ' Elimina ítem
 
 lResul = W_DELETE(sLIFO, sClav)
 If lResul = 0 Then
 
    W_LIFO_READ = 1
    Exit Function
   
 End If


 ' Fin de proceso satisfactorio
 
 W_LIFO_READ = NO_ERRO

End Function

                                                                                                       ________
 
 
'//-------------------------------------------------------------------------------------
'// Función  W_LIFO_WRIT
'//
'// Descripción  Guarda un ítem en la pila
'//
'// Parámetros
'// (entrada) sLIFO  Nombre de la pila
'//           sDato  Datos a guardar
'//
'// Retorno
'//           0  Error de proceso
'//          >0  Idice del item guardado
'//
'//--------------------------------------------------------------------------------------
Function W_LIFO_WRITE(sLIFO As String, sDato As String) As Long

 Dim sClav As String * 24 ' Aux.paso de clave
 

 ' Clave STAM inverso

 sClav = F_STAMINV()


 ' Graba ítem (estilo LIFO debido al STAM inverso)
 
 W_LIFO_WRITE = W_WRITE(sLIFO, sClav, sDato)
 
 End Function

                                                                                                       ________
 
4 Fuentes


Los servicios para colas son los mismos cambiando LIFO por FIFO. Además, en el enlace siguiente se puede acceder al libro PilasYcolas, que recoge el ejemplo considerado en el capítulo.

                                                                                                       ________