[AccessD] Compact BE on Close - An Example

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





More information about the AccessD mailing list