Dan Waters
dwaters at usinternet.com
Wed Aug 25 09:12:27 CDT 2004
Hello to All!
I've believed for a while that setting Compact On Close for the FE would
also compact the BE. But a little testing disproved that. For the BE to
auto-compact, it must actually be opened by the Access application and then
closed.
With some help from Stephen Bond, I was able to put together this code to
compact the BE
when the FE is closed by the last person.
Two things about the BE: First - you must set its Compact On Close option to
true. Second - avoid User Security on the BE or your users will be asked to
enter their user name and password as they are shutting down their FE.
You should be controlling the FE so that pushing an Exit or Quit button is
the only way the FE can be closed. (Discussed in previous posts.) When you
push that button, call the CompactBE procedure immediately before using the
DoCmd.Quit method.
I've used this successfully at one customer site. I hope this will work for
everyone - if you see any problems with this then speak up!
Thanks!
Dan Waters
ProMation Systems, Inc.
PS - I'm going to try to see if this is publishable information.
'-- Paste the following into a Standard Module titled 'Compact BE'
Option Compare Database
Option Explicit
Public Sub CompactBE()
On Error GoTo EH
Dim stgPath As String
Dim blnExclusive As Boolean
Dim appAccess As Access.Application
Dim varReturn As Variant
If CountCurrentUsers > 1 Then
Exit Sub
End If
stgPath = "\\ServerPath\SystemFolder\BackEnd\BE.mdb"
'-- Keep users out while the BE is compacting
blnExclusive = True
Set appAccess = New Access.Application
varReturn = SysCmd(acSysCmdSetStatus, "Compacting BE")
appAccess.OpenCurrentDatabase stgPath, blnExclusive
'-- When the BE closes it will auto-compact. And it happens quickly!
appAccess.CloseCurrentDatabase
appAccess.Quit
varReturn = SysCmd(acSysCmdClearStatus)
Exit Sub
EH:
Application.Echo True
Call GlobalErrors("", Err.Number, Err.Description, "Compact BE",
"CompactBE")
End Sub
Public Function CountCurrentUsers() As Integer
On Error GoTo EH
Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim stgAccessVersion As String
Dim intUserCount As Integer
Dim stgUserName As String
stgAccessVersion = SysCmd(acSysCmdAccessVer)
'-- The user roster is exposed as a provider-specific schema rowset _
in the Jet 4.0 OLE DB provider. You have to use a GUID to _
reference the schema, as provider-specific schemas are not _
listed in ADO's type library for schema rowsets
Select Case stgAccessVersion
Case "9.0"
'-- This is from MSKB 198755 and is specific to Access 2000
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=\\ServerPath\SystemFolder\FrontEnd\FE.mdb"
Case "10.0"
'-- This is from MSKB 285822 and is specific to Access 2002 or
2003
Set con = CurrentProject.Connection
Case "11.0"
'-- This is from MSKB 285822 and is specific to Access 2002 or
2003
Set con = CurrentProject.Connection
End Select
Set rst = con.OpenSchema(adSchemaProviderSpecific, ,
"{947bb102-5d43-11d1-bdbf-00c04fb92675}")
If rst.EOF = False Then
Do While rst.EOF = False
stgUserName = Left$(rst.Fields(1), InStr(1, rst.Fields(1),
Chr(0)) - 1)
If stgUserName <> "Admin" Then
intUserCount = intUserCount + 1
End If
rst.MoveNext
Loop
CountCurrentUsers = intUserCount
Else
CountCurrentUsers = 0
End If
rst.Close
Set rst = Nothing
Exit Function
EH:
Application.Echo True
Call GlobalErrors("", Err.Number, Err.Description, "Count Current
Users", "CountCurrentUsers")
End Function