Tabelle überschreiben

hallo,

für eine einfache synchonisation möchte ich die tabellen einer datenbank (ms-acc97) mit denen einer zweiten überschreiben.

wie stelle ich das am klügsten an?

sonnige grüsse
franz

Hallo Franz,

die Frage ist, ob Du bei der Synchronisation alle Tabellen überschreiben willst, oder nur einige?
Wenn Du alle überschreiben willst, dann kannst Du ja gleich die komplette Datenbank rüberkopieren, bzw. per FTP übertragen lassen.
Gib uns noch genauere Infos.

Danke
Christian

hallo christian,

ich will nur einige tabellen (bzw. deren inhalt) überschreiben.

habe schonmal mit lösch- und anfügeabfragen rumprobiert, aber es muss doch auch einfacher gehen.

viele grüsse
franz

Hallo Franz,

hast Du es schon einmal mit Makros probiert? Okay ist vielleicht nicht die schönste Lösung, aber funktioniert einwandfrei und ist schnell gemacht. In der Quelldatenbank müsstest Du Dir nur so einen Makro basteln, die Kopieren Objekt Einträge kannst Du ja mit Copy & Paste schnell erstellen und dann nur noch die Namen der Tabellen ändern:

Warnmeldungen

  • Warnmeldung An: Nein
    Kopieren Objekt
  • Zieldatenbank: arbeitsdb.mdb
  • Neuer Name···: TabellenName1
  • Objekttyp····: Tabelle
  • Objektname···: TabellenName1
    Kopieren Objekt
  • Zieldatenbank: arbeitsdb.mdb
  • Neuer Name···: TabellenName2
  • Objekttyp····: Tabelle
  • Objektname···: TabellenName2

Bei Access 2002 geht es, ich weiß aber nicht, ob alle Befehle auch im Access 97 vorhanden sind - musst Du prüfen :smile:

Gruß
Christian

hallo christian,

gute idee (hab keine makroberührungsängste :wink:) doch es scheitert leider an den beziehungen dieser tabelle. bekomme die fehlermeldung „kann tabelle xxx nicht löschen. sie ist teil einer oder mehrerer beziehungen.“

also muss ich wohl doch auf datensatzebene arbeiten (z.b. mit einer lösch- und dann anfügeabfrage)

oder hast du noch einen eleganteren ansatz?

viele grüsse
franz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

VBScript gefällig?
Hi Franz,

wenn die beiden Datenbanken lokal oder im LAN liegen, dann könntest Du auch folgendes VB-Script nehmen. Ich habe es getestet und es funktioniert.

Dim connDB, cmdSystem, sourceDB, targetDB, arrTables, tabName, fSystem, logFile, logFileName, msgInfo

REM Quelldatenbank mit Originaltabellen
sourceDB = "M:\Development\w-w-w\Original\franz.mdb"

REM Zieldatenbank
targetDB = "M:\Development\w-w-w\franz.mdb"

REM Laufwerk, Pfad und Dateiname Logbuch-Datei
logFileName = "C:\temp\synclog.txt"

REM hier kommt der Bericht rein
msgInfo = ""

REM hier stehen alle Tabellennamen die aus targetDB gelöscht und mit den Daten aus sourceDB gefüllt werden
arrTables = Array("Tab1", "Tab2", "Tab3", "Tab4")

Set connDB = CreateObject("ADODB.Connection")

connDB.Open = "provider=MICROSOFT.JET.OLEDB.4.0;data source=" & targetDB

Set cmdSystem = CreateObject("ADODB.Command")

On Error Resume Next

With cmdSystem
 .ActiveConnection = connDB
 .CommandTimeout = 5

 For Each tabName In arrTables
 msgInfo = msgInfo & tabName & ": löschen "

 .CommandText = "DELETE \* FROM " & tabName
 .Execute

 If ( Err ) Then
 msgInfo = msgInfo & "FEHLER"
 Else
 msgInfo = msgInfo & "OKAY"
 End If

 msgInfo = msgInfo & vbCrLf & tabName & ": sync. "

 .CommandText = "INSERT INTO " & tabName & " SELECT \* FROM " & tabName & " IN '" & sourceDB & "';"
 .Execute

 If ( Err ) Then
 msgInfo = msgInfo & "FEHLER"
 Else
 msgInfo = msgInfo & "OKAY"
 End If

 msgInfo = msgInfo & vbCrLf
 Next

End With

On Error Goto 0

Set cmdSystem = Nothing

connDB.Close

Set connDB = Nothing

REM nächste Zeile ggf. löschen, falls mehr als 10 Tabellen bearbeitet werden
MsgBox msgInfo

REM Ausgabe Logbuch
Set fSystem = CreateObject("Scripting.FileSystemObject")
Set logFile = fSystem.OpenTextFile(logFileName, 8, True)

logFile.Write("Synchronisation ")
logFile.WriteLine(Now())
logFile.WriteLine(String(35, "="))
logFile.Write(msgInfo)
logFile.WriteLine(String(35, "\*"))
logFile.Write(vbCrLf)
logFile.Close

Set logFile=Nothing
Set fSystem=Nothing

Script ist getestet und funktioniert bei mir. Du musst es einfach kopieren (falls die Kopie nicht so toll ist, mail mir kurz, dann schicke ich es Dir gezippt als eMail). Es versteht sich von selber, dass in der sourceDB die Tabellen den gleichen Namen und die gleiche Struktur wie die Tabellen in der targetDB haben müssen.

Gruß
Christian

PS: Das Logfile sieht dann so aus

Synchronisation 12.11.2003 20:35:48
===================================
Tab1: löschen OKAY
Tab1: sync. OKAY
Tab2: löschen OKAY
Tab2: sync. OKAY
Tab3: löschen OKAY
Tab3: sync. OKAY
Tab4: löschen OKAY
Tab4: sync. OKAY
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

hallo christian,

es klappt!
allerdings nur, wenn die tabelle keine beziehungen hat und das hat sie leider :frowning: .

ergo stimmt mein denkansatz nicht ganz, da es mit identischen tabellen kopien nicht ganz getan ist (gefährdung der datenintegität).
also müsste ich eine art lösch/aktualisiere/anfüge-abfrage haben um nahezu identische (eben bis auf gelöschte datensätze in der quelldatenbank die noch in beziehungen in der zieldatenbank stehen) tabellen zu bekommen.

doch nicht so einfach wie ich dachte, bzw. wozu oder wann braucht die datenbank überhaupt beziehungen?

viele grüsse
franz