Avatar billede jmarques Nybegynder
26. marts 2011 - 13:44 Der er 25 kommentarer og
1 løsning

Backup kommando knap af min database

Er der nogen der kan hjælpe mig med at oprette en kommando knap jeg kan trykke på, således at der tages en backup af hele databasen et andet sted på serveren, ved blot at klikke denne ene gang?

Meget gerne trin for trin, jeg er nybegynder med Access.

Har overtaget en tusse gammel database som jeg er ved at "pifte lidt op". Her er bla. en Kommando kanp til backup af hele databasen - på diskette- det er man vist gået væk fra efterhånden :-).

På forhånd tak for hjælpen.
Avatar billede hugopedersen Nybegynder
26. marts 2011 - 14:09 #1
Hvis der allerede er en funktion der gør det til diskette er det vel bare at ændre i den så den placerer backuppen et andet sted.

Men hvis du er nybegynder i Access så er det måske ikke lige nu du skal begynde med det.
Avatar billede jmarques Nybegynder
26. marts 2011 - 14:53 #2
Nej det fungerer desværre ikke. Har prøvet.

Den kode der ligger i editoren "ved klik" hedder:

Private Sub backup_Click()
On Error GoTo Err_backup_Click

    Dim stAppName As String

    stAppName = "P:\Surveillance\Database\backup.bat"
    Call Shell(stAppName, 1)

Exit_backup_Click:
    Exit Sub

Err_backup_Click:
    MsgBox Err.Description
    Resume Exit_backup_Click
   
End Sub
Avatar billede Slettet bruger
26. marts 2011 - 15:26 #3
PÅ knappens vedKlik event:

