Announcement

Collapse
No announcement yet.

Unter Access 2010 per VBA die akt. Datenbank kompr. u. rep.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unter Access 2010 per VBA die akt. Datenbank kompr. u. rep.

    Hallo Leute,

    ich habe hier ein Problem:

    Ich setze seit ein paar Tagen MS-Access 2010 ein (und kann auch nicht zurück, leider leider ...).
    Nun möchte ich aus dem VBA-Programmcode zwei Befehle absetzen:

    _________________________________________

    Punkt 1:

    Befehl "Datenbank Komprimieren und reparieren" der
    aktuell geöffneten Datenbank (Frontend der Anwendung).

    _________________________________________

    Punkt 2:

    Befehl "Datenbank Komprimieren und reparieren" einer
    anderen Datenbank (Backend der Anwendung).


    _________________________________________


    Punkt 2 habe ich gerade getestet.
    Funktioniert super (siehe http://www.donkarl.com/FAQ/FAQ6VBA.htm#6.7).

    Bei Punkt 1 komme ich überhaupt nicht weiter.
    Die Beispiele bei DONKARL gelten für die Versionen 97, 2000, XP, 2003 (siehe http://www.donkarl.com/FAQ/FAQ6VBA.htm#6.6).

    Es ist so:

    Ich möchte das Komprimieren und reparieren manuell starten (aus dem VBA-Code) und zwar an verschiedenen Stellen in der Anwendung.

    Was ich bereits programmiert habe, ist, zu untersuchen, ob ich allein im Frontend bin.
    Überprüfe zu diesem Zweck die *.ldf. Klappt auch prima.

    Aber wie geht's weiter?

    Mit SendKeys habe ich es auch probiert. Geht auch nicht.
    Hat jemand einen Tipp für mich?

    Ich glaube, dieses Thema (Komprimieren und reparieren der aktuell geöffneten Datenbank) wird häufig in Foren nachgefragt.
    Aber die Betroffenen arbeiten alle mit älteren Access-Versionen und können auf die Lösungen bei DONKARL zurückgreifen.

    Freue mich über Ideen/Anregungen/Lösungen.

    Gruß aus Stuttgart

    Thomas

  • #2
    Hallo,

    ich habe dazu auch nichts passendes gefunden und mir letztlich so geholfen (Herzlichen Dank an Frank D. für den Batch - Code und die Idee!!!):

    1. Setzen der Option "Beim Schließen komprimieren"
    2. Schreiben einer Batchdatei, die die aktuelle DB neu startet
    3. Aufruf dieser batch und schließen der DB
    4. Nach Neustart an geeigneter Stelle die Option "Beim Schließen komprimieren" wieder zurücksetzen.

    Muss man sich zwar neu anmelden, klappt aber ansonsten zufriedenstellend

    [highlight=vb]


    Private Sub Neustart()
    Dim batch As String
    Dim clientname As String
    Dim path As String

    Application.SetOption "Auto Compact", True 'false nach Neustart irgendwo setzen

    path = Application.CurrentProject.FullName
    batch = ExtractFilePath(path) & "Restart.bat"
    Open batch For Output As #1

    Print #1, Left(path, 2)
    Print #1, "cd " & ExtractFilePath(path)

    Print #1, "echo."
    Print #1, "echo 1. Warten auf Beendigung des Programms ..."
    Print #1, ":nochoffen"
    Print #1, "if exist " & ChangeFileExt(ExtractFileName(path), "laccdb") & " goto nochoffen"

    Print #1, "echo."
    Print #1, "echo 2. Neustart wird ausgefuehrt."
    Print #1, "start " & ExtractFileName(path)

    Close #1

    Shell batch, vbNormalFocus

    Application.Quit acQuitSaveAll
    End Sub

    'Aus einem vollständigen Dateipfad den Namen der Datei ermitteln
    Function ExtractFilePath(sPath As String) As String
    Dim blPos As Integer

    If Len(sPath) > 0 Then
    For blPos = Len(sPath) To 1 Step -1
    If mid(sPath, blPos, 1) = "\" Then
    ExtractFilePath = Left(sPath, blPos)
    Exit Function
    End If
    Next blPos
    ' es wurde nur ein nakter Dateiname übergeben
    ExtractFilePath = ""
    Else
    ExtractFilePath = ""
    End If

    End Function

    'Aus einem vollständigen Dateipfad den Namen der Datei ermitteln
    Function ExtractFileName(sPath As String) As String
    Dim blPos As Integer

    If Len(sPath) > 0 Then
    For blPos = Len(sPath) To 1 Step -1
    If mid(sPath, blPos, 1) = "\" Then
    ExtractFileName = Right(sPath, Len(sPath) - blPos)
    Exit Function
    End If
    Next blPos
    ' es wurde nur ein nakter Dateiname übergeben
    ExtractFileName = sPath
    Else
    ExtractFileName = ""
    End If

    End Function

    'Die Dateiendung Ändern
    Function ChangeFileExt(sfname As String, sNewExt As String) As String
    Dim blPos As Integer
    Dim result As String

    result = sfname
    If Len(sfname) > 0 Then
    For blPos = Len(sfname) To 1 Step -1
    If mid(sfname, blPos, 1) = "." Then
    result = Left(sfname, blPos) ' == einschliesslich '.'
    If Left(sNewExt, 1) = "." Then
    result = Left(result, Len(result) - 1) & sNewExt
    Else
    result = result & sNewExt
    End If
    Exit For
    End If
    Next blPos
    End If

    ChangeFileExt = result

    End Function

    [/highlight]
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Hallo tinof,

      vielen Dank für den Code. Ich mache es jetzt auch mit

      Application.SetOption "Auto Compact", True

      Klappt prima. Und das Komprimieren des Backends geht sowieso ganz leicht - habe im WWW sogar drei verschiedene Varianten gefunden.

      Gruß aus Stuttgart

      Thomas

      Comment


      • #4
        Originally posted by tschroeder View Post
        Und das Komprimieren des Backends geht sowieso ganz leicht - habe im WWW sogar drei verschiedene Varianten gefunden.
        Komprimiern der 'laufenden' Anwendung auch ohne Neustart, quasi wie beim Aufruf aus dem Office - Menü? Das würde mich mal interessieren, kannst du da bitte mal einen Hinweis posten?

        Danke!
        Tino
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment

        Working...
        X