Avatar billede overchord Nybegynder
15. oktober 2004 - 14:43 Der er 19 kommentarer og
1 løsning

Fejl ved DoCmd.CopyObject

Hejsa

I Access97 har jeg oprettet en mulighed for at brugeren ved tryk paa en knap kan eksportere dele af databasen + bagvedliggende data til en ny isoleret DB som folk kan arbejde med paa laptops etc.
Problemet er at knappen ligger paa formen "Splash" og ved klik paa knappen i denne formular giver jeg flg:
Docmd.Close acForm, "Splash", acSaveNo
CloneDB

Hvor CloneDB er en sub som loeber igennem en tabel der indeholder en liste over hvilke tabeller, queries, forms etc der skal kopieres over.
Denne fungerer fint. Problemet opstaar naar jeg vil kopiere "Spash" over i den nye DB. Dette forgaar som en del af CloneDB med udtrykket:

DoCmd.CopyObject, db2.Name, , acForm, "Spash"

Naar denne koeres faar jeg Run-time error '2007'
You already have an open database object named "Splash"

Hvis jeg lukker formen ned manuelt og koerer CloneDB fra modulet virker det hele fint nok - saa det lader til at "Splash" ikke bliver lukket ordentligt ned naar jeg bruger DoCmd.Close
Nogle forslag til hvad jeg ellers kan goere?
15. oktober 2004 - 14:46 #1
Du kan prøve med en Doevents:

Docmd.Close acForm, "Splash", acSaveNo
Doevents
CloneDB


Eller denne variant:

Docmd.Close acForm, "Splash", acSaveNo
if Currentproject.allforms("Splash").IsLoded = false then CloneDB
Avatar billede overchord Nybegynder
15. oktober 2004 - 14:56 #2
Har proevet med DoEvents -> Uden held

