PDA

Vollständige Version anzeigen : Aktion bei Schließen der DB


Storch
07.10.2011, 07:18
Hallo Accessgemeinde...

meine Zielstellung... ich will mir was konstruieren, dass mir regelmäßige Backups einer DB macht und das Backup mit der laufenden Versionsnummer versieht. Dazu einen Code zu formulieren sehe ich nicht als Schwierigkeit und ist nicht meine Frage. Diese lautet:

Kann ich an irgendeiner Stelle beim Öffnen oder Schließen(wäre mir am liebsten) die Ausführung von Code auslösen ohne ein Formular zu verwenden??????

Mit bestem Dank im Voraus....

avogt_at_home
07.10.2011, 07:58
Hallo,
Backups von Access aus zu machen halte ich für keine gute Idee, da zu viel Schief gehen kann.
Besser man kopiert das Backend mit Datum versehen per Windows Aufgabenplaner zu bestimmten Uhrzeiten oder bei Rechnerstart.

Andreas

Storch
07.10.2011, 08:43
Danke für die Antwort...
Ich bin mir jetzt nicht im Klaren, welche Risiken da bestehen, ich nehme es aber mal als gegeben hin. Eine Batch zu schreiben und diese über die 'geplanten Tasks' auszuführen scheint mir eine brauchbare Lösung.

Trotzdem hätte ich meine Frage aus #1 gern beantwortet. Würd' mich halt auch so interessieren, ob es da irgendwelche 'Angriffs'möglichkeiten gibt.

Atrus2711
07.10.2011, 08:56
Du könntest eine Funktion schreiben und diese in einem Makro ablegen. Dieses Makro könntest du durch ein Kommandozeilenargument (IIRC /x Makroname) beim Access-Start aufrufen.

Die Funktion müsste die Backenddatei kopieren. Das wird bei geöffnetem und verbundenem Frontend schwierig. Wenn es unbedingt Access sein muss, würde ich das in einer "Service-Datenbank" auslagern, die das macht und selbst nicht auf Tabellen des FE oder BE zugreift.

Aber grundsätzlich ist Datensicherung keine Aufgabe für Access.

Lanz Rudolf
07.10.2011, 09:20
Hallo
ich habe das einmal so gelöst:

•Access MDB (FE) als /Runtime gestartet
beim schliesen prüfen ob Daten Verändert sind
wenn das der Fall ist MDB schliessen und
zweite Access MDB auch als /Runtime Starten die, die BE-MDB Kopiert
die Kopie heist dann in einem BackupPfad so was SjjjjmmtthhmmssPROJ.mdb

ich könnte auch ein Muster mit allem drum und dran erstellen ;)
braucht jedoch zeit
ob ich das noch vor meiner nächsten Herz operation vom Dinstag 11.10.11 07:30 noch hin bekomme
kann ich nicht versprechen :(

fhentzsc
07.10.2011, 09:31
eine Übliche Methode um auf das Schließen der Datenbank zu reagieren ist ein verstecktes Formular, bei diesem bekommst Du mit dem Ereignis
Form_Close()
mit wenn das Formular geschlossen wird, und dieses wird auf jeden Fall auch geschlossen wenn die Accessanwendung pet ALT+F4 oder auf andere nicht von Dir angebotene Menümöglichkeiten geschlossen wird - ausser dem Abschuß durch den Taskmanager oder das PC-Ausschalten :grins: )


Gruß

Frank

ebs17
07.10.2011, 09:31
regelmäßige Backups einer DB
Was genau ist diese DB?

Ein Access-Backend kannst Du jederzeit kopieren und damit sichern, wenn Du sicherstellen kannst, dass es keine aktiven Zugriffe darauf gibt wie
- offene gebundene Formulare inkl. Listen- und Kombifelder,
- DLookups u.ä.,
- Recordsets,
- Fremdzugriffe aus anderen Anwendungen,
und das natürlich unter Beachtung eines möglichen Mehrnutzerbetriebes (der ist bei den vorangegangenen Hinweisen noch nicht so beachtet worden).
Der Anstoß des Backups kann also durchaus von einem Formular ausgehen, es sollte nur allseits ungebunden sein. Persönlich verwende ich so ein Formular beim Schließen der Anwendung, wo der Anwender entscheiden kann, ob er einfach nur schließen will oder ob er mit Datensicherung schließen will für den Fall, wo er Neueintragungen vorgenommen hat.

Bei Kopieren des BE´s mit aktiven Zugriffen hast Du eine latente Gefahr auf "unnachvollziehbare" Fehler bis zur Korruption der DB.

Für eine laufende Datensicherung könnte man die Inhalte von wesentlichen Tabellen per Abfragen in eine leere Kopie des Backends kopieren. Hier könnte man überlegen, ob man Beziehungen und Indizes "einspart", um schnell und problemlos schreiben zu können. Wenn es nur um Daten geht, könnte man auch schlicht Tabellen in Textdateien exportieren.
In beiden Fällen braucht man dann etwas höhere Rücksicherungsintelligenz.
Bei mehreren vorhandenen Backups muss man aber auch entscheiden, welches davon das Hilfreichste ist.

Das FE brauchst Du nicht zu sichern, sondern würdest es bei Bedarf (oder laufend) durch ein sauberes Original vom Entwickler ersetzen.

Storch
07.10.2011, 13:08
ich könnte auch ein Muster mit allem drum und dran erstellen ;)
braucht jedoch zeit
ob ich das noch vor meiner nächsten Herz operation vom Dinstag 11.10.11 07:30 noch hin bekomme
kann ich nicht versprechen :(
@Ruedi, das ist ganz lieb von Dir aber bitte kümmer Dich um Deine Gesundheit. HIer sind diverse Lösungsansätze gezeigt, die mich sicher weiter bringen werden.

@Frank, diese Idee hab ich auch schon überlegt.

@Eberhard, hier war zunächst die Mutter des Gedankens, erst einmal meine Entwicklerversionen regelmäßig zu sichern und mit einer fortlaufenden Nummer zu versehen. Die Datensicherung ist dabei aber auch zum Thema geworden.

Die Anwendung, um die es geht, ist in FE-BE aufgeteilt, wird aber nur von einem FE bedient, Mehrbenutzer sind somit ausgeschlossen.

Ich hab in der Vergangenheit schon mal mittels des Application-Objektes ein Backup realisiert. Risiken, wie in #2 erwähnt, hab ich keine gesehen. Ich überlege, diese Variante wieder zu verwenden, unter Verwendung eines versteckten Forms oder aber eine Hilfs-DB zu erstellen, die vor dem Backup prüft, ob die fragliche DB geöffnet ist und wenn nein, die Backups vornimmt. Dies Anwendung könnte ich über geplante Tasks und Batchdatei aufrufen

ebs17
07.10.2011, 14:19
Risiken, wie in #2 erwähnt, hab ich keine gesehen.
So etwas kommt dann "plötzlich" und "überraschend".

Ich würde auch nichts davon halten, dass ein Frontend sich selber sichert und somit dabei offen sein muss.
Ausnahme: Externe Sicherung per SaveAsText
Als große Lösung gibt es da Versionenverwaltungen, siehe mal bei Josef (http://access-codelib.net/) auf der Homepage nach, auch in aufgezeichneten virtuellen Stammtischen (als angemeldetes Mitglied).
Eine kleine Lösung wäre, dass man zum Start ein VBS-Script ausführt, das erst das Frontend kopiert und es danach startet. Hast Du bei intensiver Entwicklung das Bedürfnis zu sichern, müsste die DB einfach heruntergefahren und über das Script neu gestartet werden. Schließen und Neustarten erzeugt einen definierten (wiederholbaren) Zustand, inklusive des Komprimierens (wenn gewünscht). Im laufenden Betrieb kann man es durchaus mit besonderen Zuständen zu tun bekommen.
Bei eigener strukturierter Arbeit könnte man das aber auch per Hand erledigen.

Storch
07.10.2011, 14:52
Bei eigener strukturierter Arbeit könnte man das aber auch per Hand erledigen.

da liegt ja mein problem, bin halt ein bissel chaotisch :entsetzt: :entsetzt: :entsetzt:

CptChaos
07.10.2011, 14:53
Ich habe hier (http://www.ms-office-forum.net/forum/showpost.php?p=1152300&postcount=15) ein Update/Start-Script vorgestellt...

Storch
08.10.2011, 07:57
Guten Morgen...

Ich hab mich jetzt mal etwas über VB-Script informiert. Basiert auf VB..
@Benny.. wie passen da PHP und PowerShell hinein? Ich bin da noch völlig unbedarft.

Storch
09.10.2011, 07:16
Ich habe hier (http://www.ms-office-forum.net/forum/showpost.php?p=1152300&postcount=15) ein Update/Start-Script vorgestellt...

Hallo Benny....

ich hab mich jetzt mal mit der Thematik befasst, was VBScript ist, hab mir nen Editor im Netz gezogen(Wordpad war mir nix) hab auch schon ein wenig experimentiert(teilerfolgreich)

Bin Deinen Code mal durchgegangen der ja soweit klar ist, Mir ist nur die Zuordnung der Variablen nicht wirklich klar. Hab mir mal erlaubt, Deinen Code zu zitieren und meine Fragen da rein zu setzen:

'Variablen füllen
strProgPath = "\\Server\Freigabe\Anwendungsordner\"
strNetFEPath = strProgPath & "FrontEnd"
strFEPath = WSHEnv("APPDATA") & "Anwendungsordner"
strProgName = "Anwendung.mde"
Welche Variable beinhaltet hier was???
strVersion = "2.3"
Warum eine scheinbar starre Versionsnummer?
strVerFile = "version.log"
Was beinhaltet diese Datei und wie wird sie erstellt???
strIcoFile = "Anwendung.ico"

Wäre schön, wenn Du meinen Horizont ein wenig erweitern würdest! :) :) :)

CptChaos
10.10.2011, 10:04
Hast Du Dir den Thread durchgelesen in dem ich das Script gepostet habe? Da werden die Thema u.a. auch behandelt.

Hier eine kurze Erläuterung
Zur Frage "Welche Variable beinhaltet hier was???"
Wie soll ich das verstehen? Die Variablen werden doch oberhalb befüllt; daraus ergibt sich deren Inhalt.
strProgPath = Pfad zur Datei auf dem Server ohne die Datei selbst (z.B. \\DeinServer\DeineFreigabe\DeinApplikationsordner)
strNetFEPath = Pfad zur gesamten Datei auf dem Server (FrontEnd steht hier für den Namen der Datei die kopiert werden soll)
strFEPath = Der Zielordner in dem die Anwendung auf dem Client liegt (z.B. C:\DeineApplikation)
strProgName = Der Name der Datenbankanwendung
Die "starre" Version ist die aktuell gültige Version (das Script liegt ja auf dem Server) der Anwendung. Gegen diese wird beim Ausführen des Script verglichen.
Die Datei version.log wird beim kopieren von Server -> Client mit kopiert und liegt somit auf dem Client.
Mit dieser Version wird verglichen und ggf. kopiert.

Beispiel:
Du erstellst Version 1.0 Deiner Anwendung. Publizierst sie auf dem Server, schreibst in die version.log 1.0 und in die obige Variable ebenfalls 1.0

Jetzt kommt der erste Client daher, ruft das Script auf, stellt fest ich hab noch nix und kopiert alles und startet die DB.

Morgen erstellst Du die Version 1.1 Deiner Anwendung und publizierst auf dem Server (wieder version.log auf 1.1 und die interne Version des Scripts auf 1.1 ändern)

Jetzt ruft der Client erneut das Script auf und stellt fest:
Script.Version = 1.1
Version in der lokalen (am Client!) version.log = 1.0
-> Ich muss kopieren

Anwendungs.ico ist lediglich das Anwendungssymbol welches ich mit kopiere.

Klar soweit?

ebs17
10.10.2011, 11:46
Update/Start-Script
Ich hatte eher den Eindruck, dass ein Sichern der eigenen Entwicklungsarbeit per Backup gewünscht war.

Storch
10.10.2011, 12:41
@Benny.. "natürlich" habe ich mir den Threed nicht angesehen, is mir irgendwie nicht eingefallen. hatte das in meinem Kontext versucht zu verstehen.
Nun sieht die Sache klarer aus.
Eberhard hat aber recht, es ist nicht ganz meine Zielstellung aber Mehrbenutzerumgebung wird mich demnächst auch noch einholen.
In jedem Fall ist Deine Lösung aber ein guter Ansatz, um meine eigene Lösung zu erstellen.

Nur hab ich erst morgen wieder Zeit dazu. Ich werde mich auf jedem Fall melden, entweder mit ner Frage oder der Lösung.

CptChaos
10.10.2011, 13:58
Ich bezog mich auf Post #9 von Ebs.
Dort wurde ja auf genau die Möglichkeit Start per VBS hingewiesen...

Storch
12.10.2011, 13:42
Wie soll ich das verstehen? Die Variablen werden doch oberhalb befüllt; daraus ergibt sich deren Inhalt.
strProgPath = Pfad zur Datei auf dem Server ohne die Datei selbst (z.B. \\DeinServer\DeineFreigabe\DeinApplikationsordner)
strNetFEPath = Pfad zur gesamten Datei auf dem Server (FrontEnd steht hier für den Namen der Datei die kopiert werden soll)
strFEPath = Der Zielordner in dem die Anwendung auf dem Client liegt (z.B. C:\DeineApplikation)
strProgName = Der Name der Datenbankanwendung


Nach diesen Erläuterungen könnte ein Beispiel der Zuweisung so aussehen:
strProgPath = "C:\KVK\"
strNetFEPath = strProgPath & "Datenbank.mdb"

Nach dieser Zuweisung lautet der Inhalt von 'strNetFEPath' jetzt: "C:\KVK\Datenbank.mdb" .
Das ist ja auch nicht weiter dramatisch. Wenn aber eine Codepassage so aussieht:
Function fCopyDB(strNetFEPath, strProgName, strFEPath, strVerFile, strIcoFile)
'kopiert die DB und Version.log vom Server auf den Client
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile strNetFEPath & strProgName , strFEPath, True
objFSO.CopyFile strNetFEPath & strVerFile, strFEPath, True
objFSO.CopyFile strNetFEPath & strIcoFile, strFEPath, True
End Function
dann bin ich verwirrt, denn das Ergebnis von strNetFEPath & strProgName lautet: "C:\KVK\Datenbank.mdbDatenbank.mdb" oder auch "C:\KVK\Datenbank.mdbversion.log"
Es liegt auf der Hand, das die Copy-Funktion mich anmault.

Ich habe den Code mal für mich angepasst:
sStartRoutinghilfe ' Start des Skripts

Sub sStartRoutinghilfe()
Dim strServerFile, strClientFolder, strServerFolder, strClientFile, strVersion, strVerFile, strIcoFile


Set WshShell = WScript.CreateObject("WScript.Shell")
Set WSHEnv = WSHShell.Environment("Process")

'Variablen füllen
strServerFolder = "C:\KVK\"
strServerFile = "KVK-FE_2011_10_05.mdb"
strClientFolder = WSHEnv("APPDATA") & "\KVK\"
strClientFile = "KVK-FE_2011_10_05-Kopie.mdb"
strVersion = "3.0"
strVerFile = "kvk_version.log"
strIcoFile = "f-logo-keil.ico"

'Hauptroutine
If fCheckFolder(strClientFolder) = True Then
If fCheckVersion (strVersion, strVerFile, strClientFolder) = True Then
fStartFE(strClientFolder), (strClientFile)
Else 'fCopyDB(strServerFolder, strClientFile, strClientFolder, strVerFile, strIcoFile)
fCopyDB(strServerFolder), (strServerFile), (strClientFile), (strClientFolder), (strVerFile), (strIcoFile)
fStartFE(strClientFolder), (strClientFile)
End If
End If

'Aufräumen
Set WSHShell = Nothing
Set WSHEnv = Nothing

End Sub

'----------------------------------------------------------------------------------------

Function fCheckFolder(strClientFolder)
'prüfen ob Ordner vorhanden ist
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strClientFolder) Then
fCheckFolder = True
Else
objFSO.CreateFolder(strClientFolder)
fCheckFolder = True
End If

