{"id":55000994,"date":"2015-08-01T00:00:00","date_gmt":"2020-05-22T19:21:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=994"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Onlinebanking_per_Webservice_III","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/","title":{"rendered":"Onlinebanking per Webservice III"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In den ersten beiden Teilen dieser Beitragsreihe haben wir uns die Funktionen f&uuml;r das Einlesen von Informationen und das Konvertieren von Kontonummern in IBAN sowie das Ermitteln des Kontostandes angesehen. Im abschlie&szlig;enden, letzten Teil wird es spannend: Wir f&uuml;gen Funktionen hinzu, mit denen Sie die Kontoums&auml;tze abrufen und &uuml;berweisungen t&auml;tigen k&ouml;nnen. Damit ist auch der aktuelle Leistungsumfang des hier abgebildeten Webservice der Firma B+S Banksysteme AG beschrieben. Die Nutzung ist weiterhin f&uuml;r private Zwecke kostenlos!<\/b><\/p>\n<h2>Ums&auml;tze abrufen<\/h2>\n<p>Diese Funktion ist nat&uuml;rlich etwas umfangreicher als das Einlesen des Kontostandes, da wir ja nicht nur einen einzelnen Wert einlesen, sondern gleich eine ganze Reihe von Werten. Dazu ben&ouml;tigen wir nat&uuml;rlich eine eigene Tabelle, die wir <b>tblUmsaetze <\/b>nennen, und welche im Entwurf wie in Bild 1 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_001.png\" alt=\"Tabelle zum Speichern der Ums&auml;tze\" width=\"649,0045\" height=\"324,5023\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Tabelle zum Speichern der Ums&auml;tze<\/span><\/b><\/p>\n<p>Auf die einzelnen Felder gehen wir gleich bei der Beschreibung des Zugriffs auf den Webservice ein. Wichtig ist an dieser Stelle, dass die Tabelle nicht mit der Tabelle <b>tblKonten <\/b>verkn&uuml;pft ist. Stattdessen enth&auml;lt sie die beiden Felder <b>BankCode <\/b>und <b>Accountnumber<\/b>, welche die Bank und das Konto, &uuml;ber das die Transaktionen ausgef&uuml;hrt wurden, eindeutig identifiziert.<\/p>\n<p>Banken fusionieren ja heutzutage gern mal oder &auml;ndern ihre Bankleitzahl aus anderen Gr&uuml;nden. Bei der hier durchgef&uuml;hrten Methode behalten Sie auf jeden Fall die Originalbankdaten bei. Es steht Ihnen nat&uuml;rlich frei, die Datens&auml;tze der Tabelle <b>tblUmsaetze <\/b>&uuml;ber ein Fremdschl&uuml;sselfeld mit der Tabelle <b>tblKonten <\/b>zu verkn&uuml;pfen.<\/p>\n<p>Weiterhin ist hier zu beachten, dass wir f&uuml;r das Feld <b>HashValue <\/b>einen eindeutigen Index definiert haben. Damit stellen wir sicher, dass ein bereits eingelesener Umsatz nicht nochmals eingelesen wird.<\/p>\n<h2>Formularelemente zum Abruf der Ums&auml;tze<\/h2>\n<p>Nun ben&ouml;tigen wir noch ein Element in der Benutzeroberfl&auml;che, um die Ums&auml;tze abzurufen und auch anzuzeigen. Dazu erweitern wir einfach das Formular <b>frmKonten<\/b>, und zwar um eine Schaltfl&auml;che namens <b>cmdUmsaetzeEinlesen<\/b>, zwei Textfelder namens <b>txtStartdatum <\/b>und <b>txtEnddatum<\/b>, mit denen Sie den Zeitraum f&uuml;r die einzulesenden Ums&auml;tze einstellen k&ouml;nnen, sowie ein Unterformular zur Anzeige der Ums&auml;tze (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_002.png\" alt=\"Anpassungen des Formulars frmKonten\" width=\"549,1575\" height=\"558,1015\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anpassungen des Formulars frmKonten<\/span><\/b><\/p>\n<p>Das Unterformular verwendet die Tabelle <b>tblUmsaetze<\/b> als Datenherkunft und zeigt davon die Felder <b>Amount<\/b>, <b>Valuta<\/b>, <b>Purpose<\/b>, <b>RecBankID<\/b>, <b>RecAccountNr <\/b>und <b>RecName <\/b>an.<\/p>\n<h2>Ums&auml;tze abrufen<\/h2>\n<p>Das Abrufen der Ums&auml;tze startet der Benutzer mit einem Klick auf die Schaltfl&auml;che <b>cmdUmsaetzeEinlesen<\/b>. Diese Prozedur sieht wie in Listing 1 aus und pr&uuml;ft zun&auml;chst, ob der Benutzer f&uuml;r das Kombinationsfeld <b>cboKontakte <\/b>&uuml;berhaupt einen Wert ausgew&auml;hlt hat.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdUmsaetzeEinlesen_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>strAccountId<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strAccountnumber<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>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!cboKontakte)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"W&auml;hlen Sie einen Kontakt aus.\"\r\n         Me!cboKontakte.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strContactData = DLookup(\"ContactData\", \"tblKontakte\", \"KontaktID = \" _\r\n         & Me!cboKontakte) ''wegen L&auml;ngenbeschr&auml;nkung auf 255 Zeichen\r\n     strAccountId = Me!cboKonten.Column(5)\r\n     strAccountnumber = Me!cboKonten.Column(2)\r\n     strXML = StatementRequest(strContactData, strAccountId, strErrorCode, strErrorText, Nz(Me!txtStartdatum, 0), _\r\n         Nz(Me!txtEnddatum, 0))\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         UmsaetzeVerarbeiten strXML, strAccountnumber\r\n         Me!sfmUmsaetze.Form.Requery\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;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Start des Einlesevorgangs der Ums&auml;tze<\/span><\/b><\/p>\n<p>Anderenfalls erscheint eine entsprechende Meldung und die Prozedur wird beendet.<\/p>\n<p>Danach ermittelt die Prozedur den Wert des Feldes <b>ContactData <\/b>f&uuml;r den aktuellen Kontakt. W&auml;hrend die folgenden Werte direkt aus den weiteren Spalten des Kombinationsfeldes <b>cboKontakte <\/b>ausgelesen werden, entnehmen wir diesen Wert per <b>DLookup<\/b>-Funktion aus der Tabelle <b>tblKontakte<\/b>. Der Grund ist einfach: Jede Spalte des Kombinationsfeldes kann nur 255 Zeichen aufnehmen, <b>ContactData <\/b>ist aber l&auml;nger.<\/p>\n<p>Danach liest die Prozedur die Werte der Felder <b>AccountID <\/b>und Accountnumber der Tabelle <b>tblKontakte <\/b>ein, die wir aber bereits in den folgenden Spalten des aktuellen Eintrags des Kombinationsfeldes <b>cboKonten <\/b>gespeichert haben.<\/p>\n<p>Dann setzt die Prozedur einen Aufruf der Funktion <b>StatementRequest <\/b>ab, welche ein XML-Dokument mit den angefragten Umsatz-Informationen zur&uuml;ckliefert. Die Funktion erwartet die Werte der Felder <b>ContactData <\/b>und <b>AccountID<\/b>, zwei Parameter, mit denen eventuelle Fehlerinformationen zur&uuml;ckgeliefert werden k&ouml;nnen, sowie das Start- und das Enddatum, wenn nur die Ums&auml;tze eines begrenzten Zeitraums eingelesen werden sollen.<\/p>\n<p>Das zur&uuml;ckgelieferte XML-Dokument wertet die Prozedur dann gleich aus &#8211; zun&auml;chst, indem sie pr&uuml;ft, ob das Ergebnisdokument ein Element namens <b>SuccessText <\/b>enth&auml;lt. Ist dies der Fall, war der Aufruf des Webservice erfolgreich und wir k&ouml;nnen uns an die Auswertung begeben. Das bedeutet in diesem Fall, dass wir den Inhalt des XML-Dokuments zusammen mit dem Wert von <b>strAccountnumber <\/b>an die Routine <b>UmsaetzeVerarbeiten <\/b>&uuml;bergeben. Danach brauchen wir nur noch das Unterformular <b>sfmUmsaetze <\/b>zu aktualisieren, damit die neu eingelesenen Umsatzpositionen dort angezeigt werden.<\/p>\n<h2>Ums&auml;tze vom Webservice holen<\/h2>\n<p>Die Funktion <b>StatementRequest<\/b> aus Listing 2 erwartet die bereits erw&auml;hnten Parameter. Sie fragt als Erstes per <b>InputBox <\/b>den PIN f&uuml;r den Zugriff auf das Konto ab und speichert diesen in der Variablen <b>strPIN<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StatementRequest(strContactData<span style=\"color:blue;\"> As String<\/span>, strAccountId<span style=\"color:blue;\"> As String<\/span>, strErrorCode<span style=\"color:blue;\"> As String<\/span>, _\r\n         strErrorText<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> datStart<span style=\"color:blue;\"> As Date<\/span>, <span style=\"color:blue;\">Optional<\/span> datEnde<span style=\"color:blue;\"> As Date<\/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>, strResponse<span style=\"color:blue;\"> As String<\/span>, strPIN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strStartdate<span style=\"color:blue;\"> As String<\/span>, strEnddate<span style=\"color:blue;\"> As String<\/span>, strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"StatementRequest\"\r\n     strPIN = InputBox(\"PIN:\")\r\n     strRequest = \"                &lt;ser:StatementRequestData&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     strRequest = strRequest & \"                    &lt;ser:AccountId&gt;\" & strAccountId & \"&lt;\/ser:AccountId&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">If <\/span>datStart &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strStartdate = Format(datStart, \"yyyy-mm-dd\")\r\n         strRequest = strRequest & \"                &lt;ser:StartDate&gt;\" & strStartdate & \"&lt;\/ser:StartDate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>datEnde &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strEnddate = Format(datEnde, \"yyyy-mm-dd\")\r\n         strRequest = strRequest & \"                &lt;ser:EndDate&gt;\" & strEnddate & \"&lt;\/ser:EndDate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strRequest = strRequest & \"                &lt;\/ser:StatementRequestData&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     StatementRequest = FormatXML(objXMLResponse.XML)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Zusammensetzen des Requests und Zur&uuml;ckgeben des Ergebnisses<\/span><\/b><\/p>\n<p>Dann beginnt sie, den Request zusammenzusetzen. Dieses sieht anschlie&szlig;end beispielsweise wie folgt aus:<\/p>\n<pre>&lt;soapenv:Envelope xmlns:soapenv=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\" xmlns:ser=\"http:\/\/service.ddbac.de\/\"&gt;\r\n     &lt;soapenv:Body&gt;\r\n         &lt;ser:StatementRequest&gt;\r\n                 &lt;ser:StatementRequestData&gt;\r\n                     &lt;ser:ContactData&gt;GgxGb1115NitZ...\r\n                         &lt;\/ser:ContactData&gt;\r\n                     &lt;ser:AccountId&gt;5E3A4E4882B730A...\r\n                         &lt;\/ser:AccountId&gt;\r\n                 &lt;\/ser:StatementRequestData&gt;\r\n                 &lt;ser:Pin&gt;12345&lt;\/ser:Pin&gt;\r\n         &lt;\/ser:StatementRequest&gt;\r\n     &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p>Wenn der Benutzer ein Start- oder Enddatum angegeben hat, wird die Anfrage noch entsprechend erweitert:<\/p>\n<pre>...\r\n&lt;ser:StartDate&gt;2015-01-01&lt;\/ser:StartDate&gt;\r\n&lt;ser:EndDate&gt;2015-05-31&lt;\/ser:EndDate&gt;\r\n...<\/pre>\n<p>Danach ruft die Funktion die Routine <b>Request <\/b>auf und &uuml;bergibt ihr den Request als ersten und ein leeres <b>DOMDocument<\/b>-Objekt als zweiten Parameter. Letzterer soll die Antwort des Webservice auf den Request aufnehmen.<\/p>\n<p>Das Ergebnis dieses Aufrufs (die Routine <b>Request <\/b>haben wir bereits im ersten Teil der Beitragsreihe beschrieben) speichert die Prozedur dann in der String-Variablen <b>strResponse<\/b>. Die im Modul <b>mdlWebservice <\/b>befindliche Funktion <b>GetXMLElement <\/b>ermittelt aus dieser Antwort den Inhalt der Elemente <b>Result\/Error\/ErrorCode <\/b>und <b>Result\/Error\/ErrorText <\/b>und speichert diese, soweit gef&uuml;llt, in den beiden Variablen <b>strErrorCode <\/b>und <b>strErrorText<\/b>. Ein <b>Response<\/b>-Dokument mit diesen Fehlerinformationen sieht beispielsweise wie in Listing 3 aus. Sie k&ouml;nnen diesen Fehler beispielsweise hervorrufen, indem Sie im Testsystem als PIN einen Wert eingeben, der mit <b>0 <\/b>beginnt (also etwa <b>01111<\/b>). Die Prozedur gibt neben eventuell vorhandenen Fehlerinformationen das zur&uuml;ckgelieferte XML-Dokument als Funktionswert an die aufrufende Prozedur zur&uuml;ck.<\/p>\n<pre>&lt;soap:Envelope ...&gt;\r\n     &lt;soap:Body&gt;\r\n         &lt;StatementRequestResponse xmlns=\"http:\/\/service.ddbac.de\/\"&gt;\r\n             &lt;StatementRequestResult&gt;\r\n                 &lt;Error&gt;\r\n                     &lt;ErrorType&gt;BUSINESS&lt;\/ErrorType&gt;\r\n                     &lt;ErrorCode&gt;9800&lt;\/ErrorCode&gt;\r\n                     &lt;ErrorText&gt;Der Dialog wurde abgebrochen. Bitte melden Sie sich erneut an. (9800);...&lt;\/ErrorText&gt;\r\n                     &lt;ErrorCustomerText&gt;Der Dialog wurde abgebrochen. Bitte melden Sie sich erneut an. (9800); \r\n                         Ung&uuml;ltige Dialogkennung. Bitte melden Sie sich erneut an. (9010)...&lt;\/ErrorCustomerText&gt;\r\n                     &lt;NoFurtherRequestsPreferred&gt;false&lt;\/NoFurtherRequestsPreferred&gt;\r\n                 &lt;\/Error&gt;\r\n             &lt;\/StatementRequestResult&gt;\r\n         &lt;\/StatementRequestResponse&gt;\r\n     &lt;\/soap:Body&gt;\r\n&lt;\/soap:Envelope&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: R&uuml;ckgabe f&uuml;r eine fehlerhafte Anfrage<\/span><\/b><\/p>\n<h2>Ums&auml;tze verarbeiten<\/h2>\n<p>Die Prozedur <b>UmsaetzeVerarbeiten <\/b>aus Listing 4 erwartet das XML-Dokument, das die Funktion <b>StatementRequest <\/b>geliefert hat, sowie die Kontonummer als Parameter.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>UmsaetzeVerarbeiten(strXML<span style=\"color:blue;\"> As String<\/span>, strAccountnumber<span style=\"color:blue;\"> 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>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>objBACStatementLine<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>strBankCode<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> MSXML2.DOMDocument\r\n     objXML.loadXML strXML\r\n     strBankCode = objXML.selectSingleNode(\"\/\/CustomerData\/BankCode\").nodeTypedValue\r\n     strCustomerID = objXML.selectSingleNode(\"\/\/CustomerData\/CustomerId\").nodeTypedValue\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblUmsaetze\", dbOpenDynaset)\r\n     For Each objBACStatementLine In objXML.selectNodes(\"\/\/BACStatementLine\")\r\n         rst.Add<span style=\"color:blue;\">New<\/span>\r\n         rst!BankCode = strBankCode\r\n         rst!AccountNumber = strAccountnumber\r\n         rst!BusinessTransactionCode = objBACStatementLine.selectSingleNode(\"BusinessTransactionCode\").nodeTypedValue\r\n         rst!HashValue = objBACStatementLine.selectSingleNode(\"HashValue\").nodeTypedValue\r\n         rst!Amount = Eval(objBACStatementLine.selectSingleNode(\"Amount\").nodeTypedValue)\r\n         rst!StatementNr = objBACStatementLine.selectSingleNode(\"StatementNr\").nodeTypedValue\r\n         rst!BookingDate = DatumAusXML(objBACStatementLine.selectSingleNode(\"BookingDate\").nodeTypedValue)\r\n         rst!Currency = objBACStatementLine.selectSingleNode(\"Currency\").nodeTypedValue\r\n         rst!Valuta = DatumAusXML(objBACStatementLine.selectSingleNode(\"Valuta\").nodeTypedValue)\r\n         rst!BookingRef = objBACStatementLine.selectSingleNode(\"BookingRef\").nodeTypedValue\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         rst!Purpose = objBACStatementLine.selectSingleNode(\"Purpose\").nodeTypedValue\r\n         rst!RecBankId = objBACStatementLine.selectSingleNode(\"RecBankId\").nodeTypedValue\r\n         rst!RecAccountNr = objBACStatementLine.selectSingleNode(\"RecAccountNr\").nodeTypedValue\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         rst!RecName = objBACStatementLine.selectSingleNode(\"RecName\").nodeTypedValue\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         rst.Update\r\n         Select Case Err.Number\r\n             <span style=\"color:blue;\">Case <\/span>0, 3022\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     <span style=\"color:blue;\">Next<\/span> objBACStatementLine\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Auslesen und speichern des Inhalts des XML-Dokuments mit den Ums&auml;tzen<\/span><\/b><\/p>\n<p>Sie erstellt zun&auml;chst ein neues <b>DOMDocument<\/b>-Objekt und f&uuml;llt dieses mit dem Inhalt aus <b>strXML<\/b>, der etwa wie in Listing 5 aussieht. In diesem Dokument interessieren uns die einzelnen Elemente unterhalb des Elements <b>StatementLines<\/b>. Jedes Element namens <b>BACStatementLine <\/b>enth&auml;lt n&auml;mlich genau einen Buchungssatz. Die einzelnen dort enthaltenen Elemente liefern jeweils eine Information zur Buchung, zum Beispiel den Betrag, die W&auml;hrung oder das Buchungsdatum. Au&szlig;erdem liefert das Dokument im Element <b>CustomerData <\/b>(hier zur Platzersparnis weggelassen) noch die Informationen zum Bankkonto.<\/p>\n<pre>&lt;soap:Envelope ...\"&gt;\r\n     &lt;soap:Body&gt;\r\n         &lt;StatementRequestResponse xmlns=\"http:\/\/service.ddbac.de\/\"&gt;\r\n             &lt;StatementRequestResult&gt;\r\n                 &lt;CustomerData&gt;...&lt;\/CustomerData&gt;\r\n                 &lt;ContactData&gt;GgxGb1115Nit...&lt;\/ContactData&gt;\r\n                 &lt;AccountId&gt;C29990EF1F05175C1E952DF2005498CC79829427&lt;\/AccountId&gt;\r\n                 &lt;StatementLines&gt;\r\n                     &lt;BACStatementLine&gt;\r\n                         &lt;BusinessTransactionCode&gt;51&lt;\/BusinessTransactionCode&gt;\r\n                         &lt;HashValue&gt;62F619DF4221AD05958F6AF06957438D4E6816C8&lt;\/HashValue&gt;\r\n                         &lt;Amount&gt;1&lt;\/Amount&gt;\r\n                         &lt;StatementNr&gt;54&lt;\/StatementNr&gt;\r\n                         &lt;BookingDate&gt;2015-06-26T00:00:00&lt;\/BookingDate&gt;\r\n                         &lt;Currency&gt;EUR&lt;\/Currency&gt;\r\n                         &lt;Valuta&gt;2015-06-26T00:00:00&lt;\/Valuta&gt;\r\n                         &lt;BookingRef&gt;NONREF&lt;\/BookingRef&gt;\r\n                         &lt;BookingText&gt;&uuml;berweisungseingang&lt;\/BookingText&gt;\r\n                         &lt;Purpose&gt;Testlastschrift&lt;\/Purpose&gt;\r\n                         &lt;RecBankId&gt;DDBADEMM002&lt;\/RecBankId&gt;\r\n                         &lt;RecAccountNr&gt;DE95700009972000735160&lt;\/RecAccountNr&gt;\r\n                         &lt;RecName&gt;USER 735160&lt;\/RecName&gt;\r\n                     &lt;\/BACStatementLine&gt;\r\n                 &lt;\/StatementLines&gt;\r\n                 &lt;SuccessText&gt;Die Nachricht wurde entgegengenommen. (0010); Der Auftrag wurde ausgef&uuml;hrt. (0020)\r\n                     &lt;\/SuccessText&gt;\r\n             &lt;\/StatementRequestResult&gt;\r\n         &lt;\/StatementRequestResponse&gt;\r\n     &lt;\/soap:Body&gt;\r\n&lt;\/soap:Envelope&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: XML-Dokument mit den Umsatzdaten, hier nur f&uuml;r eine Umsatzposition<\/span><\/b><\/p>\n<p>Die Prozedur liest per <b>selectSingleNode <\/b>beispielsweise das Element <b>CustomerData\/BankCode <\/b>ein und speichert es in der Variablen <b>strBankCode<\/b>. Gleiches geschieht mit dem Element <b>CustomerData\/CustomerID<\/b>.<\/p>\n<p>Danach durchl&auml;uft die Prozedur in einer <b>For Each<\/b>-Schleife alle <b>BACStatementLine<\/b>-Elemente. F&uuml;r jedes Element legt sie im zuvor erstellten Recordset <b>rst <\/b>je einen neuen Datensatz an und tr&auml;gt die Inhalte der einzelnen Unterelemente des <b>BACStatementLine<\/b>-Elements ein.<\/p>\n<p>Der Einfachheit halber haben wir daher die Tabellenfelder nach den Elementnamen in der XML-Datei benannt.<\/p>\n<p>Hier gibt es ein paar Besonderheiten. So kommen die Datumsangaben in den XML-Elementen beispielsweise in einem Format, das etwa so aussieht:<\/p>\n<pre>2015-06-26T00:00:00<\/pre>\n<p>Dies k&ouml;nnen wir leider nicht direkt in einem Datumsfeld einer Access-Datenbank speichern, sondern m&uuml;ssen es zuvor noch einer speziellen Behandlung unterziehen.<\/p>\n<p>Daher haben wir noch eine kleine Funktion namens <b>Datum-AusXML <\/b>hinzugef&uuml;gt, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DatumAusXML(strDatum<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Date<\/span>\r\n     DatumAusXML = DateSerial(<span style=\"color:blue;\">Left<\/span>(strDatum, 4), _\r\n         <span style=\"color:blue;\">Mid<\/span>(strDatum, 6, 2), <span style=\"color:blue;\">Mid<\/span>(strDatum, 9, 2))\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Es parst schlicht und einfach die einzelnen Datumsinformationen und f&uuml;gt diese zu einem Access-kompatiblen Wert zusammen.<\/p>\n<p>Interessant ist noch die Fehlerabfrage gegen Ende der Prozedur: Bevor wir den neuen Datensatz dort n&auml;mlich mit der <b>Update<\/b>-Methode speichern, deaktiviert die Prozedur die eingebaute Fehlerbehandlung.<\/p>\n<p>Es kann n&auml;mlich geschehen, dass bereits vorhandene Ums&auml;tze nochmals eingelesen werden, was zu einem Fehler wegen eines doppelten Wertes im Feld <b>HashValue <\/b>f&uuml;hren w&uuml;rde, welches als eindeutiger Index festgelegt ist. Bereits vorhandene Ums&auml;tze werden in diesem Fall schlicht nicht nochmals angelegt.<\/p>\n<p>Das Ergebnis sehen Sie in der Datenblattansicht der Tabelle <b>tblUmsaetze <\/b>(s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_003.png\" alt=\"Beispiele f&uuml;r eingelesene Ums&auml;tze\" width=\"700\" height=\"141,4685\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Beispiele f&uuml;r eingelesene Ums&auml;tze<\/span><\/b><\/p>\n<p>Damit das Unterformular <b>sfmUmsaetze <\/b>im Hauptformular <b>frmKonten <\/b>auch wie in Bild 4 die zum aktuell angezeigten Konto liefert, m&uuml;ssen wir noch zwei kleine &auml;nderungen vornehmen. Als Erstes legen Sie zwei Textfelder im Hauptformular an, welche die f&uuml;r die Verkn&uuml;pfung herangezogenen Spalten aus den entsprechenden Spalten der beiden Kombinationsfelder ermitteln. Das erste Textfeld hei&szlig;t <b>txtBankCode <\/b>und verwendet den folgenden Ausdruck als Steuerelementinhalt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_004.png\" alt=\"Ein Beispielumsatz im Unterformular\" width=\"424,3491\" height=\"420,5603\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ein Beispielumsatz im Unterformular<\/span><\/b><\/p>\n<pre>=[cboKontakte].[Column](2)<\/pre>\n<p>Das zweite Textfeld namens <b>txtAccountnumber <\/b>wiederum greift seinen Wert aus dem Kombinationsfeld <b>cboKonten <\/b>ab:<\/p>\n<pre>=[cboKonten].[Volumn](2)<\/pre>\n<p>Die Eigenschaft <b>Sichtbar <\/b>der beiden Textfelder k&ouml;nnen Sie nach einem Text, ob beide die gew&uuml;nschten Werte anzeigen, auf den Wert <b>Nein <\/b>einstellen und die Textfelder somit ausblenden.<\/p>\n<p>Nun legen Sie noch die Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements fest. Dabei verkn&uuml;pfen wir Haupt- und Unterformular jeweils nach zwei Feldern, und zwar (s. Bild 5):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_005.png\" alt=\"Verkn&uuml;pfung zwischen Haupt- und Unterformular\" width=\"499,2343\" height=\"462,705\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Verkn&uuml;pfung zwischen Haupt- und Unterformular<\/span><\/b><\/p>\n<pre>Verkn&uuml;pfen von: Bankcode;Accountnumber\r\nVerkn&uuml;pfen nach: txtBankcode;txtAccountnumber<\/pre>\n<p>Erst danach k&ouml;nnen Sie mit den Kombinationsfeldern Kontakte und Konten ausw&auml;hlen und erhalten dann im Unterformular die bereits eingelesenen Ums&auml;tze. Schlie&szlig;lich ben&ouml;tigen wir dann noch eine Anweisung, die nach dem Aktualisieren des Kombinationsfeldes <b>cboKonten <\/b>ausgel&ouml;st wird und den zuletzt eingelesenen Umsatz aus der Tabelle <b>tblKonten <\/b>im Textfeld <b>txtKontostand <\/b>anzeigt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboKonten_AfterUpdate()\r\n     Me!txtKontostand = Nz(DLookup(\"LetzterKontostand\", _\r\n         \"tblKonten\", \"KontoID = \" & Nz(Me!cboKonten, 0)), 0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>&uuml;berweisungen per Webservice<\/h2>\n<p>Fehlt noch der letzte der Gesch&auml;ftsvorf&auml;lle, den der Webservice abdeckt &#8211; die Durchf&uuml;hrung einer &uuml;berweisung.<\/p>\n<p>Dazu erstellen wir ein neues Formular namens <b>frmUeberweisung<\/b>, das im Entwurf wie in Bild 6 aussieht und nicht an eine Datenherkunft gebunden ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_006.png\" alt=\"Entwurf des Formulars zum Durchf&uuml;hren von &uuml;berweisungen\" width=\"499,2343\" height=\"388,2005\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf des Formulars zum Durchf&uuml;hren von &uuml;berweisungen<\/span><\/b><\/p>\n<p>Die oberen beiden Kombinationsfelder sind genauso ausgestattet wie die gleichnamigen Kombinationsfelder im Formular <b>frmKonten<\/b>.<\/p>\n<p>Die Textfelder darunter sind einfache, ungebundene Textfelder namens <b>txtEmpfaenger<\/b>, <b>txtBIC<\/b>, <b>txtIBAN<\/b>, <b>txtBLZ<\/b>, <b>txtKontonummer<\/b>, <b>txtLaendercode<\/b>, <b>txtBetrag <\/b>und <b>txtVerwendungszweck<\/b>. Das untere Kombinationsfeld <b>cboSicherheitsverfahren <\/b>verwendet die Tabelle <b>tblSicherheitsverfahren <\/b>als Datensatzherkunft und zeigt davon das dritte Feld namens <b>SecurityFunction <\/b>an.<\/p>\n<p>Damit dieses Kombinationsfeld immer die f&uuml;r den aktuell im Kombinationsfeld <b>cboKontakte <\/b>ausgew&auml;hlten Kontakt verf&uuml;gbaren Sicherheitsverfahren zur Auswahl anbietet, haben wir die Prozedur <b>cboKontakte_AfterUpdate<\/b>, die sonst genau mit der entsprechenden Prozedur im Formular <b>frmKonten <\/b>&uuml;bereinstimmt, um zwei Zeilen erweitert (s. Listing 6). Die erste aktualisiert die Datensatzherkunft des Kombinationsfeldes so, dass dieses nur Sicherheitsverfahren zum gew&auml;hlten Kontakt anzeigt, die zweite w&auml;hlt den ersten Eintrag der Datensatzherkunft aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboKontakte_AfterUpdate()\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!cboKontakte)<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         ...\r\n         Me!cboSicherheitsverfahren.RowSource = \"SELECT * FROM tblSicherheitsverfahren WHERE KontaktID = \" _\r\n             & Me!cboKontakte\r\n         Me!cboSicherheitsverfahren = Me!cboSicherheitsverfahren.ItemData(0)\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 6: Anpassen der Sicherheitsverfahren nach Auswahl eines Kontaktes<\/span><\/b><\/p>\n<h2>Testdaten einfach hinzuf&uuml;gen<\/h2>\n<p>Sie k&ouml;nnen nach wie vor die Testkonten der <b>B+S Banksysteme AG <\/b>verwenden. Dazu legen Sie Kontakte f&uuml;r die folgenden Konten an:<\/p>\n<ul>\n<li>BLZ: 70000997<\/li>\n<li>Erstes Beispielkonto: 1000735160<\/li>\n<li>Zweites Beispielkonto: 1000735161<\/li>\n<li>Benutzerkennung 1: 735160<\/li>\n<li>Benutzerkennung 2: 735161<\/li>\n<\/ul>\n<p>Sie d&uuml;rfen diese Testkonten unter folgenden Bedingungen zu Testzwecken nutzen:<\/p>\n<ul>\n<li>Sie verwenden nur Verwendungszwecke, die eindeutig als Testf&auml;lle zu erkennen sind.<\/li>\n<li>Sie f&uuml;gen den Verwendungszwecken eine eindeutige Identifizierung hinzu, damit Sie Ihre eigenen &uuml;berweisungen von denen der anderen Leser unterscheiden k&ouml;nnen.<\/li>\n<li>Keine Werbung oder strafbaren Inhalte im Verwendungszweck!<\/li>\n<\/ul>\n<p>Als PIN verwenden Sie hier immer die <b>12345<\/b>, als TAN den Wert <b>123456<\/b>.<\/p>\n<p>Die Beispieldatenbank enth&auml;lt ja in den Tabellen <b>tblKontakte <\/b>und <b>tblKonten <\/b>bereits die Testkonten mit diesen Daten.<\/p>\n<p>Damit Sie nun ganz einfach Test&uuml;berweisungen durchf&uuml;hren k&ouml;nnen, habe ich dem Formular eine Schaltfl&auml;che hinzugef&uuml;gt, welche die Textfelder mit Testdaten f&uuml;llt. Diese Prozedur sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdTestdaten_Click()\r\n     Me!txtKontonummer = \"1000735161\"\r\n     Me!txtBLZ = \"70000997\"\r\n     Me!txtLaendercode = \"280\"\r\n     Me!txtEmpfaenger = \"Testkonto\"\r\n     Me!txtBetrag = \"1,00\"\r\n     Me!txtVerwendungszweck = \"Test&uuml;berweisung\"\r\n     Me!txtIBAN = \"DE43700009971000735160\"\r\n     Me!txtBIC = \"DDBADEMM002\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nach dem Bet&auml;tigen dieser Schaltfl&auml;che sieht das Formular wie in Bild 7 aus und ist bereit, die &uuml;berweisung durch einen Klick auf die Schaltfl&auml;che <b>cmdUeberweisungen <\/b>auszuf&uuml;hren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_994_007.png\" alt=\"Formular nach der Eingabe von Testdaten\" width=\"499,2343\" height=\"388,2005\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Formular nach der Eingabe von Testdaten<\/span><\/b><\/p>\n<h2>&uuml;berweisung starten<\/h2>\n<p>Dies l&ouml;st die Prozedur aus Listing 7 aus. Die Prozedur ermittelt wieder den Wert des Feldes <b>ContactData <\/b>aus der Tabelle <b>tblKontakte<\/b>, da dieser wegen seiner L&auml;nge nicht direkt im Kombinationsfeld hinterlegt werden kann. Die AccountID hingegen liegt in der sechsten Spalte des Kombinationsfeldes und landet &uuml;ber eine entsprechende Abfrage des Ausdrucks <b>Me!cboKontakte.Column(5) <\/b>in der Variablen <b>strAccountId<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdUeberweisen_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>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>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     strContactData = DLookup(\"ContactData\", \"tblKontakte\", \"KontaktID = \" _\r\n         & Me!cboKontakte) ''wegen L&auml;ngenbeschr&auml;nkung auf 255 Zeichen\r\n     strAccountId = Me!cboKonten.Column(5)\r\n     strXML = MoneyTransferRequest(strContactData, strAccountId, Nz(Me!txtEmpfaenger, \"\"), Nz(Me!txtIBAN, \"\"), _\r\n         Nz(Me!txtBIC, \"\"), Nz(Me!txtKontonummer, \"\"), Nz(Me!txtLaendercode, \"280\"), Nz(Me!txtBLZ, \"\"), Me!txtBetrag, _\r\n         Me!txtVerwendungszweck, Me!cboSicherheitsverfahren, strErrorType, strErrorText, strErrorCustomerText)\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         <span style=\"color:blue;\">MsgBox<\/span> GetXMLElement(strXML, \"\/\/SuccessText\")\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 Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Ansto&szlig;en der &uuml;berweisung per Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Damit hat die Prozedur alle Informationen zusammen, um die Funktion <b>MoneyTransferRequest <\/b>aufzurufen. Diese erwartet neben den beiden ermittelten Werten noch die Inhalte der Steuerelemente des Formulars <b>frmUeberweisung<\/b> als Parameter.<\/p>\n<p>Das Ergebnis der Funktion landet dann in der Variablen <b>strXML<\/b>, aus dem die Prozedur den Wert des Elements <b>SuccessText <\/b>ausliest.<\/p>\n<h2>Die Funktion MoneyTransferRequest<\/h2>\n<p>Die Funktion <b>MoneyTransferRequest <\/b>erwartet die f&uuml;r die &uuml;berweisung ben&ouml;tigten Informationen als Parameter, einige zur Sicherheit sogar in redundanter Form: So k&ouml;nnen Sie dieser nicht nur Bankleitzahl und Kontonummer, sondern alternativ auch BIC und IBAN &uuml;bergeben.<\/p>\n<p>Die Funktion fragt zun&auml;chst wieder den PIN ab und beginnt, die Anfrage in <b>strRequest <\/b>zusammenzustellen. Dabei pr&uuml;ft die Funktion bei einigen Daten wie der Bankleitzahl, der Kontonummer, der IBAN, der BIC und dem L&auml;ndercode des Empf&auml;ngers, ob die entsprechenden Parameter &uuml;berhaupt gef&uuml;llt sind, und legt nur dann die passenden Elemente unter dem Element <b>RecAccount <\/b>(Empf&auml;ngerkonto) im XML-Dokument an (s. Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>MoneyTransferRequest(strContactData<span style=\"color:blue;\"> As String<\/span>, strAccountId<span style=\"color:blue;\"> As String<\/span>, strEmpfaenger<span style=\"color:blue;\"> As String<\/span>, _\r\n         strIBANEmpfaenger<span style=\"color:blue;\"> As String<\/span>, strBICEmpfaenger<span style=\"color:blue;\"> As String<\/span>, strAccountNumberEmpfaenger<span style=\"color:blue;\"> As String<\/span>, _\r\n         strCountryCodeEmpfaenger<span style=\"color:blue;\"> As String<\/span>, strBankCodeEmpfaenger<span style=\"color:blue;\"> As String<\/span>, curAmount<span style=\"color:blue;\"> As Currency<\/span>, strPurpose<span style=\"color:blue;\"> As <\/span>_\r\n         String, lngSicherheitsverfahrenID<span style=\"color:blue;\"> As Long<\/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>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     <span style=\"color:blue;\">Dim <\/span>strTan<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSession<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSicherheitsverfahren<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strChallenge<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"MoneyTransferRequest\"\r\n     strPIN = InputBox(\"PIN:\")\r\n     strRequest = \"                &lt;ser:MoneyTransferRequestData&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     strRequest = strRequest & \"                        &lt;ser:RecAccount&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                            &lt;ser:Name&gt;\" & strEmpfaenger & \"&lt;\/ser:Name&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strIBANEmpfaenger) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"                            &lt;ser:Iban&gt;\" & strIBANEmpfaenger & \"&lt;\/ser:Iban&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBICEmpfaenger) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"                            &lt;ser:Bic&gt;\" & strBICEmpfaenger & \"&lt;\/ser:Bic&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strAccountNumberEmpfaenger) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"                            &lt;ser:AccountNumber&gt;\" & strAccountNumberEmpfaenger _\r\n             & \"&lt;\/ser:AccountNumber&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strCountryCodeEmpfaenger) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"                            &lt;ser:CountryCode&gt;\" & strCountryCodeEmpfaenger _\r\n             & \"&lt;\/ser:CountryCode&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBankCodeEmpfaenger) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"                            &lt;ser:BankCode&gt;\" & strBankCodeEmpfaenger _\r\n             & \"&lt;\/ser:BankCode&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Durchf&uuml;hren einer &uuml;berweisung, Teil I<\/span><\/b><\/p>\n<p>Die &uuml;brigen Elemente wie die PIN, der Betrag oder der Verwendungszweck werden wie in Listing 9 hinzugef&uuml;gt. Dort fehlt dann nur noch das Sicherheitsverfahren. Dazu liest die Funktion den Wert des Feldes <b>SecurityID <\/b>zu dem mit <b>strSicherheitsverfahren <\/b>&uuml;bergebenen Sicherheitsverfahren aus der Tabelle <b>tblSicherheitsverfahren <\/b>aus und weist diesen dem Element <b>SecurityId <\/b>zu.<\/p>\n<pre>     strRequest = strRequest & \"                        &lt;\/ser:RecAccount&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                        &lt;ser:SendAccountId&gt;\" & strAccountId & \"&lt;\/ser:SendAccountId&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                        &lt;ser:Amount&gt;\" & curAmount & \"&lt;\/ser:Amount&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                        &lt;ser:Purpose&gt;\" & strPurpose & \"&lt;\/ser:Purpose&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                    &lt;\/ser:MoneyTransferRequestData&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"                    &lt;ser:Pin&gt;\" & strPIN & \"&lt;\/ser:Pin&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSicherheitsverfahren = Nz(DLookup(\"SecurityID\", \"tblSicherheitsverfahren\", \"SecurityFunctionID = \" _\r\n         & lngSicherheitsverfahrenID))\r\n     strRequest = strRequest & \"                    &lt;ser:SecurityId&gt;\" & strSicherheitsverfahren & \"&lt;\/ser:SecurityId&gt;\" _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = CreateSoapRequest(strRequest, strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.XML\r\n     strErrorText = GetXMLElement(strResponse, \"\/\/\" & strFunction & \"Result\/Error\/ErrorText\")\r\n     strErrorType = GetXMLElement(strResponse, \"\/\/\" & strFunction & \"Result\/Error\/ErrorType\")\r\n     strErrorCustomerText = GetXMLElement(strResponse, \"\/\/\" & strFunction & \"Result\/Error\/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         strSession = GetXMLElement(strResponse, \"\/\/MoneyTransferRequestResult\/Session\")\r\n         strChallenge = GetXMLElement(strResponse, \"\/\/Challenge\")\r\n         strChallenge = <span style=\"color:blue;\">Replace<\/span>(strChallenge, \"&lt;br&gt;\", <span style=\"color:blue;\">vbCrLf<\/span>)\r\n         strTan = InputBox(\"TAN:\" & <span style=\"color:blue;\">vbCrLf<\/span> & strChallenge)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strTan) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFunction = \"MoneyTransferComplete\"\r\n             strRequest = \"            &lt;ser:Session&gt;\" & strSession & \"&lt;\/ser:Session&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             strRequest = strRequest & \"            &lt;ser:Tan&gt;\" & strTan & \"&lt;\/ser:Tan&gt;\"\r\n             strRequest = CreateSoapRequest(strRequest, strFunction)\r\n             Request strRequest, objXMLResponse\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strErrorType = \"CUSTOM\"\r\n             strErrorText = \"Vorgang bei Tan-Eingabe abgebrochen\"\r\n             strErrorCustomerText = \"Der Benutzer hat die Tan-Eingabe abgebrochen.\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     MoneyTransferRequest = FormatXML(objXMLResponse.XML)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Durchf&uuml;hren einer &uuml;berweisung, Teil II<\/span><\/b><\/p>\n<p>Das Ergebnis sieht dann in gek&uuml;rzter Form etwa wie folgt aus:<\/p>\n<pre>...\r\n&lt;ser:MoneyTransferRequestData&gt;\r\n     &lt;ser:ContactData&gt;GgxGb1115...&lt;\/ser:ContactData&gt;\r\n     &lt;ser:RecAccount&gt;\r\n         &lt;ser:Name&gt;Testkonto&lt;\/ser:Name&gt;\r\n         &lt;ser:Iban&gt;DE43700009971000735160&lt;\/ser:Iban&gt;\r\n         &lt;ser:Bic&gt;DDBADEMM002&lt;\/ser:Bic&gt;\r\n         &lt;ser:AccountNumber&gt;1000735161&lt;\/ser:AccountNumber&gt;\r\n         &lt;ser:CountryCode&gt;280&lt;\/ser:CountryCode&gt;\r\n         &lt;ser:BankCode&gt;70000997&lt;\/ser:BankCode&gt;\r\n     &lt;\/ser:RecAccount&gt;\r\n     &lt;ser:SendAccountId&gt;5E3A4E...&lt;\/ser:SendAccountId&gt;\r\n     &lt;ser:Amount&gt;1&lt;\/ser:Amount&gt;\r\n     &lt;ser:Purpose&gt;Test&uuml;berweisung&lt;\/ser:Purpose&gt;\r\n&lt;\/ser:MoneyTransferRequestData&gt;\r\n&lt;ser:Pin&gt;12345&lt;\/ser:Pin&gt;\r\n&lt;ser:SecurityId&gt;900\/&lt;\/ser:SecurityId&gt;\r\n...<\/pre>\n<p>Die Funktion <b>CreateSoapRequest<\/b> erg&auml;nzt nun die Anfrage um die SOAP-Elemente, die Routine <b>Request <\/b>schickt die Anfrage an den Webservice und nimmt mit dem Parameter <b>objXMLResponse <\/b>die Antwort entgegen und speichert sie dann in der Variablen <b>strResponse<\/b>.<\/p>\n<p>Daraus entnimmt die Funktion mit <b>GetXMLElement <\/b>den Wert der Elemente <b>Result\/Error\/ErrorText <\/b>und <b>Result\/Error\/ErrorType <\/b>und <b>Result\/Error\/ErrorCustomerText<\/b>.<\/p>\n<p>Sollte einer dieser Werte eine L&auml;nge gr&ouml;&szlig;er als <b>0 <\/b>aufweisen, scheint ein Fehler vorzuliegen und der Vorgang wird abgebrochen. Im Optimalfall sind die drei Elemente jedoch leer und wir k&ouml;nnen mit der &uuml;berweisung fortfahren. Das <b>Response<\/b>-Dokument sieht dann in gek&uuml;rzter Form wie folgt aus:<\/p>\n<pre>&lt;MoneyTransferRequestResponse ...&gt;\r\n     &lt;MoneyTransferRequestResult&gt;\r\n         &lt;Session&gt;9031ed11-cb...&lt;\/Session&gt;\r\n         &lt;Challenge&gt;123456&lt;\/Challenge&gt;\r\n         &lt;OrderReference&gt;000000P...&lt;\/OrderReference&gt;\r\n         &lt;Label&gt;Challenge&lt;\/Label&gt;\r\n         &lt;MinLength&gt;6&lt;\/MinLength&gt;\r\n         &lt;MaxLength&gt;6&lt;\/MaxLength&gt;\r\n     &lt;\/MoneyTransferRequestResult&gt;\r\n&lt;\/MoneyTransferRequestResponse&gt;<\/pre>\n<p>Genau den dort &uuml;bermittelten Wert f&uuml;r das Element <b>Session  <\/b>ben&ouml;tigen wir, um die &uuml;berweisung durch die &uuml;bermittlung der TAN abzuschlie&szlig;en. Die Funktion setzt dann aus der Antwort der ersten Anfrage eine zweite Anfrage zusammen, die dann beispielsweise auch die zuvor per <b>InputBox <\/b>ermittelte TAN aufnimmt, die ja f&uuml;r die Durchf&uuml;hrung von &uuml;berweisungen und &auml;hnlichen Auftr&auml;gen erforderlich ist.<\/p>\n<p>Diese Anfrage enth&auml;lt dann die folgenden Elemente:<\/p>\n<pre>...\r\n&lt;ser:MoneyTransferComplete&gt;\r\n     &lt;ser:Session&gt;9031ed11-cb74-43be-...&lt;\/ser:Session&gt;\r\n     &lt;ser:Tan&gt;123456&lt;\/ser:Tan&gt;\r\n&lt;\/ser:MoneyTransferComplete&gt;\r\n...<\/pre>\n<p>Auch dieser Request wird mit der Routine <b>Request <\/b>abgesetzt. Das Ergebnis landet im XML-Format im R&uuml;ckgabewert der Funktion <b>MoneyTransferRequest <\/b>und kann dort auf Fehler gepr&uuml;ft und schlie&szlig;lich per <b>MsgBox<\/b>-Anweisung verk&uuml;ndet werden.<\/p>\n<h2>Optimierung<\/h2>\n<p>Da sich viele immer noch nicht die IBAN und BIC merken k&ouml;nnen, sondern maximal die Bankleitzahl und die Kontonummer, f&uuml;gen wir der Prozedur <b>MoneyTransferRequest <\/b>noch eine kleine Verfeinerung hinzu.<\/p>\n<p>Dabei werfen wir die <b>If&#8230;Then<\/b>-Bedingungen raus, welche das Vorhandensein von BLZ, Kontonummer, BIC und IBAN sowie den L&auml;ndercode pr&uuml;fen, und ersetzen diese durch die folgende Anweisung:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strIBANEmpfaenger) = 0<span style=\"color:blue;\"> Then<\/span>\r\n     RetrieveIbanAndBic strBankCodeEmpfaenger, _\r\n         strAccountNumberEmpfaenger, strBICEmpfaenger, _\r\n         strIBANEmpfaenger, strErrorCode, strErrortext\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Diese pr&uuml;ft einfach, ob die IBAN vorhanden ist, und setzt gegebenenfalls IBAN und BIC aus BLZ und Kontonummer zusammen.<\/p>\n<p>Das Ergebnis tr&auml;gt die Funktion dann wie folgt in die XML-Anfrage ein:<\/p>\n<pre>strRequest = strRequest & \"&lt;ser:Iban&gt;\" _\r\n     & strIBANEmpfaenger & \"&lt;\/ser:Iban&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrRequest = strRequest & \"&lt;ser:Bic&gt;\" & strBICEmpfaenger _\r\n     & \"&lt;\/ser:Bic&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>F&uuml;r den Praxiseinsatz m&uuml;sste man hier zwar noch die eine oder andere Abfrage des Vorhandenseins von Parametern einf&uuml;gen, aber f&uuml;r Demonstrationszwecke reicht es.<\/p>\n<p>Der Request sieht dann schlicht wie folgt aus:<\/p>\n<pre>&lt;ser:MoneyTransferRequest&gt;\r\n     &lt;ser:MoneyTransferRequestData&gt;\r\n         &lt;ser:ContactData&gt;GgxGb1115...&lt;\/ser:ContactData&gt;\r\n         &lt;ser:RecAccount&gt;\r\n             &lt;ser:Name&gt;Testkonto&lt;\/ser:Name&gt;\r\n             &lt;ser:Iban&gt;DE16700009971000735161&lt;\/ser:Iban&gt;\r\n             &lt;ser:Bic&gt;DDBADEMM002&lt;\/ser:Bic&gt;\r\n         &lt;\/ser:RecAccount&gt;\r\n         ....\r\n     &lt;\/ser:MoneyTransferRequestData&gt;<\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Diese Beitragsreihe hat in drei Teilen zun&auml;chst den Umgang mit den allgemeinen Funktionen etwa zum Migrieren von BLZ\/Kontonummer in BIC und IBAN erl&auml;utert. Der zweite Teil f&uuml;gte dann die Techniken hinzu, die notwendig sind, um Daten zu einem Konto abzufragen &#8211; beispielsweise den Kontostand.<\/p>\n<p>Dies erg&auml;nzt der vorliegende Beitrag um die M&ouml;glichkeit, auch noch die Ums&auml;tze einzulesen und weiterhin &uuml;berweisungen auszuf&uuml;hren.<\/p>\n<p>Zum Ausprobieren der Funktionen ohne die Gefahr, die eigenen Konten mit zig Test&uuml;berweisungen zu verunstalten, k&ouml;nnen Sie die Testkonten der Firma <b>B+S Banksysteme <\/b>AG verwenden, deren Zugangsdaten wir weiter oben beschrieben haben.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OnlinebankingPerWebservice.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{3695053B-B2BC-4F8F-8B8A-C50109A1D682}\/aiu_994.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die ersten beiden Teile dieser Beitragsreihe haben uns die Funktionen f&uuml;r das Einlesen von Informationen und das Konvertieren von Kontonummern in IBAN sowie das Ermitteln des Kontostandes angesehen. Im abschlie&szlig;enden, letzten Teil wird es spannend: Wir f&uuml;gen ein Funktionen hinzu, mit der Sie die Kontoums&auml;tze abrufen und &Uuml;berweisungen t&auml;tigen k&ouml;nnen. Damit ist auch der aktuelle Leistungsumfang des hier abgebildeten Webservice der Firma B+S Banksysteme AG beschrieben. Die Nutzung ist weiterhin f&uuml;r private Zwecke kostenlos!<\/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,66042015,44000027],"tags":[],"class_list":["post-55000994","post","type-post","status-publish","format-standard","hentry","category-662015","category-66042015","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Onlinebanking per Webservice III - 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_III\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Onlinebanking per Webservice III\" \/>\n<meta property=\"og:description\" content=\"Die ersten beiden Teile dieser Beitragsreihe haben uns die Funktionen f&uuml;r das Einlesen von Informationen und das Konvertieren von Kontonummern in IBAN sowie das Ermitteln des Kontostandes angesehen. Im abschlie&szlig;enden, letzten Teil wird es spannend: Wir f&uuml;gen ein Funktionen hinzu, mit der Sie die Kontoums&auml;tze abrufen und &Uuml;berweisungen t&auml;tigen k&ouml;nnen. Damit ist auch der aktuelle Leistungsumfang des hier abgebildeten Webservice der Firma B+S Banksysteme AG beschrieben. Die Nutzung ist weiterhin f&uuml;r private Zwecke kostenlos!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:21:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42\" \/>\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=\"23\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_III\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Onlinebanking per Webservice III\",\"datePublished\":\"2020-05-22T19:21:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/\"},\"wordCount\":2812,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/75057b485c53435e977ce71047c2cc42\",\"articleSection\":[\"2015\",\"4\\\/2015\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/\",\"name\":\"Onlinebanking per Webservice III - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/75057b485c53435e977ce71047c2cc42\",\"datePublished\":\"2020-05-22T19:21:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/75057b485c53435e977ce71047c2cc42\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/75057b485c53435e977ce71047c2cc42\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice_III\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Onlinebanking per Webservice III\"}]},{\"@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 III - 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_III\/","og_locale":"de_DE","og_type":"article","og_title":"Onlinebanking per Webservice III","og_description":"Die ersten beiden Teile dieser Beitragsreihe haben uns die Funktionen f&uuml;r das Einlesen von Informationen und das Konvertieren von Kontonummern in IBAN sowie das Ermitteln des Kontostandes angesehen. Im abschlie&szlig;enden, letzten Teil wird es spannend: Wir f&uuml;gen ein Funktionen hinzu, mit der Sie die Kontoums&auml;tze abrufen und &Uuml;berweisungen t&auml;tigen k&ouml;nnen. Damit ist auch der aktuelle Leistungsumfang des hier abgebildeten Webservice der Firma B+S Banksysteme AG beschrieben. Die Nutzung ist weiterhin f&uuml;r private Zwecke kostenlos!","og_url":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:21:59+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Onlinebanking per Webservice III","datePublished":"2020-05-22T19:21:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/"},"wordCount":2812,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42","articleSection":["2015","4\/2015","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/","url":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/","name":"Onlinebanking per Webservice III - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42","datePublished":"2020-05-22T19:21:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/75057b485c53435e977ce71047c2cc42"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice_III\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Onlinebanking per Webservice III"}]},{"@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\/55000994","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=55000994"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000994\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}