Boogie Loogie
boogieloogie at gmail.com
Mon Mar 21 13:27:37 CST 2005
On Mon, 21 Mar 2005 11:03:25 -0400, Boogie Loogie
<boogieloogie at gmail.com> wrote:
> On Fri, 18 Mar 2005 22:09:36 -0000, Andy Lacey
> <andy at minstersystems.co.uk> wrote:
> > Hi BL
> > Presumably if you're using a dbf you have Clipper, Foxpro or something which
> > maintains it. Couldn't you write a small EXE in one of those and Shell to
> > it?
> >
> > -- Andy Lacey
> > http://www.minstersystems.co.uk
>
> Actually I do not have that. The GIS and GPS software I use read and
> write shapefiles...a native format. A shapefile has numerous ( for
> lack of a better term) subfiles one of which is a dbf.
>
> Anyway stay tuned I am working on a utility with Access. I will post
> it here when I am done.
>
> Cheers
>
> BL
>
FOR ACCESS 97:
Ok I have a rough draft of a packing utility. Some of the code came
from M$ web site and some from Experts-Exchange.
Opinions, improvements are welcomed. Basically the code replaces the
dbf with a new table with all of the 'junk' removed. It appears to be
working for me in my inital tests.
STEP 1:
In a new form create a combobox called cboTables
STEP 2:
in the rowsource of cboTables place the following:
SELECT MsysObjects.Name FROM MsysObjects WHERE
(((Left([Name],1))<>'~') AND ((Left([Name],4))<>'Msys') AND
((MsysObjects.Type)=6));
STEP 3:
Place a command button on the same form as cboTables and place this
code behind it:
Private Sub Command2_Click()
On Error GoTo Packman
Dim db As Database
Set db = CurrentDb()
If IsNull(Me!cboTables) Then
Beep
MsgBox "Select a table", vbInformation
Me!cboTables.SetFocus
Exit Sub
End If
Call rackempackem(db, Me!cboTables)
Exit Sub
Packman:
MsgBox Error$
Exit Sub
PackEnd:
End Sub
STEP 4:
Create a new module with the following:
Function tInstrRev(string1 As String, string2 As String)
Dim tPos As Long
tPos = InStr(1, string1, string2)
While InStr(tPos + 1, string1, string2) <> 0
tPos = InStr(tPos + 1, string1, string2)
Wend
tInstrRev = tPos
End Function
STEP 5:
Create a new module with the following:
Public Sub rackempackem(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 tdf As TableDef
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("Do you want to pack " & tblname & ".dbf?", flags)
If ret = IDYES Then
dbdir = Left$(db.Name, tInstrRev(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
For Each tdf In db.TableDefs
If tdf.Name = "p_a_c_k" Then
db.Execute "DROP TABLE p_a_c_k;"
End If
Next
'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.
'delete all records
db.Execute "DELETE *.* from " & tblname
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 & "' .dbf successfully Packed!", MB_ICONEXCLAMATION
DoCmd.TransferDatabase acExport, "dBase 5.0", "C:\GIS\SILVI\",
acTable, "P_A_C_K", tblname 'change path to suit your needs
'db.Execute "DROP TABLE P_A_C_K;" 'optional
DoCmd.TransferDatabase acLink, "dBase 5.0", "C:\GIS\SILVI\",
acTable, tblname, tblname 'change path to suit your needs
End If
RefreshDatabaseWindow
Exit Sub
PackErr:
MsgBox Error$
Exit Sub
PackEnd:
End Sub
Hopefully this is useful to someone.