![]() |
|
![]() |
#1 |
![]() Neuer Benutzer |
![]() Hallo liebe MS Office Community,
leider kenne ich mich so gut wie gar nicht in VBA aus und hoffe in diesem Forum auf etwas Unterstützung. Folgende Problemstellung habe ich: Ich habe eine Accessdatenbank mit einer großen Tabelle. Diese Tabelle hat als Primary Key das Datum und viele weitere Felder für verschiedene Messwerte. Nun versuche ich aus verschiedenen Quellen (welche als CSV-Dateien vorliegen) die Messwerte in meine große Tabelle einzufügen. Mit diesem Code tue ich erstmal alle Daten mit meiner DB verlinken: Sub LinkCSV() Dim strFile As String Dim strPath As String Dim strTable As String strPath = "C:UsersOleksandrDownloadsmoni_in" strFile = Dir(strPath & "*.csv") Do While Len(strFile) > 0 strTable = Left$(strFile, Len(strFile) - 4) DoCmd.TransferText acLinkDelim, TableName:=strTable, _ FileName:=strPath & strFile, HasFieldNames:=True strFile = Dir() Loop End Sub Das funktioniert aber suboptimal, da meine Werte mit einem ; getrennt sind und das Skript alles in eine Zeile schreibt. Das Problem kann irgendwie mit Workbook.open gelöst werden, aber egal wie ich es anstelle, bekomme ich ein Laufzeitfehler und verzweifel langsam daran ![]() Als zweites Problem schaffe ich es auf keinen eleganten Weg die verlinkten Tabellen zusammen zu führen (via JOINT) mit dem Bezug auf das Datum, welches in jeder Tabelle CSV Tabelle ebenfalls vorhanden ist. Ich wäre für jede Art von Input sehr dankbar ![]() |
![]() |
![]() ![]() |
![]() |
#2 |
![]() MOF Guru |
![]() Hallo,
Zitat: Diese Tabelle hat als Primary Key das Datum und viele weitere Felder für verschiedene Messwerte. Die Messwerte sollten als je ein Datensatz mit einem Bezug zur Messstelle gespeichert werden. Ist die Anzahl der Messwerte in jeder CSV immer gleich (auch immer die gleichen Messtellen) ? Zitat: da meine Werte mit einem ; getrennt sind Sind die Messwerte immer in der gleichen Reihenfolge ? __________________ GrußKlaus Office2016, Win10 Geändert von gpswanderer (10.08.2018 um 11:43 Uhr). |
![]() |
![]() ![]() |
![]() |
#3 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Erstmal danke für die schnelle Antwort.
Also die CSV Dateien haben in der ersten Spalte immer das Datum und je nach Datei immer 1-4 Messwerte, welche immer mit einem ; voneinander getrennt sind. Wie geht man hier sinnvoll und strukturiert vor? |
![]() |
![]() ![]() |
![]() |
#4 |
![]() MOF Guru |
![]() Hallo,
und hast Du die Hinweise zum Aufbau der Access Tabelle gelesen ? Eine Accesstabelle nicht querorientiert wie Excel. In einer Accesstabelle sollte jeder Messwert ein Datensatz sein. Das Datum wiederholt sich dann, daher kann das Datum nicht der Primärschlüssel sein. Haben diese 1-4 Messwerte Bezeichnungen, oder wie unterscheidest Du diese in der Accesstabelle, über die Spaltennamen ? __________________ GrußKlaus Office2016, Win10 |
![]() |
![]() ![]() |
![]() |
#5 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Die CSVs werden ja erstmal nur verlinkt und da ist das Datum nicht der PK.
Die Idee ist, die ganzen verlinkten Tabellen zu einer großen zusammen zu führen und dann entsprechend des Datums die Werte in die "richtige" Tabelle übertragen. Die Messwerte haben alle in der Bezeichnung, entweder als Überschrift der Spalten oder im Dateinamen der CSVs. Kann man hier irgendwie Dateien anhängen? Dann könnte ich es einfach zeigen ![]() |
![]() |
![]() ![]() |
![]() |
#6 |
![]() MOF Guru |
![]() Hallo,
Du hast immer noch nicht verstanden was ich Dir sagen will. Die Access Tabelle ist falsch aufgebaut. Du brauchst hier mindestens mal 2 Tabellen: - Messtellen (MesstelleID, Messstellenbezeichnung) - Messwerte (MesswertID, Datum, MesstelleID_F, Messwert) In der 2. Tabelle gibt jeder Messwert ein Datensatz. Was enthält denn Deine jetzige Access Tabelle noch für Felder außer dem Datum und den Feldern für die Werte ? Die verlinkten CSV Daten werden dann per VBA als je ein Datensatz übertragen. Zitat: entweder als Überschrift der Spalten oder im Dateinamen der CSVs. __________________ GrußKlaus Office2016, Win10 |
![]() |
![]() ![]() |
![]() |
#7 |
![]() MOF Guru |
![]() Prinzipiell würde ich immer versuchen, eine mit ";" getrennte csv-Datei über .TransferText einzulesen. Dabei lässt sich eine Importspezifikation definieren und verwenden, was sehr hilfreich sein kann.
Den Anmerkungen von Klaus hinsichtlich der mangelnden Normalisierung folgend, würde ich die Daten zuerst in eine temporäre Import-Tabelle einlesen und dann mit einer Prozedur oder Abfrage in die produktive (2.) Tabelle. __________________ Freundlichen GrußHans-Christian ----------------------------------------- Oft erwünscht, selten beachtet: nach Erledigung des Problems den Thread als erledigt zu markieren ----------------------------------------- Ich möchte nur Mitglied in einem Verein sein, der Leute wie mich nicht als Mitglied aufnimmt (Groucho Marx). ----------------------------------------- Ab sofort regelmässig: MOF Stammtisch in Bremen. Näheres hier. |
![]() |
![]() ![]() |
![]() |
#8 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Vielen Dank,
so habe ich das auch eigentlich vor. Alle CSVs einlesen und diese in eine temp. Tabelle zusammenführen und übertragen. DoCmd.TransferText acLinkDelim, TableName:=strTable, FileName:=strPath & strFile, HasFieldNames:=True Wo kann ich hier irgendwas bezüglich ; spezifizieren? @gpswanderer: Die Messstelle erkenne ich an der Überschrift der Spalten in den CSV Dateien. |
![]() |
![]() ![]() |
![]() |
#9 |
![]() MOF Guru |
![]() Hallo,
Zitat: Die Messstelle erkenne ich an der Überschrift der Spalten in den CSV Dateien. Und noch mal der Hinweis (mir scheint, das hast Du immer noch nicht verstanden): Die Access TAbelle ist falsch aufgebaut. Zitat: Wo kann ich hier irgendwas bezüglich ; spezifizieren? Du kannst hier Dateien anhängen. __________________ GrußKlaus Office2016, Win10 |
![]() |
![]() ![]() |
![]() |
#10 |
![]() MOF Guru |
![]() Zitat: Wie geht man hier sinnvoll und strukturiert vor? 1) Datenmodell in Access fertigstellen, etwa so wie es Klaus beschreibt. Ein Datenmodell orientiert sich daran, wie die Daten in Folge gut verarbeitet werden können, nicht daran, in welcher Struktur die externen Daten daherkommen. Ein Import ist eine Schnittstelle, da kann man alles auf links drehen. Diese Chance kann man gleich nutzen - sonst macht man es später in den Verarbeitungen mit insgesamt mehr Aufwand. 2) Für die CSV eine Importspezifikation erstellen und diese per TransferText benutzen. Mit dem richtig eingestellten Spaltentrennzeichen hättest Du jeweils in der verlinkten Tabelle gleich die Aufteilung in Felder. Ob die Spezifikation bei wechselnden Spaltenzahlen unmittelbar funktioniert, kann ich jetzt nicht sagen. Eine Spezifikation wird aber in zwei Systemtabellen in Access abgelegt, und über eine Änderung nach Bedarf könnte man Spezifikation und Datei aufeinander abstimmen. Oder man nimmt mehrere Spezifikationen, die sich dann nur in der berücksichtigten Spaltenzahl unterscheiden. Nunmehr sind die verlinkten CSV als interne Tabellen verfügbar. Der Dateiname lässt sich wohl als Messstelle interpretieren. 3) Nunmehr kann man den Datenübertrag per Anfügeabfragen organisieren, das folgende kann da als Orientierung dienen: Grundlagen - SQL ist leicht (9) - Pivottabelle in Listtabelle umformen Auf eine temporäre Tabelle kann man hier verzichten. Diese würde aus meiner Sicht auch nur Sinn machen, - wenn neben dem reinen Anfügen auch Aktualisierungen der Zieltabelle gefragt sind (ein Bug untergräbt eine Aktualisierungsabfrage mit einer verknüpften Texttabelle), - wenn man Felder der TempTabelle für eine bessere Abfrageperformance indiziert. Indizierung von solchen externen Datenquellen außerhalb einer Datenbank geht nicht. 4) Nunmehr können die Tabellenverlinkungen wieder entfernt und die CSV's archiviert oder gelöscht werden. __________________ Ein freundliches Glück Auf!Eberhard Abfrageperformance ist kein Geheimnis SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11} Dein Dankeschön: DBWiki=>Spende Geändert von ebs17 (10.08.2018 um 12:45 Uhr). |
![]() |
![]() ![]() |
![]() |
#11 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Da die Dateien die 194 kB Grenze übersteigen, hier ein Link zu meinem Google Drive:
https://drive.google.com/open?id=1Ca...yxYkRg07N0M3BK Da habe ich meine Datenbank + 3 Beispiel CSVs. Es gibt eigentlich viel mehr aber das Prinzip müsste ja immer gleich sein. Wie gesagt will die CSVs einlesen, zusammenführen und in die große Tabelle entsprechend die Werte eintragen. Hoffe auf eure Unterstützung. |
![]() |
![]() ![]() |
![]() |
#12 |
![]() MOF Guru |
![]() Hallo,
und zum wiederholten mal, der Aufbau der Access Tabelle ist falsch. So lange Dir das nicht klar ist und die Tabelle umgebaut ist, machen weitere Erläuterungen keinen Sinn. Eberhard hat Dir in #10 eine Anleitung geliefert. __________________ GrußKlaus Office2016, Win10 |
![]() |
![]() ![]() |
![]() |
#13 |
Threadstarter
![]() ![]() Neuer Benutzer |
![]() Die Sache ist, ich weiß gar nicht wie ich die Datenbank richtig aufziehen soll.
Ich habe ja pro Messwert einen Datensatz erstellt. Oder sind damit nicht die Spalten gemeint? Ich schaffe es ja auch die notwendigen Abfragen (in der bereitgestellten Datenbank nicht vorhanden) zu erzeugen. Nur der Datenimport klappt halt nicht. Dann muss ich jetzt schauen wie ich das richtig aufbauen soll ![]() |
![]() |
![]() ![]() |
![]() |
#14 |
![]() MOF Guru |
![]() Hallo,
Zitat: Ich habe ja pro Messwert einen Datensatz erstellt. Du brauchst je Messwert und je Messstelle ein Datensatz in einer extra Tabelle. Bevor Du über den Import nachdenkst, muss erst die Struktur der Access Tabelle stimmen. __________________ GrußKlaus Office2016, Win10 Geändert von gpswanderer (10.08.2018 um 14:08 Uhr). |
![]() |
![]() ![]() |