{"id":55001240,"date":"2020-06-01T00:00:00","date_gmt":"2020-07-10T09:41:33","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1240"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Wechselkurse_per_Webservice","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/","title":{"rendered":"Wechselkurse per Webservice"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>F&uuml;r viele finanzwirtschaftliche Anwendungen spielt die Umwandlung von Betr&auml;gen in verschiedene W&auml;hrungen eine Rolle. Da w&auml;re es doch praktisch, wenn man immer die aktuellen Umrechnungskurse parat h&auml;tte. Am besten jedoch nicht so, dass man diese immer aus dem Internet oder der Tageszeitung entnimmt und in die Anwendung eintippt &#8211; sondern eher als Information, die eine Anwendung automatisch aus dem Internet bezieht. Wir schauen uns an, wie wir den Webservice der europ&auml;ischen Zentralbank f&uuml;r unsere Zwecke nutzen k&ouml;nnen.<\/b><\/p>\n<p><b>Fertige XML-Dateien der europ&auml;ischen Zentralbank<\/b><\/p>\n<p>F&uuml;r den schnellen Gebrauch bietet die europ&auml;ische Zentralbank XML-Dokumente an. Die t&auml;glichen Wechselkurse von EUR in viele andere W&auml;hrung bietet beispielsweise diese Webseite an:<\/p>\n<pre>http:\/\/www.ecb.europa.eu\/stats\/eurofxref\/eurofxref-daily.xml<\/pre>\n<p>Das Ergebnis sieht im Browser wie in Bild 1 aus. Nun m&uuml;ssen wir es nur noch schaffen, den Inhalt dieser Datei per VBA abzurufen und auf die Daten im XML-Format zuzugreifen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1240_001.png\" alt=\"XML-Dokument mit Wechselkursen\" width=\"549,6265\" height=\"806,119\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: XML-Dokument mit Wechselkursen<\/span><\/b><\/p>\n<p><b>XML-Verweis<\/b><\/p>\n<p>Dazu f&uuml;gen wir dem VBA-Projekt unserer Beispieldatenbank erst einmal einen Verweis auf die Bibliothek <b>Microsoft XML 6.0 Object Library <\/b>hinzu (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1240_002.png\" alt=\"Verweis auf die XML-Bibliothek\" width=\"499,6607\" height=\"393,9009\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Verweis auf die XML-Bibliothek<\/span><\/b><\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch einen Verweis auf die Bibliothek <b>Microsoft WinHTTP Services, version 5.1<\/b>.<\/p>\n<p>Damit k&ouml;nnen wir nun eine erste kleine Testprozedur bauen, die uns den Inhalt der obigen URL herunterl&auml;dt und diesen in ein XML-Dokument &uuml;bertr&auml;gt, bevor wir dessen Inhalt im Direktfenster ausgeben lassen.<\/p>\n<p>Diese Prozedur finden Sie in Listing 1. Sie deklariert zwei Objekte &#8211; eines mit dem Typ <b>WinHttp.WinHttpRequest <\/b>und eines des Typs <b>MSXML2.DOMDocument60<\/b>. Das erste dient dazu, die Anfrage an die URL zu schicken und die zweite zum Verarbeiten des zur&uuml;ckgelieferten XML-Dokuments.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WechselkurseInsDirektfenster()\r\n     <span style=\"color:blue;\">Dim <\/span>objWinHTTP<span style=\"color:blue;\"> As <\/span>WinHttp.WinHttpRequest\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"http:\/\/www.ecb.europa.eu\/stats\/eurofxref\/eurofxref-daily.xml\"\r\n     <span style=\"color:blue;\">Set<\/span> objWinHTTP = <span style=\"color:blue;\">New<\/span> WinHttp.WinHttpRequest\r\n     objWinHTTP.Open \"GET\", strURL, <span style=\"color:blue;\">False<\/span>\r\n     objWinHTTP.send\r\n     <span style=\"color:blue;\">If <\/span>objWinHTTP.status = 200<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n         <span style=\"color:blue;\">If <\/span>objXML.loadXML(objWinHTTP.responseText)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> objXML.XML\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Herunterladen eines XML-Dokuments<\/span><\/b><\/p>\n<p>Die Prozedur speichert die URL in der Variablen <b>strURL<\/b>. Dann erstellt sie ein neues Objekt des Typs <b>WinHttp.WinHttpRequest <\/b>und referenziert dieses mit der Variablen <b>objWinHTTP<\/b>. Die <b>Open<\/b>-Anweisung erwartet die Art des Zugriffs, die zu &ouml;ffnende URL und einen <b>Boolean<\/b>-Wert, der angibt, ob die Anfrage synchron oder asynchron ausgef&uuml;hrt werden soll.<\/p>\n<p>Wir ben&ouml;tigen die synchrone Variante, damit der Code solange angehalten wird, bis der Inhalt abgerufen wurde. Die <b>send<\/b>-Methode schlie&szlig;lich schickt die Abfrage ab.<\/p>\n<p>Danach pr&uuml;fen wir in einer <b>If&#8230;Then<\/b>-Bedingung, ob die Eigenschaft <b>Status <\/b>den Wert <b>200 <\/b>enth&auml;lt, was bedeutet, dass die Abfrage erfolgreich war. In diesem Fall erstellt die Prozedur ein neues Objekt des Typs <b>MSXML2.DOMDocument60<\/b>.<\/p>\n<p>Mit der Methode <b>LoadXML <\/b>f&uuml;llen wir das XML-Dokument mit der durch den HTTP-Request gelieferten Antwort, ermittelt mit der Eigenschaft <b>responseText<\/b>. Wenn der Aufruf den Wert <b>True <\/b>zur&uuml;ckgibt, wurde der Text erfolgreich als XML-Dokument eingelesen und wir geben diesen mit der XML-Eigenschaft des <b>MSXML2.DOMDocument<\/b>-Objekts im Direktbereich des VBA-Editors aus.<\/p>\n<p>Das Ergebnis sieht wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1240_003.png\" alt=\"Ausgabe des soeben noch im Webbrowser betrachteten XML-Dokuments im Direktbereich des VBA-Editors\" width=\"499,6607\" height=\"418,5799\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ausgabe des soeben noch im Webbrowser betrachteten XML-Dokuments im Direktbereich des VBA-Editors<\/span><\/b><\/p>\n<p><b>Tabellen zum Speichern der Wechselkurse<\/b><\/p>\n<p>Nun k&ouml;nnen wir uns an die Aufgabe begeben, die gew&uuml;nschten Daten aus dem XML-Dokument zu extrahieren.<\/p>\n<p>Wir wollen das Datum ermitteln und die Wechselkurse von Euro in die verschiedenen anderen W&auml;hrungen in eine Tabelle eintragen. Die Tabelle sieht in der Entwurfsansicht wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1240_004.png\" alt=\"Entwurf der Tabelle tblWechselkurse\" width=\"649,559\" height=\"408,6082\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf der Tabelle tblWechselkurse<\/span><\/b><\/p>\n<p>Neben dem Prim&auml;rschl&uuml;sselfeld <b>WechselkursID <\/b>verwenden wir ein Fremdschl&uuml;sselfeld namens <b>WaehrungID<\/b>, mit dem wir einen Eintrag einer weiteren Tabelle namens <b>tblWaehrungen <\/b>ausw&auml;hlen k&ouml;nnen. Diese Tabelle enth&auml;lt nur die beiden Felder <b>WaehrungID <\/b>und <b>Waehrung<\/b>, wobei wir das letztere mit einem eindeutigen Index ausgestattet haben, damit jede W&auml;hrung nur einmal in die Tabelle eingetragen werden kann.<\/p>\n<p>Das Feld <b>Wechselkursdatum <\/b>wollen wir mit dem Datum f&uuml;llen, f&uuml;r das der Wechselkurs abgefragt wurde. Schlie&szlig;lich fehlt noch das Feld <b>Wechselkurs<\/b>, das den eigentlichen Wechselkurs aufnehmen soll. Dieses haben wir als W&auml;hrungsfeld mit dem Format <b>Allgemeine Zahl <\/b>definiert.<\/p>\n<p>F&uuml;r die beiden Felder <b>WaehrungID <\/b>und <b>Wechselkursdatum <\/b>haben wir au&szlig;erdem noch einen zusammengesetzten, eindeutigen Index definiert, damit f&uuml;r jede Kombination aus W&auml;hrung und Datum nur ein Wechselkurs eingetragen werden kann.<\/p>\n<p><b>XML-Dokument auslesen<\/b><\/p>\n<p>Nun wollen wir das ermittelte XML-Dokument auslesen und die ermittelten Informationen in die beiden Tabellen <b>tblWaehrungen <\/b>und <b>tblWechselkurse <\/b>speichern. Die erste Prozedur, die wir hierzu einsetzen, hei&szlig;t <b>WechselkurseSpeichern<\/b> (siehe Listing 2). Diese ist prinzipiell wie die weiter oben vorgestellte Prozedur <b>WechselkurseInsDirektfenster <\/b>aufgebaut, ruft aber nach dem Einlesen des XML-Dokuments die Prozedur <b>WechselkurseAuslesen<\/b> auf und &uuml;bergibt dieser als Parameter das <b>MSXML2.DOMDocument60<\/b>-Element.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WechselkurseSpeichern()\r\n     <span style=\"color:blue;\">Dim <\/span>objWinHTTP<span style=\"color:blue;\"> As <\/span>WinHttp.WinHttpRequest\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"http:\/\/www.ecb.europa.eu\/stats\/eurofxref\/eurofxref-daily.xml\"\r\n     <span style=\"color:blue;\">Set<\/span> objWinHTTP = <span style=\"color:blue;\">New<\/span> WinHttp.WinHttpRequest\r\n     objWinHTTP.Open \"GET\", strURL, <span style=\"color:blue;\">False<\/span>\r\n     objWinHTTP.send\r\n     <span style=\"color:blue;\">If <\/span>objWinHTTP.status = 200<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n         <span style=\"color:blue;\">If <\/span>objXML.loadXML(objWinHTTP.responseText)<span style=\"color:blue;\"> Then<\/span>\r\n             WechselkurseAuslesen objXML\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Speichern der Wechselkurse<\/span><\/b><\/p>\n<p><b>Prozedur zum Auslesen der Wechselkurse<\/b><\/p>\n<p>Diese Prozedur nimmt den Parameter namens <b>objXML <\/b>mit dem Typ <b>MSXML2.DOMDocument60<\/b> entgegen und deklariert zun&auml;chst einige Variablen (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WaehrungenAuslesen(objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60)\r\n     <span style=\"color:blue;\">Dim <\/span>objDatum<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>datDatum<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objWechselkurs<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>strWaehrung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>curWechselkurs<span style=\"color:blue;\"> As Currency<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strXMLNamespaces<span style=\"color:blue;\"> As String<\/span>\r\n     strXMLNamespaces = \"xmlns:d=\"\"http:\/\/www.ecb.int\/vocabulary\/2002-08-01\/eurofxref\"\"\"\r\n     objXML.SetProperty \"SelectionNamespaces\", strXMLNamespaces\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objDatum = objXML.selectSingleNode(\"\/\/d:Cube[@time]\")\r\n     datDatum = objDatum.Attributes.getNamedItem(\"time\").nodeTypedValue\r\n     For Each objWechselkurs In objXML.selectNodes(\"\/\/d:Cube[@currency]\")\r\n         strWaehrung = objWechselkurs.Attributes.getNamedItem(\"currency\").nodeTypedValue\r\n         curWechselkurs = <span style=\"color:blue;\">Replace<\/span>(objWechselkurs.Attributes.getNamedItem(\"rate\").nodeTypedValue, \".\", \",\")\r\n         WechselkursSpeichern datDatum, strWaehrung, curWechselkurs\r\n     <span style=\"color:blue;\">Next<\/span> objWechselkurs\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Auslesen der Daten aus der XML-Datei<\/span><\/b><\/p>\n<p>In <b>obj-Datum <\/b>wollen wir das XML-Element speichern, welches das Datum der Wechselkurse enth&auml;lt. In <b>objWechselkurs <\/b>wollen wir die XML-Elemente speichern, das die W&auml;hrung und den Wechselkurs liefern. <b>datDatum<\/b>, <b>strWaehrung <\/b>und <b>curWechselkurs <\/b>nehmen die dabei ermittelten Informationen auf. <b>strXMLNamespace <\/b>ben&ouml;tigen wir f&uuml;r eine Spezialaufgabe, die wir gleich beschreiben.<\/p>\n<p>F&uuml;r das XML-Dokument sind n&auml;mlich verschiedene Namespaces festgelegt &#8211; dies k&ouml;nnen wir dem Kopf des Dokuments entnehmen, das wie folgt aussieht:<\/p>\n<pre>&lt;gesmes:Envelope xmlns:gesmes=\"http:\/\/www.gesmes.org\/xml\/2002-08-01\" xmlns=\"http:\/\/www.ecb.int\/vocabulary\/2002-08-01\/eurofxref\"&gt;<\/pre>\n<p>Wir haben also den Namespace <b>http:\/\/www.gesmes.org\/xml\/2002-08-01<\/b>, dessen Element mit dem Pr&auml;fix <b>gesmes <\/b>markiert werden. Das gilt beispielsweise gleich f&uuml;r das erste Element, das die <b>Namespace<\/b>-Angaben enth&auml;lt.<\/p>\n<p>Au&szlig;erdem haben wir den Namespace <b>http:\/\/www.ecb.int\/vocabulary\/2002-08-01\/eurofxref<\/b>, der ohne Pr&auml;fix kommt. Dementsprechend bezieht er sich auf alle Elemente, die ohne Pr&auml;fix angegeben werden. Dabei handelt es sich um die <b>Cube<\/b>-Elemente &#8211; und diese enthalten genau die Informationen, die wir einlesen und verarbeiten wollen:<\/p>\n<pre>&lt;Cube&gt;\r\n     &lt;Cube time=\"2020-04-09\"&gt;\r\n         &lt;Cube currency=\"USD\" rate=\"1.0867\"\/&gt;\r\n         ...\r\n     &lt;\/Cube&gt;\r\n&lt;\/Cube&gt;<\/pre>\n<p>Damit gleich beim Aufruf der Methoden <b>selectNodes <\/b>und <b>selectSingleNodes <\/b>klar ist, in welchem Namespace sich die Elemente beziehen, die wir suchen wollen, legen wir diesen zuvor mit einer Property namens <b>SelectionNamespaces <\/b>fest:<\/p>\n<pre>strXMLNamespaces = \"xmlns:d=\"\"http:\/\/www.ecb.int\/vocabulary\/2002-08-01\/eurofxref\"\"\"\r\nobjXML.SetProperty \"SelectionNamespaces\", strXMLNamespaces<\/pre>\n<p>Damit k&ouml;nnen wir nun das Element einlesen, welches uns das Datum liefert und so aussieht:<\/p>\n<pre>&lt;Cube time=\"2020-04-09\"&gt;<\/pre>\n<p>In der Hierarchie des XML-Dokuments befindet es sich unterhalb eines weiteren <b>Cube<\/b>-Elements.<\/p>\n<p>Wir k&ouml;nnten mit folgendem Suchausdruck darauf zugreifen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objDatum = objXML.selectSingleNode(\"\/\/d:Cube\/d:Cube\")<\/pre>\n<p>Dies liefert das erste <b>Cube<\/b>-Element, das ein &uuml;bergeordnetes <b>Cube<\/b>-Element enth&auml;lt. Wir verwenden aber den folgenden Ausdruck:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objDatum = objXML.selectSingleNode(\"\/\/d:Cube[@time]\")<\/pre>\n<p>Damit suchen wir etwas gezielter nach dem ersten Cube-Element, welches das <b>time<\/b>-Attribut enth&auml;lt. Dieses lesen wir mit der n&auml;chsten Anweisung in die Varible <b>datDatum <\/b>ein:<\/p>\n<pre>datDatum = objDatum.Attributes.getNamedItem(\"time\").nodeTypedValue<\/pre>\n<p>Anschlie&szlig;end durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Elemente, die dem Schema <b>\/\/d:Cube[@currency] <\/b>entsprechen und somit ein <b>Cube<\/b>-Element enthalten, welches das Attribut <b>currency <\/b>enth&auml;lt:<\/p>\n<pre>For Each objWechselkurs In  objXML.selectNodes(\"\/\/d:Cube[@currency]\")<\/pre>\n<p>Innerhalb dieser Schleife ermitteln wir zun&auml;chst den Wert des Attributs <b>currency <\/b>und schreiben diesen in die Variable <b>strWaehrung<\/b>:<\/p>\n<pre>strWaehrung = objWechselkurs.Attributes. getNamedItem(\"currency\").nodeTypedValue<\/pre>\n<p>Danach lesen wir den Wechselkurs aus dem Attribut <b>rate <\/b>ein und ersetzen hier direkt den Punkt durch das Komma als Dezimaltrennzeichen:<\/p>\n<pre>curWechselkurs = <span style=\"color:blue;\">Replace<\/span>(objWechselkurs.Attributes. getNamedItem(\"rate\").nodeTypedValue, \".\", \",\")<\/pre>\n<p>Schlie&szlig;lich rufen wir die n&auml;chste Prozedur namens <b>WechselkursSpeichern <\/b>auf, der wir das Datum, die W&auml;hrung und den Wechselkurs mit den Variablen <b>datDatum<\/b>, <b>strWaehrung <\/b>und <b>curWechselkurs <\/b>&uuml;bergeben:<\/p>\n<pre>WechselkursSpeichern datDatum, strWaehrung, curWechselkurs<\/pre>\n<p>Diese Anweisungen erledigen wir f&uuml;r alle <b>Cube<\/b>-Elemente mit dem Attribut <b>rate<\/b>, welche die <b>SelectNodes<\/b>-Methode liefert.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Daten in den Tabellen speichern<\/b><\/p>\n<p>Das Speichern der Daten in den Tabellen erledigt die Prozedur <b>WechselkursSpeichern<\/b>, die f&uuml;r jede Kombination aus Datum, W&auml;hrung und Wechselkurs einmal von der Prozedur <b>WechselkurseAuslesen <\/b>aus aufgerufen wird (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WechselkursSpeichern(datDatum<span style=\"color:blue;\"> As Date<\/span>, strWaehrung<span style=\"color:blue;\"> As String<\/span>, curWechselkurs<span style=\"color:blue;\"> As Currency<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngWaehrungID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     strSQL = \"INSERT INTO tblWaehrungen(Waehrung) VALUES('\" & strWaehrung & \"')\"\r\n     db.Execute strSQL, dbFailOnError\r\n     Select Case Err.Number\r\n         <span style=\"color:blue;\">Case <\/span>3022\r\n             lngWaehrungID = DLookup(\"WaehrungID\", \"tblWaehrungen\", \"Waehrung = '\" & strWaehrung & \"'\")\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             lngWaehrungID = db.OpenRecordset(\"SELECT @@IDENTITY\", dbOpenDynaset).Fields(0)\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & \"'\" & Err.Description & \"'\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     strSQL = \"INSERT INTO tblWechselkurse(WaehrungID, Wechselkursdatum, Wechselkurs) VALUES(\" & lngWaehrungID & \", \" _\r\n         & SQLDatum(datDatum) & \", \" & <span style=\"color:blue;\">Replace<\/span>(curWechselkurs, \",\", \".\") & \")\"\r\n     db.Execute strSQL, dbFailOnError\r\n     Select Case Err.Number\r\n         <span style=\"color:blue;\">Case <\/span>3022\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"Wechselkurs f&uuml;r EUR\/\" & strWaehrung; \" am \" & datDatum & \" bereits vorhanden.\"\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & \"'\" & Err.Description & \"'\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Speichern der Wechselkurse mit Parametern<\/span><\/b><\/p>\n<p>Diese Prozedur deklariert ein <b>Database<\/b>-Objekt namens <b>db<\/b>, mit dessen <b>Execute<\/b>-Methode gleich die W&auml;hrung aus <b>strWaehrung <\/b>in die Tabelle <b>tblWaehrungen<\/b> eingetragen wird:<\/p>\n<pre>db.Execute \"INSERT INTO tblWaehrungen(Waehrung)  VALUES('\" & strWaehrung & \"')\", dbFailOnError<\/pre>\n<p>Zuvor deaktivieren wir die Fehlerbehandlung, damit im Falle eines Fehlers nicht die eingebaute Fehlermeldung erscheint. Stattdessen werten wir die Fehlernummer aus und pr&uuml;fen, ob diese den Wert <b>3022 <\/b>enth&auml;lt. Das w&uuml;rde darauf hindeuten, dass bereits ein Datensatz mit der zu speichernden W&auml;hrungsbezeichnung in der Tabelle <b>tblWaehrung <\/b>vorhanden ist.<\/p>\n<p>Der Fehler wird ausgel&ouml;st, weil wir f&uuml;r das Feld <b>Waehrung <\/b>einen eindeutigen Index definiert haben.<\/p>\n<p>Egal, ob wir den Datensatz in der Tabelle <b>tblWaehrungen <\/b>neu anlegen oder nicht, wir ben&ouml;tigen den Wert des Prim&auml;rschl&uuml;sselfeldes der Tabelle <b>tblWaehrungen <\/b>f&uuml;r den Datensatz mit der &uuml;bergebenen W&auml;hrung. Falls die W&auml;hrung bereits vorhanden war, ermitteln wir den Prim&auml;rschl&uuml;sselwert &uuml;ber eine <b>DLookup<\/b>-Funktion, der wir den Namen der W&auml;hrung als Vergleichswert f&uuml;r das Feld <b>Waehrung <\/b>&uuml;bergeben und tragen den zur&uuml;ckgelieferten Wert in die Variable <b>lngWaehrungID <\/b>ein. Falls die W&auml;hrung noch nicht in der Tabelle <b>tblWaehrungen <\/b>vorhanden war, k&ouml;nnen wir diese mit der Abfrage <b>SELECT @@IDENTITY <\/b>ermitteln, welche den zuletzt hinzugef&uuml;gten Autowert liefert:<\/p>\n<pre>lngWaehrungID = db.OpenRecordset(\"SELECT @@IDENTITY\",  dbOpenDynaset).Fields(0)<\/pre>\n<p>Die Tabelle <b>tblWaehrungen <\/b>sieht danach wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1240_005.png\" alt=\"Daten in der Tabelle tblWaehrungen\" width=\"299,7964\" height=\"798,394\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Daten in der Tabelle tblWaehrungen<\/span><\/b><\/p>\n<p>Wenn wir W&auml;hrung ermittelt haben, k&ouml;nnen wir direkt den Datensatz f&uuml;r die Kombination aus W&auml;hrung, Datum und Wechselkurs in die Tabelle <b>tblWechselkurse <\/b>eintragen:<\/p>\n<pre>db.Execute \"INSERT INTO tblWechselkurse(WaehrungID,  Wechselkursdatum, Wechselkurs) VALUES(\"  & lngWaehrungID & \", \" & SQLDatum(datDatum)  & \", \" & <span style=\"color:blue;\">Replace<\/span>(curWechselkurs, \",\", \".\") & \")\"<\/pre>\n<p>Auch dies erledigen wir bei deaktivierter Fehlerbehandlung, damit keine Fehlermeldung erscheint, wenn wir versuchen, einen Datensatz f&uuml;r eine bereits vorhandene Kombination einzutragen. Das Ergebnis in der Tabelle <b>tblWechselkurse <\/b>sehen Sie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1240_006.png\" alt=\"Daten in der Tabelle tblWechselkurse\" width=\"549,6265\" height=\"818,4775\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Daten in der Tabelle tblWechselkurse<\/span><\/b><\/p>\n<p>Auf diese Weise k&ouml;nnen wir die tagesaktuellen Daten f&uuml;r die Wechselkurse ermitteln. Aber vielleicht ben&ouml;tigen Sie diese nicht nur f&uuml;r den aktuellen Tag, sondern wollen auch die Wechselkurse der Vergangenheit einlesen, um die Entwicklung zu verfolgen. Daf&uuml;r gibt es spezifischere Webservices, die wir nachfolgend beschreiben.<\/p>\n<p><b>Webservice f&uuml;r spezifische Daten zu Wechselkursen<\/b><\/p>\n<p>Auf der folgenden Webseite finden Sie die Startseite der Dokumentation des Webservice der europ&auml;ischen Zentralbank:<\/p>\n<pre>https:\/\/sdw-wsrest.ecb.europa.eu\/help\/<\/pre>\n<p>Bei dem Webservice handelt es sich um einen RESTful Webservice, was bedeutet, dass Sie die Parameter alle &uuml;ber die URL &uuml;bergeben und das Ergebnis als XML-Dokument zur&uuml;ckbekommen. <\/p>\n<p>Den Webservice erreichen Sie &uuml;ber den folgenden Link:<\/p>\n<pre>https:\/\/sdw-wsrest.ecb.europa.eu\/service<\/pre>\n<p>Dem k&ouml;nnen Sie einige Unterelemente beziehungsweise Parameter anh&auml;ngen:<\/p>\n<pre>https:\/\/sdw-wsrest.ecb.europa.eu\/service\/&lt;resource&gt;\/&lt;flow-Ref&gt;\/&lt;key&gt;\/&lt;providerRef&gt;&lt;queryStringParameters&gt;<\/pre>\n<p>Die in spitzen Klammern stehenden Elemente haben die folgende Bedeutung:<\/p>\n<ul>\n<li><b>resource<\/b>: Einer der beiden Werte <b>data <\/b>oder <b>metadata<\/b>, f&uuml;r Wechselkursabfragen immer <b>data<\/b> (Pflichtparameter)<\/li>\n<li><b>flowRef<\/b>: Herkunft der Daten, zum Beispiel <b>ECB<\/b>, <b>EXR <\/b>oder <b>latest<\/b> (Pflichtparameter)<\/li>\n<li><b>key<\/b>: Schl&uuml;ssel f&uuml;r die zur&uuml;ckzuliefernden Daten. Dieser Schl&uuml;ssel wird aus mehreren, durch Punkte getrennten Zeichenketten zusammengesetzt. Erl&auml;uterung weiter unten (optionaler Parameter)<\/li>\n<li><b>providerRef<\/b>: Datenlieferant, beispielsweise <b>ECB<\/b> (optionaler Parameter)<\/li>\n<\/ul>\n<p>Unter <b>key<\/b> geben Sie eine Zeichenfolge wie etwa die folgende ein:<\/p>\n<pre>M.USD.EUR.SP00.A<\/pre>\n<p>Das bedeutet: Liefere den Wert des US-Dollar gegen&uuml;ber dem Euro f&uuml;r alle Jahre. Diesen Aufruf f&uuml;hren wir wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>USDEURAlle()\r\n     <span style=\"color:blue;\">Dim <\/span>objWinHTTP<span style=\"color:blue;\"> As <\/span>WinHttp.WinHttpRequest\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"https:\/\/sdw-wsrest.ecb.europa.eu\/service\/ data\/EXR\/M.USD.EUR.SP00.A\"\r\n     <span style=\"color:blue;\">Set<\/span> objWinHTTP = <span style=\"color:blue;\">New<\/span> WinHttp.WinHttpRequest\r\n     objWinHTTP.Open \"GET\", strURL, <span style=\"color:blue;\">False<\/span>\r\n     objWinHTTP.send\r\n     <span style=\"color:blue;\">If <\/span>objWinHTTP.status = 200<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n         <span style=\"color:blue;\">If <\/span>objXML.loadXML(objWinHTTP.responseText)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> objXML.XML\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das XML-Resultat enth&auml;lt unter anderem einige Elemente der folgenden Art:<\/p>\n<pre>...\r\n&lt;generic:Obs&gt;\r\n     &lt;generic:ObsDimension value=\"1999-01\"\/&gt;\r\n     &lt;generic:ObsValue value=\"1.16078\"\/&gt;\r\n     &lt;generic:Attributes&gt;\r\n         &lt;generic:Value id=\"OBS_STATUS\" value=\"A\"\/&gt;\r\n     &lt;\/generic:Attributes&gt;\r\n&lt;\/generic:Obs&gt;\r\n&lt;generic:Obs&gt;\r\n     &lt;generic:ObsDimension value=\"1999-02\"\/&gt;\r\n     &lt;generic:ObsValue value=\"1.120765\"\/&gt;\r\n     &lt;generic:Attributes&gt;\r\n         &lt;generic:Value id=\"OBS_STATUS\" value=\"A\"\/&gt;\r\n     &lt;\/generic:Attributes&gt;\r\n&lt;\/generic:Obs&gt;\r\n...<\/pre>\n<p>Hier wird also beispielsweise der Umrechnungskurs f&uuml;r die Monate Januar 1999 und Februar 1999 zur&uuml;ckgeliefert. Das erste Element des hier verwendeten Ausdrucks <b>M.USD.EUR.SP00.A <\/b>ist das Zeitintervall.<\/p>\n<p>Hierf&uuml;r gibt es zum Beispiel die folgenden M&ouml;glichkeiten:<\/p>\n<ul>\n<li><b>M<\/b>: Monatlich<\/li>\n<li><b>D<\/b>: T&auml;glich<\/li>\n<\/ul>\n<p>Wichtig sind bei dem Element f&uuml;r <b>key <\/b>das zweite und das dritte durch einen Punkt getrennte Element &#8211; in diesem Beispiel <b>USD <\/b>und <b>EUR<\/b>. Sie geben also als Erstes die W&auml;hrung an, deren Wert f&uuml;r die als zweites angegebene W&auml;hrung ermittelt werden soll.<\/p>\n<p>Wenn Sie den Umrechnungskurs von allen anderen W&auml;hrungen in EUR erhalten wollen, dann lassen Sie den zweiten Parameter f&uuml;r <b>key<\/b> leer &#8211; dies dient als Platzhalter f&uuml;r alle W&auml;hrungen:<\/p>\n<pre>M..EUR.SP00.A<\/pre>\n<p>Wenn Sie den Umrechnungskurs von US-Dollar oder kanadischen Dollar in Euro ausgeben wollen, schreiben Sie die beiden W&auml;hrungsk&uuml;rzel <b>USD <\/b>und <b>CAD <\/b>in den zweiten Parameter:<\/p>\n<pre>M.USD+CAD.EUR.SP00.A<\/pre>\n<p>Das vierte Element gibt Typ an, beispielsweise <b>SP00 <\/b>f&uuml;r <b>Foreign exchange reference rates<\/b>. Das f&uuml;nfte Element enth&auml;lt die Art der Variation, zum Beispiel <b>A <\/b>f&uuml;r <b>Average<\/b>.<\/p>\n<p><b>Parameter des Aufrufs<\/b><\/p>\n<p>Danach folgen, wenn weitere Parameter festgelegt werden sollen, noch ein oder mehrere QueryString-Parameter, also Parameter, die mit einem Fragezeichen an die URL angeh&auml;ngt werden und als durch das Kaufmanns-Und voneinander getrennte Name-Wert-Paare erscheinen. Hier gibt es unter anderem noch die folgenden Parameter:<\/p>\n<ul>\n<li><b>startPeriod<\/b>: Start der Periode, f&uuml;r welche die Umrechnungskurse zur&uuml;ckgeliefert werden sollen. Diese Periode wird mit den unten angegebenen Datumsformaten angegeben.<\/li>\n<li><b>endPeriod<\/b>: Ende der Periode, f&uuml;r welche die Umrechnungskurse zur&uuml;ckgeliefert werden sollen. Diese Periode wird mit den unten angegebenen Datumsformaten angegeben.<\/li>\n<li><b>updatedAfter<\/b>: Liefert nur Werte, die nach dem hierf&uuml;r angegebenen Datum aktualisiert wurden (Angabe im Datumsformat wie unten beschrieben).<\/li>\n<li><b>firstNObservations<\/b>: Liefert nur die ersten <b>N <\/b>Resultate.<\/li>\n<li><b>lastNObservations<\/b>: Liefert nur die letzten <b>N <\/b>Resultate.<\/li>\n<li><b>detail<\/b>: Gibt an, wie umfangreich die zur&uuml;ckgelieferten Resultate ausfallen sollen. Es gibt die Werte <b>full<\/b>, <b>dataonly<\/b>, <b>serieskeyonly<\/b> und <b>nodata<\/b>.<\/li>\n<\/ul>\n<p><b>Datumsformate<\/b><\/p>\n<p>F&uuml;r die Parameter <b>startPeriod<\/b>, <b>endPeriod <\/b>und <b>updated-After <\/b>geben Sie Datumsangaben an.<\/p>\n<p>Diese formatieren Sie wie folgt:<\/p>\n<p><b>YYYY-MM-DD<\/b>: Tagesgenaue Abfrage<\/p>\n<p><b>YYYY-W[01-53]<\/b>: Wochengenaue Abfrage<\/p>\n<p><b>YYYY-MM<\/b>: Monatsgenaue Abfrage<\/p>\n<p><b>YYYY-Q[1-4]<\/b>: Abfrage nach Quartal<\/p>\n<p><b>YYYY-S[1-2]<\/b>: Abfrage je halbem Jahr<\/p>\n<p><b>YYYY<\/b>: Abfrage nach Jahr<\/p>\n<p><b>Response Codes<\/b><\/p>\n<p>Der Webservice kann die folgenden Zahlenwerte als Response Codes zur&uuml;ckliefern:<\/p>\n<ul>\n<li><b>200 <\/b>(<b>OK<\/b>): Abfrage erfolgreich<\/li>\n<li><b>304 <\/b>(<b>No change<\/b>): Tritt auf, wenn seit dem per Timestamp angegebenen Zeitpunkt keine &Auml;nderungen in den angeforderten Daten vorliegen.<\/li>\n<li><b>400 <\/b>(<b>Syntax error<\/b>): Die Abfrage enth&auml;lt einen Syntaxfehler.<\/li>\n<li><b>401 <\/b>(<b>Login needed<\/b>): Login notwendig<\/li>\n<li><b>403 <\/b>(<b>Semantic error<\/b>): Semantischer Fehler<\/li>\n<li><b>404 <\/b>(<b>Not found<\/b>): Keine Ergebnisse f&uuml;r diese Abfrage<\/li>\n<li><b>406 <\/b>(<b>Invalid format<\/b>): Kein unterst&uuml;tztes Format<\/li>\n<li><b>413 <\/b>(<b>Results too large<\/b>): Zu viele Ergebnisse<\/li>\n<li><b>414 <\/b>(<b>URL too long<\/b>): URL zu lang<\/li>\n<li><b>500 <\/b>(<b>Server error<\/b>): Serverfehler<\/li>\n<li><b>501 <\/b>(<b>Not implemented<\/b>): Die Funktion ist noch nicht implementiert.<\/li>\n<li><b>503 <\/b>(<b>Unavailable<\/b>): Der Dienst ist aktuell nicht verf&uuml;gbar.<\/li>\n<\/ul>\n<p>Diese Code lesen Sie mit der Eigenschaft <b>status <\/b>des <b>WinHttpRequest<\/b>-Objekts aus.<\/p>\n<p><b>Aufbau der Response-Dateien<\/b><\/p>\n<p>Die Response-Dateien sind immer gleich aufgebaut (Beispiel siehe Listing 5). Das erste Element <b>mes-sage:Ge-nericData <\/b>enth&auml;lt die Namespaces. Das folgende <b>mes-sage:Header<\/b>-Element enth&auml;lt Informationen wie eine eindeutige ID, Datum und Uhrzeit der Erstellung, den Lieferanten und die Angabe der verwendeten Struktur. Das <b>message:DataSet<\/b>-Element enth&auml;lt eine oder mehrere <b>generic:Series<\/b>-Elemente. Eine Sammlung im Element <b>generic:Series <\/b>umfasst immer ein paar Metadaten sowie die eigentlichen Daten.<\/p>\n<pre>&lt;message:GenericData ...&gt;\r\n     &lt;message:Header&gt;\r\n         &lt;message:ID&gt;9b3618cc-c8f5-4508-8d3f-c34974a80e12&lt;\/message:ID&gt;\r\n         &lt;message:Test&gt;false&lt;\/message:Test&gt;\r\n         &lt;message:Prepared&gt;2020-04-12T18:01:16.737+02:00&lt;\/message:Prepared&gt;\r\n         &lt;message:Sender id=\"ECB\"\/&gt;\r\n         &lt;message:Structure structureID=\"ECB_EXR1\" dimensionAtObservation=\"TIME_PERIOD\"&gt;\r\n             &lt;common:Structure&gt;\r\n                 &lt;URN&gt;urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=ECB:ECB_EXR1(1.0)&lt;\/URN&gt;\r\n             &lt;\/common:Structure&gt;\r\n         &lt;\/message:Structure&gt;\r\n     &lt;\/message:Header&gt; \r\n     &lt;message:Data<span style=\"color:blue;\">Set<\/span> action=\"Replace\" validFromDate=\"2020-04-12T18:01:16.737+02:00\" structureRef=\"ECB_EXR1\"&gt;\r\n         &lt;generic:Series&gt;\r\n             &lt;generic:SeriesKey&gt;\r\n                 &lt;generic:Value id=\"FREQ\" value=\"M\"\/&gt;\r\n                 &lt;generic:Value id=\"CURRENCY\" value=\"ARS\"\/&gt;\r\n                 &lt;generic:Value id=\"CURRENCY_DENOM\" value=\"EUR\"\/&gt;\r\n                 &lt;generic:Value id=\"EXR_TYPE\" value=\"SP00\"\/&gt;\r\n                 &lt;generic:Value id=\"EXR_SUFFIX\" value=\"A\"\/&gt;\r\n             &lt;\/generic:SeriesKey&gt;\r\n             &lt;generic:Attributes&gt;\r\n                 &lt;generic:Value id=\"COLLECTION\" value=\"A\"\/&gt;\r\n                 &lt;generic:Value id=\"DECIMALS\" value=\"5\"\/&gt;\r\n                 &lt;generic:Value id=\"UNIT\" value=\"ARS\"\/&gt;\r\n                 &lt;generic:Value id=\"UNIT_MULT\" value=\"0\"\/&gt;\r\n                 &lt;generic:Value id=\"SOURCE_AGENCY\" value=\"4F0\"\/&gt;\r\n                 &lt;generic:Value id=\"TITLE_COMPL\" value=\"Indicative exchange rate, Argentine peso\/Euro, 2:15 pm                               \r\n                     (C.E.T.)\"\/&gt;\r\n                 &lt;generic:Value id=\"TIME_FORMAT\" value=\"P1M\"\/&gt;\r\n                 &lt;generic:Value id=\"TITLE\" value=\"Argentine peso\/Euro\"\/&gt;\r\n             &lt;\/generic:Attributes&gt;\r\n             &lt;generic:Obs&gt;\r\n                 &lt;generic:ObsDimension value=\"2020-02\"\/&gt;\r\n                 &lt;generic:ObsValue value=\"66.849385\"\/&gt;\r\n                 &lt;generic:Attributes&gt;\r\n                     &lt;generic:Value id=\"OBS_STATUS\" value=\"A\"\/&gt;\r\n                 &lt;\/generic:Attributes&gt;\r\n             &lt;\/generic:Obs&gt;\r\n             &lt;generic:Obs&gt;\r\n                 &lt;generic:ObsDimension value=\"2020-03\"\/&gt;\r\n                 &lt;generic:ObsValue value=\"69.82061363636365\"\/&gt;\r\n                 &lt;generic:Attributes&gt;\r\n                     &lt;generic:Value id=\"OBS_STATUS\" value=\"A\"\/&gt;\r\n                 &lt;\/generic:Attributes&gt;\r\n             &lt;\/generic:Obs&gt;\r\n         &lt;\/generic:Series&gt;\r\n    &lt;\/message:DataSet&gt;\r\n&lt;\/message:GenericData&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: R&uuml;ckgabe des Webservice<\/span><\/b><\/p>\n<p>Der erste Satz von Metadaten befindet sich im <b>generic:SeriesKey<\/b>-Element. Dieses liefert die beiden betroffenen W&auml;hrungen, die Angabe der Frequenz (zum Beispiel <b>M <\/b>f&uuml;r die monatliche Frequenz) und weitere Informationen.<\/p>\n<p>Der zweite Satz von Informationen kommt im Element <b>generic:Attributes <\/b>und enth&auml;lt beispielsweise Informationen &uuml;ber die W&auml;hrungen und Datumsformate und einen Titel f&uuml;r die Daten.<\/p>\n<p>Schlie&szlig;lich kommen noch die eigentlichen Umrechnungsdaten, und zwar f&uuml;r jeden Zeitraum in einem eigenen Element des Typs <b>generic:Obs<\/b>. Jedes davon enth&auml;lt den Zeitraum (beispielsweise <b>2020-02<\/b>) und den Umrechnungskurs.<\/p>\n<p><b>Auswertung der Response-Dateien<\/b><\/p>\n<p>Anschlie&szlig;end schauen wir uns noch an, wie wir den Inhalt einer solchen Umrechnungsdatei auswerten k&ouml;nnen.<\/p>\n<p>Das XML-Dokument enth&auml;lt ein oder mehrere Elemente des Typs <b><generic:SeriesKey><\/b>, die im Element <b><generic:Value> <\/b>die beteiligten W&auml;hrungen liefert, im Element <b><generic:Attributes> <\/b>die Informationen zur W&auml;hrung und zur Einheit der W&auml;hrung des Umrechnungskurses und ein oder mehrere <b><generic:Obs><\/b>-Elemente mit dem Datum und dem Wechselkurs zu diesem Datum.<\/p>\n<p>Wir wollen die hier ermittelten Daten in die gleiche Tabelle speichern wie die aus dem vorherigen Beispiel. Die obige Prozedur <b>USDEURAlle <\/b>&auml;ndern wir in eine Prozedur namens <b>Wechselkurse <\/b>mit dem Parameter <b>strURL<\/b>, welche die jeweilige URL entgegennimmt. Diese sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Wechselkurse(strURL<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objWinHTTP<span style=\"color:blue;\"> As <\/span>WinHttp.WinHttpRequest\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Set<\/span> objWinHTTP = <span style=\"color:blue;\">New<\/span> WinHttp.WinHttpRequest\r\n     objWinHTTP.Open \"GET\", strURL, <span style=\"color:blue;\">False<\/span>\r\n     objWinHTTP.send\r\n     <span style=\"color:blue;\">If <\/span>objWinHTTP.status = 200<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n         <span style=\"color:blue;\">If <\/span>objXML.loadXML(objWinHTTP.responseText)<span style=\"color:blue;\"> Then<\/span>\r\n             Inzwischenablage objXML.XML\r\n             WechselkurseAuslesenExtended objXML\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> objWinHTTP.status\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Aufruf dieser Prozedur k&ouml;nnen Sie dann etwa von einer weiteren Prozedur durchf&uuml;hren:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EURAlleTaeglichLetzteZehnTage()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"https:\/\/sdw-wsrest.ecb.europa.eu\/service\/ data\/EXR\/D..EUR.SP00.AlastNObservations=10 &detail=dataonly&key=D\"\r\n     Wechselkurse strURL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>Wechselkurse <\/b>ruft dann nach dem Ermitteln des XML-Dokuments wiederum die Prozedur <b>WechselkurseAuslesenExtended <\/b>auf, die das ermittelte XML-Dokument entgegennimmt und dieses analysiert (siehe Listing 6). Die Prozedur legt dabei zun&auml;chst die zu ber&uuml;cksichtigenden Namespaces fest und schreibt diese in die Variable <b>strXMLNamespaces<\/b>. Diese verwendet die Prozedur dann, um sie als Wert der Property <b>SelectionNamespaces <\/b>zuzuweisen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WechselkurseAuslesenExtended(objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60)\r\n     <span style=\"color:blue;\">Dim <\/span>datDatum<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objSeries<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objSeriesKey<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objCurrency<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objObs<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objObsValue<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objObsDimension<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>strWaehrung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>curWechselkurs<span style=\"color:blue;\"> As Currency<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strXMLNamespaces<span style=\"color:blue;\"> As String<\/span>\r\n     strXMLNamespaces = \"xmlns:message=\"\"http:\/\/www.sdmx.org\/resources\/sdmxml\/schemas\/v2_1\/message\"\" \" _\r\n         & \"xmlns:generic=\"\"http:\/\/www.sdmx.org\/resources\/sdmxml\/schemas\/v2_1\/data\/generic\"\"\"\r\n     objXML.SetProperty \"SelectionNamespaces\", strXMLNamespaces\r\n     For Each objSeries In objXML.selectNodes(\"\/\/generic:Series\")\r\n         <span style=\"color:blue;\">Set<\/span> objSeriesKey = objSeries.selectSingleNode(\"generic:SeriesKey\")\r\n         <span style=\"color:blue;\">Set<\/span> objCurrency = objSeriesKey.selectSingleNode(\"generic:Value[@id='CURRENCY']\")\r\n         strWaehrung = objCurrency.Attributes.getNamedItem(\"value\").nodeTypedValue\r\n         For Each objObs In objSeries.selectNodes(\"generic:Obs\")\r\n             <span style=\"color:blue;\">Set<\/span> objObsDimension = objObs.selectSingleNode(\"generic:ObsDimension\")\r\n             datDatum = objObsDimension.Attributes.getNamedItem(\"value\").nodeTypedValue\r\n             <span style=\"color:blue;\">Set<\/span> objObsValue = objObs.selectSingleNode(\"generic:ObsValue\")\r\n             On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n             curWechselkurs = <span style=\"color:blue;\">Replace<\/span>(objObsValue.Attributes.getNamedItem(\"value\").nodeTypedValue, \".\", \",\")\r\n             <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 WechselkursSpeichern datDatum, strWaehrung, curWechselkurs\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">Next<\/span> objObs\r\n     <span style=\"color:blue;\">Next<\/span> objSeries\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Auslesen der Wechselkurse, erweiterte Version<\/span><\/b><\/p>\n<pre>objXML.SetProperty \"SelectionNamespaces\",  strXMLNamespaces<\/pre>\n<p>Dann durchl&auml;uft die Prozedur in einer <b>For Each<\/b>-Schleife alle Elemente des Typs <b>generic:Series<\/b>:<\/p>\n<pre>For Each objSeries In  objXML.selectNodes(\"\/\/generic:Series\")<\/pre>\n<p>Darin liest sie zun&auml;chst das <b>generic:SeriesKey<\/b>-Element ein:<\/p>\n<pre>    <span style=\"color:blue;\">Set<\/span> objSeriesKey = objSeries.selectSingleNode( \"generic:SeriesKey\")<\/pre>\n<p>Dieses enth&auml;lt ein Element des Typs <b>generic:Value <\/b>mit einem Attribut namens <b>id <\/b>mit dem Wert <b>CURRENCY<\/b>, das den Namen der W&auml;hrung enth&auml;lt, dessen Wechselkurs wir ermitteln wollen. Dieses Element referenzieren wir mit <b>objCurrency<\/b>. Um das Element mit dem richtigen Attribut zu ermitteln, nutzen wir den folgenden XPath-Ausdruck:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> objCurrency = objSeriesKey.selectSingleNode( \"generic:Value[@id='CURRENCY']\")<\/pre>\n<p>Die W&auml;hrung lesen wir dann schlie&szlig;lich &uuml;ber das Attribut namens <b>value <\/b>dieses Elements ein: <\/p>\n<pre>     strWaehrung = objCurrency.Attributes. getNamedItem(\"value\").nodeTypedValue<\/pre>\n<p>Dann geht es in einer Schleife &uuml;ber alle Elemente des Typs <b>generic:Obs <\/b>weiter:<\/p>\n<pre>     For Each objObs In objSeries.selectNodes(\"generic:Obs\")<\/pre>\n<p>Hier referenzieren wir zun&auml;chst das Element <b>generic:ObsDimensions<\/b> mit der Variablen <b>objObsDimensions<\/b>:<\/p>\n<pre>         <span style=\"color:blue;\">Set<\/span> objObsDimension = objObs.selectSingleNode( \"generic:ObsDimension\")<\/pre>\n<p>Diesem entnehmen wir &uuml;ber das Attribut <b>value <\/b>den Wert des Datums f&uuml;r diesen Umrechnungskurs und speichern diesen in der Variablen <b>datDatum<\/b>:<\/p>\n<pre>         datDatum = objObsDimension.Attributes. getNamedItem(\"value\").nodeTypedValue<\/pre>\n<p>Au&szlig;erdem lesen wir das Element <b>generic:ObsValue <\/b>in die Variable <b>objObsValue <\/b>ein:<\/p>\n<pre>         <span style=\"color:blue;\">Set<\/span> objObsValue = objObs.selectSingleNode( \"generic:ObsValue\")<\/pre>\n<p>Dieses enth&auml;lt, sofern vorhanden, den Wechselkurs, also den Betrag der umzurechnenden W&auml;hrung. Das hier ausgelesene Attribut <b>value<\/b> kann aber auch den Wert <b>NaN <\/b>enthalten, wenn der Wert nicht vorhanden ist.<\/p>\n<p>In diesem Fall l&ouml;sen wir beim Versuch, diesen Wert in der Variablen <b>curWechselkurs <\/b>zu speichern, einen Fehler aus. Diesen umgehen wir, indem wir die Fehlerbehandlung ausschalten:<\/p>\n<pre>         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         curWechselkurs = <span style=\"color:blue;\">Replace<\/span>(objObsValue.Attributes. getNamedItem(\"value\").nodeTypedValue, \".\", \",\")<\/pre>\n<p>Ist kein Fehler aufgetreten, rufen wir die bereits weiter oben beschriebene Prozedur <b>WechselkursSpeichern <\/b>auf, der wir die zu speichernden Daten &uuml;bergeben:<\/p>\n<pre>         <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n             WechselkursSpeichern datDatum, strWaehrung,  curWechselkurs\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Next<\/span> objObs\r\n<span style=\"color:blue;\">Next<\/span> objSeries<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag beschreibt das Auslesen von Wechselkursen f&uuml;r verschiedene W&auml;hrungskombination mithilfe eines Webservice, der per RESTful Webservice aufgerufen werden kann. Die ermittelten Daten im XML-Format werden analysiert und in einer Tabelle gespeichert. Man k&ouml;nnte noch eine Benutzeroberfl&auml;che f&uuml;r diese Funktionen erstellen, die auch die Auswahl der gew&uuml;nschten Parameter erm&ouml;glicht.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>WebserviceWaehrungen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/0AFFFFD9-2FF0-462E-B88C-27A9E3F061B9\/aiu_1240.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>F&uuml;r viele finanzwirtschaftliche Anwendungen spielt die Umwandlung von Betr&auml;gen in verschiedene W&auml;hrungen eine Rolle. Da w&auml;re es doch praktisch, wenn man immer die aktuellen Umrechnungskurse parat h&auml;tte. Am besten jedoch nicht so, dass man diese immer aus dem Internet oder der Tageszeitung entnimmt und in die Anwendung eintippt &#8211; sondern eher als Information, die eine Anwendung automatisch aus dem Internet bezieht. Wir schauen uns an, wie wir den Webservice der europ&auml;ischen Zentralbank f&uuml;r unsere Zwecke nutzen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662020,66032020,44000027],"tags":[],"class_list":["post-55001240","post","type-post","status-publish","format-standard","hentry","category-662020","category-66032020","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Wechselkurse per Webservice - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wechselkurse per Webservice\" \/>\n<meta property=\"og:description\" content=\"F&uuml;r viele finanzwirtschaftliche Anwendungen spielt die Umwandlung von Betr&auml;gen in verschiedene W&auml;hrungen eine Rolle. Da w&auml;re es doch praktisch, wenn man immer die aktuellen Umrechnungskurse parat h&auml;tte. Am besten jedoch nicht so, dass man diese immer aus dem Internet oder der Tageszeitung entnimmt und in die Anwendung eintippt - sondern eher als Information, die eine Anwendung automatisch aus dem Internet bezieht. Wir schauen uns an, wie wir den Webservice der europ&auml;ischen Zentralbank f&uuml;r unsere Zwecke nutzen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:41:33+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Wechselkurse per Webservice\",\"datePublished\":\"2020-07-10T09:41:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/\"},\"wordCount\":3047,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0961af529a184e96a0f8c9192de9ff40\",\"articleSection\":[\"2020\",\"3\\\/2020\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/\",\"name\":\"Wechselkurse per Webservice - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0961af529a184e96a0f8c9192de9ff40\",\"datePublished\":\"2020-07-10T09:41:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0961af529a184e96a0f8c9192de9ff40\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0961af529a184e96a0f8c9192de9ff40\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Wechselkurse_per_Webservice\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Wechselkurse per Webservice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Wechselkurse per Webservice - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/","og_locale":"de_DE","og_type":"article","og_title":"Wechselkurse per Webservice","og_description":"F&uuml;r viele finanzwirtschaftliche Anwendungen spielt die Umwandlung von Betr&auml;gen in verschiedene W&auml;hrungen eine Rolle. Da w&auml;re es doch praktisch, wenn man immer die aktuellen Umrechnungskurse parat h&auml;tte. Am besten jedoch nicht so, dass man diese immer aus dem Internet oder der Tageszeitung entnimmt und in die Anwendung eintippt - sondern eher als Information, die eine Anwendung automatisch aus dem Internet bezieht. Wir schauen uns an, wie wir den Webservice der europ&auml;ischen Zentralbank f&uuml;r unsere Zwecke nutzen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:41:33+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Wechselkurse per Webservice","datePublished":"2020-07-10T09:41:33+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/"},"wordCount":3047,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40","articleSection":["2020","3\/2020","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/","url":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/","name":"Wechselkurse per Webservice - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40","datePublished":"2020-07-10T09:41:33+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/0961af529a184e96a0f8c9192de9ff40"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Wechselkurse_per_Webservice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Wechselkurse per Webservice"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001240"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001240\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}