Avatar billede schoesler Nybegynder
23. oktober 2003 - 12:49 Der er 29 kommentarer og
1 løsning

Kopiere tabeller over i ekstern DB

Hej Eksperter
Har en opdatering DB der indeholder 20 tabeller. Dem vil jeg gerne haver overført til min eksterne DB, men kun hvis de ikke eksistere i forvejen.
1. undersøger om tabellen eksisterer, hvis ja kopiere, hvis nej undersøgelse af næste tabel
Avatar billede schoesler Nybegynder
23. oktober 2003 - 12:49 #1
hvordan kan man gøre det i VBA kode
Avatar billede keil Nybegynder
23. oktober 2003 - 14:23 #2
Kan den eksterne DB opdateres af andre end denne opdaterings DB ?
Avatar billede schoesler Nybegynder
23. oktober 2003 - 14:26 #3
Nej, det er ikke meningen
Avatar billede overchord Nybegynder
23. oktober 2003 - 14:27 #4
Du kan vel bruge noget i retning af (ikke testet kode):

dim tdf as tabledef
dim tdf2 as tabledef
dim db1 as database
dim db2 as database
dim CopyTable as Boolean

set db1 = din opdateringsdatabase
set db1 = din eksterne db


For Each tdf in db1
  tablecopy = true
  for each tdf2 in db2
    if tdf.Name = tdf2.Name then
      tablecopy = false
    end if
  Next tdf2
  if tablecopy then
    DoCmd.TransferDatabase accopy, "Microsoft Access", db2.Name, acTable, _ tdf.Name, tdf2.Name

Next tdf
Avatar billede keil Nybegynder
23. oktober 2003 - 14:41 #5
Hvis den ikke kan opdateres andre steder fra, så er det vel blot at sætte en switz når man opdaterer den eksterne base, og slukke switsen når man opdaterer den interne base.

Så skal man kun opdatere når switsen ikke er sat.
Avatar billede schoesler Nybegynder
23. oktober 2003 - 14:45 #6
Hvad er der galt her!

Dim tdf As TableDef
Dim tdf2 As TableDef
Dim db1 As Database
Dim db2 As Database
Dim CopyTable As Boolean

Set db1 = "c:\update.mdb" 'update db
Set db2 = "c:\testDB.mdb" 'ekstern db


For Each tdf In db1
  tablecopy = True
  For Each tdf2 In db2
    If tdf.name = tdf2.name Then
      tablecopy = False
    End If
  Next tdf2
  If tablecopy Then
    DoCmd.TransferDatabase acCopy, "Microsoft Access", "c:\update.mdb", acTable, tdf.name, "c:\update.mdb"
End Sub
Avatar billede overchord Nybegynder
23. oktober 2003 - 15:26 #7
det kommer lidt an paa hvilken db du korer koden fra. den foerste c:\update.mdb skal vaere et tabel-navn istedet = tdf2.name
Avatar billede schoesler Nybegynder
23. oktober 2003 - 15:46 #8
kører koden fra update.mdb
Avatar billede overchord Nybegynder
24. oktober 2003 - 10:31 #9
ok saa mener jeg koedn skal vaere:

DoCmd.TransferDatabase acCopy, "Microsoft Access", tdf.Name, acTable, tdf2.name, db2.Name
Avatar billede schoesler Nybegynder
24. oktober 2003 - 10:39 #10
'overchord' får fejl på Set db1 = "c:\update.mdb" 'update db

når denne kode kører!

Dim tdf As TableDef
Dim tdf2 As TableDef
Dim db1 As Database
Dim db2 As Database
Dim CopyTable As Boolean

Set db1 = "c:\update.mdb" 'update db
Set db2 = "c:\testDB.mdb" 'ekstern db


For Each tdf In db1
  tablecopy = True
  For Each tdf2 In db2
    If tdf.name = tdf2.name Then
      tablecopy = False
    End If
  Next tdf2
  If tablecopy Then
    DoCmd.TransferDatabase acCopy, "Microsoft Access", tdf.name, acTable, tdf2.name, db2.name
Avatar billede overchord Nybegynder
24. oktober 2003 - 13:26 #11
OK siden der er database hvor koden ligger skal du sitedet bruge
set db1 = currentdb
Avatar billede keil Nybegynder
24. oktober 2003 - 13:42 #12
Jeg følger jo lidt med på sidelinien, så jeg måske også kan blive lidt klogere. Uden at være verdensmester i VBA, mener jeg at kunne læse, at I løber hele basen i gennem (alle 20 tabeller til sin tid) for at tjekke om hver enkelt record er opdateret. Hvis den eksterne base er forskellig fra den interne, så opdaterer I, ellers gør I ikke noget.

Er det rigtigt forstået ?
Avatar billede schoesler Nybegynder
24. oktober 2003 - 13:55 #13
'overchord' Koden kører men får type: mismatch error

Private Sub Command45_Click()
Dim tdf As TableDef
Dim tdf2 As TableDef
Dim db1 As Database
Dim db2 As Database
Dim CopyTable As Boolean

Set db1 = CurrentDb
Set db2 = "c:\testDB.mdb" 'ekstern db


For Each tdf In db1
  tablecopy = True
  For Each tdf2 In db2
    If tdf.name = tdf2.name Then
      tablecopy = False
    End If
  Next tdf2
  If tablecopy Then
    DoCmd.TransferDatabase acCopy, "Microsoft Access", tdf.name, acTable, tdf2.name, db2.name
