Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Xoar am September 18, 2019, 09:35:12

Titel: Backend komprimieren aus VBA
Beitrag von: Xoar am September 18, 2019, 09:35:12
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
Titel: Re: Backend komprimieren aus VBA
Beitrag von: ebs17 am September 18, 2019, 16:10:28
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?
Titel: Re: Backend komprimieren aus VBA
Beitrag von: Xoar am September 18, 2019, 16:32:51
Da gebe ich dir recht, das wäre auch meine längerfristige Lösung . Ich hoffte allerdings das zeitweilig umgehen zu können.

Titel: Re: Backend komprimieren aus VBA
Beitrag von: ebs17 am September 18, 2019, 23:08:08
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.