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?
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
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.
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
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
Añade tu respuesta sólo si conoces la solución a la pregunta.
No lo utilices para hacer una nueva pregunta.
Para pedir más datos de la pregunta utiliza "Pedir más información".
Para aportar más información a una respuesta, añade un comentario.