Hallo zusammen,
habe ein blödes Problem, ich erörte mal eben:
In meiner Datenbank gibt es eine Anfügeabfrage die mit einem eindeutigen Index arbeitet und jeder ID gewisse Datensätze hinzufügt. Jede ID welche diese Datensätze schon hat, wird dann durch den eindeutigen index ignoriert. Werden jetzt bei der Eingabe 3... neue IDs hinzugefügt und die Abfrage ausgeführt, ohne vorher zu komprimieren, bläht sich das Backend ja immens auf. Irgendwann kommt dann ein Speicherplatzproblem bei uns (Das Netzlaufwerk hat nur 1 GB Datenvolumen)
Normalerweise komprimiere ich das Backend immer wenn das Frontend geschlossen ist und kein Netzwerkuser mehr auf dies zugreift.
Hier wurde der VBA Code von DonKarl benutzt mit dem unsichtbaren Formular, in dem alle Verbindungen zum Backend aufgelöst werden und dann über ein Dummy komprimiert wird.
Das klappt auch alles super.
So jetzt aber mein neuer Ansatz und das Problem damit:
Ich möchte jedesmal wenn diese Anfügeabfrage genutzt wurde das Backend komprimieren, also habe ich einfach in dem FormularModul wo diese ausgeführt wird, die Sub von dem unsichtbaren Formular aufgerufen. Das klappt aber nicht WEIL dadurch nicht die Verbindung zum Backend getrennt wird.
Ich vermute das die Verbindung erst gelöst wird, wenn die Sub nach dem aufrufen vom FormUnload des unsichtbaren Formulares wieder zurück springt und dann nach dem End Sub.
in diesem Fall hat der Code im Form_unload des unsichtbaren Forms aber nichts gemacht, da die Verbindung zum Backend noch bestanden hat.
Hier nochmal die Codepassagen:
Private Sub Registersteuerelement_Change()
On Error GoTo Fehlerbehandlung
Select Case Me!Registersteuerelement
Case "0"
Case "1"
DoCmd.SetWarnings False
If Nz(DLookup("F_MitarbeiterID", "qryPruefenObQualiZugewiesen", "F_MitarbeiterID = " & Me!MitarbeiterID)) = 0 Then
MsgBox "Qualifikationen werden erzeugt, dieser Vorgang kann einige Minuten in Anspruch nehmen!", vbInformation + vbOKOnly, "Qualifikationen erzuegen"
DoCmd.OpenQuery "AddQualisZuMitarbeitern"
'//hier eine Komprimierung durchführen
Call Form_frmUnsichtbarBeimStart.Form_Unload(0) '<-- Aufruf zum Komprimieren!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' //Dies wieder aktivieren, wenn nicht mehr komprimiert werden muss
' Form_frmStammdaten.Requery
' DoCmd.GoToRecord , , acLast
' Form_frmStammdaten!ListFeldSuche.Requery
End If
DoCmd.SetWarnings True
Case "4"
If Me!frmDienstkleidung.SourceObject = "frmDienstkleidung" Then
Else
Me!frmDienstkleidung.SourceObject = "frmDienstkleidung"
End If
Case "3"
If Me!frmMitarbeiterAtemschutzUebung.SourceObject = "frmMitarbeiterAtemschutzUebung" Then
frmMitarbeiterAtemschutzUebung.Requery
Else
Me!frmMitarbeiterAtemschutzUebung.SourceObject = "frmMitarbeiterAtemschutzUebung"
End If
End Select
Exit Sub
Fehlerbehandlung:
If MsgBox("Fehlercode: " & Err.Number & vbCrLf & vbCrLf & Err.Description & vbCrLf & vbCrLf & "Admin informieren wo der Fehler aufgetreten ist.", vbOKOnly + vbCritical, "Ein Fehler ist aufgetreten!") = vbOK Then
End If
On Error GoTo 0 'Fehlerbehandlung zurücksetzten
Err.Clear 'Fehlerobjekt wieder leeren
Resume Next 'In der Zeile NACH dem Fehler weiter machen.
End Sub
und hier der Code zum komprimieren:
Public Sub Form_Unload(Cancel As Integer)
Dim strForm As String
Do While Forms.Count > 1
If Forms(0).Name = Me.Name Then
DoCmd.Close acForm, Forms(1).Name
Else
DoCmd.Close acForm, Forms(0).Name
End If
Loop
Sleep 2000
If Len(Dir(CurrentProject.Path & "\Personaldaten_be.laccdb")) = 0 Then BackendKomprimieren
End Sub
Public Function BackendKomprimieren() As Boolean
On Error GoTo e:
'Dieses wird benutzt
Dim strBackend As String
Dim strBackendPfad As String
Dim strBackendTemp As String
Dim strBackendEndung As String
strBackend = DLookup("Database", "MSysObjects", "Name = 'tblMitarbeiter'")
If Not Len(Dir(strBackend)) = 0 Then
strBackendPfad = Mid(strBackend, 1, InStrRev(strBackend, "\"))
strBackendEndung = Mid(strBackend, InStrRev(strBackend, "."))
strBackendTemp = strBackendPfad & "BackendTemp_" & Format(Now, "yyyymmdd_hhnnss") & strBackendEndung
'Ohne Kennwortschutz:
'DBEngine.CompactDatabase strBackend, strBackendTemp
'Mit Kennwortschutz:
DBEngine.CompactDatabase strBackend, strBackendTemp, , , ";pwd=HierStehtWasAnderes"
Name strBackend As strBackend & "_kill" & strBackendEndung
Name strBackendTemp As strBackend
Kill strBackend & "_kill" & strBackendEndung
End If
Exit Function
e:
If Err.Number = 3704 Then
Debug.Print Err.Description
Exit Function
Else
MsgBox "Fehler beim komprimieren!" & vbCrLf & Err.Number & vbCrLf & vbCrLf & Err.Description, vbCritical + vbOKOnly
Exit Function
End If
End Function
PS: Wie kann ich in einem CodeTag Hier in Rot Schrift einfärben?
Grüße
ZitatJede ID welche diese Datensätze schon hat, wird dann durch den eindeutigen index ignoriert.
Sollte man nicht besser nur jene Datensätze anfügen, die gefragt sind? Müllvermeidung statt Müllaufräumen?
Da gebe ich dir recht, das wäre auch meine längerfristige Lösung . Ich hoffte allerdings das zeitweilig umgehen zu können.
Nach Deinen Worten könnte man glauben, eine zusätzlich eingefügte Inkonsistenzprüfung wäre ein Riesenakt.
Zitat
Ich vermute das die Verbindung erst gelöst wird, wenn die Sub nach dem aufrufen vom FormUnload des unsichtbaren Formulares wieder zurück springt und dann nach dem End Sub.
Ich auch. Auf die Idee, ein anderes Formular zu benutzen, um sich selber schließen zu lassen, muss man erst mal kommen. Einfach wäre anders: Sich selber schließen und ein wirklich ungebundenes Fomular für Maßnahmen öffnen.