Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Backend per VBA komprimieren

194 views
Skip to first unread message

Gerhard Förster

unread,
May 7, 2012, 5:44:53 AM5/7/12
to
Hallo und Moin, Moin,

ich möchte, dass meine Backend DB beim Schließen des Frontends
automatisch komprimiert wird.

dazu habe ich beim Schließen des HFO vom Frontend den Funktionsaufruf
compress_db geschrieben.

.....
compress_db
application quit. Das funktioniert.

In der Funktion compress_db bestimme ich die Namen der Backend Db und
der Zieldatei in der diese komprimiert werden soll:
s1 = rs!act_DB
s2 = Get_FilePath(s1) & "COMP1.MDE"

anschließend wird das HFO geschlossen und die gelinkten Tabellen
gelöscht:
DoCmd.Close acForm, "A_FRM_Bill"
TBL_DisConnect

dann folgt der Aufruf zum komprimieren und reparieren:
if RepairDB (s1, s2)

Leider landet der Aufruf zum Komprimieren immer im Fehlercode, dass
die Datei nicht komprimiert werden kann.
Führe ich die Funktion seperat aus, ohne dass die Frontent Anwendung
gestartet wurde, funktioniert alles Bestens.
Ich denke, dass liegt daran, das noch irgendwelche Objekte offen sind,
obwohl Verbindung zu den gelinkten Tabellen gelöscht und auch das
Hauptformular geschlossen wurde.

Wie kann ich erreichen, dass alle störenden Objekte / Referenzen /
Links geschlossen werden, so dass das Komprimieren funktioniert.

Die Funktion zu Reparieren sieht so aus:
Public Function RepairDB(strSource As String, strDestination As
String) As Boolean
On Error GoTo error_handler
RepairDB = Application.CompactRepair(SourceFile:=strSource,
DestinationFile:=strDestination)
On Error GoTo 0
Exit Function
error_handler:
RepairDB = False
End Function

Das ganze läuft unter Access 2003 / XP

Wer kann helfen, wer weiß Rat

Danke im Voraus
Gruß Gerhard





Winfried Sonntag

unread,
May 7, 2012, 1:59:07 PM5/7/12
to
Am 07.05.2012 schrieb Gerhard Förster:


> ich möchte, dass meine Backend DB beim Schließen des Frontends
> automatisch komprimiert wird.

Gibt es dafür einen bestimmten Grund? Normalerweise braucht man das BE
nicht bei jedem schliessen des FE zu komprimieren.

> anschließend wird das HFO geschlossen und die gelinkten Tabellen
> gelöscht:
> DoCmd.Close acForm, "A_FRM_Bill"
> TBL_DisConnect

Hat das Formular eine Datensource? Wenn ja, versuch das ganze aus
einem Formular heraus aufzurufen, das keine Datensource hat. Schließe
manuell das Formular und prüf ob das Backend noch eine LDB offen hat.
Wenn ja, dann ist noch etwas offen. Sobald das Backend keine LDB mehr
erzeugt hat, dann kannst Du das Backnd auch komprimieren.

Servus
Winfried
--
Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
Community Forums NNTP Bridge: http://communitybridge.codeplex.com/
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Access-Stammtisch: http://www.access-muenchen.de

Wolfgang Badura

unread,
May 7, 2012, 5:13:59 PM5/7/12
to
Hallo Winfried!
"Winfried Sonntag" <Winfried...@gmx.de> schrieb im Newsbeitrag
news:1n1so1lo...@ID-163725.user.individual.de...
> Am 07.05.2012 schrieb Gerhard Förster:
>
>
>> ich möchte, dass meine Backend DB beim Schließen des Frontends
>> automatisch komprimiert wird.
>
> Gibt es dafür einen bestimmten Grund? Normalerweise braucht man das BE
> nicht bei jedem schliessen des FE zu komprimieren.
>
>> anschließend wird das HFO geschlossen und die gelinkten Tabellen
>> gelöscht:
>> DoCmd.Close acForm, "A_FRM_Bill"
>> TBL_DisConnect
>
> Hat das Formular eine Datensource? Wenn ja, versuch das ganze aus
> einem Formular heraus aufzurufen, das keine Datensource hat. Schließe
> manuell das Formular und prüf ob das Backend noch eine LDB offen hat.
> Wenn ja, dann ist noch etwas offen. Sobald das Backend keine LDB mehr
> erzeugt hat, dann kannst Du das Backnd auch komprimieren.

Die Diskussion hier betrifft wohl jeden, der eine FE-BE-Lösung verfaßt hat.

Die Komprimierung des Backends führe ich allerdings immer außerhalb des
Frontends
mit VBS oder mit einem VB (6 oder Net)-Programm aus.
Sollte die LDB aber vorhanden sein wird die Komprimierung ausgesetzt.

Und jetzt die Frage an Dich:
Was tust Du, um irgendwann eine Komprimierung durchführen zu können?

Wolfgang


Winfried Sonntag

unread,
May 7, 2012, 5:56:21 PM5/7/12
to
Am 07.05.2012 schrieb Wolfgang Badura:


> "Winfried Sonntag" <Winfried...@gmx.de> schrieb im Newsbeitrag

> Und jetzt die Frage an Dich:
> Was tust Du, um irgendwann eine Komprimierung durchführen zu können?

