PDA

Vollständige Version anzeigen : Beim Schließen komprimieren-Multiuserumgebung


Access_Neuling
27.03.2006, 16:12
Hallo,
ich hab eine kleine Datenbank in einer Multiuser Umgebung im Einsatz (in FE und BE getrennt), die sich regelmäßig aufbläht. Durch komprimieren und reparieren wird sie wieder deutlich kleiner. In den Optionen kann man einstellen das beim schließen der Datenbank automatisch komprimiert wird. Meine Frage ist nun wie das in einer Multiuser Umgebung funktioniert? Findet das komprimieren statt, wenn der letzte User die Datenbank schließt oder wenn mehrere User in der Datenbank sind bei jedem der die Datenbank schließt?
Hat jemand Erfahrung damit?

Access_Neuling :)

a0053
27.03.2006, 16:38
Bei FE/BE-Trennung betrifft diese Einstellung nur das FE, da das BE nicht "normal" geöffnet ist.
Wenn Du das BE komprimieren willst geht das sowieso nur wenn kein User mehr verbunden ist. Ich mache soetwas gerne auch über einen kleinen Batch, das dann z.B. Sonntags als geplanter Vorgang läuft.

Gruß,
Carsten

Access_Neuling
27.03.2006, 16:47
Hallo Carsten,
vielen Dank für die Antwort. Kannst Du mir den Batch mal erklären??

Access_Neuling

Ich würdeja schon gerne die integrierte Funktion von Access nutzen. Aber nur dann wenn ich weiß was Access in der Multiuserumgebung treibt.

a0053
27.03.2006, 17:12
@echo off

set DB=deine_datenbank.mdb
set WRKGRP=
rem set WRKGRP=/wrkgrp hier_ggf_MDW_Datei_mit_Pfad
set USERPWD=
rem set USERPWD=/user hier_ggf_User /pwd hier_Passwort

msaccess.exe %WRKGRP% %DB% /compact %TEMP%\tmp_comp_db.mdb %USERPWD%
if not errorlevel 0 goto error
del %DB%
copy %TEMP%\tmp_comp_db.mdb %DB%

:exit
exit
:error


Wenn Du eine Arbeitsgruppendatei verwendest musst Du die auskommentierten Zeilen entkommentieren und modifizieren.

Access_Neuling
28.03.2006, 07:41
Hallo Carsten,
vielen Dank für die Batch Datei. Werde das mal an einer kleinen lokalen Datenbank testen.

Access_Neuling :boah:

Andre.Heisig
28.03.2006, 17:30
das geht auch access-intern ... folgendes in ein modul =>

'**************** Code Start **************
' FUNKTION: komprimiert das Backend, sofern möglich (Zugriff)
' und Schwellgrösse erreicht.
' AUFRUF: BackendKomprimieren "Pfad_und_Name_der_zu_komprimierenden.mdb"
' VERWENDUNG: Exit-Button Hauptmenu

Public Sub Datenbank_BackendKomprimieren(BackendFile As String, maxMegaByte As Double)
On Error GoTo Err_BackendKomprimieren

DoCmd.Hourglass True

Dim strFile As String
Dim varDummyPath As Variant
Dim varDummyFile As Variant
strFile = Dir(BackendFile)
varDummyPath = Left$(BackendFile, Len(BackendFile) - Len(strFile))
varDummyFile = varDummyPath & "EMPB_TEMP.MDB"

If FileLen(BackendFile) > maxMegaByte * 1024 * 1024 Then
DBEngine.CompactDatabase BackendFile, varDummyFile
Kill BackendFile
Name varDummyFile As BackendFile
End If

Exit_BackendKomprimieren:
DoCmd.Hourglass False
Exit Sub

Err_BackendKomprimieren:
Select Case Err.Number
Case 3005, 3024, 53, 3044, 76
'MsgBox "Backend konnte nicht gefunden werden.", vbOKOnly
Case 3196, 3356
'MsgBox "Backend wird zur Zeit verwendet.", vbOKOnly
Case Else
MsgBox "Ausnahme Nr. " & Err.Number & " => " & Err.Description
End Select
Resume Exit_BackendKomprimieren
End Sub
'**************** Code End **************






'**************** Code Start **************
' FUNKTION: Automatisches Komprimieren des Frontends
' beim Schliessen, wenn angegebene Dateigrösse erreicht.
' VERWENDUNG: HAUPTMENU und TIMEOUT.
Public Sub Datenbank_FrontendKomprimieren(FrontendFile As String, maxMegaByte As Double)
On Error GoTo Err_FrontendKomprimieren

DoCmd.Hourglass True
If FileLen(FrontendFile) > maxMegaByte * 1024 * 1024 Then
Application.SetOption ("Auto Compact"), True
End If
DoCmd.Hourglass False

Exit_FrontendKomprimieren:
Exit Sub

Err_FrontendKomprimieren:
MsgBox Err.Number & " - " & Err.Description
Resume Exit_FrontendKomprimieren

End Sub
'**************** Code Start **************

und das hier in den exit-application button (oder das passende event) =>

Private Sub btn_ExitApplication_Click()
If MsgBox("EMPB-Datenbank wirklich beenden ?", vbYesNo + vbQuestion, "Bestätigen ...") = vbYes Then
Call Datenbank_FrontendKomprimieren(CurrentDb.name, MaxGrösse)
Call Datenbank_BackendKomprimieren ("UNC_ZUM_BACKEND.MDB", MaxGrösse) End If
End Sub

... und schon hast du eine lösung á la "der letzte macht die tür zu", die auf keine batch angewiesen ist, sondern aus der DB selbst heruas gesteuert wird.

wenn du das mit einer lösung kombinierst, die die DB "nach X minuten
untätigkeit" oder zu einem festgelegten zeitpunkt schliesst, ist auch das offen stehen lassen der applikation kein grund mehr, das backend am nächsten morgen nicht auf dem sicherungsband zu haben :grins:

andre.

Access_Neuling
29.03.2006, 07:20
Hallo Andre,
vielen Dank für die Antwort. Hab das mal ausprobiert. Funktioniert prima.
Vielen dANK

Access_Neuling :mrcool:

Andre.Heisig
29.03.2006, 07:57
büdde. gerne.

blumen und lobpreisungen hier ans forum, die lösungen sind ziemlich alle hier zusammengesucht ... :grins: :grins: :grins:

andre.