Avatar billede omello Nybegynder
26. januar 2005 - 19:52 Der er 33 kommentarer og
1 løsning

Automatisk backup-funktion

Vi har en database, der bruges af ca. 5 personer samtidigt. Jeg vil gerne indbygge en funktion, der gør at databasen hver dag kl. 12 laver en kopi af hele filen og gemmer på c: med navnet "Backup-" og så det normale navn. Backup'en fra dagen før skal bare overskrives. Det er kun maskiner, der har databsen åben på det pågældende tidspunkt, der skal lave backup. Kan det lade sig gøre? Jeg ved godt at det i princippet betyder, at der laves 5 backup'er (hvis alle 5 personer har den åben samtidig), men det bør vel ikke være et problem? Vi har både .mdb og .mde-fil. TAK
Avatar billede terry Ekspert
26. januar 2005 - 19:58 #1
You could try looking at this alternative
http://www.mvps.org/access/modules/mdl0045.htm
Avatar billede terry Ekspert
26. januar 2005 - 20:00 #2
Avatar billede omello Nybegynder
26. januar 2005 - 20:11 #3
Tak - det sidste lyder til at passe perfekt, men hvordan får jeg koden ind i Access - det volder mig problemer. TAK!!
Avatar billede terry Ekspert
26. januar 2005 - 20:16 #4
You have to make a new module and then just copy th ecode directly to the module.

Then in your application you need to call the function

fMakeBackup()

You can put it in the On Click event of a button
26. januar 2005 - 20:23 #5
Hvis databasen er splittet op i frontend og backend, er det jo typisk nok at tage backup af backend-filen.

Dette kan gøres med en simpel Filecopy "X:\Databaser\Backend.mdb", "X:\Backup\Backend" & format(Date, "yyyymmdd") & ".mdb"

Koden kan placeres ved opstart af databasen eller på en knap.
Avatar billede omello Nybegynder
26. januar 2005 - 20:32 #6
Hi Terry

My database says: Database kan ikke finde funktionen.

This is what I did:
1. copy the whole code from your link (sugestion no. 2).
2. in my database, in module window, I pressed Ny. Pasted all the copied code and closed (saved as "module1").
3. In a form I made a button. In the "ved klik" I wrote fMakeBackup().

But it doesn't work. What did I do wrong? THANKS!
Avatar billede mugs Novice
26. januar 2005 - 20:34 #7
Module1.fMakeBackup
Avatar billede mugs Novice
26. januar 2005 - 20:37 #8
Jeg tror jeg benytter den samme metode. Kan sende dig en kopi hvis du ønsker. Blot læg din e-mail.

Denne skal indsættes i knappen Vedklik:

Module1.fMakeBackup

Og husk at lave en reference til DAO i dit VBA-modul Tools > References
Avatar billede omello Nybegynder
26. januar 2005 - 20:44 #9
TAK, men nu skriver den, at den ikke kan finde makroen "Modul1". Jeg er nu i det her...
Avatar billede mugs Novice
26. januar 2005 - 20:46 #10
Før skrev du:

(saved as "module1").

Og nu:

Modul1. Kontroller for stavefejl!
Avatar billede omello Nybegynder
26. januar 2005 - 20:49 #11
Det var en tastefejl her i forum. Den skriver, at den ikke kan finde Module1, hvilket er det modulet hedder... Hvad kan jeg have gjort galt? TAK
Avatar billede terry Ekspert
26. januar 2005 - 20:53 #12
you should NOT need to write module1

just write fMakeBackup
without ()


and it may be an idea to replace the function fDBExclusive with this


Function fDBExclusive() As Integer
Dim hFile As Integer
    hFile = FreeFile
    Set db = CurrentDb
    On Error Resume Next
    Open CurrentDb.Name For Binary Access Read Write Shared As hFile
    Select Case Err
        Case 0
            fDBExclusive = False
        Case 70
            fDBExclusive = True
        Case Else
            fDBExclusive = Err
    End Select
    Close hFile
    On Error GoTo 0
End Function
Avatar billede mugs Novice
26. januar 2005 - 20:54 #13
Åbn formularen i designvisning > Højreklik på din knap > Egenskaber > Fanen hændelser > Sæt markøren på linien vedKlik > Tryk på de 3 små i højre side.

Du kommer nu ind i VBA-editoren hvor du har skrevet din kode. Sle linien:

Module1.fMakeBackup

Nu skriver du igen:

Module1.

Hvad sker der på skærmen efter dit . (punktumnotation)?
Avatar billede terry Ekspert
26. januar 2005 - 20:54 #14
sorry

