Serie ficheros virtuales


 
VBA. Ficheros virtuales



VBA. Ficheros virtuales. DELETE


1 Introducción
2 Código añadido a la hoja de muestra
3 El código de la función DELETE
4 La función auxiliar común PrDELETE
5 La utilidad U_DesplazaInd
6 Fuentes


                                                                                                     ________

1 Introducción

Obtenidos WRITE, CHAIN y READ las siguientes operaciones naturales son el DELETE y el UPDATE. Veamos ahora el DELETE, instrucción que permite suprimir registros individuales de una base de datos virtual.

Con él, nuestra hoja de cálculo se amplia como sigue:


En este momento el código ha sufrido una transformación frente a la versión anterior, pues para incluir el tratamiento del DELETE se aborda el relleno de la parte inferior que contempla el nuevo ejemplo.

En esta parte inferior se ha agregado una lista de claves de ítems a borrar (31...51), junto con el resultado de su aplicación. Finalmente se emiten READ's para presentar el contenido restante del fichero y se presentan a la derecha de estos resultados.

Nos vamos a centrar en esta zona de código añadido en particular.

                                                                                                     ________

2 Código añadido a la hoja de muestra

El código relevante añadido sigue a continuación:

 ...
 
 ' Ejecuta Deletes

 For i = 1 To 5
   
    j = i + 16
   
    Range("D" & j) = M_DELETE(Range("C13"), Range("A" & j))
 
 Next i
   
   
 ' Recupera datos restantes con READ secuencial
 
 For i = 1 To 10
   
    j = i + 16
   
   
    ' Estampilla índice
   
    Range("C" & j) = i
   
   
    ' Recupera mientras encuentra datos sin borrar (En este ejemplo ya sólo quedan 5 ítems)
   
    lResul = M_READC(Range("C13"), i, sDato, sClave)
    If lResul > 0 Then
       Exit For
    End If
   
       
    ' Pasa claves y datos recuperados
     
    Range("G" & j) = lResul
    Range("H" & j) = sClave
    Range("I" & j) = sDato
   
 Next i

                                                                                                     ________

3 El código de la función DELETE

'/*-----------------------------------------------------------------*/
'/* FUNCION....: M_DELETE                                           */
'/*                                                                 */
'/* DESCRIPCION: Elimina un Item de un fichero virtual              */
'/*                                                                 */
'/* PARAMETROS.:                                                    */
'/* (entrada) lNIDp: Identificador del Conjunto de Items asociado   */
'/*           sClav: Clave del Item                                 */
'/*                                                                 */
'/* RETORNO....:                                                    */
'/*                 0: Error de Proceso (No encontrado,...)         */
'/*                >0: Posición en memoria del ítem suprimido       */
'/*                                                                 */
'/*-----------------------------------------------------------------*/
Function M_DELETE(lNIDp As Long, sClav As String) As Long

 Dim Erro As Integer ' Control de errores intermedios
 Dim lResul As Long  ' Control de resultados intermedios
 
 
 ' Control de solicitud erronea
 
 If (lNIDp <= 0 Or iSTAT(lNIDp) = 0 Or lNITEM(lNIDp) <= 0) Then
   
    M_DELETE = 0
    Exit Function
   
 End If
 

 ' Recupera ítem a eliminar
 
 lResul = M_SETEQ(lNIDp, sClav)  ' SETEQ se presentó al considerar la función WRITE en un epígrafe anterior
 If lResul <= 0 Then
   
    M_DELETE = 0
    Exit Function
   
 End If


 ' Actualiza contador
 
 lBAJAS(lNIDp) = lBAJAS(lNIDp) + 1
 
 
 
 ' Ejecuta la función común PrDELETE sobre el fichero solicitado
 
 Select Case lNIDp
  
   Case 1
     Erro = PrDELETE(lNIDp, lResul, lSDimC(lNIDp), sCLAVES1, lINDICES1)

   ...

   Case 111
     Erro = PrDELETE(lNIDp, lResul, lSDimC(lNIDp), sCLAVES111, lINDICES111)

   Case Else
 
    M_DELETE = 0
    Exit Function
   
 End Select


 ' Control de errores
 
 If Erro = 1 Then
 
    M_DELETE = 0
    Exit Function
 
 End If
 
 
 ' Ajustes por baja total
 
 If lBAJAS(lNIDp) >= lNITEM(lNIDp) Then
    Erro = M_CLRF(lNIDp)               ' Esta función, el vaciado de un fichero, la veremos luego en detalle junto con la función M_ERASE
 End If

 
 ' Retorna índice de supresión
 
 M_DELETE = lResul


End Function

                                                                                                     ________


4 La función auxiliar común PrDELETE

'/*-----------------------------------------------------------------
'/* FUNCION....: PrDELETE                                          
'/*                                                                
'/* DESCRIPCION: Común de eliminación de un Item de un fichero virtual
'/*                                                                
'/* PARAMETROS.:                                                   
'/* (entrada) lNIDp: Identificador del Conjunto de Items asociado  
'/*         lIndPos: Posición de índice obtenida en M_SETEQ
'/*           lDimC: Longitud de la clave
'/*            sClv: Serie de claves
'/*            lInd: Serie de índices
'/*                                                                
'/* RETORNO....:                                                   
'/*                0/1: Error de Proceso (No encontrado,...)       
'/*                                                                
'/*-----------------------------------------------------------------
Private Function PrDELETE(lNIDp As Long, lIndPos As Long, lDimC As Long, sClv() As String, lInd() As Long) As Integer

 On Error GoTo EtError


 Dim sClave As String ' Aux.paso de clave a borrar
 Dim Erro As Integer  ' Control de resultados intermedios


 ' Reserva índice quemado

 Dim lIndice As Long

 lIndice = lInd(lIndPos)


 ' Elimina registro de clave asociado (quemándolo con *HIVAL)
 
 sClave = Chr(255) + Right(sClv(lIndice), lDimC - 1)
 sClv(lIndice) = sClave
 
 
 ' Reordenación: Si hay + de 1 elemento y no es baja el último
 
 If lNITEM(lNIDp) > lIndPos Then
 
 
  ' Reordena resultados para poder poner el índice quemado al final de la lista tras el desplazamiento

  Erro = U_DesplazaInd(lIndPos, lNITEM(lNIDp), lInd)
 

  ' Coloca el índice quemado al final de la lista
 
  lInd(lNITEM(lNIDp)) = lIndice
 
 End If
 
 
 ' Fin de proceso satisfactorio
 
 PrDELETE = 0
 
 Exit Function


' Fin de proceso erróneo
 
EtError:
 
 PrDELETE = 1
 
 
End Function

                                                                                                     ________

5 La utilidad U_DesplazaInd

PrDELETE llama a su vez a U_DesplazaInd, utilidad para emular el memmove que se utilizaba en la versión origen escrita en lenguaje C para desplazar la serie índice, y que aquí se ha transcrito como sigue


'-----------------------------------------------------------------
' FUNCION....: U_DesplazaInd
'
' DESCRIPCION: Desplaza una serie índice a la izquierda una unidad desde una posición dada
'
' PARAMETROS.:
' (I)       lPos: Posición de desplazamiento
'           N   : Nºítems actuales
'           sInd: Serie índice objeto de la inserción (Y que acaba pues con N-1 ítems)
'
' RETORNO....:  0/1 error de proceso
'-----------------------------------------------------------------
Function U_DesplazaInd(lPos As Long, N As Long, sInd() As Long) As Integer
             
 Dim i As Long ' Contador de do
 
             
 On Error GoTo EtError


 ' Filtros
 
 If lPos < 1 Then
    U_DesplazaInd = 1
    Exit Function
 End If
 
 If N <= lPos Then
    U_DesplazaInd = 1
    Exit Function
 End If

 
 ' Desplazamiento de cola
 
 For i = lPos To N
 
    sInd(i) = sInd(i + 1)
 
 Next i

 
 ' Fin de proceso satisfactorio

 U_DesplazaInd = 0

 Exit Function
 
 
 ' Fin de proceso erróneo
 
EtError:
 
 U_DesplazaInd = 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, también puede utilizarse el enlace de acceso 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.

                                                                                                     ________