{"id":55000987,"date":"2015-06-01T00:00:00","date_gmt":"2020-05-22T19:30:57","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=987"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Onlinebanking_per_Webservice_II","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/","title":{"rendered":"Onlinebanking per Webservice II"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im ersten Teil dieser Beitragsreihe haben wir uns angesehen, wie Sie per Webservice einige Informationen Ihrer Bank einlesen und einfache Funktionen wie das Ermitteln einer IBAN aus Kontonummer und Bankleitzahl durchf&uuml;hren. In vorliegenden zweiten Teil gehen wir einen Schritt weiter: Sie erfahren, wie Sie den Kontostand und die Ums&auml;tze einlesen und wie Sie &uuml;berweisungen durchf&uuml;hren k&ouml;nnen. Dies alles geschieht weiterhin per Webservice, Sie ben&ouml;tigen also nichts au&szlig;er Ihrer Datenbankanwendung und einer Internetverbindung f&uuml;r diese Funktionen.<\/b><\/p>\n<p><b>Datenbank vorbereiten<\/b><\/p>\n<p>Bevor wir in die Onlinebanking-Materie einsteigen, bereiten wir die Beispieldatenbank auf die folgenden Anforderungen vor. Diese sollen beispielsweise die Kontakte speichern (also die eindeutigen Verbindungen zur Bank), die Kontodaten, die Ums&auml;tze und weitere Informationen.<\/p>\n<p><b>Tabellen zum Speichern der Kontakte<\/b><\/p>\n<p>Die erste Tabelle hei&szlig;t dann auch gleich <b>tblKontakte<\/b> und nimmt die Felder aus Bild 1 auf. Die BLZ, die Benutzerkennung und die Teilnehmernummer (Letztere sind mitunter identisch) k&ouml;nnen Sie den Unterlagen Ihres Kreditinstituts zum Onlinebanking entnehmen. Die beiden &uuml;brigen Felder finden Sie dort nicht vor:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_987_001.png\" alt=\"Tabellen zum Speichern der Onlinebanking-Kontakte\" width=\"575\" height=\"203,7478\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Tabellen zum Speichern der Onlinebanking-Kontakte<\/span><\/b><\/p>\n<ul>\n<li><b>ContactData<\/b>: Dies ist ein Wert, der nach der erstmaligen Anmeldung mit BLZ, Benutzerkennung, Teilnehmernummer und PIN von der Bank generiert wird und der f&uuml;r weitere Zugriffe ben&ouml;tigt wird.<\/li>\n<li><b>Bankinfo<\/b>: Informationen &uuml;ber die Bank und den abgefragten Kontakt mit den Kontodaten der Konten dieses Kontakts<\/li>\n<\/ul>\n<p><b>Ablauf beim Zugriff<\/b><\/p>\n<p>Der grunds&auml;tzliche Ablauf beim Zugriff &uuml;ber den Webservice sieht so aus, dass in einer ersten Abfrage der Wert von <b>ContactData <\/b>ermittelt wird, f&uuml;r den die &uuml;bermittlung der Kontaktdaten (also Bankleitzahl, Benutzerkennung et cetera) erforderlich ist. Diesen Wert k&ouml;nnen Sie lokal speichern und ihn wiederverwenden oder sie lesen ihn vor jedem Zugriff erneut ein. Bei der Abfrage des Kontostandes, der Ums&auml;tze oder bei der Durchf&uuml;hrung einer &uuml;berweisung &uuml;bergeben Sie dann nur noch die in <b>ContactData <\/b>verschl&uuml;sselten Daten des Kontaktes, sodass diese nicht einfach abgegriffen und einem Konto zugeordnet werden k&ouml;nnen.<\/p>\n<p>Das Gleiche geschieht sp&auml;ter beim Einlesen der Konten: Hier verschl&uuml;sselt der Webservice die Kontodaten in einem Element namens <b>AccountId<\/b>.<\/p>\n<p><b>Tabelle zum Speichern der Kontodaten<\/b><\/p>\n<p>Die Tabelle <b>tblKonten <\/b>aus Bild 2 speichert die Informationen je Konto. Damit sind wir gleich darauf vorbereitet, dass ein Kontakt einmal mehr als nur ein Konto verwendet &#8211; also beispielsweise mehrere Girokonten. Der Sinn der meisten Felder erschlie&szlig;t sich aus der Abbildung. Wichtig ist das Feld <b>AccountId<\/b>. Dieses nimmt einen eindeutigen Identifizierer auf, der f&uuml;r den Zugriff auf den Kontostand oder die Ums&auml;tze sowie f&uuml;r die Durchf&uuml;hrung von &uuml;berweisungen ben&ouml;tigt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_987_002.png\" alt=\"Tabellen zum Speichern der Kontodaten\" width=\"575\" height=\"352,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Tabellen zum Speichern der Kontodaten<\/span><\/b><\/p>\n<p>Die Datens&auml;tze der Tabelle <b>tblKonten <\/b>werden &uuml;ber das Feld <b>KontaktID <\/b>mit der Tabelle <b>tblKontakte <\/b>verkn&uuml;pft, jedes Konto kann also logischerweise nur einem einzigen Kontakt zugewiesen werden.<\/p>\n<p><b>Daten ermitteln<\/b><\/p>\n<p>Nachdem wir die Tabellen zum Speichern von Kontakten und Kontodaten erstellt haben, ben&ouml;tigen wir noch ein Formular namens <b>frmKonten<\/b>, von dem aus wir die Aktionen wie etwa das Einlesen der Kontodaten starten. Das Formular soll zun&auml;chst zwei Kombinationsfelder enthalten, von denen das erste der Auswahl des Kontakts dient. Das zweite soll dann alle Konten zu diesem Kontakt zur Auswahl anbieten. Au&szlig;erdem f&uuml;gen wir dem Formular bereits zwei Schaltfl&auml;chen hinzu (s. Bild 3):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_987_003.png\" alt=\"Formular zum Verwalten von Kontakten und Konten\" width=\"499,2343\" height=\"223,6954\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Formular zum Verwalten von Kontakten und Konten<\/span><\/b><\/p>\n<ul>\n<li><b>cmdNeuerKontakt<\/b>: Soll ein Formular zum Eintragen eines neuen Kontakts &ouml;ffnen.<\/li>\n<li><b>cmdKontakteAktualisieren<\/b>: Soll die Informationen zum aktuellen Kontakt neu einlesen.<\/li>\n<\/ul>\n<p>Die Schaltfl&auml;che <b>cmdNeuerKontakt <\/b>soll ein weiteres Formular namens <b>frmKontaktdetails <\/b>&ouml;ffnen, mit dem der Benutzer einen neuen Kontakt anlegen soll.<\/p>\n<p><b>Das Formular frmKontaktdetails<\/b><\/p>\n<p>Dieses Formular verwendet die Tabelle <b>tblKontakte <\/b>als Datenherkunft und zeigt die drei Felder <b>BLZ<\/b>, <b>Benutzerkennung <\/b>und <b>Teilnehmernummer <\/b>an (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_987_004.png\" alt=\"Formular zum Anlegen von Kontakten\" width=\"421,853\" height=\"217,2633\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Formular zum Anlegen von Kontakten<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdOK <\/b>schlie&szlig;t das Formular lediglich:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Neuen Kontakt anlegen<\/b><\/p>\n<p>Um mit dem Formular <b>frmKontaktdetails <\/b>einen neuen Kontakt anzulegen, soll dieses durch einen Klick auf die Schaltfl&auml;che <b>cmdNeuerKontakt <\/b>des Formulars <b>frmKonten <\/b>ge&ouml;ffnet werden. Nach dem Schlie&szlig;en des als modaler Dialog ge&ouml;ffneten Formulars aktualisiert das Formular die Liste der Kontakte im Kombinationsfeld <b>cboKontakte<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuerKontakt_Click()\r\n     DoCmd.OpenForm \"frmKontaktdetails\", _\r\n         WindowMode:=acDialog, DataMode:=acFormAdd\r\n     Me!cboKontakte.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Kombinationsfeld <b>cboKontakte <\/b>zeigt alle Datens&auml;tze der Tabelle <b>tblKontakte <\/b>an, wobei wir fast alle Felder der Tabelle verwenden. Die anzuzeigende Spalte soll einen aus der Bankleitzahl, der Teilnehmernummer und der Benutzerkennung zusammengesetzten Ausdruck liefern. Daher haben wir die Datensatzherkunft f&uuml;r das Kombinationsfeld wie folgt formuliert:<\/p>\n<pre>SELECT KontaktID, [BLZ] & \"|\" & [Teilnehmernummer] & \"|\" & [Benutzerkennung] AS Kontakt, \r\nBLZ, Teilnehmernummer, Benutzerkennung, ContactData FROM tblKontakte;<\/pre>\n<p>Damit das Kombinationsfeld nur das zweite Feld der Datensatzherkunft anzeigt, aber die anderen bei Bedarf &uuml;ber das Kombinationsfeld abgefragt werden k&ouml;nnen, stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>6 <\/b>und die Eigenschaft <b>Spaltenbreiten <\/b>auf <b>0cm;;0cm;0cm;0cm;0cm <\/b>ein.<\/p>\n<p><b>Kontakt aktualisieren<\/b><\/p>\n<p>Damit kommen wir zu der Schaltfl&auml;che <b>cmdKontenAktualisieren<\/b>, welche die Informationen zum aktuell im Kombinationsfeld <b>cboKontakte <\/b>ausgew&auml;hlten Kontakt ermittelt.<\/p>\n<p>Diese l&ouml;st die Prozedur aus Listing 1 aus, die lediglich den Wert des Feldes <b>ContactData <\/b>der Tabelle <b>tblKontakte<\/b> f&uuml;r den aktuell ausgew&auml;hlten Kontakt leert. Danach ruft sie die Prozedur <b>cboKontakte_AfterUpdate <\/b>auf, die au&szlig;erdem beim Aktualisieren des Wertes des Kombinationsfeldes <b>cboKontakte <\/b>ausgel&ouml;st wird.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdKontaktAktualisieren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"UPDATE tblKontakte SET ContactData = NULL WHERE KontaktID = \" _\r\n         & Me!cboKontakte, dbFailOnError\r\n     cboKontakte_AfterUpdate\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Start der Aktualisierung eines Kontakts<\/span><\/b><\/p>\n<p>Diese Prozedur finden Sie in Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboKontakte_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strContactData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCustomerID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strUserID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngKontaktID<span style=\"color:blue;\"> As Long<\/span>\r\n     strBLZ = Me!cboKontakte.Column(2)\r\n     strCustomerID = Me!cboKontakte.Column(4)\r\n     strUserID = Me!cboKontakte.Column(3)\r\n     lngKontaktID = Me!cboKontakte\r\n     <span style=\"color:blue;\">If <\/span>IsNull(DLookup(\"ContactData\", \"tblKontakte\", \"KontaktID = \" & lngKontaktID))<span style=\"color:blue;\"> Then<\/span>\r\n         strContactData = Anmelden(strBLZ, strCustomerID, strUserID)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!cboKonten.RowSource = \"SELECT * FROM qryCboKonten WHERE KontaktID = \" & lngKontaktID\r\n     Me!cboKonten = Me!cboKonten.ItemData(0)\r\n     cboKonten_AfterUpdate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur, die bei der Aktualisierung des aktuellen Kontakts ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Sie liest zun&auml;chst einige Werte aus den nicht sichtbaren Spalten des Kombinationsfeldes aus und speichert diese in Variablen wie <b>strBLZ<\/b>, <b>strCustomerID<\/b>, <b>strUserID <\/b>und <b>lngKontaktID<\/b>.<\/p>\n<p>Nun folgt eine Pr&uuml;fung, ob das Feld <b>ContactData <\/b>f&uuml;r diesen Kontakt leer ist. Dies ist der Fall, wenn die Daten des Kontakts noch nie eingelesen wurden oder der Benutzer zuvor auf die Schaltfl&auml;che <b>cmdKontaktAktualisieren <\/b>geklickt hat, die ja dieses Feld f&uuml;r den aktuellen Kontakt leert.<\/p>\n<p>In diesem Fall ruft die Prozedur eine weitere Funktion namens Anmelden auf, der sie die Bankleitzahl, die Benutzerkennung und die Teilnehmernummer &uuml;bergibt &#8211; mehr dazu weiter unten.<\/p>\n<p>Danach ist jedenfalls die Tabelle <b>tblKonten <\/b>mit den Konten zu diesem Kontakt gef&uuml;llt. Die folgenden Anweisungen filtern dann das Kombinationsfeld <b>cboKonten <\/b>nach dem soeben ausgew&auml;hlten beziehungsweise aktualisierten Kontakt, w&auml;hlen den ersten Eintrag aus und rufen eine weitere Prozedur namens <b>cboKonten_AfterUpdate <\/b>auf, die auch ausgel&ouml;st wird, wenn der Benutzer manuell den Wert des Kombinationsfeldes <b>cboKonten <\/b>&auml;ndert.<\/p>\n<p><b>Anmelden und Kontaktdaten einlesen<\/b><\/p>\n<p>Die Funktion <b>Anmelden <\/b>aus Listing 3 erwartet die Bankleitzahl, die Benutzernummer und die Teilnehmernummer als Parameter und soll die Kontaktdaten in Form eines XML-Dokuments zur&uuml;ckliefern. Dazu ist zun&auml;chst die Abfrage der PIN f&uuml;r diesen Kontakt erforderlich &#8211; also die Zeichenfolge, mit der Sie sich auch f&uuml;r Onlinebanking anmelden. Diese fragt die Funktion per <b>InputBox <\/b>ab und speichert sie in der Variablen <b>strPIN<\/b>. Danach folgt der Aufruf einer weiteren Funktion namens <b>CreateContactDirectRequest<\/b>. Diese leistet den eigentlich Zugriff auf den Bankserver und liefert das gew&uuml;nschte XML-Dokument als <b>String<\/b>-Variable zur&uuml;ck (Erl&auml;uterung zu dieser Funktion siehe weiter unten). Beim Aufruf &uuml;bergeben wir einige Werte per Parameter, andere Parameter sollen die R&uuml;ckmeldungen des Webservice an die aufrufende Funktion zur&uuml;ckliefern. Das Ergebnis landet schlie&szlig;lich in der Variablen <b>strContactData<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Anmelden(strBLZ<span style=\"color:blue;\"> As String<\/span>, strCustomerID<span style=\"color:blue;\"> As String<\/span>, strUserID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> _\r\n         As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\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>strContactData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngKontaktID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPIN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErrorType<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErrorText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErrorCustomerText<span style=\"color:blue;\"> As String<\/span>\r\n     strPIN = InputBox(\"PIN\")\r\n     strContactData = CreateContactDirectRequest(strBLZ, strUserID, strCustomerID, strPIN, _\r\n         strResponse, strErrorType, strErrorText, strErrorCustomerText)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strErrorType) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         KontenEinlesen strResponse\r\n         lngKontaktID = DLookup(\"KontaktID\", \"tblKontakte\", _\r\n             \"BLZ = ''\" & strBLZ & \"'' AND Benutzerkennung = ''\" _\r\n             & strCustomerID & \"'' AND Teilnehmernummer = ''\" & strUserID & \"''\")\r\n         <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n         objXML.loadXML strResponse\r\n         <span style=\"color:blue;\">Set<\/span> objNode = objXML.selectSingleNode(\"\/\/CreateContactDirectRequestResult\")\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"UPDATE tblKontakte SET ContactData = ''\" & strContactData _\r\n             & \"'', BankInfo = ''\" _\r\n             & FormatXML(objNode.XML) & \"'' WHERE KontaktID = \" & lngKontaktID, dbFailOnError\r\n         SecurityFunctionsAktualisieren db, objNode, lngKontaktID\r\n         GeschaeftsvorfaelleAktualisieren db, objNode\r\n         Anmelden = strContactData\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorCustomerText\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Anmelden an den Bankserver und ermitteln einiger Daten zum aktuellen Kontakt<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Sollte die Funktion <b>CreateContactDirectRequest<\/b> den Parameter <b>strErrorType <\/b>mit einem Wert ungleich <b>0 <\/b>f&uuml;llen, ist kein Fehler aufgetreten und die gelieferten Daten k&ouml;nnen verarbeitet werden.<\/p>\n<p>Die Prozedur ruft dann die Prozedur <b>KontenEinlesen <\/b>auf, welche die Kontoinformationen einliest und in der Tabelle <b>tblKonten <\/b>speichert (siehe weiter unten). Dieser &uuml;bergibt sie den Wert aus <b>strResponse<\/b>. Wie der Inhalt dieser Variablen aussieht, schauen wir uns ebenfalls weiter unten an.<\/p>\n<p>Dann ermittelt die Prozedur den Prim&auml;rschl&uuml;sselwert des Kontakts, f&uuml;r den soeben die Daten neu eingelesen wurden, und speichert diesen in der Variablen <b>lngKontaktID<\/b>.<\/p>\n<p>Ein neues <b>DOMDocument<\/b>-Objekt namens <b>objXML <\/b>wird mit dem Inhalt der Antwort des Webservice-Aufrufs aus <b>strResponse <\/b>gespeist. Uns interessiert hier das Element <b>CreateContactDirectRequestResult<\/b>, das wir in die <b>IXMLDOMNode<\/b>-Variable <b>objNode <\/b>einlesen. Dieses Objekt verarbeiten wir aber auch nicht direkt in dieser Prozedur, sondern &uuml;bergeben es noch an weitere Prozeduren, die jeweils einen Teil des XML-Dokuments analysieren.<\/p>\n<p>Zuvor schreibt die Prozedur dieses aber auf jeden Fall in das Feld <b>ContactData <\/b>des betroffenen Datensatzes in der Tabelle <b>tblKontakte<\/b>.<\/p>\n<p>Schlie&szlig;lich folgt noch der Aufruf zweier Prozeduren, die jeweils einen Satz von Daten in weitere Tabellen eintragen: <b>SecurityFunctionsAktualisieren <\/b>und <b>GeschaeftsvorfaelleAktualisieren<\/b>.<\/p>\n<p><b>Webservice aufrufen<\/b><\/p>\n<p>Einen wichtigen Teil der Arbeit erledigt die bereits erw&auml;hnte Funktion <b>CreateContactDirectRequest<\/b>. Diese erwartet die Kontaktdaten sowie die PIN als Parameter und liest damit einen ganzen Rutsch Daten vom Bankserver ein.<\/p>\n<p>Die Prozedur aus Listing 4 stellt in der Variablen <b>strRequest <\/b>den wichtigen Teil des XML-Requests zusammen. Dieser sieht etwa wie folgt aus und enth&auml;lt die Bankdaten und die PIN:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateContactDirectRequest(strBankCode<span style=\"color:blue;\"> As String<\/span>, strUserID<span style=\"color:blue;\"> As String<\/span>, _\r\n         strCustomerID<span style=\"color:blue;\"> As String<\/span>, _\r\n         strPIN<span style=\"color:blue;\"> As String<\/span>, strResponse<span style=\"color:blue;\"> As String<\/span>, strErrorType<span style=\"color:blue;\"> As String<\/span>, strErrorText<span style=\"color:blue;\"> As String<\/span>, _\r\n         strErrorCustomerText<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLResponse<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"CreateContactDirectRequest\"\r\n     strRequest = \"        &lt;ser:CustomerData&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"            &lt;ser:BankCode&gt;\" & strBankCode & \"&lt;\/ser:BankCode&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"            &lt;ser:UserId&gt;\" & strUserID & \"&lt;\/ser:UserId&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"            &lt;ser:CustomerId&gt;\" & strCustomerID & \"&lt;\/ser:CustomerId&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"        &lt;\/ser:CustomerData&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"        &lt;ser:Pin&gt;\" & strPIN & \"&lt;\/ser:Pin&gt;\"\r\n     strRequest = CreateSoapRequest(strRequest, strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.XML\r\n     strErrorType = GetXMLElement(strResponse, \"\/\/ErrorType\")\r\n     strErrorText = GetXMLElement(strResponse, \"\/\/ErrorText\")\r\n     strErrorCustomerText = GetXMLElement(strResponse, \"\/\/ErrorCustomerText\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strErrorType & strErrorText & strErrorCustomerText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         CreateContactDirectRequest = GetXMLElement(strResponse, \"\/\/ContactData\")\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Anfrage an den Webserver senden und Antwort zur&uuml;ckliefern<\/span><\/b><\/p>\n<pre>&lt;ser:CustomerData&gt;\r\n     &lt;ser:BankCode&gt;70000997&lt;\/ser:BankCode&gt;\r\n     &lt;ser:UserId&gt;735160&lt;\/ser:UserId&gt;\r\n     &lt;ser:CustomerId&gt;735160&lt;\/ser:CustomerId&gt;\r\n&lt;\/ser:CustomerData&gt;\r\n&lt;ser:Pin&gt;12345&lt;\/ser:Pin&gt;<\/pre>\n<p>Die Funktion <b>CreateSoapRequest<\/b>, die wir bereits im ersten Teil der Beitragsreihe vorgestellt haben, erg&auml;nzt den Request um die f&uuml;hrenden und nachfolgenden Zeilen; das Ergebnis landet wieder in <b>strRequest<\/b>.<\/p>\n<p>Diese Zeichenkette wird dann zusammen mit der noch leeren Objektvariablen <b>objXMLResponse <\/b>an die Prozedur <b>Request <\/b>&uuml;bergeben, deren Beschreibung Sie ebenfalls im ersten Teil der Beitragsreihe finden. <b>objXMLResponse <\/b>enth&auml;lt anschlie&szlig;end das Ergebnis vom Webservice, das in der folgenden Zeile &uuml;ber die Eigenschaft <b>XML <\/b>ausgelesen und in die Variable <b>strResponse <\/b>geschrieben wird.<\/p>\n<p>Aus dieser ermittelt die Prozedur dann gegebenenfalls vorhandene Fehlermeldungen und speichert sie in den Variablen <b>strErrorType<\/b>, <b>strErrorText<\/b> und <b>strErrorCustomerText<\/b>. Nach einer Pr&uuml;fung, ob diese Variablen allesamt leer sind und somit kein Fehler aufgetreten ist, gibt die Funktion den Inhalt des Elements <b>ContactData <\/b>des Ergebnisses an die aufrufende Prozedur <b>Anmelden <\/b>zur&uuml;ck.<\/p>\n<p><b>Konten einlesen<\/b><\/p>\n<p>Das so ermittelte XML-Dokument im String-Format wird von der Prozedur <b>Anmelden <\/b>gleich an die Routine <b>KontenEinlesen <\/b>weitergegeben (s. Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KontenEinlesen(strXML<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>objAccount<span style=\"color:blue;\"> As <\/span>IXMLDOMNode\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>lngContactID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBankCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strUserID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCustomerID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> DOMDocument\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblKonten\", dbOpenDynaset)\r\n     objXML.loadXML strXML\r\n     strBankCode = objXML.selectSingleNode(\"\/\/CustomerData\/BankCode\").nodeTypedValue\r\n     strUserID = objXML.selectSingleNode(\"\/\/CustomerData\/UserId\").nodeTypedValue\r\n     strCustomerID = objXML.selectSingleNode(\"\/\/CustomerData\/CustomerId\").nodeTypedValue\r\n     lngContactID = DLookup(\"KontaktID\", \"tblKontakte\", \"BLZ = ''\" & strBankCode & \"'' AND Benutzerkennung = ''\" _\r\n         & strCustomerID & \"'' AND Teilnehmernummer = ''\" & strUserID & \"''\")\r\n     db.Execute \"DELETE FROM tblKonten WHERE KontaktID = \" & lngContactID, dbFailOnError\r\n     For Each objAccount In objXML.selectNodes(\"\/\/BACAccountData\")\r\n         rst.Add<span style=\"color:blue;\">New<\/span>\r\n         rst!KontaktID = lngContactID\r\n         rst!AccountID = objAccount.selectSingleNode(\"AccountId\").nodeTypedValue\r\n         rst!Iban = objAccount.selectSingleNode(\"Iban\").nodeTypedValue\r\n         rst!Bic = objAccount.selectSingleNode(\"Bic\").nodeTypedValue\r\n         rst!AccountNumber = objAccount.selectSingleNode(\"AccountNumber\").nodeTypedValue\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         rst!SubAccountCharacteristic = objAccount.selectSingleNode(\"SubAccountCharacteristic\").nodeTypedValue\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         rst!CountryCode = objAccount.selectSingleNode(\"CountryCode\").nodeTypedValue\r\n         rst!BankCode = objAccount.selectSingleNode(\"BankCode\").nodeTypedValue\r\n         rst!CustomerId = objAccount.selectSingleNode(\"CustomerId\").nodeTypedValue\r\n         rst!AccountType = objAccount.selectSingleNode(\"AccountType\").nodeTypedValue\r\n         rst!Currency = objAccount.selectSingleNode(\"Currency\").nodeTypedValue\r\n         rst!AccountHolderName = objAccount.selectSingleNode(\"AccountHolderName\").nodeTypedValue\r\n         rst!AccountName = objAccount.selectSingleNode(\"AccountName\").nodeTypedValue\r\n         rst.Update\r\n     <span style=\"color:blue;\">Next<\/span> objAccount\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Eintragen der Account-Daten in die Tabelle tblKonten<\/span><\/b><\/p>\n<p>Diese Prozedur erzeugt f&uuml;r die Variable <b>rst <\/b>ein neues Recordset auf Basis der Tabelle <b>tblKonten<\/b>. Dann l&auml;dt sie den Inhalt von <b>strXML <\/b>in ein <b>DOMDocument<\/b>-Objekt namens <b>objXML<\/b>. Daraus lassen sich mit der Funktion <b>selectSingleNode <\/b>und der Angabe eines entsprechenden <b>XPath<\/b>-Ausdrucks die Inhalts verschiedener Elemente des XML-Dokuments ermitteln. Im ersten Fall liefert das Element <b>\/\/CustomerData\/BankCode <\/b>die Bankleitzahl, die dann in der Variablen <b>strBankCode <\/b>landet. Auf die gleiche Art und Weise ermittelt die Prozedur die &uuml;brigen Informationen.<\/p>\n<p>Diese sehen in der XML-Datei &uuml;brigens wie folgt aus &#8211; hier nur der relevante Ausschnitt mit dem Element <b>CustomerData<\/b>:<\/p>\n<pre>&lt;CreateContactDirectRequestResult&gt;\r\n     &lt;CustomerData&gt;\r\n         &lt;BankCode&gt;70000997&lt;\/BankCode&gt;\r\n         &lt;UserId&gt;735160&lt;\/UserId&gt;\r\n         &lt;CustomerId&gt;735160&lt;\/CustomerId&gt;\r\n     &lt;\/CustomerData&gt;\r\n     &lt;Accounts...&gt;\r\n     &lt;SupportedSecurityFunctions...&gt;\r\n     &lt;ContactData&gt;GgxGb1115NitZ2XV9Rn...&lt;\/ContactData&gt;\r\n     &lt;SuccessText...&gt;\r\n&lt;\/CreateContactDirectRequestResult&gt;<\/pre>\n<p>Danach ermittelt die Prozedur per <b>DLookup <\/b>den Prim&auml;rschl&uuml;sselwert der Tabelle <b>tblKontakte <\/b>f&uuml;r den aktuell zu aktualisierenden Kontakt und speichert diesen in <b>lngContactID<\/b>. Damit l&ouml;scht sie im n&auml;chsten Schritt alle Datens&auml;tze der Tabelle <b>tblKonten<\/b>, da ja auch die Konten neu eingelesen werden sollen. Schlie&szlig;lich durchl&auml;uft sie alle Elemente des XML-Objekts, die den Elementnamen <b>BAC-AccountData <\/b>tragen. Auf diese greift es &uuml;ber die Funktion <b>selectNodes <\/b>des <b>DOMDocument<\/b>-Objekts zu, die eine Auflistung liefert, welche die Prozedur in einer <b>For Each<\/b>-Schleife durchlaufen kann. Das jeweilige XML-Element landet dabei in der Variablen <b>objAccount<\/b>.<\/p>\n<p>F&uuml;r jedes damit referenzierte Konto des aktuellen Kontakts legt die Prozedur nun zun&auml;chst einen neuen Datensatz in dem Recordset auf Basis der Tabelle <b>tblKonten <\/b>an.<\/p>\n<p>Danach tr&auml;gt sie die &uuml;ber die <b>selectSingleNode <\/b>ermittelten Informationen aus dem XML-Dokument direkt in die entsprechenden Felder der Tabelle <b>tblKonten <\/b>ein &#8211; also BIC, IBAN, Kontonummer, Bankleitzahl und so weiter. Schlie&szlig;lich speichert die Prozedur den neu erstellten und gef&uuml;llten Datensatz mit der <b>Update<\/b>-Anweisung in der Tabelle und springt mit der Next-Anweisung zum n&auml;chsten <b>Accounts<\/b>-Objekt.<\/p>\n<p>Zum besseren Verst&auml;ndnis hier noch der Ausschnitt des XML-Dokuments mit den Daten eines Beispielkontos:<\/p>\n<pre>&lt;CreateContactDirectRequestResult&gt;\r\n     &lt;CustomerData ...&gt;\r\n     &lt;Accounts&gt;\r\n         &lt;BACAccountData&gt;\r\n             &lt;AccountId&gt;5E3A4E4882B730A5...&lt;\/AccountId&gt;\r\n             &lt;Iban&gt;DE43700009971000735160&lt;\/Iban&gt;\r\n             &lt;Bic&gt;DDBADEMM002&lt;\/Bic&gt;\r\n             &lt;AccountNumber&gt;1000735160&lt;\/AccountNumber&gt;\r\n             &lt;CountryCode&gt;280&lt;\/CountryCode&gt;\r\n             &lt;BankCode&gt;70000997&lt;\/BankCode&gt;\r\n             &lt;CustomerId&gt;735160&lt;\/CustomerId&gt;\r\n             &lt;AccountType&gt;1&lt;\/AccountType&gt;\r\n             &lt;Currency&gt;EUR&lt;\/Currency&gt;\r\n             &lt;AccountHolderName&gt;USER-735160&lt;\/AccountHolderName&gt;\r\n             &lt;AccountName&gt;Girokonto&lt;\/AccountName&gt;\r\n         &lt;\/BACAccountData&gt;\r\n         &lt;BACAccountData...&gt;\r\n     &lt;\/Accounts&gt;\r\n     &lt;SupportedSecurityFunctions...&gt;\r\n     &lt;ContactData&gt;GgxGb1115NitZ2XV9Rn...&lt;\/ContactData&gt;\r\n     &lt;SuccessText&gt;Angemeldet. (0020); Informationen \r\n         fehlerfrei entgegengenommen. (0020); \r\n         Die Synchronisierung der Kundensystem-ID war \r\n         erfolgreich. (0020)&lt;\/SuccessText&gt;\r\n&lt;\/CreateContactDirectRequestResult&gt;<\/pre>\n<p>Damit h&auml;tten wir schon einmal die ben&ouml;tigten Basisdaten zusammen &#8211; also die <b>Contact<\/b>&#8211; und die <b>Account<\/b>-Daten. Diese sind jeweils in den Tabellen <b>tblKontakte <\/b>und <b>tblKonten <\/b>gelandet. Das Formular <b>frmKonten <\/b>zeigt nun die Kontakte im Kombinationsfeld <b>cboKontakte <\/b>an und die Konten zum aktuellen Kontakt im Kombinationsfeld <b>cboKonten<\/b> (s. Bild 5). Dieses m&uuml;ssen Sie zuvor noch hinzuf&uuml;gen und einrichten. Es verwendet eine Abfrage namens <b>qry-Cbo-Konten <\/b>als Datensatzherkunft, welches den folgenden SQL-Ausdruck enth&auml;lt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_987_005.png\" alt=\"Kontakte und Konten lassen sich nun bereits ausw&auml;hlen.\" width=\"421,853\" height=\"150,0823\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Kontakte und Konten lassen sich nun bereits ausw&auml;hlen.<\/span><\/b><\/p>\n<pre>SELECT KontoID, [AccountNumber] & \"|\" & [AccountName] AS Konto, AccountNumber, \r\nIban, Bic, AccountId, KontaktID, BankCode FROM tblKonten;<\/pre>\n<p>Das Kombinationsfeld soll nur das zweite der Felder anzeigen, die &uuml;brigen aber verborgen zur Verf&uuml;gung stellen. Dazu stellen Sie die Eigenschaft <b>Spaltenanzahl <\/b>auf den Wert <b>6 <\/b>und die Eigenschaft <b>Spaltenbreiten <\/b>auf den Wert <b>0cm;;0cm;0cm;0cm;0cm <\/b>ein.<\/p>\n<p><b>Formular frmKonten erweitern<\/b><\/p>\n<p>Damit das Formular <b>frmKonten<\/b> auch die gewonnenen Informationen wie den Kontostand oder die Kontoums&auml;tze anzeigen kann, m&uuml;ssen Sie noch weitere Steuerelemente hinzuf&uuml;gen.<\/p>\n<p>Dazu f&uuml;gen Sie dem Formular zun&auml;chst die Steuerelemente zur Anzeige und zur Aktualisierung des Kontostands hinzu (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_987_006.png\" alt=\"Steuerelemente zur Anzeige und Aktualisierung des Kontostandes\" width=\"549,1575\" height=\"260,5876\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Steuerelemente zur Anzeige und Aktualisierung des Kontostandes<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdKontostandEinlesen <\/b>soll die Prozedur aus Listing 6 ausl&ouml;sen. Die Prozedur liest zun&auml;chst den Wert des Feldes <b>ContactData <\/b>aus der Tabelle <b>tblKontakte<\/b> ein. Die entsprechende Zeichenkette ist l&auml;nger als 255 Zeichen, sodass wir diese nicht einfach in der Datensatzherkunft f&uuml;r das Kombinationsfeld unterbringen k&ouml;nnen. Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob der Benutzer das Kontrollk&auml;stchen <b>chkAlleKonten <\/b>aktiviert hat. In diesem Fall soll der Kontostand aller Konten dieses Kontaktes eingelesen werden. Ist <b>chkAlleKonten <\/b>deaktiviert, tr&auml;gt die Prozedur die Nummer des einzulesenden Kontos aus dem aktuellen Eintrag des Kombinationsfeldes <b>cboKonten <\/b>in die Variable <b>strAccountId <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdKontostandEinlesen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strContactData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strNewContactData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strAccountId<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErrorCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErrorText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>curKontostand<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>objResponse<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>objBalance<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     strContactData = DLookup(\"ContactData\", \"tblKontakte\", \"KontaktID = \" & Me!cboKontakte) ''wegen L&auml;ngenbeschr&auml;nkung\r\n     <span style=\"color:blue;\">If <\/span>Me!chkAlleKonten = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strAccountId = Me!cboKonten.Column(5)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strXML = BalanceRequest(strContactData, strNewContactData, strAccountId, strErrorCode, strErrorText)\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strNewContactData) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"UPDATE tblKontakte SET ContactData = ''\" & strNewContactData & \"'' WHERE KontaktID = \" _\r\n             & Me!cboKontakte, dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(GetXMLElement(strXML, \"\/\/SuccessText\")) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objResponse = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n         objResponse.loadXML strXML\r\n         For Each objBalance In objResponse.selectNodes(\"\/\/Balance\")\r\n             curKontostand = Eval(objBalance.selectSingleNode(\"CurrentValutaBalance\/Amount\").nodeTypedValue)\r\n             db.Execute \"UPDATE tblKonten SET LetzterKontostand = \" & <span style=\"color:blue;\">Replace<\/span>(curKontostand, \",\", \".\") _\r\n                 & \", LetzterKontostandDatum = \" & Isodatum(Now) & \" WHERE KontoID = \" & Me!cboKonten, dbFailOnError\r\n         <span style=\"color:blue;\">Next<\/span> objBalance\r\n         Me!txtKontostand = DLookup(\"LetzterKontostand\", \"tblKonten\", \"KontoID = \" & Me!cboKonten)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Fehler:\" & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorCode & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorText\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Start des Einlesevorgangs des Kontostands<\/span><\/b><\/p>\n<p>Schlie&szlig;lich folgt wie in den bereits vorgestellten Prozeduren wieder der Aufruf einer Funktion, welche die eigentliche Kommunikation mit dem Webservice &uuml;bernimmt und die Antwort in Form eines XML-Dokuments im <b>String<\/b>-Format zur&uuml;ckliefert.<\/p>\n<p>In diesem Fall handelt es sich um die Funktion <b>BalanceRequest<\/b>, die wir weiter unten beschreiben. Vorerst gehen wir davon aus, dass diese Funktion das gew&uuml;nschte XML-Dokument zur&uuml;ckliefert.<\/p>\n<p>Die Prozedur <b>cmdKontostandEinlesen_Click <\/b>pr&uuml;ft dann, ob der Parameter <b>strNewContactData <\/b>gef&uuml;llt ist. Den bestehenden Wert des Feldes <b>ContactData <\/b>hat die Prozedur der Funktion mit dem Parameter <b>strContactData <\/b>&uuml;bermittelt. In manchen F&auml;llen wird <b>ContactData <\/b>beim Aufruf des Webservice erneuert und dann mit dem Parameter <b>strNewContactData <\/b>zur&uuml;ckgeliefert. Dies pr&uuml;ft die Prozedur und tr&auml;gt den neuen Wert gegebenenfalls in das Feld <b>ContactData <\/b>der Tabelle <b>tblKontakte <\/b>ein.<\/p>\n<p>Sollte das zur&uuml;ckgelieferte XML-Dokument ein Element namens <b>SuccessText <\/b>enthalten, war der Aufruf erfolgreich. Die Prozedur liest das noch in der String-Variablen <b>strXML<\/b> enthaltene XML-Dokument dann in ein <b>DOMDocument<\/b>-Objekt ein und liest die einzelnen <b>Balance<\/b>-Elemente ein. Der interessante Teil des XML-Dokuments sieht auszugsweise wie folgt aus:<\/p>\n<pre>&lt;BalanceRequestResponse xmlns=\"http:\/\/service.ddbac.de\/\"&gt;\r\n     &lt;BalanceRequestResult&gt;\r\n         &lt;CustomerData....\/&gt;\r\n        &lt;Balances&gt;\r\n             &lt;Balance&gt;\r\n                 &lt;AccountName&gt;Girokonto&lt;\/AccountName&gt;\r\n                 &lt;AccountCurrency&gt;EUR&lt;\/AccountCurrency&gt;\r\n                 &lt;CurrentValutaBalance&gt;\r\n                 &lt;Currency&gt;EUR&lt;\/Currency&gt;\r\n                     &lt;Amount&gt;18179.75&lt;\/Amount&gt;\r\n                     &lt;Date&gt;2015-05-02T00:00:00&lt;\/Date&gt;\r\n                 &lt;\/CurrentValutaBalance&gt;\r\n                 ...\r\n&nbsp;&nbsp;&nbsp;&nbsp;    &lt;\/Balance&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;    &lt;Balance...\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;    &lt;Balance...\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/Balances&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;SuccessText&gt;Die Nachricht wurde entgegengenommen. (0010); Der Auftrag wurde ausgef&uuml;hrt. (0020)&lt;\/SuccessText&gt;\r\n     &lt;\/BalanceRequestResult&gt;\r\n&lt;\/BalanceRequestResponse&gt;<\/pre>\n<p>Die Prozedur durchl&auml;uft nun die einzelnen <b>Balance<\/b>-Elemente in einer <b>For Each<\/b>-Schleife &uuml;ber die Auflistung, die mit der <b>SelectNodes<\/b>-Funktion f&uuml;r den XPath-Ausdruck <b>\/\/Balance <\/b>ermittelt wurde. Dabei liest sie den Kontostand &uuml;ber das Element <b>CurrentValutaBalance\/Amount <\/b>des aktuellen <b>Balance<\/b>-Elements ein.<\/p>\n<p>Diesen Wert tr&auml;gt sie per <b>UPDATE<\/b>-Aktionsabfrage f&uuml;r den entsprechenden Datensatz der Tabelle <b>tblKonten <\/b>ein und wendet sich den &uuml;brigen Kontost&auml;nden f&uuml;r diesen Kontakt zu. Der so ermittelte Kontostand landet dann schlie&szlig;lich im Textfeld <b>txtKontostand <\/b>des Formulars <b>frmKonten<\/b>.<\/p>\n<p>Sollte ein Fehler aufgetreten sein, gibt die Prozedur diesen per <b>MsgBox<\/b>-Anweisung aus.<\/p>\n<p><b>BalanceRequest-Funktion<\/b><\/p>\n<p>Damit kommen wir zur Funktion <b>BalanceRequest<\/b>, die den oder die Kontost&auml;nde einliest (s. Listing 7). Die Funktion erwartet den Wert von <b>ContactData <\/b>sowie gegebenenfalls die Nummer des einzulesenden Kontos, wenn nicht ohnehin alle Konten des aktuellen Accounts eingelesen werden sollen. Sie fragt per <b>InputBox <\/b>wiederum die PIN f&uuml;r den Zugriff auf den Bankserver ab und speichert diese in <b>strPIN<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BalanceRequest(strContactData<span style=\"color:blue;\"> As String<\/span>, strNewContactData<span style=\"color:blue;\"> As String<\/span>, strAccountId<span style=\"color:blue;\"> As String<\/span>, _\r\n         strErrorCode<span style=\"color:blue;\"> As String<\/span>, strErrorText<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLResponse<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPIN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"BalanceRequest\"\r\n     strPIN = InputBox(\"PIN:\")\r\n     strRequest = \"            &lt;ser:BalanceRequestData&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                &lt;ser:ContactData&gt;\" & strContactData & \"&lt;\/ser:ContactData&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strAccountId) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"                &lt;ser:AccountId&gt;\" & strAccountId & \"&lt;\/ser:AccountId&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strRequest = strRequest & \"            &lt;\/ser:BalanceRequestData&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"            &lt;ser:Pin&gt;\" & strPIN & \"&lt;\/ser:Pin&gt;\"\r\n     strRequest = CreateSoapRequest(strRequest, strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.XML\r\n     strErrorCode = GetXMLElement(strResponse, \"\/\/\" & strFunction & \"Result\/Error\/ErrorCode\")\r\n     strErrorText = GetXMLElement(strResponse, \"\/\/\" & strFunction & \"Result\/Error\/ErrorText\")\r\n     strNewContactData = GetXMLElement(strResponse, \"\/\/ContactData\")\r\n     BalanceRequest = FormatXML(objXMLResponse.XML)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Abfragen des aktuellen Kontostandes per Webservice<\/span><\/b><\/p>\n<p>Dann stellt sie den Kern des Requests zusammen. Dieser enth&auml;lt lediglich ein Element namens <b>BalanceRequestData <\/b>mit dem Unterelement <b>ContactData <\/b>und ein <b>PIN<\/b>-Element. Wenn nicht alle Konten des Kontakts eingelesen werden sollen, hat der Benutzer das Kontrollk&auml;stchen <b>chkAlleKonten <\/b>deaktiviert und die Nummer des aktuellen Kontos wird mit dem Parameter <b>strAccountID <\/b>an die Funktion <b>BalanceRequest <\/b>&uuml;bergeben. In diesem Fall f&uuml;gt die Funktion dem Element <b>BalanceRequestData <\/b>noch das Element <b>AccountId <\/b>mit den verschl&uuml;sselten Daten zur  betroffenen Kontonummer hinzu.<\/p>\n<p>Der XML-Teil der Anfrage (ohne SOAP) sieht dann so aus:<\/p>\n<pre>&lt;ser:BalanceRequest&gt;\r\n     &lt;ser:BalanceRequestData&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;ser:ContactData&gt;GgxGb1115NitZ2XV9R...        &lt;\/ser:ContactData&gt;\r\n         &lt;ser:AccountId&gt;5E3A4E48...&lt;\/ser:AccountId&gt;    \r\n     &lt;\/ser:BalanceRequestData&gt;\r\n     &lt;ser:Pin&gt;12345&lt;\/ser:Pin&gt;\r\n&lt;\/ser:BalanceRequest&gt;<\/pre>\n<p>Daraus erstellt die Funktion dann den SOAP-Request und &uuml;bermittelt diesen mit den bereits bekannten Funktionen an den Webservice. Das Ergebnis landet dann in der als Funktionswert verwendeten Variablen <b>BalanceRequest<\/b>. Sollte bei diesem Abruf ein neuer Wert f&uuml;r <b>ContactData <\/b>erstellt worden sein, landet dieser im R&uuml;ckgabeparameter <b>strNewContactData<\/b>.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Damit haben wir nun die Authentifizierung mit einem ersten Aufruf und der Ermittlung des Wertes von Contactdata f&uuml;r den Kontakt und der AccountId f&uuml;r jedes einzelne Konto erledigt sowie den ersten Zugriff auf die wirklich interessanten Daten &#8211; in diesem Fall den Kontostand. Dieser erscheint nach dem Einlesen im Formular <b>frmKonten <\/b>und der zuletzt eingelesene Wert wird in der Tabelle <b>tblKonten <\/b>gespeichert.<\/p>\n<p>Es fehlen noch zwei Operationen, n&auml;mlich das Einlesen der Kontoums&auml;tze sowie das Ausf&uuml;hren von &uuml;berweisungen &#8211; dann sind die aktuellen Funktionen des Webservices der <b>B+S Banksysteme AG <\/b>abgedeckt. Diese finden Sie in einem weiteren Beitrag in der folgenden Ausgabe.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OnlinebankingPerWebservice.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{38B1FF0D-FA34-48B8-895E-7067A29827B9}\/aiu_987.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im ersten Teil dieser Beitragsreihe haben wir uns angesehen, wie Sie per Webservice einige Informationen Ihrer Bank einlesen und einfache Funktionen wie das Ermitteln einer IBAN aus Kontonummer und Bankleitzahl durchf&uuml;hren. In vorliegenden zweiten Teil gehen wir einen Schritt weiter: Sie erfahren, wie Sie den Kontostand und die Ums&auml;tze einlesen und wie Sie &Uuml;berweisungen durchf&uuml;hren k&ouml;nnen. Dies alles geschieht weiterhin per Webservice, Sie ben&ouml;tigen also nichts au&szlig;er Ihrer Datenbankanwendung und einer Internetverbindung f&uuml;r diese Funktionen.<\/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":[662015,66032015,44000027],"tags":[],"class_list":["post-55000987","post","type-post","status-publish","format-standard","hentry","category-662015","category-66032015","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Onlinebanking per Webservice II - 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\/Onlinebanking_per_Webservice_II\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Onlinebanking per Webservice II\" \/>\n<meta property=\"og:description\" content=\"Im ersten Teil dieser Beitragsreihe haben wir uns angesehen, wie Sie per Webservice einige Informationen Ihrer Bank einlesen und einfache Funktionen wie das Ermitteln einer IBAN aus Kontonummer und Bankleitzahl durchf&uuml;hren. In vorliegenden zweiten Teil gehen wir einen Schritt weiter: Sie erfahren, wie Sie den Kontostand und die Ums&auml;tze einlesen und wie Sie &Uuml;berweisungen durchf&uuml;hren k&ouml;nnen. Dies alles geschieht weiterhin per Webservice, Sie ben&ouml;tigen also nichts au&szlig;er Ihrer Datenbankanwendung und einer Internetverbindung f&uuml;r diese Funktionen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:30:57+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Onlinebanking per Webservice II\",\"datePublished\":\"2020-05-22T19:30:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/\"},\"wordCount\":2941,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a78d1a7080a54f929e09e7035e94e75d\",\"articleSection\":[\"2015\",\"3\\\/2015\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/\",\"name\":\"Onlinebanking per Webservice II - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a78d1a7080a54f929e09e7035e94e75d\",\"datePublished\":\"2020-05-22T19:30:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a78d1a7080a54f929e09e7035e94e75d\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a78d1a7080a54f929e09e7035e94e75d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_II\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Onlinebanking per Webservice II\"}]},{\"@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":"Onlinebanking per Webservice II - 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\/Onlinebanking_per_Webservice_II\/","og_locale":"de_DE","og_type":"article","og_title":"Onlinebanking per Webservice II","og_description":"Im ersten Teil dieser Beitragsreihe haben wir uns angesehen, wie Sie per Webservice einige Informationen Ihrer Bank einlesen und einfache Funktionen wie das Ermitteln einer IBAN aus Kontonummer und Bankleitzahl durchf&uuml;hren. In vorliegenden zweiten Teil gehen wir einen Schritt weiter: Sie erfahren, wie Sie den Kontostand und die Ums&auml;tze einlesen und wie Sie &Uuml;berweisungen durchf&uuml;hren k&ouml;nnen. Dies alles geschieht weiterhin per Webservice, Sie ben&ouml;tigen also nichts au&szlig;er Ihrer Datenbankanwendung und einer Internetverbindung f&uuml;r diese Funktionen.","og_url":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:30:57+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Onlinebanking per Webservice II","datePublished":"2020-05-22T19:30:57+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/"},"wordCount":2941,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d","articleSection":["2015","3\/2015","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/","url":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/","name":"Onlinebanking per Webservice II - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d","datePublished":"2020-05-22T19:30:57+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/a78d1a7080a54f929e09e7035e94e75d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_II\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Onlinebanking per Webservice II"}]},{"@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\/55000987","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=55000987"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000987\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}