machohunk
Goto Top

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

Content-Key: 317732

Url: https://administrator.de/contentid/317732

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: Kraemer
Kraemer 13.10.2016 um 15:17:03 Uhr
Goto Top
Moin,

und wo ist nun dein Problem?

Gruß Krämer
Mitglied: Pjordorf
Pjordorf 13.10.2016 um 15:27:14 Uhr
Goto Top
Hallo,

Zitat von @machohunk:
keine befriedígende Lösung erarbeiten/finden können
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
Mitglied: colinardo
Lösung colinardo 13.10.2016 aktualisiert um 18:23:23 Uhr
Goto Top
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.
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
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
Mitglied: machohunk
machohunk 13.10.2016 um 19:07:21 Uhr
Goto Top
Zitat von @Kraemer:
und wo ist nun dein Problem?

Hallo Krämer,
leider ist das gesamte xml-Thema für mich noch ein Buch mit 7 Siegeln.

Gruß
HN
Mitglied: machohunk
machohunk 13.10.2016 um 19:48:27 Uhr
Goto Top
Zitat von @Pjordorf:
Zitat von @machohunk:
keine befriedígende Lösung erarbeiten/finden können
Und? Was hast du denn bis jetzt erarbeitet bzw gefunden und wo genau kommst du nicht weiter?
Bisher habe ich die o.g. Aufgabe so gelöst, dass ich die historischen (incl. der der tgl. neuen) Daten immer komplett als csv-Datei gespeichert und diese dann nach Access importiert habe.
sollen von Festplatte
Und warum dann ein Link ins WWW? Wenn die doch auf der Festplatte liegen tun....
Zum einen will ich zeigen um was für xml-Daten es sich handelt, zum anderen weil der Import tatsächlich auch nur von Festplatte geschehen soll.
per Access
Version?
Ich nutze die Version 2010.
>> 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.
Das ist alles bereits geschehen. Jetzt brauche ich "nur noch" die o.g. Tabelle.
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?
Die neuen Kurse werden handelstäglich, in der Regel Mo - Fr ab ca. 16 Uhr zur Verfügung gestellt, siehe (RefKurse-Daily). D. h. täglich ein neuer Datensatz mit aktuellen Kursen. 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.

Viele Grüße
HN
Mitglied: machohunk
machohunk 13.10.2016 um 20:17:06 Uhr
Goto Top
Hallo Uwe

fast perfekt. face-wink
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.
Das zu ändern bin ich allerdings (noch) nicht in der Lage.

Gruß
HN

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
jo, ich denke das ist demnächst bald mal fällig. face-wink
Mitglied: colinardo
colinardo 13.10.2016 aktualisiert um 22:23:38 Uhr
Goto Top
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 face-smile. Die Währungsnamen als Spalten und dazu die Daten vermute ich ?
Darüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen
Aha, also mal wieder ein Azubinchen face-wink mit Ansprüchen.
Auch kein Problem, spart eine Funktion ein.

Mach ich dir gerne, Angebot dafür kannst du dir per PM abholen.

Grüße Uwe
Mitglied: machohunk
machohunk 14.10.2016 um 10:16:28 Uhr
Goto Top
Hallo Uwe,
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 face-smile. Die Währungsnamen als Spalten und dazu die Daten vermute ich ?
Genau, also die erste Spalte für das jeweilige Datum und die weiteren Spalten mit den jeweiligen Währungskürzel als Überschrift für die Kurse.
Darüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen
Aha, also mal wieder ein Azubinchen face-wink mit Ansprüchen.
Auch kein Problem, spart eine Funktion ein.
Die Restriktion habe ich mir selbst gesetzt da ich die Dateien in eine Archivdatei verschieben möchte.
Bezüglich der Ansprüche möchte ich nochmals auf meinen Eingangspost verweisen, dort hatte ich das ja bereits erwähnt. face-wink

Gruß
HN
Mitglied: Kraemer
Kraemer 14.10.2016 um 10:29:11 Uhr
Goto Top
[OT]
Zitat von @machohunk:
Darüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen.
gez. Dr. Jekyll

