Back-maken en plaatsen in onderliggend pad.

Status
Niet open voor verdere reacties.

Vergeer500

Gebruiker
Lid geworden
25 apr 2017
Berichten
11
Hallo,

Dmv onderstaande code maak ik een back-up van de hele base.
Deze wordt geplaatst in de huidige map.
Dat gaat prima.


Echter wil ik de back-up plaatsen in de onderliggende map Back-up.
Raar, maar als ik het pad invul, krijg ik steevast de melding dat de back-up mislukt is (en wordt ook niet gemaakt).

I.p.v.
Pad = CurrentProject.Path & "" zet ik er nu neer Pad = CurrentProject.Path & "\Back-up"

en in dit gedeelte: strBackupNaam = CurrentProject.Path & "" zet ik neer strBackupNaam = CurrentProject.Path & "\Back-up"

Hele code:

Private Sub cmdBackup_Click()
On Error GoTo fout
Dim fileObj As Object
Dim strBestandNaam As String, strBackupNaam As String, MijnBestand As String
Dim Pad As String
Dim DB() As Variant
Dim i As Integer

Pad = CurrentProject.Path & ""
strBestandNaam = "Wedprog_BU_"
MijnBestand = Dir(Pad & strBestandNaam & "*.mdb")
Do While Not MijnBestand = ""
ReDim Preserve DB(i)
DB(i) = MijnBestand
i = i + 1
ReDim Preserve DB(i)
MijnBestand = Dir
Loop

strBackupNaam = CurrentProject.Path & "" & strBestandNaam & Format(Date, "_yyyy-mm-dd-") & Format(Time, "_HH.MM") & ".mdb"
strBestandNaam = Pad & CurrentProject.Name

Set fileObj = CreateObject("Scripting.FileSystemObject")
If i > 30 Then fileObj.DeleteFile (DB(0))
fileObj.CopyFile strBestandNaam, strBackupNaam, True

msg = MsgBox("De backup is gelukt!")

Exit Sub

fout:
MsgBox "De backup is mislukt!", vbCritical

End Sub


Iemand enig idee ?
Bvd
 
