PDA

Vollständige Version anzeigen : geöffnete BE sichern


Konrad Lepping
06.05.2004, 19:32
Hallo,
ich habe auf einem server eine BE Datenbank. Auf diese BE Datenbank wird stetig zugegriffen (von ca 10 Benutzer, welche jeweils eine FE Datei auf dem PC am Arbeitsplatz haben).

meine Frage:
-kann ich die BE Datei im geöffneten Zustand sichern, so dass sie auch später ohne Fehlermeldungen (unbekanntes Datenbankformat) die Datei wieder benutzen lässt?
-wie kann ich das mit einer Schaltfläche verwirklichen?

Ich benutze Access 2002

Danke

KHS
06.05.2004, 19:57
Schau mal hier rein:
http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=126801

Konrad Lepping
06.05.2004, 20:18
habe mir das von tommy_k angeschaut. wie kann ich jetzt den API (kopieren einer Datei) Code an eine Schaltfläche anbinden?

Schaltfläche vorhanden->Ereignid bei klick->und dann einfach reinkopieren, oder wie?

TommyK
07.05.2004, 05:41
Hallo Konrad,

Du erstellst eine neues Modul in Deiner DB und kopierst den Code dort rein:
Public Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _
(ByVal lpExistingFileName As String, ByVal lpNewFileName As String, _
ByVal bFailIfExists As Long) As Long
'bFailIfExists gibt es folgende Möglichkeiten:
'"0": eine vorhandene Datei soll überschrieben werden
'"1": eine vorhandene Datei soll nicht überschrieben werden
'Die Funktion liefert zwei verschiedene Rückgabewerte:
'"0": Vorgang erfolgreich
'"1": Vorgang nicht erfolgreich


Public Function API_CopyFile(strSourceFile As String, strTargetFile As String, _
Optional lngFileExist As Long = 0) As Long
'*******************************************
'Name: API_CopyFile (Function)
'Purpose: Datei kopieren
'Author: Tommyk
'Date: März 11, 2004, 04:04:19
'Inputs: strSourceFile=Pfad und Name der Quelldatei, strTargetFile=Pfad und Name der Zieldatei
' lngFileExist=0 eine vorhandene Datei soll überschrieben werden
' lngFileExist=1 eine vorhandene Datei soll nicht überschrieben werden
'Output:
'*******************************************
API_CopyFile = CopyFile(strSourceFile, strTargetFile, lngFileExist)
If API_CopyFile = 0 Then
MsgBox "Kopieren der Datei " & strSourceFile & " fehlgeschlagen", vbInformation, "Fehler"
Exit Function
Else
MsgBox "Die Datei wurde erfolgreich kopiert.", vbInformation, "Erfolgreich"
End If
End Function


In Deinem Form hinterlegst Du dann beim Klick-Ereignis Deines Buttons z.B.:

Private Sub Befehl6_Click()
API_CopyFile "PfadundNameBE", "PfadundNameBESicherung"
End Sub

Musst natürlich Deine Pfade angeben.

Konrad Lepping
07.05.2004, 07:19
ja super tommyk, funktioniert einwandfrei.

kann man das noch so abändern, dass die Datei mit dem aktuellen Datum im Namen gespeichert wird. Dann habe ich ja zb. nach drei sicherungen an drei verschiedenen Tagen auch drei verschiedene Sicherungsdateien. Ist es möglich, dass bei der vierten sicherung automatisch die älteste sicherung überschrieben wird?

Danke

Arne Dieckmann
07.05.2004, 07:37
Zum 1. Problem:

API_CopyFile "PfadundNameBE", "C:\Backup\Backup_vom_" & format(date,"yyyy_mm_dd") & ".MDB"

Konrad Lepping
07.05.2004, 11:08
jo super,
speichern mit datum funktioniert, DANKE!!!!

ne lösung für den rest???

TommyK
07.05.2004, 11:15
Hallo Konrad,

welcher Rest?

Arne Dieckmann
07.05.2004, 11:34
@Tommy: Der Rest liegt in Konrads Beitrag vom 07.05.2004 um 08:19 Uhr zwischen Dann habe ich ja zb. nach drei sicherungen an drei verschiedenen Tagen auch drei verschiedene Sicherungsdateien. und Danke ;)

TommyK
07.05.2004, 12:06
@Arne

wird Zeit das Wochenende wird. :D

@Konrad

dann würde ich es anders machen.
kopiere den folgenden Code auch noch in Deine DB.
Function DoesDirExist(Verzeichnis As Variant) As Boolean
'Test, ob das angegebene Verzeichnis existiert
On Error Resume Next
ChDir Verzeichnis
DoesDirExist = IIf(Err = 0, True, False)
End Function


Public Sub SaveBE(sSource As String, sDBName As String)
Dim sEndung As String, sSaveBEPfad As String
Dim sTarget

'Sicherungsverzeichnis
sTarget = "H:\Daten\Sicher\"
'Prüfung ob Sicherungsverzeichnis existiert
If DoesDirExist(sTarget) = False Then: MkDir sTarget
'Erstellung des Unterverzeichnisses nach Tag
sEndung = Format(Date, "ddd")
sSaveBEPfad = sTarget & sEndung & "\"
'Prüfung ob UnterSicherungsverzeichnis existiert
If DoesDirExist(sSaveBEPfad) = False Then: MkDir sSaveBEPfad
'kopieren der DB
API_CopyFile sSource, sSaveBEPfad & "\" & sDBName
End Sub

Die Sub "SaveBE" würde für jeden Tag eine Kopie in ein Unterverzeichnis je Tag machen.
Also z.B. "= "H:\Daten\Sicher\Montag" , "= "H:\Daten\Sicher\Dienstag" usw.
Ist wieder Montag wird die Datei vom letzten Montag überschrieben.

Aufruf dann so:
SaveBE "C:\DeinVerzeichnis\Deine.mdb","Sicher.mdb"

Das Verzeichnis ""H:\Daten\Sicher\" musst Du natürlich Deinen Wünschen anpassen.
Als Ergänzung könnte man noch ein INI-Datei schreiben lassen mit einigen Infos zum Backup.
Ich hab das mal für ein Programm in der Firma gemacht.
Wenn Du da Interesse hast, melde Dich nochmal.

Konrad Lepping
07.05.2004, 12:49
also es funktioniert jetzt so wie ihr mir dazu auf den Weg geholfen habt. Ich sage mal eine hervorragende Anleitung von euch. Ich denke, dass können noch einige so brauchen.

DANKE an euch!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

STOP noch ne kleinigkeit:
die be datei ist mehrere MB groß. jetzt klickt man auf das Button "Sichern" und wartet dann (bei meiner Datei jetzt zB. 25 Sekunden, weil 42 MB groß). Der Benutzer weis nicht, wie weit die Sicherung ist.

Kann man das noch mit einem Fortschrittbalken ergänzen?

TommyK
07.05.2004, 13:20
Hallo Konrad,

am einfachsten wäre dann mittels der API "SHFileOperation" , s. auch meine HP, zu kopieren.
Dort wird dann das gleiche Fenster wie beim kopieren im Explorer angezeigt. (Fliegende Ordner)

Konrad Lepping
07.05.2004, 14:26
werde ich mir mal anschauen uns ausprobieren.

Feedback kommt ganz sicher, Fragen vielleicht auch

Konrad Lepping
07.05.2004, 18:44
tommyK, wo finde ich das auf deiner Homepage?

schnolli
07.05.2004, 18:52
...bin zwar nicht Tommy, aber guckst Du hier (http://access-beispiele.tommyk-webbox.de/code/code_fs_api.htm).

Gruss Oliver

Konrad Lepping
07.05.2004, 19:11
hy oliver,
hab ich gekugst. Schau dir mal etwas weiter oben den Code an, den ich habe.

Wo muss ich jetzt was einfügen, so dass ein Fenster mit den flying Windows, Fortschrittanzeige, erscheint.

Konrad Lepping
07.05.2004, 19:29
hallo an alle helferlein,
habs gefunden und auch eingefügt. funktioniert super. fortschritt ist jetzt auch zu sehen.

nochmals danke an euch alle

TommyK
08.05.2004, 06:49
Hallo Konrad,

ich war erst heute früh wieder hier, aber man hat Dir ja trotzdem geholfen.
Schön das es geht und danke fürs Feedback.

jimmyheinz
01.01.2007, 10:10
Hallo TommyK

bin bei der Suche auf diesen Beitrag gestoßen, habe ihn umgesetzt, klappt auch ganz gut, nur eine sache läuft bei mir nicht richtig.
ich habe ein verzeichnis ....\Backup\ in dem die Backup's kopiert werden, beim betätigen der code'S von dir "SaveBE" wird in diesem verzeichnis ein ordner mit dem Wochentag erstellt und das Backup mit dem entsprechenden namen kopiert, allerdings hatte ich es so verstanden, das die kopie in den entsprechenden ordner kopiert wird.
Function DoesDirExist(Verzeichnis As Variant) As Boolean
'Test, ob das angegebene Verzeichnis existiert
On Error Resume Next
ChDir Verzeichnis
DoesDirExist = IIf(Err = 0, True, False)
End Function


Public Sub SaveBE(sSource As String, sDBName As String)
Dim sEndung As String, sSaveBEPfad As String
Dim sTarget

'Sicherungsverzeichnis
sTarget = "\\Atlas\anaesthesie\Intensiv\IntDok\Backup\"
'Prüfung ob Sicherungsverzeichnis existiert
If DoesDirExist(sTarget) = False Then: MkDir sTarget
'Erstellung des Unterverzeichnisses nach Tag
sEndung = Format(Date, "ddd")
sSaveBEPfad = sTarget & sEndung & ""
'Prüfung ob UnterSicherungsverzeichnis existiert
If DoesDirExist(sSaveBEPfad) = False Then: MkDir sSaveBEPfad
'kopieren der DB
API_CopyFile sSource, sSaveBEPfad & "" & sDBName
End Sub

und der code zum ausführen

SaveBE "\\Atlas\anaesthesie\Intensiv\IntDok\MasterTabellen.mdb","Sicher.mdb"
den code vom 7-5-2004 6:41Uhr habe ich auch eingefügt
was mache ich falsch?

Jimmy

TommyK
02.01.2007, 05:52
Hallo Jimmy,

allerdings hatte ich es so verstanden, das die kopie in den entsprechenden ordner kopiert wird.

Das ist richtig.
Wobei mir unklar ist was die "" in den beiden Zeilen sollen?
sSaveBEPfad = sTarget & sEndung & ""
und
API_CopyFile sSource, sSaveBEPfad & "" & sDBName

Eine vollständige Version kannst Du Dir hier downloaden:
Backup-Lösung für tägliche Sicherung, Ausgabe wahlweise auch als Zip-Datei (http://www.access-beispiele.tommyk-webbox.de/bsp_anwendungen.php#anwend_backup)

Sascha Trowitzsch
02.01.2007, 09:43
Da der Thread wieder hochgeholt wurde, möchte ich bei der Gelegenheit wieder mal auf einige Mahnungen zum Thema "Sicherung im laufenden Betrieb" zurückkommen:
http://ms-office-forum.net/forum/showpost.php?p=680108&postcount=5

Ciao, Sascha

jimmyheinz
02.01.2007, 10:57
HAllo TommyK

den Code habe ich von #10, der war doch von dir, oder?? Ich meine wegen deiner Fragen, vielen Dank aber für den Link, ist ja doch ein bisschen mehr.

@Sascha
Danke für den Hinweis, diesen Thread kannte ich allerdings noch nicht, in diesem Fall geht es auch um das verküpfte BE, im Moment habe ich es gerade so eingestellt habe das es um eine Zeit passiert wo kaum einer damit arbeitet, werde aber mal versuchen deine Code's zu integrieren, eine Frage aber schon mal, wie wird das alles rückgängig gemacht, oder ist es besser die FE zu schließen und ganz neu zustarten?

Sascha Trowitzsch
02.01.2007, 19:37
..wie wird das alles rückgängig gemacht...
Was rückgängig gemacht? Meinst du das Wiedereinspielen einer Sicherung?
Ich gehe davon aus, dass das höchst selten zur Anwendung kommen sollte und deshalb würde ich's manuell machen. Schon, um zu sehen, was denn am aktuellen BE nicht stimmt, bzw. , welche Fehler aufgetreten sind.

Mit dem FE hat das nichts direkt zu tun. Natürlich darf aber keines auf das BE zugreifen, wenn es wiederhergestellt wird. Dazu reicht aber bereits, dass kein Formular, Tabellenblatt oder sonstwas offen sind.

Ciao, Sascha

jimmyheinz
02.01.2007, 20:12
Das rückgäng machen einer sicherung meinte ich nicht sondern folgende aussagen von dir mit den entsprechenden Code'sAlle Objekte in der DB sollten zunächst geschlossen sein.

Dann sollte sichergestellt werden, dass alle Schreibvorgänge der Datenbank-Engine beendet wurden; z.B. so:
Auf das Backend sollte zum Zeitpunkt des Kopierens niemand mehr zugreifen. D.h., es darf keine .LDB-Datei zur Backend-MDB existieren und außerdem sollte Exklusiv-Zugriff bestehen:
jimmy

Sascha Trowitzsch
02.01.2007, 21:40
Na, der Code, den ich dort angegeben hatte, der macht doch schon alles nötige: Alle Objekte schließen etc.
Allerdings müsste dann das Anstoßen des Codes bei Mehrbenutzerumgebung entweder irgendwie ferngesteuert werden - z.B. per Flag-Feld in einer speziellen Tabelle im BE - , oder per Timer in den FEs in regelmäßigen Abständen versucht werden. Das ist dann wieder ein anderes Problem.

Ciao, Sascha

jimmyheinz
02.01.2007, 21:46
genau das meinte ich, das wieder anstoßen des Codes. Daher die FRage, wenn alle FE geschlossen werden und man wieder starten muß, wird och sicher das beste sein, oder grundsätzlich, man beendet alle FE fürht dann das BAckup durch. Es ist doch sicherlich möglich beim beenden einer DB automatisch eine andere zu öffnen, wie würde das denn aussehen?
jimmy