Hallo Zusammen,
ich habe 27 Tabellen, die ich in eine Tabelle zusammenfassen möchte. Die Spaltennamen aller Tabellen sind gleich.
Ich habe es mit 27 Anfügeabfragen versucht, die ich in einem Macro zusammengefasst habe. Das ist nicht sehr komfortabel!!
Gibt es da etwas besseres?
Im Anschluss erstelle ich daraus eine Kreuzabfrage.
Hallo,
ZitatGibt es da etwas besseres?
Ja, ein korrektes Datenmodell. Wozu brauchst Du 27 gleiche Tabellen?
Eine Unionabfrage erzeugt auch eine gemeinsame Abfrage. Eine Unionabfrage musst Du aber selbst schreiben, das geht nicht mit dem Abfrageentwurfsfenster von Access. Aber schneller dürfte das auch nicht sein.
Hallo,
per VBA könntest du die Namen der 27 Tabellen in einer Schleife ermitteln und so die Anfügeabfrage mit den ermittelten Tabellennamen dynamisch geändert ablaufen lassen.
Wobei sich aber auch die Frage stellt wie es sein kann dass 27 idente Tabellen überhaupt existieren ???
@Klaus
Ist es theoretisch möglich 27 Tabellen in eine UNION zu packen oder geht das wirklich?
Vielen Dank für die schnellen Antworten.
Nur die Spaltennamen sind gleich, die Inhalte sind natürlich unterschiedlich.
Schon klar, aber eben genau die gleichen Spalten habe ich unter 'idente Tabellen' gemeint.
Die Tabellen kommen aus SAP. An eine bessere Lösung wird gearbeitet, ich kann aber nicht so lange warten.
Hallo,
dann bleibt wohl nur die 27 Anfügeabfragen. Ob eine Union geht weis ich jetzt nicht, Peter hat mich da zum Zweifeln gebracht.
Hallo,
@Klaus
ZitatPeter hat mich da zum Zweifeln gebracht
...war nicht meine Absicht - ich habe da leider auch keine Kenntnis darüber ::)
Du kannst aber auch folgendes in einem Standardmodul unterbringen und versuchshalber ablaufen lassen:
Public Sub InsertAusfuehren()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strSQL As String
Set db = CurrentDb
For Each tdf In db.TableDefs
If tdf.Name <> "DeineNeueTabelle" Then
strSQL = "INSERT INTO DeineNeueTabelle (Feld1, Feld2, Feld....) " & _
"SELECT Feld1, Feld2, Feld... FROM " & tdf.Name
Db.Execute strSQL, dbFailOnError
End If
Next tdf
End Sub
Vielen Dank für deine Mühe.
Wenn ich es einsetze kommen nur Fehlermeldungen. Ich glaube für eine solche Lösung bin ich nicht gut genug.
Hallo,
Zitat...kommen nur Fehlermeldungen...
Welche?
Habe eben gesehen, dass ich bei der Auflistung der Tabellen den Ausschluß der Systemtabellen nicht berücksichtigt habe.
Daher:
Public Sub InsertAusfuehren()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strSQL As String
Set db = CurrentDb
For Each tdf In db.TableDefs
If tdf.Name <> "DeineNeueTabelle" And Left(tdf.Name,4) <> "MSys" Then
strSQL = "INSERT INTO DeineNeueTabelle (Feld1, Feld2, Feld....) " & _
"SELECT Feld1, Feld2, Feld... FROM " & tdf.Name
Db.Execute strSQL, dbFailOnError
End If
Next tdf
End Sub
Zur Demo im Anhang ein kleines Beispiel.
Öffne das Modul, stell den Cursor in die Routine und drücke F8 um den Code schrittweise zu durchlaufen.
Bei jeder gefundenen Systemtabelle wird nun das Insert übersprungen und nur die beiden Tabellen mit den Daten behandelt.
Die Namen der Tabellen werden ins Direkfenster zur Kontrolle geschrieben (debug.print)
HTH
[Anhang gelöscht durch Administrator]
Vermutlich hat der Kollege außer dem SAP-Sammelsurium noch weitere Tabellen in der Datenbank, mindestens die Systemtabellen. Diese haben natürlich dann eine andere Struktur und werfen bei einer Anfügeabfrage Fehler.
@Profitor: Sinnreich wäre es, die Tabellen nicht mit "Augen zu" zu importieren als eigene Tabellen, sondern deren Inhalte gleich per Anfügeabfrage an eine geplante Datenbanktabelle anzufügen. Dann wäre es ein Vorgang und ist somit komfortabel.
MfGA
ebs
Hallo,
@ebs
Es sind die Systemtabellen, die den Fehler werfen - ich hab bei meinem Schnippsel übersehen diese auszuschließen.