How to ZAP or PACK a dBASE or FoxPro TableID: Q119116
|
The following passage appears in the "Professional Features," Book 2,
page 141:
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.
To be able to ZAP or PACK your .DBF files, you must have the following
entry in your VB.INI or <appname>.INI file:
[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 :
Version :
Platform :
Issue type :
Last Reviewed: June 25, 1999