Function fDBExclusive() As Integer
Dim hFile As Integer
    hFile = FreeFile
    On Error Resume Next
    Open CurrentDb.Name For Binary Access Read Write Shared As hFile
    Select Case Err
        Case 0
            fDBExclusive = False
        Case 70
            fDBExclusive = True
        Case Else
            fDBExclusive = Err
    End Select
    Close hFile
    On Error GoTo 0
End Function
Avatar billede -anders- Juniormester
26. januar 2005 - 20:56 #15
Hej, jeg mener ikke det betyder så meget hvad modulet hedder, måske hvis det er et klassemodul ellers ikke? har bestemt ikke kloget mig på nogen måde :o), skal der ikke stå noget med Call fMakeBackup()
Avatar billede mugs Novice
26. januar 2005 - 20:57 #16
Begge fungerer:

Module1.fMakeBackup
fMakeBackup

Nå jeg ønsker Module1.fMakeBackup, er det for at se, om kaldet genkender funktionsnavnet.
Avatar billede -anders- Juniormester
26. januar 2005 - 21:00 #17
mugs>Hæ, der lærte jeg noget nyt :o)vidste det simpelthen ikke, kunne det være noget med at formen ikke kan modtage kode ?
Avatar billede terry Ekspert
26. januar 2005 - 21:01 #18
If I place a button on the form this code works. If it doesnt then you need toi make sure that module1 is saved and thet there are no errors in the code. Make sure that you havent copied other texts than the necessary code.!
You should NOT have RED text. You can also try compiling the program (Debug+Compile ...) menu


Private Sub Command16_Click()
fMakeBackup
End Sub
Avatar billede omello Nybegynder
26. januar 2005 - 21:02 #19
Terry; jeg har indarbejdet dine ændringer. Det virker. TAK.
mugs + aandersen; det virker nu. TAK.

Sidste ønske; hvis navnet på backup-filen skal hedde tidspunktet (YYMMDD-HH:MM) efterfulgt af "-" og så databasenavnet, hvad skal jeg så ændre i koden?
Avatar billede mugs Novice
26. januar 2005 - 21:05 #20
aandersen > Jeg bruger normalt både modulnavnet OG funktionsnavnet. Så er jeg sikker på med det samme at opfange en stavefejl. Og jeg synes det er nemmere at fejlfinde ændre senere hen.
Avatar billede -anders- Juniormester
26. januar 2005 - 21:07 #21
Enig lyder smart, det vil jeg helt sikkert også benytter mig af fremover, tak for tippet :o)
Avatar billede omello Nybegynder
26. januar 2005 - 21:07 #22
alternativt - hvis jeg bruger den første model - skal den overskrive den kopi, der er lavet sidst. Nu tilføjer den "Kopi (2) af " i navnet, når jeg laver backup anden gang. Hvordan får jeg den til at overskrive? TAK
Avatar billede terry Ekspert
26. januar 2005 - 21:08 #23
strSaveFile = CurrentDb.Name

but this also include the path. So you are going to have to split it up to add the extra information. But ther is already a date time the fiel was created!
Avatar billede terry Ekspert
26. januar 2005 - 21:19 #24
Try this

You need to change/add


strSaveFile = "c:\YourBackup.mdb" 'CurrentDb.Name
    Kill strSaveFile
    With tshFileOp
.
.
Avatar billede omello Nybegynder
26. januar 2005 - 21:32 #25
Having written

FOF_RENAMEONCOLLISION
    strSaveFile = "c:\YourBackup.mdb" 'CurrentDb.Name
    Kill strSaveFile
    With tshFileOp
        .wFunc = FO_COPY


It says:
Error Information...

Function fMakeBackup
Desription: File not found
Error #: 53
Avatar billede terry Ekspert
26. januar 2005 - 22:18 #26
'********** Code Start *************
' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Private Type SHFILEOPSTRUCT
    hwnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Boolean
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Private Const FO_MOVE As Long = &H1
Private Const FO_COPY As Long = &H2
Private Const FO_DELETE As Long = &H3
Private Const FO_RENAME As Long = &H4

Private Const FOF_MULTIDESTFILES As Long = &H1
Private Const FOF_CONFIRMMOUSE As Long = &H2
Private Const FOF_SILENT As Long = &H4
Private Const FOF_RENAMEONCOLLISION As Long = &H8
Private Const FOF_NOCONFIRMATION As Long = &H10
Private Const FOF_WANTMAPPINGHANDLE As Long = &H20
Private Const FOF_CREATEPROGRESSDLG As Long = &H0
Private Const FOF_ALLOWUNDO As Long = &H40
Private Const FOF_FILESONLY As Long = &H80
Private Const FOF_SIMPLEPROGRESS As Long = &H100
Private Const FOF_NOCONFIRMMKDIR As Long = &H200

Private Declare Function apiSHFileOperation Lib "Shell32.dll" _
            Alias "SHFileOperationA" _
            (lpFileOp As SHFILEOPSTRUCT) _
            As Long

Function fMakeBackup() As Boolean
Dim strMsg As String
Dim tshFileOp As SHFILEOPSTRUCT
Dim lngRet As Long
Dim strSaveFile As String
Dim lngFlags As Long
Const cERR_USER_CANCEL = vbObjectError + 1
Const cERR_DB_EXCLUSIVE = vbObjectError + 2
    On Local Error GoTo fMakeBackup_Err

    If fDBExclusive = True Then Err.Raise cERR_DB_EXCLUSIVE
   
    strMsg = "Are you sure that you want to make a copy of the database?"
    If MsgBox(strMsg, vbQuestion + vbYesNo, "Please confirm") = vbNo Then _
            Err.Raise cERR_USER_CANCEL
           
    lngFlags = FOF_SIMPLEPROGRESS Or _
                            FOF_FILESONLY Or _
                            FOF_RENAMEONCOLLISION
    strSaveFile = "c:\YourBackup.mdb" 'CurrentDb.Name
    Kill strSaveFile
    With tshFileOp
        .wFunc = FO_COPY
        .hwnd = hWndAccessApp
        .pFrom = CurrentDb.Name & vbNullChar
        .pTo = strSaveFile & vbNullChar
        .fFlags = lngFlags
    End With
    lngRet = apiSHFileOperation(tshFileOp)
    fMakeBackup = (lngRet = 0)
   
fMakeBackup_End:
    Exit Function
fMakeBackup_Err:
    fMakeBackup = False
    Select Case Err.Number
        Case cERR_USER_CANCEL:
            'do nothing
        Case cERR_DB_EXCLUSIVE:
            MsgBox "The current database " & vbCrLf & CurrentDb.Name & vbCrLf & _
                    vbCrLf & "is opened exclusively.  Please reopen in shared mode" & _
                    " and try again.", vbCritical + vbOKOnly, "Database copy failed"
        Case Else:
            strMsg = "Error Information..." & vbCrLf & vbCrLf
            strMsg = strMsg & "Function: fMakeBackup" & vbCrLf
            strMsg = strMsg & "Description: " & Err.Description & vbCrLf
            strMsg = strMsg & "Error #: " & Format$(Err.Number) & vbCrLf
            MsgBox strMsg, vbInformation, "fMakeBackup"
    End Select
    Resume fMakeBackup_End
End Function

Private Function fCurrentDBDir() As String
'code courtesy of
'Terry Kreft
Dim strDBPath As String
Dim strDBFile As String
    strDBPath = CurrentDb.Name
    strDBFile = Dir(strDBPath)
    fCurrentDBDir = Left(strDBPath, InStr(strDBPath, strDBFile) - 1)
End Function

Function fDBExclusive() As Integer
Dim hFile As Integer
    hFile = FreeFile
    'Set db = CurrentDb
    On Error Resume Next
    Open CurrentDb.Name For Binary Access Read Write Shared As hFile
    Select Case Err
        Case 0
            fDBExclusive = False
        Case 70
            fDBExclusive = True
        Case Else
            fDBExclusive = Err
    End Select
    Close hFile
    On Error GoTo 0
End Function
'************* Code End ***************
Avatar billede terry Ekspert
26. januar 2005 - 22:20 #27
Its because the file you are trying to delete doesnt exist. Try

    On Error Resume Next
    Kill strSaveFile
    On Local Error GoTo fMakeBackup_Err
Avatar billede omello Nybegynder
26. januar 2005 - 22:25 #28
tak, hvor skal det tilføjes?
Avatar billede terry Ekspert
27. januar 2005 - 12:19 #29
FOF_RENAMEONCOLLISION
    strSaveFile = "c:\YourBackup.mdb" 'CurrentDb.Name
On Error Resume Next
    Kill strSaveFile
On Local Error GoTo fMakeBackup_Err
Avatar billede terry Ekspert
27. januar 2005 - 19:55 #30
hows it going omello, have you got it working?
Avatar billede omello Nybegynder
28. januar 2005 - 19:44 #31
-its doing great. However can I change the code, so that it doesnt show the message "Are you sure that you want to make a copy of the database?", and just perform the backup? I transfer points, when it is done, tonight. THANKS for your help.
Avatar billede mugs Novice
28. januar 2005 - 19:48 #32
Slet disse 2 linier.

If MsgBox(strMsg, vbQuestion + vbYesNo, "Bekræft kopiering") = vbNo Then _
            Err.Raise cERR_USER_CANCEL
Avatar billede omello Nybegynder
28. januar 2005 - 22:02 #33
thanx
Avatar billede terry Ekspert
29. januar 2005 - 10:26 #34
selv thanx
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester