Hallo zusammen,
ich möchte via VBA eine externe CSV-Datei in eine bestehende Access Tabelle importieren.
Sowohl die bestehende Tabelle als auch die externe CSV-Tabelle haben folgende Datenformate:
Datenformat (extern):
fiktivnummer,PLZ,Ort,Name
Datenformat (Access): (Name: "Ziel")
korrektnummer,fiktivnummer,PLZ,Ort,Name,Trigger
Nun möchte ich jetzt aber noch parallel verschiedene Bedingungen ausführen:
1. Die Dateninhalte (PLZ,Ort,Name) sollen nur dort importiert werden, wo auch die selbe "fiktivnummer" ist. Der rest der Access-Tabelle soll unberührt bleiben.
2. Bei jedem Datensatz der importiert wurde soll unter dem Feld "Trigger" der Wert "1" eingetragen werden.
ich habe folgenden Code geschrieben mit dem ich zumindest das Dialogfeld aufrufen kann:
Private Sub DatenErfassen_Click()
DoCmd.SetWarnings False
Dim dlgOpen As Object
Dim Dateipfad As Variant
Set dlgOpen = Application.FileDialog(1)
With dlgOpen
.Filters.Clear
.Filters.Add "test", "*.csv", 1
.Title = "Datei auswählen"
.buttonname = "Import"
.show
If .SelectedItems.Count > 0 Then
Dateipfad = .SelectedItems(1)
Dateipfad = dlgOpen.SelectedItems(1)
DoCmd.TransferText acImport, "Tabelleimport", "Ziel", Dateipfad, False
DoCmd.SetWarnings True
End If
End With
End Sub
Ab hier komme ich aber überhaupt nicht mehr weiter. Wie bringe ich nun die ganzen o.g. Bedingungen dort unter?
Ich bin leider in Access nicht sonderlich versiert und bin auf eure Hilfe angewiesen.
Ich freue mich auf sämtliche antworten.
Vielen Dank + Viele Grüße
Dave
Hallo,
zwei Möglichkeiten:
1) benutze eine weitere Zwischentabelle ("ZielRoh") , in die zunächst die Daten mit TransferText importiert werden. Mittels Aktualisierungsabfrage, die die Tabellen "Ziel" und "ZielRoh" über "fiktivnummer" verknüpft, werden die Datensätze aktualisiert. (Es ist kein "Import", sondern eben eine Aktualisierung, wenn Deine Beschreibung zutrifft)
Evtl. klappt das auch, wenn die CSV-Datei gleich als ext. Tabelle verknüpft wird und auf "ZielRoh" damit verzichtet werden kann.
2) Die CSV-Datei mittels VBA öffnen und zeilenweise einlesen. Dabei jeweils eine aktualisierungsabfrage ausführen, die auf den jeweils passenden Datensatz in "Ziel" wirkt.
Vielen Dank! Guter Tipp mit der Zwischentabelle. Das macht das ganze schon etwas kalrer für mich.
Ich habe jetzt eine weitere Tabelle ("ZielRoh") angelegt mit dem gleichen Schema wie die externen Daten:
fiktivnummer,PLZ,Ort,Name
Leider habe ich bei meinem Importlauf noch ein Problem:
ZitatPrivate Sub DatenErfassen_Click()
DoCmd.SetWarnings False
Dim dlgOpen As Object
Dim Dateipfad As Variant
Set dlgOpen = Application.FileDialog(1)
With dlgOpen
.Filters.Clear
.Filters.Add "test", "*.csv", 1
.Title = "Datei auswählen"
.buttonname = "Import"
.show
If .SelectedItems.Count > 0 Then
Dateipfad = .SelectedItems(1)
Dateipfad = dlgOpen.SelectedItems(1)
DoCmd.TransferText acImport, "Tabelleimport", "Ziel", Dateipfad, False
DoCmd.SetWarnings True
End If
End With
End Sub
Wie kann ich denn in Office2010 einen Spezifkation vergeben? Also in dem Fall habe ich "Tabellenimport" als Name verwendet, aber wie weiße ich dem die korrekte Spezifikation zu?
Kannst du mir auch noch ein paar Tipps geben, wie ich auf "code-ebene" nun mit der Tabelle "ZielRoh" umzugehen habe und die Bedingungen zu erreichen?
1000fach Dank!
Hallo,
ZitatWie kann ich denn in Office2010 einen Spezifkation vergeben
... indem du den Import einmal manuell erstellst und im Assistenten die Schaltfläche 'Weitere...' anklickst, dort nimmst du deine Einstellungen nach Wunsch und Bedarf vor und wählst im Dialog dann 'Speichern unter...'
Den hier vergebenen Namen setzt du dann in deineM DoCmd.TransferText acImport, "Spezifikationsname", ... ein.
Zitatwie ich auf "code-ebene" nun mit der Tabelle "ZielRoh" umzugehen habe
Du KÖNNTEST z.B. die SQL der benötigten Abfrage per VBA gegen die DB senden ....
Dim strSQL as String
strSQL = "UPDATE tblDeineTabelle SET Feld = NeuerWert ..... "
CurrentDB.Execute strSQL
... als eine der Möglichkeiten, die du mit VBA hast.
HTH
[Anhang gelöscht durch Administrator]
Das mit der Spezifikation habe ich nun hinbekommen, aber mit dem Bedingungen habe ich noch probleme.
Müsste ich nicht einen Insert Into Befehl dafür nehmen?
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "INSERT INTO ZIEL (PLZ,Ort,Name)
Aber wie bekomme ich dann die Daten aus der Tabelle "ZielRoh"?
Hallo,
"Insert" fügt DS hinzu, was ja lt. der Beschreibung nicht erfolgen soll. Wenn aber trotzdem in "Ziel" noch nicht vorhandene DS hinzugefügt werden sollen, dann ist eine Aktionsabfrage anzuwenden. Dabei ist aber sicherzustellen, dass auf dem Feld "fiktiveNummer" ein eindeutiger Index (index ohne Duplikate) liegt.
"Update" aktualisiert die angegebenen Felder in der Zieltabelle entspr. den Zuweisungen.
Update Ziel inner Join Zielroh on Ziel.fiktiveNummer = ZielRoh.fiktiveNummer set Ziel.PLZ = Zielroh.PLZ , Ziel.Ort= Zielroh.Ort , Ziel.[Name] = Zielroh.[Name]
"Name" muss unbedingt in Eckklammern stehen, weil es sich bei "Name" um ein reserviertes Wort handelt.
hey, funktioniert!
Vielen Dank :)