End Function

Function fCheckVersion(strVersion, strVerFile, strClientFolder)
'einlesen der Version von der lokalen Log-Datei
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strClientFolder & strVerFile) Then
Set objFile = objFSO.OpenTextFile(strClientFolder & strVerFile, 1)
Do Until objFile.AtEndOfStream
strLocVersion = Left(objFile.ReadAll, 4)
Loop

If strLocVersion = strVersion Then
fCheckVersion = True
Exit Function
Else
fCheckVersion = False
Exit Function
End If
'Else
End If

End Function

Function fCopyDB(strServerFolder, strServerFile, strClientFile, strClientFolder, strVerFile, strIcoFile)
'kopiert die DB und Version.log vom Server auf den Client
Set objFSO = CreateObject("Scripting.FileSystemObject")

objFSO.CopyFile strServerFolder & strServerFile , strClientFolder & strClientFile, True
objFSO.CopyFile strServerFolder & strVerFile, strClientFolder & strVerFile, True
objFSO.CopyFile strServerFolder & strIcoFile, strClientFolder & strIcoFile, True

End Function

Function fStartFE(strClientFolder, strClientFile)
'Start der FE-Datei
Dim DB
Set DB = CreateObject("Access.Application")
DB.OpenCurrentDatabase strClientFolder & strClientFile
DB.Visible = True