const backupPath="P:\backup\"
fileCopy currentdb.name,backupPath & mid(CurrentDb.Name,instrrev(CurrentDb.Name,"\")+1)
Avatar billede jmarques Nybegynder
26. marts 2011 - 15:48 #4
Har lige prøvet. Jeg modtager en "run-time error "70" på koden:

FileCopy CurrentDb.Name, backupPath & Mid(CurrentDb.Name, InStrRev(CurrentDb.Name, "\") + 1)
Avatar billede Slettet bruger
26. marts 2011 - 16:21 #5
Nå det var ikke sådan det skulle virke ;)
Det viser sig at access har åbnet mdb filen for en eksklusiv adgang der respekteres af filecopy.

Derfor sådan istedet:

shell "cmd /c copy " & CurrentDb.Name & " " backupPath & Mid(CurrentDb.Name, InStrRev(CurrentDb.Name, "\") + 1)
Avatar billede jmarques Nybegynder
26. marts 2011 - 16:33 #6
Jeg skal lige være sikker. Denne sti const backupPath="P:\backup\"
skal føre hen til der hvor gerne vil have gemt vores backup på serveren ikke sandt?

Så ser stien nemlig således ud:

"P:\Surveillance\Database\Sikkehedskopier\Sikkerhedskopi af Surveillance database.mdb"

Så vba koden ved klik event skal i sidste ende se sådan her ud eller?:

Den kode der ligger i editoren "ved klik" hedder:

Private Sub backup_Click()
On Error GoTo Err_backup_Click

    Dim stAppName As String

    stAppName = "P:\Surveillance\Database\Sikkehedskopier\Sikkerhedskopi af Surveillance database.mdb"
    shell "cmd /c copy " & CurrentDb.Name & " " backupPath & Mid(CurrentDb.Name, InStrRev(CurrentDb.Name, "\") + 1)

Exit_backup_Click:
    Exit Sub

Err_backup_Click:
    MsgBox Err.Description
    Resume Exit_backup_Click
   
End Sub
Avatar billede Slettet bruger
26. marts 2011 - 17:07 #7
Den kunne se sådan ud

Private Sub backup_Click()
  Const backupPath = "P:\Surveillance\Database\Sikkehedskopier\Surveillance databaser\"
  Shell "cmd /c copy " & CurrentDb.name & " " & backupPath & Mid(CurrentDb.name, InStrRev(CurrentDb.name, "\") + 1)
End Sub
Avatar billede jmarques Nybegynder
26. marts 2011 - 17:26 #8
Nå jeg klikker på knappen er der ser det umiddelbart ud til at fungere. Ingen fejmeddelelser.

Til gengæld kan jeg ikke se nogen ikoner i mappen \Sikkerhedskopier\Surveillance databaser
Avatar billede Slettet bruger
26. marts 2011 - 19:08 #9
Check om der er overenstemmelse mellem mappenavn og parameterne til shell kommandoen.

Men det er korrekt at den er 'silent' - der er ingen tilbagemelding om hvorvidt det lykkedes - hvis man gerne vil se om det lykkedes kan man:

Shell "cmd /k copy " & CurrentDb.name & " " & backupPath & Mid(CurrentDb.name, InStrRev(CurrentDb.name, "\") + 1) & "&pause&exit",vbNormalFocus
Avatar billede jmarques Nybegynder
27. marts 2011 - 11:25 #10
Har indsat:

Shell "cmd /k copy " & CurrentDb.name & " " & backupPath & Mid(CurrentDb.name, InStrRev(CurrentDb.name, "\") + 1) & "&pause&exit",vbNormalFocus

I linien i stedet for som du foreslog men så kommer der et sort vidows vindue op med:

The system cannot find the file specified.
Press any key to continue . . .

Som sti har jeg indsat:

P:\Surveillance\Database\Sikkehedskopier

Det er en henvisning til en på nuværende tidspunkt tom mappe, hvor jeg forestillede mig at et ikon ville lægge sig når jeg trykker på backup knappen. Således at jeg kan se hvornår der sidst er taget en backup af databasen.
Avatar billede Slettet bruger
27. marts 2011 - 13:47 #11
Jeg ved godt hvad der er galt - sagen er at computeren her på martiklen indehaves af en ekstrem mellemrumshader hvad angår navnet på et hvilket somhelst objekt.

Først info om hvordan man bikser sådan nogle ting sammen.

I vba editoren er der nederst til højre et vindue - immediate vinduet (se vinduets titel tekst)
Her kan man udføre kommandoer direkte - kalde function's og sub's og mere. Vba betyder, som måske bekendt, 'visual basic for applications' - en af basic sprogets meget anvendte kommandoer er: 'print'. I immediate vinduet kan man blot skrive spørgsmålstegn - prøv f.eks.

?10+20<tast return>

I det følgende bruger jeg <> som instruktions anvisning
Prøv nu følgende på en ny linie

  ?cur<ctrl-mellemrum>r<tast evt. pil ned til currentdb er markeret><tast tab>.n<tast tab><tast return>
 
Prøv nu denne:

  ?instrr<tast tab>(curr<tast pil ned><tast tab>.n<tast tab>,"\")<tast return>
 
Læg mærke hvordan 'instrrev' skiftede til den kamelskrift, som er måden, med 'case',hvorpå det er defineret - det er i andre sammenhænge er rar feature. Prøv nu at anbrige markøren i 'InStrRev' og tast F1 - det ses at InStrRev i vores eksemel har retuneret postionen på den sidste bagslash i path-filnavnet.
Prøv ligeledes med F1, at se hvorfor dette finder *.mdb filnavnet uden path:

  ?mid(CurrentDb.Name,InStrRev(CurrentDb.Name,"\")+1)
 
Man kan sammensætte udtryk som dem ovenover med & tegnet

?currentdb.name & " p:\damned space\backup\" & mid(CurrentDb.Name,InStrRev(CurrentDb.Name,"\")+1)

Som bekendt anvender 'cmd.exe kommandoer' mellemrum som skilletegn! Filnavne skal indkapsles i gåseøjne! Syntaksen for gåseøjne i noget der skrives inde i gåseøjne kan drille - her kommer immediate vinduet virkeligt til sin ret. Princippet er at to ved siden af hinanden inden i en streng (efter første) - betyder et enkelt gåseøje.

Du får lige lidt at starte på:
 
  ?"cmd /k copy """ & CurrentDb.Name & """" 

... og er velkommen til at vende tilbage hvis du hænger fast
Avatar billede jmarques Nybegynder
27. marts 2011 - 14:32 #12
OK - er det ligemeget hvor i vba´en jeg er, når jeg er nede i immidiate feltet?

Er nået til ?instrr<tast tab>(curr<tast pil ned><tast tab>.n<tast tab>,"\")<tast return>

Skriver fint: instrr og taster tab men herfra sker der ingenting?
Avatar billede jmarques Nybegynder
27. marts 2011 - 14:34 #13
Hvis jeg følger sætningen så præcist som jeg fortolker den skriver den:

Invalid watch expression
Avatar billede Slettet bruger
27. marts 2011 - 15:28 #14
Sorry - der skulle have stået:

?instrr<ctrl-mellemrum>(curr<ctrl-mellemrum><tast pil ned><tab>.n<tast tab>,"\")<tast return>

Meningen er at du får sikkerhed og forståelse for at det er 'access objekter' og kun magiske nøgler fra en forum dialog du har med at gøre.
Avatar billede jmarques Nybegynder
27. marts 2011 - 16:53 #15
Jeg fik det til at virke den skriver forskellige stier ud fra de koder man taster ind. Men jeg må indrømme at koderne giver ikke meget mening endnu. Ganske få ting gør men ellers ikke. Fik denne linie til sidst:
cmd /k copy "P:\Surveillance\Database\Den originale database\Database2000XP.mdb"
Avatar billede Slettet bruger
27. marts 2011 - 18:10 #16
Det er udmærket - du skal bare forlænge, så det passer med mønsteret i argumentlisten og kommandoerne til cmd som i #9 - altså noget i stil med (idet jeg anvender andre stinavne)

cmd /k copy "c:\home\access\rap.mdb" "d:\backup\rap.mdb"&pause&exit

og dette udtryk anvendes som 1.argument til shell - Det er vigtigt at 2. argument er vbNormalFocus, nu vi andvender /k option til at få vist tilbagemeldingen (tænker igen på kontordamen - den henter bare anderkendelse ;)
Avatar billede jmarques Nybegynder
27. marts 2011 - 18:50 #17
Er ved at miste overblikket lidt i de her koder.

Har forsøget at skrive denne sti ind efter shell:

cmd /k copy ""P:\Surveillance\Database\Den originale database\Database2000XP.ldb" "P:\Surveillance\Database\Sikkehedskopier"&pause&exit

Men modtager "Compile Error" Expected: end of statement

Er det ikke rigtigt forstået at kommandoen betyder at den skal tage originalen og lave en kopi til den mappe jeg kalder for sikkerhedskopier?
Avatar billede Slettet bruger
27. marts 2011 - 19:15 #18
Jo - det er rigtigt forstået. Du kan prøve at åbne et konsole vindue  - skriv cmd i windows->startknappen->kør

I det console vindue skriver du
help copy

Så får du kommandolinie argumenterne til cmd's copy kommando - kort fortalt:

copy kilde destination

Den fejlmeddelelse du får er fra vba miljøet - du har skrevt noget som bliver oversat til 'for mange argumenter til shell funktionen'
Avatar billede jmarques Nybegynder
30. marts 2011 - 21:06 #19
Har skrevet helt copy i startknappen kør og læst vejledningen.

Jeg har prøvet forskellige løsninger med forkellige sti navne men det vil ikke lykkedes for mig.
Avatar billede jmarques Nybegynder
30. marts 2011 - 21:15 #20
Jeg må være ærlig. Jeg forstår simpelthen ikke hvad jeg gør forkert?
Avatar billede Slettet bruger
30. marts 2011 - 23:40 #21
Der ligger nok også en del i det.

Sub backup_Click()
  Const backupPath = "P:\Surveillance\Database\Sikkehedskopier\Surveillance databaser\"
  Shell "cmd /c copy """ & CurrentDb.Name & """ """ & backupPath & _
        Mid(CurrentDb.Name, InStrRev(CurrentDb.Name, "\") + 1) & """&pause&exit"
End Sub
Avatar billede Slettet bruger
30. marts 2011 - 23:51 #22
FEJL - #21 skulle være:
Sub backup_Click()
  Const backupPath = "P:\Surveillance\Database\Sikkehedskopier\Surveillance databaser\"
  Shell "cmd /k copy """ & CurrentDb.Name & """ """ & backupPath & _
        Mid(CurrentDb.Name, InStrRev(CurrentDb.Name, "\") + 1) & """&pause&exit",vbNormalFocus
End Sub
Avatar billede jmarques Nybegynder
31. marts 2011 - 01:14 #23
Den virker !!

Skulle lige ændre stien til backup mappen. En eller anden har haft flyttet på dem....!

En lille detalje. Console vinduet lukker ikke af sig selv. Kan man få den til det mon?

Men ellers KANON !!
Avatar billede Slettet bruger
31. marts 2011 - 09:19 #24
Det Console vindue er din backup funktions lille maskot - den feature som tager kegler hos andre brugere - '1 file(s) copied' så ved man at der er taget backup!
Men elles se i #7 - oprindeligt havde jeg anvist en 'silent' udgave - forskellen ligger i option /c kontra option /k til cmd, de eksta kommandoer 'pause' og 'exit' og det sidste argument til shell.
Avatar billede jmarques Nybegynder
31. marts 2011 - 09:44 #25
Ok super. Jeg tror faktisk også at jeg beholder vinduet af samme årsag som du nævner - igen tusind tak for råd, vejledning og ikke mindst din tålmodighed.
Avatar billede Slettet bruger
31. marts 2011 - 18:15 #26
Du holdt godt ud, det må jeg sige.
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