End If
Next tdf
End Sub
Avatar billede schoesler Nybegynder
24. oktober 2003 - 14:08 #14
'keil' Det er kun tabellerne der skal tjekkes, men det kunne være super hvis der kunne laves en kode der også tjekker hvert felt?
Avatar billede keil Nybegynder
24. oktober 2003 - 14:12 #15
Hvordan tjekker man om en tabel er ændret uden at tjekke felterne ?
Avatar billede schoesler Nybegynder
24. oktober 2003 - 14:14 #16
Har 18 identiske backends som indeholder forskelligt data. Når jeg kører en opdatering skulle dataene var intakte, men felter og tabeller same.
Kan det lade sig gøre?
Avatar billede schoesler Nybegynder
24. oktober 2003 - 14:16 #17
'keil' hvad er dit foreslag? Sætter gerne max point in for at få felterne tjekket også
Avatar billede overchord Nybegynder
24. oktober 2003 - 14:44 #18
Ok hvad siger mismatch-fejlen, er det stadig docmd.trasnferdatabase der giver problemer??

mht at opdaetere felt-vis. Er de vigtigt at tabellerne i DB1 som evt ogsaa forefindes i db2 forbliver i databasen?
Hvad jeg egentligt proever at sige er om det vil vaere nemmere at smide alle tabellerne fra DB1 over i DB2
Avatar billede keil Nybegynder
24. oktober 2003 - 14:46 #19
Da din eksterne base kun bliver opdateret herfra, så vil jeg hver gang jeg opdaterer min interne base, sætte en markering.

Så vil jeg kun overføre data til den eksterne base, når denne markering er sat, og jeg vil umiddelbart efter overførslen slette markeringen.
Du har jo én master og én slave. Så lad masteren styre slaven. Hvis du havde flere, som kunne opdatere slaven, så havde det været relevant at tjekke for om indholdet var tjekket.
Avatar billede overchord Nybegynder
24. oktober 2003 - 14:47 #20
Proev med:

DoCmd.TransferDatabase acCopy, "Microsoft Access", db2.Name, acTable, tdf.Name, tdf.Name
Grunden til 2 x tdf name er jo at tabel-navnet IKKE eksisterer i db2, og derfor kan tdf2.name ikke bruge, dooh , min fejl - beklager
Avatar billede schoesler Nybegynder
24. oktober 2003 - 14:56 #21
Får fejl på: Set db2 = "c:\testDB.mdb" 'ekstern db
Det er selve databasen stien
Avatar billede overchord Nybegynder
24. oktober 2003 - 14:58 #22
set db2 = opendatabase("c:\testDB.mdb")
Avatar billede schoesler Nybegynder
24. oktober 2003 - 15:10 #23
ØV nu får jeg denne fejl på denne: For Each tdf In db1

"operation is not supported for this type of object"
Avatar billede keil Nybegynder
24. oktober 2003 - 15:28 #24
"overchord" siger:

"Hvad jeg egentligt proever at sige er om det vil vaere nemmere at smide alle tabellerne fra DB1 over i DB2"

Det er jeg meget enig i. Hvis I alligevel vil tjekke hele databasen, så er det da lettere at smide hele lortet over. Fra Master til slave. Men jeg mener stadig, at I skal styre det fra Masteren.
Avatar billede schoesler Nybegynder
24. oktober 2003 - 15:41 #25
Som tidligere skrevet er der 18 backends, med samme struktur, men forskellig data. Jeg sidder med master backend, som jeg ændrer løbende. Hvordan får jeg nemmest opdatert de andre backends. Jeg laver løbende nye tabeller og felter i master backend's tabeller. ? Mine 18 backends sejler rundt i hele verdenen!
så opdateringen sendes på CD-rom
JAN
Avatar billede overchord Nybegynder
24. oktober 2003 - 16:59 #26
ok proev med flg. Du skal aendre tdf og tdf2 til string istedet :

For Each tabledef In db1.tabledefs
  tablecopy = True
  tdf = db1.tabledef.name
  For Each tabeldef In db2.tabledefs
    tdf2 = db2.tabledef.Name
    If tdf = tdf2 Then
      tablecopy = False
    End If
  Next tabledef


er ikke helt 100 paa om det virker, men proever ta lave et eksempel
Avatar billede overchord Nybegynder
24. oktober 2003 - 17:10 #27
ok nu har jeg en kode der virker helt 100% sikkert!

Sub updatetables()

Dim db1 As Database
Dim db2 As Database
Dim tdf As TableDef
Dim tdf2 As TableDef
Dim TableCopy As Boolean


Set db1 = CurrentDb
Set db2 = OpenDatabase("c:\a.mdb")

With db1
For Each tdf In .TableDefs
    TableCopy = True
    With db2
        For Each tdf2 In .TableDefs
        If tdf.Name = tdf2.Name Then
        TableCopy = False
        End If
        Next tdf2
    End With
   
    If TableCopy Then
    DoCmd.TransferDatabase acExport, "Microsoft Access", db2.Name, acTable, tdf.Name, tdf.Name, 0
    End If

Next
End With



End Sub

- Jeg kan sende dig eksemplerne hvis du laegger en mail-adresse (acc97)
Avatar billede schoesler Nybegynder
24. oktober 2003 - 17:49 #28
'overchord' her er min adresse jan@schoesler.com
Avatar billede schoesler Nybegynder
24. oktober 2003 - 19:10 #29
Tak for hjælpen
Avatar billede overchord Nybegynder
24. oktober 2003 - 20:34 #30
Det var saa lidt - har sendt en kopi som benytter sig af koden i: 24/10-2003 17:10:13
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