Xml-Datei laden bzw. auf Festplatte kopieren und per VBA in eine Access-Tabelle speichern
Hallo,
Für die folgende Aufgabenstellung habe ich bisher keine befriedígende Lösung erarbeiten/finden können und wurde mich daher über jede Hilfe freuen:
Die Daten dieser xml-Datei (RefKurse-History) sollen von Festplatte per Access in eine noch nicht vorhandene Tabelle geschrieben werden und täglich um die Daten dieser xml-Datei (RefKurse-Daily) ergänzt werden. Dabei soll geprüft werden, ob die Tabelle bereits mit neuen Daten ergänzt worden ist.
Vorab schon mal vielen Dank für jedwede Unterstützung
Viele Grüße
HN
Für die folgende Aufgabenstellung habe ich bisher keine befriedígende Lösung erarbeiten/finden können und wurde mich daher über jede Hilfe freuen:
Die Daten dieser xml-Datei (RefKurse-History) sollen von Festplatte per Access in eine noch nicht vorhandene Tabelle geschrieben werden und täglich um die Daten dieser xml-Datei (RefKurse-Daily) ergänzt werden. Dabei soll geprüft werden, ob die Tabelle bereits mit neuen Daten ergänzt worden ist.
Vorab schon mal vielen Dank für jedwede Unterstützung
Viele Grüße
HN
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 317732
Url: https://administrator.de/forum/xml-datei-laden-bzw-auf-festplatte-kopieren-und-per-vba-in-eine-access-tabelle-speichern-317732.html
Ausgedruckt am: 21.04.2025 um 18:04 Uhr
22 Kommentare
Neuester Kommentar
Hallo,
Und? Was hast du denn bis jetzt erarbeitet bzw gefunden und wo genau kommst du nicht weiter?
Gruß,
Peter
Und? Was hast du denn bis jetzt erarbeitet bzw gefunden und wo genau kommst du nicht weiter?
sollen von Festplatte
Und warum dann ein Link ins WWW? Wenn die doch auf der Festplatte liegen tun....per Access
Version?in eine noch nicht vorhandene Tabelle geschrieben werden
Autsch. Schreiben wir also erstmal - hinter werden wir dann entscheiden was ist wird. Du wirst nicht umhin kommen und dir zuerst Gedanken über den Aufbau deiner Datenbank bzw. Tabellen zu machen und diese auf Papier zum laufen bringen. Dann kannst du anfangen mit dein Access diese Datenbank / Tabellen nach deinen erstellten vorgaben umzusetzen. Der erste Schritt beim Programmieren ist immer Papier zu holen und die Bleistifte anzuspitzen.und täglich um die Daten dieser xml-Datei (RefKurse-Daily) ergänzt werden.
OK.Dabei soll geprüft werden, ob die Tabelle bereits mit neuen Daten ergänzt worden ist.
Soll nur geschaut werden ob es schon mal gestartet wurde oder sollen die Datensätze ebenfalls geprüft werden ob diese vorhanden sind? Wie viele Datensätze werden denn in 6 Monaten erwartet? Wie lange sollen die vorgehalten werden? Gibt es nur das eine kennzeichen Time was darauf schliuessen lassen kann das anzahl unbekannt an Datensätze hinzugekommen sind? Was ist wenn mal mehr oder weniger Datensätze (Währungen) kommen? Soll darüber ein Protokoll erstellt werde?Gruß,
Peter
Servus HN,
das wäre zwar mit Powershell in zwei drei Zeilen erledigt, aber wenn's VBA sein muss, bidde:
Zum Starten in Access die Sub ImportData() ausführen. Die Daten werden direkt aus dem Web geladen, ein Zwischenspeichern auf der Platte ist nicht nötig und entfällt hier.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
das wäre zwar mit Powershell in zwei drei Zeilen erledigt, aber wenn's VBA sein muss, bidde:
Zum Starten in Access die Sub ImportData() ausführen. Die Daten werden direkt aus dem Web geladen, ein Zwischenspeichern auf der Platte ist nicht nötig und entfällt hier.
Option Compare Database
Dim strTableName As String
Sub ImportData()
'Tabellenname definieren
strTableName = "Kurse"
With CurrentDb
'Prüfen ob Tabelle bereits existiert
If DCount("[Name]", "MSysObjects", "[Name] = '" & strTableName & "'") = 1 Then
'Tabelle existiert, lade Updates
InsertNewRates "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
Else
'Tabelle existiert nicht, erstelle Tabellenstruktur und lade dann die Historie
.Execute ("CREATE TABLE " & strTableName & " (Datum DATETIME, Währung CHAR, Kurs NUMBER);")
InsertNewRates "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml"
End If
End With
End Sub
'Funktion die Daten aus den XML-Dateien ausliest und nur neue Daten zur Tabelle hinzufügt
Function InsertNewRates(URL As String)
'Eindeutiger Wert als Parameter für den Download der XML Dateien aus dem Web (Cache-Problem umgehen)
ticks = DateDiff("s", #1/1/1970#, Now())
' XML Datei herunterladen
Set xmldoc = DownloadXML(URL & "?" & ticks)
' war Download erfolgreich ?
If Not xmldoc Is Nothing Then
'Namespaces der XML-Dateien definieren für XPath Selection
xmldoc.SetProperty "SelectionNamespaces", "xmlns:gesmes='http://www.gesmes.org/xml/2002-08-01' xmlns:ns='http://www.ecb.int/vocabulary/2002-08-01/eurofxref'"
'Alle Cube Knoten mit time property selektieren
Set nodes = xmldoc.SelectNodes("/gesmes:Envelope/ns:Cube/ns:Cube")
'Keine Knoten gefunden? => Exit
If nodes Is Nothing Then
Exit Function
End If
' Für jeden Datumsknoten ...
For Each n In nodes
'Speichere Datum und formatiere es Datenbankgerecht
strDate = Format(CDate(n.Attributes.getNamedItem("time").Text), "yyyy\/mm\/dd")
' Nur wenn noch keine Daten für das Datum vorhanden sind Währungen hinzufügen
If DCount("[Datum]", strTableName, "[Datum] = #" & strDate & "#") = 0 Then
'Alle Währungen zur Tabelle hinzufügen
For Each currencyNode In n.childNodes
strCurrency = Trim(currencyNode.Attributes.getNamedItem("currency").Text)
strValue = Trim(currencyNode.Attributes.getNamedItem("rate").Text)
CurrentDb.Execute "INSERT INTO " & strTableName & " (Datum,Währung,Kurs) VALUES(#" & strDate & "#,'" & strCurrency & "'," & strValue & ");"
Next
End If
Next
End If
End Function
'Funktion die die XML-Dateien aus dem Web herunterlädt
Function DownloadXML(ByVal strURL As String) As Object
On Error GoTo Error
Dim objhttp As Object, objXML As Object
Set objhttp = CreateObject("Microsoft.XMLHTTP")
Set objXML = CreateObject("msxml2.domdocument.6.0")
With objhttp
.Open "GET", strURL, False
.send
If .Status = 200 Then
Set DownloadXML = .responseXML
Else
Set DownloadXML = Nothing
End If
End With
Exit Function
Error:
Set DownloadXML = Nothing
End Function
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Zitat von @machohunk:
Es müsste so sein, dass pro Tag (Datum) ein Datensatz in der Tabelle aufgenommen wird.
Aha, und wenn du jetzt noch sagst um welchen es sich handelt und wie das bei dir ausschauen soll, sind wir beide schlauer Es müsste so sein, dass pro Tag (Datum) ein Datensatz in der Tabelle aufgenommen wird.
Darüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen
Aha, also mal wieder ein Azubinchen Auch kein Problem, spart eine Funktion ein.
Mach ich dir gerne, Angebot dafür kannst du dir per PM abholen.
Grüße Uwe
[OT]
gez. Mr. Hyde
[/OT]
BTT:
Gruß Krämer
Zitat von @machohunk:
Darüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen.
gez. Dr. JekyllDarüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen.
gez. Mr. Hyde
[/OT]
BTT:
da ich die Dateien in eine Archivdatei verschieben möchte
Wozu das? Die Daten liegen dann doch schön sauber in einer Datenbank!Gruß Krämer
Getestet, und für Funktionstüchtig befunden.
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Option Compare Database
'Funktion die Daten aus den XML-Dateien ausliest und nur neue Daten zur Tabelle hinzufügt
Function ImportData()
'Tabellenname festlegen
Const strTableName = "Kurse"
'Pfade zu den XML-Dateien angeben
Const XMLPATH_HISTORY = "D:\Data\eurofxref-hist.xml"
Const XMLPATH_DAILY = "D:\data\eurofxref-daily.xml"
'Variablen
Dim xmldoc As Object, boolNewTable As Boolean, nodes As Object, n As Object, strCols As String, strValues As String, strDate As String, cName As String, currencyNode As Object
'Objekte erstellen
Set xmldoc = CreateObject("Msxml2.DomDocument.6.0")
Set dic = CreateObject("Scripting.Dictionary")
With xmldoc
.ValidateOnParse = False
.Async = False
'Namespaces der XML-Dateien definieren für XPath Selection
.SetProperty "SelectionNamespaces", "xmlns:gesmes='http://www.gesmes.org/xml/2002-08-01' xmlns:ns='http://www.ecb.int/vocabulary/2002-08-01/eurofxref'"
'Prüfen ob Tabelle bereits existiert
If DCount("[Name]", "MSysObjects", "[Name] = '" & strTableName & "'") = 1 Then
'Tabelle existiert
.Load XMLPATH_DAILY
Else
'Tabelle existiert nicht, erstelle Tabellenstruktur und lade dann die Historie
.Load XMLPATH_HISTORY
boolNewTable = True
End If
'Alle Cube Knoten mit time property selektieren
Set nodes = xmldoc.SelectNodes("/gesmes:Envelope/ns:Cube/ns:Cube")
'Keine Knoten gefunden? => Exit
If nodes Is Nothing Then
Exit Function
End If
' Neue Tabellenstruktur erstellen
If boolNewTable Then
strCols = ""
For Each n In nodes
For Each currencyNode In n.childNodes
cName = currencyNode.Attributes.getNamedItem("currency").Text
If Not dic.Exists(cName) Then
dic.Add cName, ""
strCols = strCols & cName & " NUMBER,"
End If
Next
Next
strCols = Left(strCols, Len(strCols) - 1)
CurrentDb.Execute ("CREATE TABLE " & strTableName & " (Datum DATETIME," & strCols & ");")
Application.RefreshDatabaseWindow
End If
' Für jeden Datumsknoten ...
For Each n In nodes
'Speichere Datum und formatiere es Datenbankgerecht
strDate = Format(CDate(n.Attributes.getNamedItem("time").Text), "yyyy\/mm\/dd")
' Nur wenn noch keine Daten für das Datum vorhanden sind Währungen hinzufügen
If DCount("[Datum]", strTableName, "[Datum] = #" & strDate & "#") = 0 Then
strCols = "Datum,"
strValues = "#" & strDate & "#,"
'Alle Währungen zur Tabelle hinzufügen
For Each currencyNode In n.childNodes
strCols = strCols & Trim(currencyNode.Attributes.getNamedItem("currency").Text) & ","
strValues = strValues & Trim(currencyNode.Attributes.getNamedItem("rate").Text) & ","
Next
strCols = Left(strCols, Len(strCols) - 1)
strValues = Left(strValues, Len(strValues) - 1)
CurrentDb.Execute "INSERT INTO " & strTableName & " (" & strCols & ") VALUES(" & strValues & ");"
End If
Next
End With
End Function
Mir scheint, du leidest unter einer gespaltenen Persönlichkeit.
Muss furchtbar sein auf Dauer.
Furchtbar ist es, wenn Leute so tun, als wenn etwas nicht anders geht (externer Einfluss) es aber in Wahrheit so ist, dass sie etwas nicht wollen! Zeugt von mangelndem Rückgrat.Muss furchtbar sein auf Dauer.
da ich die Dateien in eine Archivdatei verschieben möchte
Wozu das? Die Daten liegen dann doch schön sauber in einer Datenbank!PS. Da ich annehme, dass du nicht ernsthaft daran interessiert bist Unterstützung zu leisten, ware ich dir dankbar wenn du in diesem Thread keinen Kommentar mehr absonderst.
Danke für nichts!
Kein DingDanke für nichts!
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Zitat von @machohunk:
ich habe in Zeile 9 ein "l" in ".xmll" entfernt und in Zeile 40 den Felddatentyp geändert.
War ja nur ein Tippfehler, Pfad solltest du ja anpassen.ich habe in Zeile 9 ein "l" in ".xmll" entfernt und in Zeile 40 den Felddatentyp geändert.
Aufgefallen ist mir allerdings, wenn statt "\eurofxref-hist-90d.xml" die gesamten historischen Daten der Datei "\eurofxref-hist.xml" importieren will,l bricht das Modul mittendrin ab.
Nee, du brauchst nur die Pfade zu den beiden XML-Dateien in dem Konstanten anpassen, mehr nicht! Ich habe das Skript nur für die beiden Dateien angepasst die du in deinem Eingangspost verlinkt hast!http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml
http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
Das ist doch alles PillePalle 
Irgendwer muss hier ja das Niveau zwischendurch etwas anheben.
Immerhin lesen hier auch noch andere mit, denen solche Codeschnippsel durchaus nützlich sein könnten.
Was bringt es dem Forum und der Welt da draußen, wenn unter einem Beitrag nur blöde Kommentare stehen?! Richtig -> niente ...
Für mich ist das nur Schreibarbeit die ich, wenn es die Zeit zulässt, gerne opfere um jemandem zu helfen denn es nutzt hier meist noch viel mehr Leuten als nur dem TO.
Jeden Tag eine gute Tat bringt keinen um. Denk mal drüber nach.
Irgendwer muss hier ja das Niveau zwischendurch etwas anheben.
Immerhin lesen hier auch noch andere mit, denen solche Codeschnippsel durchaus nützlich sein könnten.
Was bringt es dem Forum und der Welt da draußen, wenn unter einem Beitrag nur blöde Kommentare stehen?! Richtig -> niente ...
Für mich ist das nur Schreibarbeit die ich, wenn es die Zeit zulässt, gerne opfere um jemandem zu helfen denn es nutzt hier meist noch viel mehr Leuten als nur dem TO.
Jeden Tag eine gute Tat bringt keinen um. Denk mal drüber nach.
Uwe,
Ich verstehe deine Intention.
...
...
Richtig ist sie nicht. Ich helfe jeden Tag mehr bestens zwei Leuten in Foren ihr Problem zu verstehen und damit zu lösen. Effekt: sie haben es verstanden!
Hier ist es mit momentan so: Wunsch äußern und fertige Lösung präsentiert bekommen. Und die Leute kloppen sich drum wer zuerst die perfekte Lösung präsentiert. Krank. Und sich dann wundern das der Kunde im Laden nur zwanzig eus bezahlen will....
Ich verstehe deine Intention.
...
...
Richtig ist sie nicht. Ich helfe jeden Tag mehr bestens zwei Leuten in Foren ihr Problem zu verstehen und damit zu lösen. Effekt: sie haben es verstanden!
Hier ist es mit momentan so: Wunsch äußern und fertige Lösung präsentiert bekommen. Und die Leute kloppen sich drum wer zuerst die perfekte Lösung präsentiert. Krank. Und sich dann wundern das der Kunde im Laden nur zwanzig eus bezahlen will....
Na ja, colinardo,
natürlich sind deine Codeschnipsel nützlich für viele.
Und werden auch von Menschen gelesen, die es wertschätzen -nicht als dahingeschenkte Fertg-Copy&Paste-Lösung, sondern als (vorbildliches) Beispiel, ein mittelkomplexes Problem strukturiert, überlegt und elegant zu lösen.
Insofern gebe ich dir recht.
Wenn ich allerdings die "Vorgaben" im Eroffnungspost lese, meinetwegen angereichert mit den spärlich formulierten nachgetröpfelten Anforderungen, wegen denen du 3x deinen Code halb abreissen und neu aufbauen musstest..
-> Da kann ich Kraemers kopfschüttelndes "Was für eine Verschwendung" verstehen.
Wenn offensichtlich zu berücksichtigende Detail-Probleme, wie Kraemer sie auch oben abgeklopft hat, so beantwortet werden wie zB hier:
Wenn ein TO mit einem Problem handwerklich überfordert ist und um professionelle Unterstützung bittet - dafür habe ich ein offenes Ohr.
Wenn aber so deutlich wird, dass keinerlei ernsthafte Befassung mit dem Thema stattgefunden hat ...
Ja hey! Wenn denn der TO sein Problem nicht als sein Problem ansieht, warum solltest du es dann zu deinem machen?
Grüße
Biber
natürlich sind deine Codeschnipsel nützlich für viele.
Und werden auch von Menschen gelesen, die es wertschätzen -nicht als dahingeschenkte Fertg-Copy&Paste-Lösung, sondern als (vorbildliches) Beispiel, ein mittelkomplexes Problem strukturiert, überlegt und elegant zu lösen.
Insofern gebe ich dir recht.
Wenn ich allerdings die "Vorgaben" im Eroffnungspost lese, meinetwegen angereichert mit den spärlich formulierten nachgetröpfelten Anforderungen, wegen denen du 3x deinen Code halb abreissen und neu aufbauen musstest..
-> Da kann ich Kraemers kopfschüttelndes "Was für eine Verschwendung" verstehen.
Wenn offensichtlich zu berücksichtigende Detail-Probleme, wie Kraemer sie auch oben abgeklopft hat, so beantwortet werden wie zB hier:
Was ist wenn mal mehr oder weniger Datensätze (Währungen) kommen?
Ob da dann mal eine Währung mehr oder weniger dabei ist kann ich nicht sagen. Das sollte aber beim täglichen Update geprüft und ggf. um die jeweilige Anzahl an Spalten (Währung) erweitert werden.
--> Spätestens da wäre sogar ich ausgestiegen - und man nennt mich hier den Sanftmütigen.Ob da dann mal eine Währung mehr oder weniger dabei ist kann ich nicht sagen. Das sollte aber beim täglichen Update geprüft und ggf. um die jeweilige Anzahl an Spalten (Währung) erweitert werden.
Wenn ein TO mit einem Problem handwerklich überfordert ist und um professionelle Unterstützung bittet - dafür habe ich ein offenes Ohr.
Wenn aber so deutlich wird, dass keinerlei ernsthafte Befassung mit dem Thema stattgefunden hat ...
Ja hey! Wenn denn der TO sein Problem nicht als sein Problem ansieht, warum solltest du es dann zu deinem machen?
Grüße
Biber