End Function

So läuft das prima. Das einzige was mir unklar ist:

Wieso schließt sich meine Datenbank nach dem Öffnen sofort wieder?????

Atrus2711
12.10.2011, 13:48
Hi,

Wieso schließt sich meine Datenbank nach dem Öffnen sofort wieder?????

Setz doch mal einen Haltepunkt oder ein STOP vor das erste SET. Da wird dann angehalten. Dann kannst du sehen, ob deine DB da überhaupt reinspringt.

Storch
12.10.2011, 15:04
Hallo Martin,

ich habe vor:
Set DB = CreateObject("Access.Application")
den Haltepunkt gesetzt und plötzlich hat sich die DB anstandslos geöffnet und tut es auch immer wieder. Da ich vorher nix anderes gemacht habe, kann ich aber nicht sagen ob das jetzt vllt. nur Zufall war bzw. ist.

Nichts desto trotz hätt ich gerne ne Aktion, die beim Schließen einer DB eintritt. Ich denke gerade, wenn ich eine DB mittels VBS öffnen kann, dann sollte sie sich auf dem selben Wege doch auch schließen lassen??? Dazu müsste an einem bestimmten Punkt ein entsprechendes VBScript gestartet werden , welches die DB von außen schließt und anschließend weitere Aktionen ausführt. WOmit ich nochmals bei der Frage wäre, gibt es irgendein Ereignis oder eine Stelle im Programm, das immer auf ein Schließen der DB reagiert und von wo man dann ein Script starten könnte????