Das kommt ganz auf die Anwendung an. Ich hatte Backends, die wurden
regelmäßig mittels geplantem Task komprimiert, bei anderen wurde nach
jedem Import, der täglich durchgeführt wurde, komprimiert und
repariert. Andere Backends werden manuell bei Bedarf komprimiert.

Gerhard Förster

unread,
May 9, 2012, 9:17:54 AM5/9/12
to
On 7 Mai, 23:13, "Wolfgang Badura" <WolfgangBad...@aon.at> wrote:
> Hallo Winfried!
> "Winfried Sonntag" <Winfried.Sonn...@gmx.de> schrieb im Newsbeitragnews:1n1so1lo...@ID-163725.user.individual.de...
>
>
>
>
>
>
>
>
>
> > Am 07.05.2012 schrieb Gerhard Förster:
>
> >> ich möchte, dass meine Backend DB beim Schließen des Frontends
> >> automatisch komprimiert wird.
>
> > Gibt es dafür einen bestimmten Grund? Normalerweise braucht man das BE
> > nicht bei jedem schliessen des FE zu komprimieren.
>
> >> anschließend wird das HFO geschlossen und die gelinkten Tabellen
> >> gelöscht:
> >>    DoCmd.Close acForm, "A_FRM_Bill"
> >>    TBL_DisConnect
>
> > Hat das Formular eine Datensource? Wenn ja, versuch das ganze aus
> > einem Formular heraus aufzurufen, das keine Datensource hat. Schließe
> > manuell das Formular und prüf ob das Backend noch eine LDB offen hat.
> > Wenn ja, dann ist noch etwas offen. Sobald das Backend keine LDB mehr
> > erzeugt hat, dann kannst Du das Backnd auch komprimieren.
>
> Die Diskussion hier betrifft wohl jeden, der eine FE-BE-Lösung verfaßt hat.
>
> Die Komprimierung des Backends führe ich allerdings immer außerhalb des
> Frontends
> mit VBS oder mit einem VB (6 oder Net)-Programm aus.
> Sollte die LDB aber vorhanden sein wird die Komprimierung ausgesetzt.
>

Meine Frage ist ja nun die, wie bekomme ich das Backend in einen
solchen Zustand, dass keine LDB-Datei mehr vorhanden ist.
Gibt es so eine Möglichkei wie "CLOSE alles", sa dass die LDB Datei
dann auch gelöscht wird?

Gerhard

Raimo Becker

unread,
May 9, 2012, 10:06:46 AM5/9/12
to

Raimo Becker

unread,
May 9, 2012, 9:58:18 AM5/9/12
to
Hallo Gerhard,

> Gibt es so eine Möglichkei wie "CLOSE alles", sa dass die LDB Datei
> dann auch gelöscht wird?

Schau mal nach "CloseAllOpenObjects" und oder "CloseAllRecordsets".
Ersteres benutze ich in ein/zwei Tools um dann zu komprimieren.

Gruß
Raimo

Winfried Sonntag

unread,
May 15, 2012, 1:08:59 AM5/15/12
to
Am 09.05.2012 schrieb Gerhard Förster:

> Meine Frage ist ja nun die, wie bekomme ich das Backend in einen
> solchen Zustand, dass keine LDB-Datei mehr vorhanden ist.
> Gibt es so eine Möglichkei wie "CLOSE alles", sa dass die LDB Datei
> dann auch gelöscht wird?

Wenn Du ein Frontendformular hast, in dem keine Tabellen geöffnet
werden, egal ob mit Abfrage oder direkt, hast Du gute Chancen das so
zu bekommen.

Peter Doering

unread,
May 15, 2012, 2:43:40 AM5/15/12
to
Hallo,

Gerhard Förster wrote:

> [...]
> s1 = rs!act_DB
> s2 = Get_FilePath(s1) & "COMP1.MDE"
>
> anschließend wird das HFO geschlossen und die gelinkten Tabellen
> gelöscht:
> DoCmd.Close acForm, "A_FRM_Bill"
> TBL_DisConnect

Zeig mal diese Prozedur.

> dann folgt der Aufruf zum komprimieren und reparieren:
> if RepairDB (s1, s2)
>
> Leider landet der Aufruf zum Komprimieren immer im Fehlercode, dass
> die Datei nicht komprimiert werden kann.
> Führe ich die Funktion seperat aus, ohne dass die Frontent Anwendung
> gestartet wurde, funktioniert alles Bestens.
> Ich denke, dass liegt daran, das noch irgendwelche Objekte offen sind,
> obwohl Verbindung zu den gelinkten Tabellen gelöscht und auch das
> Hauptformular geschlossen wurde.
>
> Wie kann ich erreichen, dass alle störenden Objekte / Referenzen /
> Links geschlossen werden, so dass das Komprimieren funktioniert.

Fuer die Objekte hast du ja schon Loesungen bekommen. Fuer die Referenzen
bist du selbst verantwortlich. Also immer darauf achten, dass Recordsets
geschlossen und Referenzen vernichtet werden.

Falls du damit nicht weiterkommen solltest, gaebe es noch einen Workaround:

- Compact/Repair-Funktion in andere mdb auslagern.
- Vor Application.Quit per z.B. FollowHyperlink die andere mdb aufrufen und
die beiden Dateinamen mitgeben.

Vor dem Aufruf von Repair_DB solltest du einen Sleep 2000 oder so einbauen,
um dem Frontend 2 sec Zeit zu geben, sich zu schliessen und damit die ldb
freizugeben.

Gruss - Peter

--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
0 new messages