Article ID: 119116
Article Last Modified on 10/30/2003
dBASE and FoxPro database systems do not physically delete records, but merely mark them for deletion at a later time. You must pack the .DBF file (using your own utilities) to remove these records from the .DBF files. The CompactDatabase function will not affect attached tables.
[dBase ISAM] Deleted=On
Dim db As database
Set db = OpenDatabase("c:\dBaseIII", false, false, "dBase III")
'Open the database.
db.Execute "Delete From Authors" 'Execute the delete action query.
db.Close 'Close the database.
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
'To open file C:\SAMPLES\FOXTBL.DBF
Dim db As Database
Set db = OpenDatabase("c:\samples\foxtbl", False, False, "foxpro 2.5")
Call Pack_DBF(db, "foxtbl")
db.Close
Additional query words: 3.00
Keywords: KB119116