Edit: Jetzt wird die DB zwar geöffnet aber wenn ich das Hauptformular in Entwurfsmodus schalten will, schließt sich die DB

Atrus2711
12.10.2011, 15:18
Hi,

WOmit ich nochmals bei der Frage wäre, gibt es irgendein Ereignis oder eine Stelle im Programm, das immer auf ein Schließen der DB reagiert
Nichts Verlässliches... Hilfskonstruktionen wie ein kleines, unsichtbares, permanent offenes Formular, das ganz zuletzt geschlossen wird und dabei einen letzten Willen hat, lassen sich umgehen, wären aber vielleicht ein Weg.

Unklar ist mir, warum du unbedingt eine Kopie nach Ende und nicht eine Kopie vor Beginn der DB-Nutzung anlegen willst. Das wäre leichter.

Ein Schließen von außen würde ich auch nicht erwägen. Innerhalb der DB sollte deine Logik gelten, für die unter Normalumständen kein "Abschießbedarf" bestehen sollte.

Storch
12.10.2011, 16:11
Hi,
Unklar ist mir, warum du unbedingt eine Kopie nach Ende und nicht eine Kopie vor Beginn der DB-Nutzung anlegen willst. Das wäre leichter.


Nicht zwingend unbedingt. Ich hatte bisher immer nur so das Feeling.... Sichern nach getaner Arbeit. Aber ich sehe die Unwegsamkeiten und andererseits, zerschießen tut man während der Arbeit. Da macht es sind, seine Daten vorher zu sichern. Ich denke ich werde bei diesem VORHER bleiben und einmal öfters neu starten.

