Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

dbase 'Pack'

Posted on 1997-03-21
1
Medium Priority
?
1,028 Views
Last Modified: 2012-05-04
How do you 'pack' a dbase file in VB3 (or 4 for that matter). I have deleted loads of records and wish to reclaim the space.      
0
Comment
Question by:hughm
1 Comment
 
LVL 2

Accepted Solution

by:
dirkmartin earned 140 total points
ID: 1424427
Here you go....


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

This will filter out deleted records so they do not appear in recordsets.

To perform a ZAP, you simply need to run a DELETE action query. For example, the following sample marks all the records in the AUTHORS.DBF table as deleted:

   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.

For extremely large tables, it is more efficient to delete the Tabledef representing the table from the TableDefs collection of the database and then re-create the table structure.

The following subroutine shows you how to perform a PACK. Essentially, you copy all the records to a new temporary table, delete the old one, then rename the temporary table as the original name.

Sample Code

   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

The following example code shows you how to call the above subroutine. First, you open the database the table is in, then you pass the database object and the name of the table to PACK to the subroutine. Be sure that there are not any open recordsets on the table you are trying to pack or you will get an error.

   '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

The above methods do not preserve formatting of numeric fields for our dBASE and FoxPro tables. To work around this limitation you should keep a template DBF file created from dBASE or FoxPro that contains the formatting you need, and use an INSERT INTO statement instead of the SELECT INTO statement shown above.
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

782 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question