Zitat von @machohunk:
Die Restriktion habe ich mir selbst gesetzt .
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
Mitglied: machohunk
machohunk 14.10.2016 um 11:37:26 Uhr
Goto Top
Zitat von @Kraemer:

[OT]
Zitat von @machohunk:
Darüber hinaus unterliege ich leider der "Restriktion" die Daten vom Laufwerk einzuspielen.
gez. Dr. Jekyll

Zitat von @machohunk:
Die Restriktion habe ich mir selbst gesetzt .
gez. Mr. Hyde
[/OT]
Mir scheint, du leidest unter einer gespaltenen Persönlichkeit.
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!
Wenn die Frage ernst gemeint war brauchst du mehr Hilfe als ich.


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!
Mitglied: colinardo
Lösung colinardo 14.10.2016 aktualisiert um 19:57:45 Uhr
Goto Top
Getestet, und für Funktionstüchtig befunden.
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
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
Mitglied: Kraemer
Kraemer 14.10.2016 um 14:36:31 Uhr
Goto Top
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.

da ich die Dateien in eine Archivdatei verschieben möchte
Wozu das? Die Daten liegen dann doch schön sauber in einer Datenbank!
Wenn die Frage ernst gemeint war brauchst du mehr Hilfe als ich.
Die Frags ist ernst gemeint.

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 Ding
Mitglied: colinardo
colinardo 14.10.2016 um 17:19:03 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Mitglied: machohunk
machohunk 14.10.2016 um 19:22:33 Uhr
Goto Top
Hallo Uwe,

ich habe in Zeile 9 ein "l" in ".xmll" entfernt und in Zeile 40 den Felddatentyp geändert.
Dann lief alles soweit.
Aufgefallen ist mir allerdings, wenn statt "\eurofxref-hist-90d.xml" die gesamten historischen Daten der Datei "\eurofxref-hist.xml" importieren will, bricht das Modul mittendrin ab.

Gruß
HN
Mitglied: colinardo
colinardo 14.10.2016 aktualisiert um 20:55:04 Uhr
Goto Top
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.
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
Mitglied: machohunk
machohunk 14.10.2016 um 19:50:23 Uhr
Goto Top
Zitat von @colinardo:

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.
War ja auch nur ein Hinweis falls du das noch ändern magst. Hast du ja dann auch schon inzwischen.

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!
Das habe ich natürlich auch gemacht und dabei ist es mir halt aufgefallen.
Nichts für ungut, aber auch das war nur ein Hinweis. "Vielleicht" liest ja jemand mit und wundert sich dann. face-wink
Ansonsten ist alles ok und mehr als ich erhofft hatte.

Vielen Dank nochmals.

Gruß
HN
Mitglied: colinardo
colinardo 14.10.2016 aktualisiert um 19:59:58 Uhr
Goto Top
Na gut letzte Änderung oben, Importiert jetzt auch die komplette Historie. Lag daran das es dort an bestimmten Tagen eine Währung mehr gab und deswegen dem Insert-Statement eine Spalte fehlte.

Grüße Uwe
Mitglied: Kraemer
Kraemer 14.10.2016 um 22:18:56 Uhr
Goto Top
Krass was hier an Wissen verramscht wird...
Mitglied: colinardo
colinardo 14.10.2016 aktualisiert um 23:05:01 Uhr
Goto Top
Zitat von @Kraemer:
Krass was hier an Wissen verramscht wird...
Das ist doch alles PillePalle face-smile

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.
Mitglied: Kraemer
Kraemer 15.10.2016 um 00:35:46 Uhr
Goto Top
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....
Mitglied: Mitchell
Mitchell 15.10.2016 um 01:10:25 Uhr
Goto Top
Thread auf Wunsch des TO und mir geschlossen, es wird auch Zeit.

Mfg
@Mitchell
Mitglied: Biber
Biber 15.10.2016 um 01:22:53 Uhr
Goto Top
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:

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.

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