Jetzt muss sich nur noch rausfinden, wieso sich meine DB so eigentümlich verhält:upps:

Storch
24.10.2011, 08:41
Moin moin zusammen,

ich mach den Threed nochmal auf, weil ich immer noch Probleme beim Öffnen von Datenbanken mit dem folgenden Code habe.
Dim DB
Dim strClientFolder As String, strClientFile As String

strClientFolder = "C:\Dokumente und Einstellungen\Uwe\Anwendungsdaten\Keilo\"
'strClientFile = "KVK-FE_2011_10_12-Kopie.mdb"
strClientFile = "PRS11_2.mdb"
'strClientFile = "WaWi_VoWeVe2_2010-12-09_FE.mdb"

Set DB = CreateObject("Access.Application")
DB.OpenCurrentDatabase strClientFolder & strClientFile
DB.Visible = True

Der Code entstammt dem Scriptbeispiel von Benny, ich habe ihn zum rumprobieren in eine DB gepackt.

Eine von 3 DB's wird nach der Sicherheitsabfrage zum Öffnen sofort wieder geschlossen. Eine weitere läuft anscheinend problemlos, eine weitere schließt sich, wenn ich das 'Haupt'formular in die Entwurfsansicht schalte. Ich kann mir auf das Verhalten keinen Reim machen. Vllt. habt Ihr irgendwelche Anregungen, was die Ursache dafür sein könnte.

Vielen Dank schonmal im Voraus.

CptChaos
24.10.2011, 09:09
Nur nochmal als Anmerkung:
Die Scripte von mir haben erstmal nix mit der Access-Datei zu tun sondern sind für sich selbst lauffähig und könnten nach selben Schema auch eine beliebige andere Anwendung öffnen.

Der Code selbst hat nix in der DB zu suchen!

Storch
24.10.2011, 09:13
Das Dein Code einVB-Script ist, ist mir klar. Ich habe nur keine Befehlsreferenz für VBS gefunden, wo ich die verwendeten Funktionen bzw. Methoden und deren Parameter nachlesen konnte. Da es heißt, das VBS stark an VB angelehnt ist, habe ich es in eine DB gepackt, um die VBA-Umgebung zu erhalten und mir dort etwaige Erklärungen zu holen. Schlauer bin ich trotzdem nicht, zumal das verhalten der zu öffnenden DB's völlig unterschiedlich ist.

Schlussendlich soll das Ganze auch bei mir wieder ein VB-Script werden.

