Avatar billede krestensb Nybegynder
17. september 2013 - 13:40 Der er 7 kommentarer og
1 løsning

Kopi af db uden link til odbc-kilder

Jeg har en database med en række odbc-linkede tabeller. Jeg vil gerne tage en kopi af databasen uden link til odbc-kilderne.
Er der nogen der kan klare det? Jeg kan kun gøre det for en tabel ad gangen, og da der er mange tabeller er det lidt omstændeligt.

Formålet er at få en udviklingsversion af min database, som jeg kan arbejde med udenom netværket.

Mvh Kresten
Avatar billede MSchlamovitz Mester
17. september 2013 - 14:15 #1
Sådan gør jeg - lidt omstændeligt, men det virker !
Har andre en smartere metode, er jeg meget lydhør !!

1. Du skal lave en opdeling i frondend og backend, så du har tabellerne i én fil og resten i en anden.
2. Så skal du lave en kopi af backend-filen (den med tabellerne).
3. I denne fil laver du en kopi af ODBC-tabeller og gemmer dem som lokale tabeller - i samme fil.
4. Så fjerner du alle ODBC-tabellerne.
5. Derefter omdøber du alle lokaltabellerne så de hedder det samme som ODBC-tabellerne.
6. Så har du én fil med lokaltabeller, som du kobler din Frontend-database samme med når du udvikler off-line (Sammenkædede tabeller). - og én fil med ODBC-tabeller, som du kobler til i produktion.
7. Når du laver ændringer i tabelstrukturen skal du huske at lave dem begge steder.
Avatar billede krestensb Nybegynder
17. september 2013 - 14:29 #2
Det tar vel 10 minutter at kopiere en tabel i mit system. Jeg er nød til at kunne gøre det om natten, uden at blive spurgt om egenskaber for hver kopi.
Kan det gøres i en makro?
Avatar billede krestensb Nybegynder
17. september 2013 - 15:31 #3
Jeg har fundet en kodestump er kopierer en tabel fra en anden db. Koden kopierer tabellen ind med link. Kan man få den til at lade være med det?

DoCmd.TransferDatabase acImport, "Microsoft Access", "default.accdb", acTable, "TestUdvikling", "TestUdvikling", False
Avatar billede MSchlamovitz Mester
18. september 2013 - 10:03 #4
Docmd.transferDatabase vil importere et link som et link - det kan man ikke lave om på.

Ovenstående procedure skal du kun udføre én gang.
Det er min umiddelbare vurdering, at det tager længere tid at skrive en kode, der kan gøre det automatisk, end det tager at gøre det manuelt - især fordi det er nødvendigt, at lokaltabellerne hedder det samme som ODBC tabellerne.

Men her er et hint til noget kode, der løser opgaven:
(Nedenstående er meget mangelfuld, men giver dig en ide om hvilken vej du skal gå)

For each tabel in tabelscollection
  docmd.RunSQL "SELECT * FROM tabel INTO tabel & "A"
Next tabel

Herefter har du to af hver tabeller: Tabel og TabelA. Nu skal du slette Tabel og omdøbe TabelA til Tabel.
Avatar billede krestensb Nybegynder
18. september 2013 - 11:49 #5
Følgende kode gør arbejdet, og det fungerer udemærket.

  SQL1 = "SELECT TOP 100 VUEUDV_RAT_AKTPER.FORNAVNE INTO ny_RAT_AKTPER FROM VUEUDV_RAT_AKTPER;"
  SQL2 = "DROP TABLE VUEUDV_RAT_AKTPER;"
  SQL3 = "SELECT * INTO VUEUDV_RAT_AKTPER FROM ny_RAT_AKTPER;"
  SQL4 = "DROP TABLE ny_RAT_AKTPER;"
 
  DoCmd.RunSQL SQL1
  DoCmd.RunSQL SQL2
  DoCmd.RunSQL SQL3
  DoCmd.RunSQL SQL4

Kan køre flere strenge gennem samme DoCmd kald?
Og så er der noget med at omdøbe. Er der en smartere måde i access?
Avatar billede MSchlamovitz Mester
18. september 2013 - 12:15 #6
Vær opmærksom på, at SELECT TOP 100 . . ." kun medtager de første 100 records i tabellen

Som jeg ser det, mangler du bare den løkke, der løber alle tabellerne igennem  - noget i stil med:

dim db as DAO.database, tbl as DAO.tableDef
dim strSQL as string, GlNavn As String, NyNavn As String

set db = currentdb()

for each tbl in db.TableDefs
If mid(tbl.name,1,4) <>"MSYS" then
GlNavn = tbl.name
NyNavn = "ny_"& tbl.Name

SQL1 = "SELECT * INTO " & NyNavn & " FROM " & GlNavn" & ;"
SQL2 = "DROP TABLE " & GlNavn & ";"
SQL3 = "SELECT * INTO " & GlNavn & " FROM " & NyNavn & ";"
SQL4 = "DROP TABLE " & NyNavn & ";"
 
  DoCmd.RunSQL SQL1
  DoCmd.RunSQL SQL2
  DoCmd.RunSQL SQL3
  DoCmd.RunSQL SQL4
end if
Next tbl

Huske at teste - det har jeg ikke haft tid til
Avatar billede krestensb Nybegynder
18. september 2013 - 12:16 #7
Jeg fandt det

DoCmd.Rename "RAT_AKTPER", acTable, "ny_RAT_AKTPER;"
Avatar billede MSchlamovitz Mester
18. september 2013 - 12:25 #8
Med ovenstående rutiner i SQL1 -2 -3 og 4 ewr der ikke brug for at omdøbe :-)
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

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