Currentporject retunerer 'Variable not defined' Er det evt en ADO kommando istedet?
15. oktober 2004 - 14:56 #3
Sorry, Overchord, CurrentProject virker selvfølgelig ikke i Access 97 :o(
15. oktober 2004 - 15:00 #4
Du kan evt lave din egen IsLoaded-funktion i et modul:

Function IsLoaded(MyFormName As String) As Integer
    Dim I As Integer

    IsLoaded = False
    For I = 0 To Forms.Count - 1
        If Forms(I).FormName = MyFormName Then
            IsLoaded = True
            Exit Function     
        End If
    Next

End Function

Og derefter gøre således:
Docmd.Close acForm, "Splash", acSaveNo
Do Until IsLoaded("Splash") = false
    doevents
loop
CloneDB
Avatar billede overchord Nybegynder
15. oktober 2004 - 15:14 #5
argh - nu troede jeg ellers den var der :-0

IsLoaded lader til at fungere fint nok, faar ingen fejl paa det, men hvis jeg smider et breakpoint ved For I = 0 To Forms.Count - 1 kan jeg se at Forms.Count = 0, saa formularen skulle vaere lukket - men faar stadig samme fejl ved CopyObject...
15. oktober 2004 - 15:19 #6
Der er jo selvfølgelig også noget paradokselt ved at den skal eksekvere den sidste del af koden på formularen - efter at den er lukket. Derfor lukker den nok ikke formularen "rigtigt" før hele koden er eksekveret.

Du kan ikke konstruere applikationen anderledes? F.eks. lægge knappen på en formular, som ikke skal kopieres med? Eller lægge knappen på værktøjslinien?
Avatar billede overchord Nybegynder
15. oktober 2004 - 15:21 #7
Ikke rigtigt :-(
Problemet er at denne knap er en del af hoved-navigationspanelet for hele db'en. Alternativet kunne maaske vaere at lave en lille status-box som ikke skal kopieres med over hvor modulet koeres fra.... det vil jeg da lige afproeve!
Avatar billede overchord Nybegynder
15. oktober 2004 - 15:34 #8
Utroligt!
Foerst flyttede jeg CloneDB action over til load eventen paa en ny formular som aabnes naar Splash lukkes - samme fejl

Nu har jeg flyttet det saa man rent faktisk skal trykke paa en commandbutton foer clone-db koeres. eg har stadig lagt testen fra 15/10-2004 15:00:21 ind paa den nye formular's load-event og knappen er sat til foerst at blive enabled efter at denne er loopet igennem. Men jeg faar stadig sammen fejl....
Nu er al eksport kode med 100% sikkerhed ikke koblet med noget der skal overfoeres.
15. oktober 2004 - 15:37 #9
Men den vil godt kopiere andre formularer?
Avatar billede overchord Nybegynder
15. oktober 2004 - 15:40 #10
Ja alle andre formularer (37 stk) kopieres fint sammen med alle andre tabeller, queries osv - det er kun Splash den giver fejl paa...
Hvis jeg aabner den nye "midterform" efter af jeg manuelt hyar klikket paa luk knappen for Splash koerer det hele ogsaa fint.... :-S
15. oktober 2004 - 15:57 #11
hmm....mystisk.

Kan du ikke ved opstart (vha Autoexec-makro) spørge brugeren om han ønsker at tage kopi af databasen og derefter køre CloneDB inden nogen formularer overhovedet har været åbne?

En anden mulighed (som selvfølgelig heller ikke er optimal) er at kopiere Splash til lokal (og uberørt) kopi:

Docmd.CopyObject, "Splash_tmp" , acForm, "Spash"
DoCmd.CopyObject db2.Name,  acForm, "Spash"
DoCmd.DeleteObject acForm, "Splash_tmp"
Avatar billede overchord Nybegynder
15. oktober 2004 - 16:01 #12
Jeg kna ikke goere det ved opstart idet der foerst koeres et check paa bruger-rettigheder - og det er ikke alle brugere der har rettigheder til at lave kopier.

Men den med lokal kopi vil jeg lige afproeve ---efter en kaffepuse :-)
15. oktober 2004 - 16:03 #13
ok, men dette rettighedscheck, kan du jo bare kalde forinden - via din autoexec...
Avatar billede overchord Nybegynder
15. oktober 2004 - 17:09 #14
Ja - det er selvf rigtigt nok, men det vil nu vaere at firetraekke at brugeren frit kan oprette en kopi efter at de har arbejdet med data.
Det virker "naesten" med at lave en temp version og kopiere over.
Problemet er bare at jeg stadig ikke kan give den det nye avn Splash i db2.
Hvis jeg koerer det som

DoCmd.CopyObject db2.Name, "Splash", acForm, "Splash_temp"

faar jeg stadig den samme fejl. Men hvis jeg koerer:

DoCmd.CopyObject db2.Name, , acForm, "Splash_temp"
Virker det. Problemet er at Splash er den formular der ligger som startup, hvorfor den jo gerne skulle bibeholde sit navn......
Heh det skulle have vaeret saa nemt, men....
15. oktober 2004 - 17:18 #15
Du skal jo ændre navnet tilbage, når du kopiere den over i den ny database:
DoCmd.CopyObject db2.Name, "Splash_temp", acForm, "Splash"
Avatar billede overchord Nybegynder
18. oktober 2004 - 08:48 #16
Jeps men hvis jeg goer det faa jeg den saevanlige fejl!
Jeg kan kopiere den til db2 under "temp" - navnet, men hvis jeg proever at kopiere den som "Splash" faar jeg samme fejl som tidligere....
Avatar billede overchord Nybegynder
18. oktober 2004 - 16:04 #17
ok thomas - hvis du kan give mig en pointer om hvordan jeg faar omdoebt
formularen Splash_temp naar den ligger i db2, hvor db2 ikke er currentdb  - saa kan jeg faa givet dig dine point ;-)
18. oktober 2004 - 16:09 #18
hmm, det aner jeg faktsk ikke :o(

Men jeg tror heller ikke, at det er muligt, da det virker som om, at den åbner Splash-formularen i db2 når du forsøger at eksporterer til den. Så når du ikke får lov at oveskrive den, så får du næppe heller lov at omdøbe den :o(
Avatar billede overchord Nybegynder
19. oktober 2004 - 12:01 #19
hehe ja jeg fik lavet en loesning hvor jeg overfoerer den som splash_temp og efterfoelgende saetter splash_temp som startupform fromfor den originale splash. Det goer ikke den store forskel for brugeren - blot en irriterende lille detalje at man ikke kunne kode det "ordentligt" :-)
Anyway tak for hjaelpen - du faar point for forslaget som foerste til loesningen ;-)
19. oktober 2004 - 12:03 #20
ok, tak for det....selvom jeg er ked af, at det ikke lykkedes 100%

og du har ret i, at det da er for irriterende :o(
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