ebs17
24.10.2011, 12:22
Ich habe nur keine Befehlsreferenz für VBS gefunden, wo ich die verwendeten Funktionen bzw. Methoden und deren Parameter nachlesen konnte.
Siehe VBScript-Referenz (http://www.asphelper.de/referenz/vbscript/)
Wie hier bei FSO und RegEx gezeigt, kann man auch auf weitere Objekte und deren Eigenschaften und Methoden zugreifen (WSH, DAO, ADODB, Access, Excel, ...), generell natürlich über Late Binding.

Storch
24.10.2011, 20:58
@Eberhard, Danke für den Link....
Dennoch habe ich keine Idee, woher das eigenartige Verhalten der Datenbanken beim Öffnen kommt.:( :( :( :( :(

Storch
29.10.2011, 10:28
Nun nochmal nach oben mit dem Threed um meine Lösung zu posten.

Nachdem ich mehr als geraume Zeit erfolglos versucht habe, mit dem Beispiel von @CptChaos, dort Function fStartFE ein Datenbankobjekt zu öffnen, das stabil läuft und nicht schon beim Öffnen oder dem Umschalten eines Formulares in die Entwurfsansicht kommentarlos dicht macht, habe ich im Internet einen Lösungsansatz gefunden, der darauf basiert per WshShell,run Access selbst zu starten und den vollständigen Pfad der eigentlichen Datenbank als Parameter mitzugeben. Ich habe die genannte Funktion (Beispiel siehe #11) angepasst. Meine unten gepostete Lösung funktioniert entsprechend meinen Wünschen. Da bei dieser Art des DB-Startes die 8.3-Namenskonvention beachtet werden muss, habe ich das in meiner Lösung berücksichtigt.

IMHO müsste diese Lösung auch noch beinhalten, das es Dateien oder Ordner geben kann, die in den ersten 6 Zeichen identisch sind. Das OS kennzeichnet diese dann durch die Zahl hinter der Tilde. Es müsste hier noch einWeg gefunden werden, abzusichern, das dann auch die richtigen Ordner/Dateien hinzugezogen werden. Vllt. hat hierzu jemand einen Lösungsansatz für mich.

Function fStartFE(strClientFolder, strClientFile)

Dim i, intLaenge, intPosition, intLen
Dim strClientFolder8_3, strHelp

'Länge des Pfades ermitteln
intLaenge = Len(strClientFolder)

'Variablen initialisieren
strPfadKurz = ""
strHelp = ""
intLen = 0 'nimmt die Länge für die Mid-Funktion auf
intPosition = 0 'nimmt die Startposition für die Mid-Funktion auf

'Schleife von 1 bis zur Zeichenanzahl des Pfades
For i = 1 To intLaenge
'jedes Zeichen auf Backslash prüfen und wenn Ja dann ....
If Mid(strClientFolder, i, 1) = "\" Then
'Länge für die folgende Mid-Funktion neu definieren
intLen = i - intPosition
'Pposition für Mid-Funktion neu definieren
intPosition = intPosition + 1
'String holen
strHelp = Mid(strClientFolder, intPosition, intLen)
'Länge von strHelp prüfen und bei >8 (ohne Leerzeichen) auf 8.3-Namen anpassen
If Len(Trim(strHelp)) > 8 Then strHelp = Left(Trim(strHelp), 6) & "~1\"
'Position ist gleich aktuelle Position
intPosition = i
'rekursive Verkettung des 8.3-Kompatiblen Pfades
strClientFolder8_3 = strClientFolder8_3 & strHelp
End If
Next
'Abtrennen der Dateierweiterung vom Dateinamen
strHelp = Left(strClientFile, Len(strClientFile) - 4)
'8.3-Behandlung des Dateinamens
If Len(Trim(strHelp)) > 8 Then strClientFile = Left(Trim(strHelp), 6) & "~1.mdb"
'Zuweisne der Access-Exe
strAnwendung = "MSACCESS.EXE "
'WSShellobjekt erzeugen
Set wshell = CreateObject("Wscript.shell")
'Starten von Access mit Übergabe des Vollständigen Pfades der DB
wshell.run strAnwendung & strClientFolder8_3 & strClientFile , 1
'WSShellobjekt erzeugen
Set wshell = Nothing

End Function

Storch
29.10.2011, 11:53
noch ein Hinweis auf das Scriptbeispiel von Benny in folgendem Code findet sich ein Leerzeichen, das dafür sorgt, das immer kopiert wird, was ja eigentlich nicht soll.
Ich hab mir den VBS.Editor von Vincent Casser runtergeladen und dieser gibt dort keine Fehlermeldung. Nach entfernen des Leerzeichens klappt das mit dem Kopieren, nur bei geänderter Version

'Hauptroutine
If fCheckFolder(strFEPath) = True Then
If fCheckVersion (strVersion, strVerFile, strFEPath) = True Then
fStartFE(strFEPath), (strProgName)
Else
fCopyDB(strNetFEPath), (strProgName), (strFEPath), (strVerFile), (strIcoFile)
fStartFE(strFEPath), (strProgName)
End If
End If