Consulta a Dbase

Tengo problemas para borrar registros desde un proyecto de VB6.0 en una tabla de dbaseIV. La instrucción 'delete' marca los registros para borrar pero no los borra realmente.
¿Existe alguna instrucción equivalente al 'pack' de Clipper para borrarlos definitivamente?
4

4 respuestas

Respuesta
1
Como eliminar registros de un base DBase (PACK)
Para habilitar la eliminación física de los registros te entrego 2 maneras:
1.- Fácil y para pocos registros
2.- Completa para tablas de gran tamaño
1.- Debes escribir la siguiente entrada en tu archivo VB.INI or appname>.INI:
   [dBase ISAM]
   Deleted=On
Ahora puedes utilizar el siguiente código de ejemplo (ajústalo a tus necesidades):
   Dim db As database
   Set db = OpenDatabase("c:\dBaseIII", false, false, "dBase III")
   db.Execute "Delete From Authors"      
   db.Close                              
2.- Para tablas muy grandes puedes copiar los registros no eliminados (o los eliminados) en una nueva tabla, luego de eso eliminas la tabla antigua y la renombras.
   Sub Pack_DBF (db As Database, tblname As String)
     Const MB_YESNO = 4                     ' Yes and No buttons
     Const MB_ICONEXCLAMATION = 48          ' Warning message
     Const IDYES = 6                        ' Yes button pressed
     Dim dbdir As String, tmp As String 'Temp variables
     Dim i As Integer, ret As Integer   'Counter and return value of MsgBox
     Dim flags As Integer                   'Flags for MsgBox
     ReDim idxs(0) As New index             'Holds indexes
     On Error GoTo PackErr
     flags = MB_YESNO Or MB_ICONEXCLAMATION
     ret = MsgBox("Remove All Deleted Records in " & tblname & "?", flags)
     If ret = IDYES Then
       dbdir = db.Name + "\"                      'Hold database directory
       'Delete the temp file if it exists.
       If Dir$(dbdir & "p_a_c_k.*") <> "" Then
         Kill dbdir & "p_a_c_k.*"
       End If
       'Store the indexes.
       For i = 0 To db.TableDefs(tblname).Indexes.Count - 1
         ReDim Preserve idxs(i + 1)
         idxs(i).Name = db.TableDefs(tblname).Indexes(i).Name
         idxs(i).Fields = db.TableDefs(tblname).Indexes(i).Fields
         idxs(i).Primary = db.TableDefs(tblname).Indexes(i).Primary
         idxs(i).Unique = db.TableDefs(tblname).Indexes(i).Unique
       Next
       'Create the new table without the deleted records.
       db.Execute "Select * into [p_a_c_k] from " & tblname
       'Delete the current table.
       db.TableDefs.Delete tblname
       'Rename the DBF file and any memo files.
       tmp = Dir$(dbdir & "p_a_c_k.*")
       Do While tmp <> ""
       'Rename with the correct file extension; this should be on one line.
           Name dbdir & tmp As dbdir & tblname &
                                Right$(tmp, Len(tmp) - InStr(tmp, ".") + 1)
           tmp = Dir$
       Loop
       'Refresh the tabledefs and add the indexes to the new table.
       db.TableDefs.Refresh
       For i = 0 To UBound(idxs) - 1
         db.TableDefs(tblname).Indexes.Append idxs(i)
       Next
      MsgBox "'" & tblname & "' successfully Packed!", MB_ICONEXCLAMATION
     End If
     Exit Sub
   PackErr:
     MsgBox Error$
     Exit Sub
   PackEnd:
   End Sub
Ahora solo debes utilizar código que invoque a la rutina...
   Dim db As Database
   Set db = OpenDatabase("c:\samples\foxtbl", False, False, "foxpro 2.5")
   Call Pack_DBF(db, "foxtbl")
   Db. Close
Ojalá te sirva, mucha suerte y sigue adelante!
Gazoo
Respuesta
1
Necesitaría alguna aclaración...
¿Cómo te conectar a la tabla de DBase IV?, a través de ODBC, ADO, etc...
¿Cuándo los borras usas el método 'delete' del recordset o lo haces a través de sentencias SQL 'DELETE * FROM Mitabla'?
La conexión es mediante ADO, cuando borro los registros he probado a hacerlo mediante el método "delete" del recordset y mediante una instrucción SQL, en los 2 casos los marca solamente.
Saludos...
Mándame tu correo electrónico y te enviaré un ejemplo de cómo hacerlo.
Mi dirección es [email protected]
Muchas Gracias
Te acabo de mandar el ejemplo a tu dirección de correo.
Respuesta
1
Nunca he trabajado con dbaseIV, pero recuerdo haber tenido el mismo problema con Access. En access sucede por que la conexión se mantenía abierta (la base de datos estaba abierta). Cuando la cerraba, las filas "marcada para borrar" ("marked for deletion" es el termino con que se conoce este asunto) se borraban definitivamente de la base de datos.
Puedes probar haciendo lo mismo y cuéntame si te funciona. Si tienes alguna otra duda, y te puedo ayudar, ya sabes donde encontrarme.
Patrick
Ya he solucionado el tema pero creando una tabla con los registros que quiero que permanezcan. Ya probé lo que me aconsejaste pero seguía todo igual. Muchísimas gracias por tu ayuda
Respuesta
1
No me dices que motor de b.d. estás usando, pero vamos, supongo que una instrucción sql del tipo Delete no debería dejarlos marcados, sino borrarlos completamente. No obstante el método compactDatabase quizá te los quite de encima...
Ya probé con "compactDatabase" pero seguía marcándolos. Lo he solucionado creando una tabla aparte con los registros que me interesan.
Muchas gracias por todo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas