PDA

Vollständige Version anzeigen : Automatische Sicherung der Codemodule


grzi
25.10.2010, 15:03
Im Laufe der Zeit habe ich gelernt, dass man nie genug Sicherungen seiner Arbeit machen kann!

Dies betrifft insbesondere die Codemodule.

Anbei ein kleines Code-Beispiel, mit welchem man sehr elegant eine Sicherung seiner Module erreicht.

Kleiner Tipp: Beim start der DB ein Formular aufrufen, dessen Timer das Backup startet (alle 10min TimerIntervall = 600000) auch nicht gespeichte Zustände werden dann im Backup-Ordner hinterlegt und man hat den Kopf frei fürs Programmieren ;)

52622

Getestet unter Acc03/07 sowie Win XP/7

Thomas Möller
25.10.2010, 19:29
Hallo,

Du könntest Deinen Code vereinfachen, wenn Du zur Prüfung bzw. Erstellung des Ordners für die Sicherungen die Funktion MakeSureDirectoryPathExists verwendest.
Nähere Details zu genannten Funktion findest Du hier:
http://www.vbarchiv.net/api/api_makesuredirectorypathexists.html

CU

grzi
25.10.2010, 21:45
Danke für den Tip - man lernt immer noch dazu!

Hier die optimierte Version
52637

Thomas Möller
26.10.2010, 07:53
Hallo Carsten,

Du kannst Deinen Code noch weiter optimieren. ;)
Wenn Du diesen Code-Block


'Bei Pfadübergabe
If Len(sComplFolderPath) > 0 Then GoTo gtoBackup
sComplFolderPath = CurrentProject.Path & "\Modulebackup\"

gtoBackup:
'Ordner erstellen:
...


umstellst, kannst Du auf die Verwendung des Labels und des ungeliebten GoTo-Befehls verzichten. Ich würde den Abschnitt so formulieren:

'Bei Pfadübergabe
If Len(sComplFolderPath) = 0 Then
sComplFolderPath = CurrentProject.Path & "\Modulebackup\"
End If

'Ordner erstellen:
...


Was mir noch auffällt ist der Block Ordner erstellen. Auf die zweite Verwendung der folgenden Zeile kannst Du verzichten:

'Ordner erstellen:
If Not (Right(sComplFolderPath, 1) = "\") Then sComplFolderPath = sComplFolderPath & "\"


Statt dessen fügst Du den abschließenden BackSlash in der vorhergehenden Zeile ein:

sComplFolderPath = sComplFolderPath & Replace(CStr(Now()), ":", ".") & "\"


CU

grzi
26.10.2010, 09:04
Hallo Carsten,

Du kannst Deinen Code noch weiter optimieren. ;)
Wenn Du diesen Code-Block


'Bei Pfadübergabe
If Len(sComplFolderPath) > 0 Then GoTo gtoBackup
sComplFolderPath = CurrentProject.Path & "\Modulebackup\"

gtoBackup:
'Ordner erstellen:
...


umstellst, kannst Du auf die Verwendung des Labels und des ungeliebten GoTo-Befehls verzichten. Ich würde den Abschnitt so formulieren:

'Bei Pfadübergabe
If Len(sComplFolderPath) = 0 Then
sComplFolderPath = CurrentProject.Path & "\Modulebackup\"
End If

'Ordner erstellen:
...



Die Entwirrung nehme ich doch gerne an ;) - geht sogar als Einzeiler:

If Len(sComplFolderPath) = 0 Then sComplFolderPath = CurrentProject.Path & "\Modulebackup\"


...
Was mir noch auffällt ist der Block Ordner erstellen. Auf die zweite Verwendung der folgenden Zeile kannst Du verzichten:

'Ordner erstellen:
If Not (Right(sComplFolderPath, 1) = "\") Then sComplFolderPath = sComplFolderPath & "\"


Statt dessen fügst Du den abschließenden BackSlash in der vorhergehenden Zeile ein:

sComplFolderPath = sComplFolderPath & Replace(CStr(Now()), ":", ".") & "\"



Hier gestaltet es sich nicht so einfach, da ich den ersten "\" im Griff habe - den aus & "\Modulebackup\", beim Benutzerdefinierten Pfad könnte der "\" am Ende fehlen, deshalb muss ich da nochmal prüfen, bevor ich das Datum anhänge!


BackupMod "c:\temp\temp"

hier würde bei deiner Variante ein Verzeichnis c:\temp\temp26.10.2010 09.55.42\ erstellt werden!


BackupMod "c:\temp\temp\"

Und hier ein Verzeichnis c:\temp\temp\26.10.2010 09.55.42\
Das wird mit meiner Codezeile verhindert!

Gruß

Thomas Möller
26.10.2010, 11:19
Hallo Carsten,

ich denke, da haben wir etwas an einander vorbeigeredet bzw. -geschrieben.

Probier mal bitte folgenden Code aus:


'Ordner erstellen:
If Not (Right(sComplFolderPath, 1) = "\") Then sComplFolderPath = sComplFolderPath & "\"
sComplFolderPath = sComplFolderPath & Replace(CStr(Now()), ":", ".") & "\"


Damit solltest Du eigentlich alle möglichen Fälle abfangen.

CU

grzi
26.10.2010, 11:47
War wohl noch etwas früh heute morgen! Ja - so gehts!
Mein Logik-Sektor war da wohl noch nicht so wach :eek:

Danke für das Mitdenken!

grzi
22.11.2010, 19:25
Habe etwas gespielt und dank Josefs Hilfe ein brauchbares Addin zur Codemodul-Sicherung und Wiederherstellung zustande gebracht!

Viel Spass beim ausprobieren und Testen! Alles natürlich auf Eigene Gefahr :cool:


53182

Die Quellcode DB ist mit dabei, so dass ihr euch bei Bedarf das AddIn anpassen könnt!

Für Rückmeldungen zur Verbesserung/Optimierung bin ich immer zu haben!

Josef P.
22.11.2010, 20:18
Ein Hinweis zur Property-Prozedur CurrentVbProject:
Für den Vergleich von VbProject.FileName und Currentdb.Name müsste man noch UNCPath verwenden, falls Anwendungen nicht auf einem lokalen Laufwerk genutzt werden.

mfg
Josef

Thomas Möller
22.11.2010, 20:24
Hallo Carsten,

Du könntest die Konstanten für die Bedingte Kompilierung in die Eigenschaften des VBA-Projekt auslagern. So musst Du die Konstanten nur an einer Stelle umstellen (und kannst keine vergessen).

CU

Thomas Möller
23.11.2010, 19:10
Hallo Carsten,


Kannst du mir da mal auf die Sprünge helfen?


aber gerne:

- VBA-Editor / Extras / Eigenschaften von >Name Deines Projekts<
- Reiter Allgemein
- Zeile "Argumente für Bedingte Kompilierung"

Hier kannst Du die Argumente für die Bedingte Kompilierung zentral eintragen. Mehrere Werte trennst Du dabei durch einen Doppelpunkt.

DEBUGMODE = 0 : EARLYBINDING = 0

Im Gegenzug kannst Du die in den Modulköpfen eingetragenen Konstanten entfernen. So hast Du später nur noch eine Stelle, an der Du die Konstanten änderst.

grzi
24.11.2010, 07:43
@Josef: Macht Sinn und habe ich global auch für andere Pfadangaben geändert!

Nun für UNC-Pfade geeignet:
53198

@Thomas: Danke für diese Info - von dieser Möglichkeit habe ich noch nicht mal was geahnt!

Josef P.
24.11.2010, 08:11
Hallo!

Bezüglich UNCPath:
strCurrentDbName = CurrentDb.Name
If UNCPath(m_CurrentVbProject.FileName) <> UNCPath(strCurrentDbName) Then
Set m_CurrentVbProject = Nothing
For Each proj In VBE.VBProjects
If proj.FileName = strCurrentDbName Then
Set m_CurrentVbProject = proj
Exit For
End If
Next
End If
=>
strCurrentDbName = UNCPath(CurrentDb.Name)
If m_CurrentVbProject.FileName <> strCurrentDbName Then
Set m_CurrentVbProject = Nothing
For Each proj In VBE.VBProjects
If proj.FileName = strCurrentDbName Then
Set m_CurrentVbProject = proj
Exit For
End If
Next
End If
VBProject.FileName liefert bereits den UNC-Pfad.


Public Function UNCPath(ByVal Path As String, _
Optional IgnoreErrors As Boolean = True) As String
Dim UNC As String * 512
If Len(Path) = 1 Then Path = Path & ":"
If Right$(Path, 1) <> "\" Then Path = Path & "\"
If WNetGetConnectionA(Left$(Path, 2), UNC, Len(UNC)) Then
' API-Routine gibt Fehler zurück:
If IgnoreErrors Then
UNCPath = Path
Else
Err.Raise 5 'Setzt den Fehler: Invalid procedure call or argument
End If
Else
' Ergebnis zurückgeben:
UNCPath = Left$(UNC, InStr(UNC, vbNullChar) - 1) & Mid$(Path, 3)
End If
End Function
Warum hängst du einen Backslash am Ende an? Das sieht bei Dateien etwas eigenartig aus und könnte unerwünscht sein. ;)

mfg
Josef

grzi
24.11.2010, 08:55
...
Warum hängst du einen Backslash am Ende an? Das sieht bei Dateien etwas eigenartig aus und könnte unerwünscht sein. ;)


Kommt davon, wenn man den Code kopiert und nicht näher hinschaut ...:(

Ich schiebe das mal auf mein verschnubbtes Hirn ;)