Laatst bewerkt:
Er zitten wat foutjes in je code volgens mij. Hij gaat de fout in bij het verwijderen, en dat komt omdat je een bestand verwijdert zonder pad. Dat wordt dan niet gevonden. Deze variant werkt bij mij prima.
Code:
Dim fileObj As Object
Dim strBestandNaam As String, strBackupNaam As String, MijnBestand As String
Dim Pad As String, PadBU As String
Dim DB() As Variant
Dim i As Integer

    On Error GoTo Fout
    Pad = CurrentProject.Path & IIf(Right(CurrentProject.Path, 1) <> "\", "\", "")
    PadBU = Pad & "Back-up\"
    strBestandNaam = "Wedprog_BU_"
    MijnBestand = Dir(PadBU & strBestandNaam & "*.accdb")
    Do While Not MijnBestand = ""
        ReDim Preserve DB(i)
        DB(i) = MijnBestand
        i = i + 1
        MijnBestand = Dir
    Loop
    
    strBackupNaam = PadBU & strBestandNaam & Format(Date, "_yyyy-mm-dd") & Format(Time, "_HH.MM") & ".accdb"
    strBestandNaam = Pad & CurrentProject.Name
    Set fileObj = CreateObject("Scripting.FileSystemObject")
    If i >= 30 Then fileObj.DeleteFile (PadBU & DB(0))
    fileObj.CopyFile strBestandNaam, strBackupNaam, True
    MsgBox "De backup is gelukt!", vbOKOnly
    Exit Sub
    
Fout:
    MsgBox "De backup is mislukt!", vbCritical
 
Bedankt, toch verschijnt nu de foutmelding Compileerfout - Variabele niet gedefinieerd.

ReDim Preserve DB

Aldus ingevoegd...
Private Sub cmdBackup_Click()
Dim i As Integer

On Error GoTo Fout
Pad = CurrentProject.Path & IIf(Right(CurrentProject.Path, 1) <> "", "", "")
PadBU = Pad & "Back-up"
strBestandNaam = "Wedprog_BU_"
MijnBestand = Dir(PadBU & strBestandNaam & "*.accdb")
Do While Not MijnBestand = ""
ReDim Preserve DB(i)
DB(i) = MijnBestand
i = i + 1
MijnBestand = Dir
Loop

strBackupNaam = PadBU & strBestandNaam & Format(Date, "_yyyy-mm-dd") & Format(Time, "_HH.MM") & ".accdb"
strBestandNaam = Pad & CurrentProject.Name
Set fileObj = CreateObject("Scripting.FileSystemObject")
If i >= 30 Then fileObj.DeleteFile (PadBU & DB(0))
fileObj.CopyFile strBestandNaam, strBackupNaam, True
MsgBox "De backup is gelukt!", vbOKOnly
Exit Sub

Fout:
MsgBox "De backup is mislukt!", vbCritical

End Sub
 
Als je Option Explicit aan hebt staan is dat logisch, omdat je nu maar één variabele declareert. Ik heb er sowieso een extra bijgemaakt: PadBU. Overigens kun je veel beter de CODE tag gebruiken i.p.v. de quote tag...
 
Tja, bedankt voor de feedback.
Maar nu gaat het mijn pet te boven.
Kan je de code zo aanpassen dat het wel werkt ?
Of is dat niet mogelijk.
 
Dan zou dit 'm moeten zijn:
Code:
Private Sub cmdBackup_Click()
Dim strBestandNaam As String, strBackupNaam As String, MijnBestand As String
Dim Pad As String, PadBU As String
Dim DB() As Variant, fileObj As Object
Dim i As Integer

    On Error GoTo Fout
    Pad = CurrentProject.Path & IIf(Right(CurrentProject.Path, 1) <> "\", "\", "")
    PadBU = Pad & "Back-up\"
    strBestandNaam = "Wedprog_BU_"
    MijnBestand = Dir(PadBU & strBestandNaam & "*.mdb")
    Do While Not MijnBestand = ""
        ReDim Preserve DB(i)
        DB(i) = MijnBestand
        i = i + 1
        MijnBestand = Dir
    Loop
    
    strBackupNaam = PadBU & strBestandNaam & Format(Date, "_yyyy-mm-dd") & Format(Time, "_HH.MM") & ".mdb"
    strBestandNaam = Pad & CurrentProject.Name
    If i >= 30 Then fileObj.DeleteFile (PadBU & DB(0))
    fileObj.CopyFile strBestandNaam, strBackupNaam, True
    MsgBox "De backup is gelukt!", vbOKOnly
    Exit Sub
    
Fout:
    MsgBox "De backup is mislukt!", vbCritical

End Sub
 
Dank je voor de reactie.
Er gebeurt niets, alleen de foutmelding "De backup is mislukt verschijnt".
Bij het allereerst weergegeven voorbeeld werkt het nog steeds, zij het dat het bestand in de huidige map komt en niet in de map Back-up.
 
Mijn code, uit de eerste post (#2) dus, werkt bij mij perfect. Veel mer kan ik er ook niet van maken. Ik heb dus wel het type db veranderd van mdb naar accdb. En hij werkt nog steeds prima :).
 
OK, bedankt. Schijnbaar te moeilijk / niet op te lossen.
In ieder gevel bedankt voor de hulp.
Iemand anders een idee ?
Het werkt namelijk niet op deze manier.
 
OK, bedankt. Schijnbaar te moeilijk / niet op te lossen.
Beetje flauwe opmerking dit.... Dingen zijn (voor mij) zelden niet op te lossen, laat staan te moeilijk. Bovendien heb ik mijn routine op een aantal databases getest, en werkt hij prima. Met een aanvulling die automatisch de backup map maakt, zodat dat ook niet fout kan gaan.

Code:
Dim fileObj As Object
Dim strBestandNaam As String, strBackupNaam As String, MijnBestand As String
Dim Pad As String, PadBU As String
Const BU_Map As String = "Back_Up"
Dim DB() As Variant
Dim i As Integer

''    On Error GoTo Fout
    Set fileObj = CreateObject("Scripting.FileSystemObject")
    If Dir(CurrentProject.Path & "\" & BU_Map, vbDirectory) = "" Then MkDir CurrentProject.Path & "\" & BU_Map
    Pad = CurrentProject.Path & IIf(Right(CurrentProject.Path, 1) <> "\", "\", "")
    PadBU = Pad & BU_Map & "\"
    strBestandNaam = Split(CurrentProject.Name, ".")(LBound(Split(CurrentProject.Name, "."))) & "_BU_"
    MijnBestand = Dir(PadBU & strBestandNaam & "*.accdb")
    Do While Not MijnBestand = ""
        ReDim Preserve DB(i)
        DB(i) = MijnBestand
        i = i + 1
        MijnBestand = Dir
    Loop
    
    strBackupNaam = PadBU & strBestandNaam & Format(Date, "yyyy-mm-dd") & Format(Time, "_HH.MM") & ".accdb"
    strBestandNaam = Pad & CurrentProject.Name
    If i >= 3 Then fileObj.DeleteFile (PadBU & DB(0))
    fileObj.CopyFile strBestandNaam, strBackupNaam, True
    MsgBox "De backup is gelukt!", vbOKOnly
    Exit Sub
    
Fout:
    MsgBox "De backup is mislukt!", vbCritical

Ik ben wel nog iets aan het toevoegen waarmee je de array kunt sorteren zodat je de oudste naam weggooit, en niet de oudste file. Nu gooit hij soms de verkeerde weg. Niet dat dat het proces in de weg staat. Maar het is netter als hij de oudste verwijdert.
 
Heel hartelijk dank - alles werkt naar behoren.
De geplaatste opmerking was niet als flauw bedoeld en als deze zo overkwam, mijn excuses.
 
Prima, de foutmelding kwam hier..

ReDim Preserve DB

Zegt mij niets verder.

Vriendelijke groet,
 
Dan probeer ik dat nog even uit te leggen :). Het gaat, neem ik aan, om dit stukje:
Code:
    Do While Not MijnBestand = ""
        ReDim Preserve DB(i)
        DB(i) = MijnBestand
        i = i + 1
        MijnBestand = Dir
    Loop
De variabele DB is een matrix variabele. Dat is een variabele die meerdere waarden (in 'lagen' zeg maar) kan bevatten. Zie het als een flatgebouw, waar voor elke nieuwe bewoner (waarde) een nieuwe etage (dimensie) bovenop wordt gebouwd. Een matrix moet altijd worden gedefinieerd. Dat doe je met het Dim commando. Dus met Dim (DB(2) geef je aan dat de matrix 2 of 3 waarden kan bevatten. Die laatste opmerking kun je alleen snappen als je weet hoe die variabele begint met vastleggen. Daarvoor zijn twee opties: met 0 of met 1. Dat moet je specifiek vastleggen in de db. Als je wilt dat de matrix met 1 begint, moet je bovenaan in de module de regel Option Base 1 neerzetten. Dan levert DB(2) dus 2 plaatsen op. Laat je de Option Base weg, dan begint de matrix bij 0, en heb je dus 3 waarden (DB(0), DB(1) en DB(2)).

Vaak weet je van tevoren niet hoeveel plekken je nodig hebt. In een functie die op een query is gebaseerd, kan het aantal records wisselen en lees je een map uit, zoals nu, dan kan het aantal bestanden variëren. In dat geval heb je een matrix nodig die je kan aanpassen. Dat doe je door de matrix iets anders te definiëren, namelijk met Dim DB() (As Variant). Nu heeft de matrix nog geen dimensie, en ga je die zelf bepalen. Meestal doe je dat door in een lus zaken uit te lezen, en de dimensie steeds met één te verhogen, zoals ook in de code gebeurt.
Dat opnieuw bepalen doe je met ReDim en een getal. Redim heeft één nadeel: het gooit alle oude waarden ook gelijk weg. Dus als je een variabele vult, en steeds de waarde verhoogt, is dat niet handig want dan kun je op het eind weer opnieuw beginnen. Vandaar dat je de opdracht moet uitbreiden met Preserve. Hiermee geef je aan dat de matrix moet worden vergroot, met behoud van de eerdere waarden.

Je begint dus met een platte variabele, met één opslagplaats. i is namelijk 0 als je begint met de code. De regel ReDim Preserve DB(0) doet dan in beginsel dus hetzelfde als ReDim DB(0). Bij de volgende bestanden moet je ReDim Preserve DB(1) en ReDim Preserve DB(2) gebruiken, omdat de matrix dus anders geleegd wordt.

Fouten hierbij onstaan op het moment dat je niet precies weet of je met 0 of met 1 moet beginnen. Je kunt nooit buiten de maximale of minimale dimensie werken, dus als je DB(1) probeert te vullen in een matrix die alleen DB(0) kent, dan gaat het fout. Andersom ook: als je Option Base 1 gebruikt moet i met 1 beginnen en niet met 0.
Hopelijk is het nu wat duidelijker!
 
Beste OctaFish,

Dank je, het is erg druk, maar na de feestdagen zal ik je uitleg goed gaan bestuderen en proberen mij machtig te maken.
Tot zover wederom mijn dank.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan