{"id":55000971,"date":"2015-02-01T00:00:00","date_gmt":"2020-05-22T21:07:03","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=971"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Onlinebanking_per_Webservice","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/","title":{"rendered":"Onlinebanking per Webservice"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die Firma B+S Banksysteme AG bietet einen Webservice f&uuml;r das Onlinebanking an. Damit k&ouml;nnen Sie einfache Aktionen durchf&uuml;hren &euro;&#8220; zum Beispiel den Kontostand ermitteln, Ums&auml;tze einlesen oder &uuml;berweisungen t&auml;tigen. Bislang ist der Gebrauch f&uuml;r Privatpersonen kostenlos, und f&uuml;r die gesch&auml;ftliche Nutzung gibt es g&uuml;nstige Jahreslizenzen. Eine Einschr&auml;nkung ist, dass dieser Webservice aktuell nur mit Konten funktioniert, die PIN\/TAN per HBCI anbieten. Dies ist leider nicht bei allen Kreditinsituten der Fall.<\/b><\/p>\n<p>Onlinebanking ist ein interessanter Anwendungsfall f&uuml;r Access-Datenbanken. Egal, ob Sie eine Anwendung f&uuml;r Kunden damit ausstatten &euro;&#8220; etwa eine Vereinsverwaltung &euro;&#8220; oder selbst eine selbst entwickelte Software nutzen m&ouml;chten, um ihre eigenen Konten im &uuml;berblick zu behalten und gegebenenfalls auch einmal eine &uuml;berweisung zu t&auml;tigen.<\/p>\n<p>In Access im Unternehmen haben wir bereits die DDBAC-Komponente vorgestellt, die ebenfalls vom Hersteller <b>B+S Banksysteme AG <\/b>stammt (zum Beispiel in <b>Onlinebanking mit SEPA<\/b>, <b>http:\/\/www.access-im-unternehmen.de\/898<\/b>).<\/p>\n<p>W&auml;hrend Sie diese Komponente vor der Nutzung installieren mussten, f&auml;llt dieser Aufwand bei Verwendung eines Webservice nat&uuml;rlich nicht an: Access liefert, erg&auml;nzt um einige externe Bibliotheken, die aber auf jedem Rechner installiert sind, alle notwendigen Werkzeuge f&uuml;r den Zugriff auf Webservices.<\/p>\n<p>Daf&uuml;r muss man nat&uuml;rlich das Vertrauen mitbringen, dass die Daten vor der &uuml;bermittlung an die Bank &uuml;ber den Webservice des Anbieters laufen und auf dem R&uuml;ckweg ebenso (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_001.png\" alt=\"Verlauf einer Anfrage beim Onlinebanking per Webservice\" width=\"575\" height=\"216,9676\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verlauf einer Anfrage beim Onlinebanking per Webservice<\/span><\/b><\/p>\n<p>Allerdings wei&szlig; man als Otto Normalverbraucher bei den g&auml;ngigen Softwarepaketen, die Onlinebanking-Funktionen bereitstellen, auch nicht, &uuml;ber welche Wege die Daten zur Bank und zur&uuml;ck gelangen.<\/p>\n<p>Schlussendlich entscheiden Sie aber selbst, ob Sie einen solchen Webservice nutzen m&ouml;chten oder nicht.<\/p>\n<p>Wir zeigen Ihnen in diesem Beitrag jedenfalls, wie dies gelingt. Sollten Sie dem Braten vorerst nicht trauen oder einfach ein wenig mit dem Webservice experimentieren wollen, k&ouml;nnen Sie auch eines der f&uuml;r diesen Zweck vorgesehenen Testkonten nutzen &euro;&#8220; mehr dazu siehe weiter hinten.<\/p>\n<p><b>Was kann die Bank<\/b><\/p>\n<p>Als Erstes wollen wir &uuml;berhaupt einen Kontakt zur Bank herstellen und herausfinden, welche M&ouml;glichkeiten die Bank &uuml;berhaupt &uuml;ber den Webservice anbietet.<\/p>\n<p>Wie bereits erw&auml;hnt, k&ouml;nnen Sie &uuml;ber den Webservice nur Daten mit Banken austauschen, die PIN\/TAN als Authentifizierungsmethode anbieten &euro;&#8220; und wir wollen nun zun&auml;chst herausfinden, ob die gew&uuml;nschte Bank dieses Feature anbietet.<\/p>\n<p>Grunds&auml;tzlich m&uuml;ssen wir dazu eine geeignete SOAP-Anfrage im XML-Format an den Webservice schicken. Dieser verarbeitet die Anfrage dann und liefert die Antwort ebenfalls im XML-Format zur&uuml;ck.<\/p>\n<p>Eine solche Abfrage kann beispielsweise wie in Listing 1 aussehen. Diese Abfrage enth&auml;lt beispielsweise die Information, dass wir die Funktion <b>GetBankInfo <\/b>ausf&uuml;hren wollen, welche als einzigen Parameter die Bankleitzahl erwartet. Diese platzieren wir in einem weiteren Element namens <b>sBankCode<\/b>.<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"&gt;\r\n&lt;SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http:\/\/www.w3.org\/2003\/05\/soap-envelope\" ...&gt;\r\n   &lt;SOAP-ENV:Body&gt;\r\n     &lt;s0:GetBankInfo xmlns:s0=\"http:\/\/service.ddbac.de\/\"&gt;\r\n       &lt;s0:sBankCode&gt;70000997&lt;\/s0:sBankCode&gt;\r\n     &lt;\/s0:GetBankInfo&gt;\r\n   &lt;\/SOAP-ENV:Body&gt;\r\n&lt;\/SOAP-ENV:Envelope&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Abfrage an den Webservice, um die Funktionen f&uuml;r eine bestimmte Bank zu ermitteln<\/span><\/b><\/p>\n<p>Wenn wir diese Anfrage an den Server schicken, erhalten wir eine Antwort, die etwa wie in Listing 2 erscheint. Auf den ersten Blick sieht das alles etwas verwirrend aus. Wenn man wei&szlig;, was man sucht, erleichtert dies die Sache jedoch erheblich. Um herauszufinden, ob die Bank Pin\/Tan anbietet, muss hier beispielsweise ein Element namens PinTanConnection vorliegen &euro;&#8220; genau das ist hier der Fall.<\/p>\n<pre>&lt;GetBankInfoResponse xmlns=\"http:\/\/service.ddbac.de\/\"&gt;\r\n     &lt;GetBankInfoResult&gt;\r\n         &lt;FinTSConnection&gt;\r\n             ...\r\n         &lt;\/FinTSConnection&gt;\r\n         &lt;PinTanConnection&gt;\r\n             &lt;CommAddress&gt;https:\/\/fints.datadesign.de\/j2hbci-gateway\/j2hbci\r\n                                                                     &lt;\/CommAddress&gt;\r\n             &lt;AdressSuffix&gt;64&lt;\/AdressSuffix&gt;\r\n             &lt;FinTSVersion&gt;300&lt;\/FinTSVersion&gt;\r\n             &lt;UserIDName&gt;Benutzerkennung&lt;\/UserIDName&gt;\r\n             &lt;CustomerIDName&gt;Kunden ID&lt;\/CustomerIDName&gt;\r\n             &lt;Parameters&gt;\r\n                 &lt;ContactParameter&gt;\r\n                     &lt;ID&gt;CountryCode&lt;\/ID&gt;\r\n                     &lt;DefaultValue&gt;280&lt;\/DefaultValue&gt;\r\n                     &lt;IsVisible&gt;true&lt;\/IsVisible&gt;\r\n                     &lt;IsMandatory&gt;true&lt;\/IsMandatory&gt;\r\n                     &lt;Label&gt;L&auml;nderkennzeichen&lt;\/Label&gt;\r\n                     &lt;MinLength&gt;3&lt;\/MinLength&gt;\r\n                     &lt;MaxLength&gt;3&lt;\/MaxLength&gt;\r\n                     &lt;Pattern&gt;\\d{3}&lt;\/Pattern&gt;\r\n                 &lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;SecurityMediaDetailID&lt;\/ID&gt;...&lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;HBCIVersion&lt;\/ID&gt;...&lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;CommunicationsAddress&lt;\/ID&gt;...&lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;CommunicationsAddressSuffix&lt;\/ID&gt;...\r\n                                                                 &lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;BankCode&lt;\/ID&gt;...&lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;UserID&lt;\/ID&gt;...&lt;\/ContactParameter&gt;\r\n                 &lt;ContactParameter&gt;&lt;ID&gt;CustomerID&lt;\/ID&gt;...&lt;\/ContactParameter&gt;\r\n             &lt;\/Parameters&gt;\r\n         &lt;\/PinTanConnection&gt;\r\n         &lt;BankCode&gt;70000997&lt;\/BankCode&gt;\r\n         &lt;BIC&gt;DDBADEMM002&lt;\/BIC&gt;\r\n         &lt;Bankname&gt;B+S Banksysteme Demobank FinTS3&lt;\/Bankname&gt;\r\n         &lt;DefaultUserIDName&gt;Benutzerkennung&lt;\/DefaultUserIDName&gt;\r\n         &lt;DefaultCustomerIDName&gt;Kunden ID&lt;\/DefaultCustomerIDName&gt;\r\n         &lt;Xml&gt;...&lt;\/Xml&gt;\r\n         &lt;TestSystem&gt;true&lt;\/TestSystem&gt;\r\n     &lt;\/GetBankInfoResult&gt;\r\n&lt;\/GetBankInfoResponse&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: R&uuml;ckmeldungen mit den Bankinformationen<\/span><\/b><\/p>\n<p>Wenn Sie die obige Anfrage etwa f&uuml;r die Bankleitzahl <b>35040038 <\/b>gestellt h&auml;tten (Commerzbank), h&auml;tte die Antwort kein Element namens <b>PinTanConnection <\/b>enthalten.<\/p>\n<p>Innerhalb dieses Elements finden Sie einige Informationen, welche Daten Sie f&uuml;r die Authentifizierung ben&ouml;tigen. Darunter finden Sie die Bankleitzahl, die BIC, den Namen der Bank, die Bezeichnung f&uuml;r die Felder <b>UserID <\/b>und <b>CustomerID <\/b>sowie einige weitere Informationen.<\/p>\n<p><b>Aufbau der Webservice-Anfragen <\/b><\/p>\n<p>Wie bei jedem anderen Webservice gibt es auch f&uuml;r den Onlinebanking-Webservice eine Beschreibung in Form einer WDSL-Datei. Diese finden Sie unter dem folgenden Link:<\/p>\n<pre>https:\/\/service.ddbac.de\/demo\/ServiceNG.asmxWSDL<\/pre>\n<p>Diese Seite zeigt den Aufbau der verschiedenen Request- und Response-Elemente des Webservice an (s. Bild 2). Mit ein wenig Erfahrung lassen sich hiermit die gew&uuml;nschten Requests zusammenstellen (die Antworten liefert ohnehin der Webservice). Es gibt jedoch auch eine einfachere M&ouml;glichkeit &euro;&#8220; n&auml;mlich eine Software, die aus dieser Datei alle Requests ausliest und in einer Form aufbereitet, in der Sie sogar die ben&ouml;tigten Parameter einf&uuml;gen und die Requests gegen den Webservice testen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_002.png\" alt=\"Beschreibung der Requests und Responses des Webservice\" width=\"650\" height=\"630,8825\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Beschreibung der Requests und Responses des Webservice<\/span><\/b><\/p>\n<p><b>Webservice-Anfragen testen<\/b><\/p>\n<p>Bevor wir den Zugriff auf die Webservices per VBA programmieren, schauen wir uns eine solche Plattform an, mit der Sie die einzelnen Anfragen testen und die Antworten einsehen k&ouml;nnen.<\/p>\n<p>Dies ist insbesondere inte-ressant, wenn beim Absenden der SOAP-Anfrage per VBA Fehler auftreten, die Sie sich nicht erkl&auml;ren k&ouml;nnen. In diesem Fall macht es Sinn, den Request separat &uuml;ber eine externe Plattform zu testen, um zu pr&uuml;fen, ob es an dem Request selbst liegt.<\/p>\n<p>Die Testplattform nennt sich <b>SoapUI <\/b>und ist kostenlos verf&uuml;gbar. Sie k&ouml;nnen dieses Tool unter <b>soapui.org <\/b>herunterladen. Nachdem Sie es gestartet haben, k&ouml;nnen Sie mit dem Men&uuml;befehl <b>File|New Soap Project <\/b>ein neues Projekt erstellen. Dazu erscheint ein kleiner Dialog, dem Sie die ben&ouml;tigten Daten f&uuml;r den Zugriff auf den Webservice mitteilen k&ouml;nnen (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_003.png\" alt=\"Eingabe der Daten des Webservices in die Testoberfl&auml;che\" width=\"650\" height=\"391,4962\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eingabe der Daten des Webservices in die Testoberfl&auml;che<\/span><\/b><\/p>\n<p>Tragen Sie f&uuml;r das Feld <b>Project Name <\/b>den Wert <b>AiUOnlinebanking<\/b> ein, f&uuml;r <b>InitialWDSL <\/b>die Adresse der WDSL-Datei:<\/p>\n<pre>https:\/\/service.ddbac.de\/demo\/ServiceNG.asmxWSDL<\/pre>\n<p>Setzen Sie den Haken f&uuml;r die Option <b>Create Requests<\/b>, die &uuml;brigen Optionen k&ouml;nnen Sie deaktivieren.<\/p>\n<p>Nach dem Klick auf die Schaltfl&auml;che <b>OK<\/b> ackert das Tool einige Augenblicke und pr&auml;sentiert dann links in der &uuml;bersicht alle Funktionen des Webservices (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_004.png\" alt=\"Auflistung der Funktionen des Webservices\" width=\"650\" height=\"485,422\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Auflistung der Funktionen des Webservices<\/span><\/b><\/p>\n<p>Wir wollen uns zun&auml;chst die einfache Funktion <b>GetBankInfo <\/b>ansehen. Also klicken Sie mit der rechten Maustaste auf diese Funktion und w&auml;hlen dort den Eintrag <b>New Request <\/b>aus. Geben Sie als Name die Bezeichnung der Funktion ein, also <b>GetBankInfo<\/b>.<\/p>\n<p><b>SoapUI<\/b> erstellt nun ein neues Fenster, das den kompletten Request enth&auml;lt &euro;&#8220; mit Ausnahme des einzigen Parameters <b>sBankCode<\/b> (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_005.png\" alt=\"Der Webservice-Request GetBankInfo\" width=\"650\" height=\"429,7222\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Der Webservice-Request GetBankInfo<\/span><\/b><\/p>\n<p>Den Request k&ouml;nnen Sie nach Belieben anpassen, also k&ouml;nnen Sie dort auch das einzige Fragezeichen durch den gew&uuml;nschten Wert ersetzen. Wir verwenden die Test-Bankleitzahl <b>70000997 <\/b>und klicken dann oben links im Fenster auf die Schaltfl&auml;che mit dem gr&uuml;nen Pfeil. Und siehe da: Nach kurzer Wartezeit erscheint im Bereich rechts von unserem Request schon die Antwort des Webservers (s. Bild 6)!<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_006.png\" alt=\"Test eines Requests inklusive Response des Webservers\" width=\"700\" height=\"352,2199\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Test eines Requests inklusive Response des Webservers<\/span><\/b><\/p>\n<p>Die Arbeit mit <b>SoapUI <\/b>ist wirklich so einfach, dass ich nur jedem Entwickler, der einmal den Zugriff auf einen Webservice programmiert, die Nutzung dieses Tools empfehlen kann.<\/p>\n<p>Sollten Sie SOAP-Requests absetzen wollen, die weitere Informationen wie etwa Header-Daten oder eine Authentifizierung erfordern, nutzen Sie die Bereiche unter dem Request. <\/p>\n<p>Dort k&ouml;nnen Sie alle ben&ouml;tigten Informationen hinzuf&uuml;gen.<\/p>\n<p>Der Request funktioniert also wie gew&uuml;nscht &euro;&#8220; dann k&ouml;nnen wir uns an die Umsetzung mit VBA begeben.<\/p>\n<p><b>Request per VBA absetzen<\/b><\/p>\n<p>F&uuml;r den ersten Request und zum Einarbeiten bauen wir uns ein kleines Formular, in das wir den Wert f&uuml;r den einzigen Parameter eintragen. Mit der Schaltfl&auml;che <b>cmdRequest <\/b>wollen wir den Request zusammenstellen und absenden sowie die Antwort des Webservers entgegennehmen. Der Request soll im Textfeld <b>txtRequest <\/b>landen, die Response im Textfeld <b>txtResponse<\/b> (s. Bild 7). Beide Textfelder sollen f&uuml;r die Eigenschaft <b>Bildlaufleisten <\/b>den Wert <b>Vertikal <\/b>erhalten. Sofern Sie Access 2007 oder neuer nutzen, stellen Sie auch die Eigenschaft <b>Horizontaler Anker <\/b>f&uuml;r beide Textfelder auf den Wert <b>Beide <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_007.png\" alt=\"Formular zur Ausgabe von Response und Request\" width=\"500\" height=\"436,6729\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Formular zur Ausgabe von Response und Request<\/span><\/b><\/p>\n<p>Bevor wir mit der Programmierung beginnen, richten wir noch einen Verweis auf die Bibliothek <b>Microsoft XML, v6.0 <\/b>im <b>Verweise<\/b>-Dialog ein (VBA-Editor, Men&uuml;befehl <b>Extras|Verweise<\/b>) &euro;&#8220; s. Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_008.png\" alt=\"Verweis auf die XML-Bibliothek\" width=\"400\" height=\"311,1111\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Verweis auf die XML-Bibliothek<\/span><\/b><\/p>\n<p>Danach stellen wir den Request zusammen &euro;&#8220; mit einigen Hilfsfunktionen, die den Vorgang ein wenig besser strukturieren und au&szlig;erdem wiederverwendbar sind. Den Start macht die Prozedur, die durch den Mausklick auf die Schaltfl&auml;che <b>cmdRequest <\/b>ausgel&ouml;st wird (s. Listing 3). Die Prozedur pr&uuml;ft zun&auml;chst, ob der Benutzer eine Bankleitzahl im korrekten Format eingegeben hat. Anderenfalls erscheint eine entsprechende Meldung. Gegen ung&uuml;ltige Bankleitzahlen ist die Prozedur hingegen nicht gefeit &euro;&#8220; es kommt lediglich ein leeres Request-Dokument zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdRequest_Click()\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>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;\">If <\/span><span style=\"color:blue;\">Not<\/span> (<span style=\"color:blue;\">Len<\/span>(Me!txtBLZ) = 8 And IsNumeric(Me!txtBLZ))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Geben Sie eine BLZ mit acht Stellen ein.\"\r\n         Me!txtBLZ.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     GetBankInfo Me!txtBLZ, strErrorCode, strErrorText, strRequest, strResponse\r\n     Me!txtRequest = FormatXML(strRequest)\r\n     Me!txtResponse = FormatXML(strResponse)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Aufruf der Webservice-Funktion GetBankInfo<\/span><\/b><\/p>\n<p>Hat die Bankleitzahl das korrekte Format, ruft die Prozedur die Routine <b>GetBankInfo <\/b>auf. Diese erwartet f&uuml;nf Parameter, von denen zwei optional sind. Der erste erwartet die BLZ der zu untersuchenden Bank, der zweite und der dritte leere Variablen, die beim Auftreten eines Fehlers gef&uuml;llt werden. F&uuml;r beiden Variablen <b>strRequest <\/b>und <b>strResponse <\/b>&uuml;bergeben Sie ebenfalls leere String-Variablen, die dann mit dem Request und dem Response gef&uuml;llt werden.<\/p>\n<p>Nach dem Aufruf der Routine <b>GetBank-Info <\/b>tr&auml;gt die Prozedur <b>cmdRequest_Click <\/b>noch den erhaltenen Request und Response in die entsprechenden Textfelder zur genaueren Betrachtung ein. Dabei werden beide mit der Funktion <b>FormatXML <\/b>formatiert, also mit Zeilenumbr&uuml;chen und Einr&uuml;ckungen versehen. Der Webservice liefert seine Daten n&auml;mlich komplett ohne solche Formatierungen.<\/p>\n<p><b>GetBankInfo<\/b><\/p>\n<p>Die Funktion <b>GetBackInfo<\/b> aus Listing 4 steuert die Erstellung des Requests und sendet diesen ab &euro;&#8220; beides mit weiteren Hilfsfunktionen. Die Parameter dieser Funktion haben wir ja schon weiter oben beschrieben. Die Funktion speichert zun&auml;chst den Namen der Webservice-Funktion in der Variablen <b>strFunction<\/b>. Diese &uuml;bergibt sie zusammen mit dem Kern-Element des Requests an eine weitere Routine namens <b>CreateSoapRequest<\/b>. Der Kern sieht mit der Beispiel-BLZ <b>70000997 <\/b>so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetBankInfo(strBLZ<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> strRequest<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strResponse<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>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"GetBankInfo\"\r\n     strRequest = CreateSoapRequest(\"            &lt;ser:sBankCode&gt;\" & strBLZ _\r\n         & \"&lt;\/ser:sBankCode&gt;\", strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.selectSingleNode(\"\/\/\" & strFunction & \"Response\").XML\r\n     strErrorCode = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorCode\")\r\n     strErrorText = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorText\")\r\n     GetBankInfo = GetXMLElement(strResponse, strFunction & \"Result\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Funktion GetBankInfo<\/span><\/b><\/p>\n<pre>&lt;ser:sBankCode&gt;70000997&lt;\/ser:sBankCode&gt;\"<\/pre>\n<p>Die Routine <b>CreateSoapRequest <\/b>stellt aus dem Kern des XML-Dokuments und dem Namen der Funktion den Request zusammen und liefert diesen zur&uuml;ck.<\/p>\n<p>Der Aufruf der Prozedur <b>Request <\/b>ist der n&auml;chste Schritt: Diese erwartet den Request in Form der <b>String<\/b>-Variablen <b>strRequest <\/b>und eine leere Variable namens <b>objXMLResponse<\/b>. Diese hat den Typ <b>MSXML2.DOMDocument<\/b>.<\/p>\n<p>Das mit <b>objXMLResponse <\/b>zur&uuml;ckgelieferte XML-Dokument wertet die Prozedur anschlie&szlig;end aus. Die Funktion <b>selectSingleNode <\/b>nimmt einen <b>XPath<\/b>-Ausdruck (die Abfragesprache f&uuml;r XML-Dokumente), der in diesem Fall das Element <b>\/\/GetBankInfoResponse <\/b>zur&uuml;ckliefern soll. Damit befreit die Prozedur quasi die Antwort aus dem SOAP-Umschlag, also die umschlie&szlig;enden SOAP-Elemente:<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;soap:Envelope ...&gt;\r\n     &lt;soap:Body&gt;\r\n         &lt;GetBankInfoResponse ...&gt;\r\n             &lt;GetBankInfoResult&gt;\r\n                 ...\r\n             &lt;\/GetBankInfoResult&gt;\r\n         &lt;\/GetBankInfoResponse&gt;\r\n     &lt;\/soap:Body&gt;\r\n&lt;\/soap:Envelope&gt;<\/pre>\n<p>&uuml;brig bleibt dann also:<\/p>\n<pre>&lt;GetBankInfoResponse ...&gt;\r\n     &lt;GetBankInfoResult&gt;\r\n         ...\r\n     &lt;\/GetBankInfoResult&gt;\r\n&lt;\/GetBankInfoResponse&gt;<\/pre>\n<p>Das Ergebnis landet in der Variablen <b>strResponse<\/b>. Au&szlig;erdem ermittelt die Prozedur noch eventuell auftretende Fehler. Dazu verwendet sie eine Hilfsfunktion namens <b>GetXMLElement<\/b>. Diese bietet eine einfache M&ouml;glichkeit, durch einen Einzeiler ein Element aus einem XML-Dokument auszulesen (s. Listing 5). Dies kann man zwar auch wie in der vorherigen Anweisung direkt mit der Funktion <b>selectSingleNode <\/b>erledigen. Allerdings liefert dies einen Fehler, wenn Sie direkt auf den Inhalt dieses Elements zugreifen, dieses aber nicht gefunden werden konnte. Dies umgeht die Funktion <b>GetXMLElement<\/b>, indem sie erst das Element mit einer Objektvariablen referenziert und dann pr&uuml;ft, ob die Objektvariable &uuml;berhaupt gef&uuml;llt ist. Nur dann fragt die Funktion den Wert dieses Elements ab und liefert diesen als Funktionswert zur&uuml;ck. Anderenfalls ist eine leere Zeichenkette das Ergebnis.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetXMLElement(strXML<span style=\"color:blue;\"> As String<\/span>, strElement<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>objElement<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n     objXML.loadXML strXML\r\n     <span style=\"color:blue;\">Set<\/span> objElement = objXML.documentElement\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objElement.selectSingleNode(strElement)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         GetXMLElement = objNode.nodeTypedValue\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Hilfsfunktion GetXMLElement<\/span><\/b><\/p>\n<p>Die Funktion <b>GetBankInfo <\/b>liest also die Elemente <b>Result\/Error\/ErrorCode <\/b>und <b>Result\/Error\/ErrorText <\/b>und speichert die Inhalte in den R&uuml;ckgabeparametern <b>strErrorCode <\/b>und <b>strErrorText<\/b>.<\/p>\n<p><b>SOAP-Request zusammenstellen<\/b><\/p>\n<p>Damit kommen wir zun&auml;chst zur Funktion <b>CreateSoapRequest<\/b> (s. Listing 6). Diese steuert eine Reihe weiterer Funktionen, die den Basis-Request aus der Variablen <b>strBasicRequest<\/b> und den Funktionsnamen zusammenstellen. Diese Funktion k&ouml;nnen wir f&uuml;r weitere Anfragen wiederverwenden, denn wir brauchen auch f&uuml;r die &uuml;brigen Requests eigentlich nur den Funktionsnamen (hier <b>GetBankInfo<\/b>) und die paar Zeilen XML-Code mit den notwendigen Parametern.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateSoapRequest(strBasicRequest<span style=\"color:blue;\"> As String<\/span>, strFunction<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     strRequest = RequestEnvelopeStart\r\n     strRequest = strRequest & RequestBodyStart(strFunction)\r\n     strRequest = strRequest & strBasicRequest & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & RequestBodyEnde(strFunction)\r\n     strRequest = strRequest & RequestEnvelopeEnde\r\n     CreateSoapRequest = strRequest\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Funktion CreateSoapRequest<\/span><\/b><\/p>\n<p>Die Funktion stellt in der <b>String<\/b>-Variablen <b>strRequest <\/b>den Request zusammen. Den Beginn macht die Funktion <b>Re-quest-EnvelopeStart<\/b> (s. Listing 7). Die Prozedur liefert das &ouml;ffnende Element des SOAP-Umschlages &euro;&#8220; also in gek&uuml;rzter Form etwa diese beiden Zeilen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RequestEnvelopeStart()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     strRequest = strRequest _\r\n         & \"&lt;soapenv:Envelope xmlns:soapenv=\"\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"\" \" _\r\n         & \"xmlns:ser=\"\"http:\/\/service.ddbac.de\/\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"    &lt;soapenv:Body&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     RequestEnvelopeStart = strRequest\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Funktion RequestEnvelopeStart<\/span><\/b><\/p>\n<pre>&lt;soapenv:Envelope ...&gt;\r\n     &lt;soapenv:Body&gt;<\/pre>\n<p>Danach folgt der &ouml;ffnende Teil des eigentlich XML-Requests, den die Funktion <b>RequestBodyStart<\/b> beisteuert (s. Listing 8). Diese Funktion erwartet den Namen der zu verwendenden Methode als Parameter und liefert dann diese Zeile:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RequestBodyStart(strMethod<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     strRequest = strRequest & \"        &lt;ser:\" & strMethod & \"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     RequestBodyStart = strRequest\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Die Funktion RequestBodyStart<\/span><\/b><\/p>\n<pre>        &lt;ser:GetBankInfo&gt;<\/pre>\n<p>Nun folgt der eigentliche Inhalt aus der Variablen <b>strBasicRequest<\/b>:<\/p>\n<pre>&lt;ser:sBankCode&gt;70000997&lt;\/ser:sBankCode&gt;\"<\/pre>\n<p>Die folgende Funktion <b>RequestBodyEnde <\/b>(s. Listing 9) schlie&szlig;t den Request &euro;&#8220; wieder mithilfe des Wertes aus der Variablen <b>strMethod<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RequestBodyEnde(strMethod<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     strRequest = strRequest & \"        &lt;\/ser:\" & strMethod & \"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     RequestBodyEnde = strRequest\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Die Funktion RequestBodyEnde<\/span><\/b><\/p>\n<pre>&lt;ser:sBankCode&gt;70000997&lt;\/ser:sBankCode&gt;\"<\/pre>\n<p>Nun fehlen nur noch die schlie&szlig;enden Elemente des SOAP-Umschlags, welche die Funktion <b>RequestEnvelopeEnde<\/b> aus Listing 10 beisteuert:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RequestEnvelopeEnde()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     strRequest = strRequest & \"    &lt;\/soapenv:Body&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"&lt;\/soapenv:Envelope&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     RequestEnvelopeEnde = strRequest\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Die Funktion RequestEnvelopeEnde<\/span><\/b><\/p>\n<pre>    &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p>Dieser Request wird dann von der Funktion <b>CreateSoapRequest <\/b>an die aufrufende Routine <b>GetBankInfo <\/b>zur&uuml;ckgeschickt.<\/p>\n<p><b>Request ausf&uuml;hren<\/b><\/p>\n<p>Die Routine <b>GetBankInfo <\/b>ruft nun schlussendlich die Funktion <b>Request <\/b>auf, welche die folgenden zwei Parameter verwendet (s. Listing 11):<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Request(strRequest<span style=\"color:blue;\"> As String<\/span>, objXMLResponse<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument)<span style=\"color:blue;\"> _\r\n         As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Set<\/span> objXMLResponse = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument\r\n     strURL = cURLBase\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"post\", strURL, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"text\/xml; charset=utf-8\"\r\n         .setRequestHeader \"Content-Length\", <span style=\"color:blue;\">Len<\/span>(strRequest)\r\n         .send strRequest\r\n         objXMLResponse.loadXML .responseText\r\n         Request = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Die Funktion Request f&uuml;hrt den eigentliche Request aus.<\/span><\/b><\/p>\n<ul>\n<li><b>strRequest <\/b>erwartet den Request als String und<\/li>\n<li><b>objXMLResponse <\/b>ist ein R&uuml;ckgabeparameter, der ein Objekt des Typs <b>MSXML2.DOMDocument <\/b>zur&uuml;ckliefert.<\/li>\n<\/ul>\n<p>Die Prozedur erzeugt ein neues Objekt des Typs <b>MSXML2.DOMDocument <\/b>und liest dann den Wert der Konstanten <b>cURLBase <\/b>in die Variable <b>strURL <\/b>ein.<\/p>\n<p>Aktuell k&ouml;nnen Sie die Konstante wie folgt mit der Zieladresse versehen:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cURLBase<span style=\"color:blue;\"> As String<\/span> = \r\n\"https:\/\/service.ddbac.de\/demo\/ServiceNG.asmx\"<\/pre>\n<p>Diese kann sich gegebenenfalls einmal &auml;ndern &euro;&#8220; sollte diese also nicht mehr funktionieren, wenden Sie sich per E-Mail an <b>info@access-im-unternehmen.de<\/b>.<\/p>\n<p>Danach best&uuml;ckt die Funktion ein ebenfalls neu erzeugtes Objekt des Typs <b>MSXML2.XMLHTTP<\/b>, indem es zun&auml;chst die <b>Open<\/b>-Methode aufruft und dabei den Wert <b>post<\/b>, die URL aus <b>strURL <\/b>und den Wert <b>False <\/b>&uuml;bergibt.<\/p>\n<p><b>post <\/b>ist die &uuml;bertragungsmethode und der Wert f&uuml;r den dritten Parameter legt fest, dass der Aufruf nicht asynchron erfolgen soll.<\/p>\n<p>Das hei&szlig;t, dass der Code angehalten wird, bis der sp&auml;tere Aufruf ein Ergebnis geliefert hat.<\/p>\n<p>Die folgenden beiden Zeilen &uuml;bergeben einige Header, welche die Codierung und  L&auml;nge des Requests festlegen. Schlie&szlig;lich schickt die <b>send<\/b>-Methode den Request an den Webservice.<\/p>\n<p>Nachdem diese Aufgabe erledigt wurde, kann die folgende Anweisung mit der Eigenschaft <b>responseText <\/b>den Inhalt der Antwort ermitteln. Diesen schreibt sie gleich als XML-Code in das Objekt <b>obj-XML-Response<\/b>, das dann als Parameter an die aufrufende Routine zur&uuml;ckgegeben wird &euro;&#8220; nebst dem Wert <b>True <\/b>als Ergebnis der Funktion.<\/p>\n<p>Den Rest haben Sie bereits weiter oben kennengelernt &euro;&#8220; die Funktion <b>GetBank-Info <\/b>liest die ben&ouml;tigten Daten aus dem <b>Response<\/b>-Dokument aus und liefert diese als Ergebnis an die aufrufende Prozedur <b>cmdRequest_Click <\/b>des Formulars zur&uuml;ck. Dieses zeigt das Ergebnis dann in den beiden daf&uuml;r vorgesehenen Textfeldern an (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_009.png\" alt=\"Das Formular frmGetBankInfo mit den ben&ouml;tigten Informationen\" width=\"450\" height=\"356,4273\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Das Formular frmGetBankInfo mit den ben&ouml;tigten Informationen<\/span><\/b><\/p>\n<p><b>Verwendet die Bank Pin\/Tan<\/b><\/p>\n<p>Nun wissen wir noch nicht, ob die angesprochene Bank Pin\/Tan f&uuml;r Onlinebanking zul&auml;sst und somit f&uuml;r unseren hier vorgestellten Webservice nutzbar ist.<\/p>\n<p>Diese Information holen wir uns noch mit ein paar zus&auml;tzlichen Zeilen, die wir an die Funktion <b>cmdRequest_Click <\/b>anh&auml;ngen (s. Listing 12).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdRequest_Click()\r\n     ...\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     ....\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(\"\/\/PinTanConnection\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Bank ist Webservice-f&auml;hig.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Bank ist nicht Webservice-f&auml;hig.\"\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 12: Erweiterung, um die Webservice-F&auml;higkeit zu pr&uuml;fen<\/span><\/b><\/p>\n<p>Dabei deklarieren wir zun&auml;chst ein Objekt des Typs <b>MSXML2.DOMDocument<\/b>, das wir sp&auml;ter mit dem mit <b>strResponse <\/b>gelieferten XML-Dokument f&uuml;llen.<\/p>\n<p>Das zweite neue Objekt hat den Typ IXMLDOMNode und soll ein Element mit dem Namen <b>PinTanConnection <\/b>per <b>selectSingleNode <\/b>finden und referenzieren, sofern <b>objXML <\/b>ein solches enth&auml;lt. Falls ja, ist <b>objNode <\/b>danach nicht <b>Nothing <\/b>und es erscheint eine Meldung, dass die Bank Webservice-f&auml;hig ist.<\/p>\n<p><b>Zwischenfazit<\/b><\/p>\n<p>Sie haben zwar nun noch erst einmal herausgefunden, ob eine Bank den Zugriff mit diesem Webservice zul&auml;sst.<\/p>\n<p>Allerdings haben wir dabei schon eine ganze Reihe von Funktionen vorgestellt, die wir in den folgenden Beispielen immer wieder nutzen werden. Der Zugriff auf den Webservice verl&auml;uft n&auml;mlich immer etwa nach dem gleichen Schema.<\/p>\n<p><b>Was kann der Webservice<\/b><\/p>\n<p>Nachdem wir gekl&auml;rt haben, wie Sie herausfinden, ob eine Bank den Zugriff per Webservice &uuml;berhaupt zul&auml;sst, k&ouml;nnen wir uns die m&ouml;glichen Funktionen ansehen, die Sie damit ausf&uuml;hren k&ouml;nnen:<\/p>\n<ul>\n<li><b>BalanceRequest<\/b>: Ermittelt den Kontostand f&uuml;r ein Konto. Erwartet die Parameter <b>ContactData <\/b>und <b>AccountId<\/b>, die zuvor mit <b>CreateContact-Di-rect-Request <\/b>erfasst werden m&uuml;ssen.<\/li>\n<li><b>CheckIban<\/b>: Pr&uuml;ft eine IBAN-Nummer.<\/li>\n<li><b>CreateContact-DirectRequest<\/b>: Liefert alle Daten zu einem Kontakt, also alle Konten, zu jedem Konto eine <b>Account-Id <\/b>sowie einen Wert f&uuml;r <b>ContactData<\/b>, mit dem weitere Aktionen authentifiziert werden k&ouml;nnen.<\/li>\n<li><b>GetBankInfo<\/b>: Liefert Informationen zu einer Bank.<\/li>\n<li><b>MoneyTransferRequest<\/b>: Durchf&uuml;hren einer &uuml;berweisung<\/li>\n<li><b>MoneyTransfer-Complete<\/b>: &uuml;bermittlung der TAN bei einer &uuml;berweisung<\/li>\n<li><b>RetrieveBicForBankCode<\/b>: Ermittlung der BIC aus einer BLZ<\/li>\n<li><b>RetrieveBicForIban<\/b>: Ermittlung einer BIC aus einer IBAN<\/li>\n<li><b>RetrieveIbanAndBic<\/b>: Ermittlung von IBAN und BIC aus Kontonummer und BLZ<\/li>\n<li><b>StatementRequest<\/b>: Abrufen des Kontostands<\/li>\n<\/ul>\n<p>Diese Liste enth&auml;lt eine Reihe Funktionen, f&uuml;r die keine Authentifizierung n&ouml;tig ist. Dabei handelt es sich um die Funktionen etwa zur Pr&uuml;fung einer IBAN, zur Ermittlung der BIC zu einer BLZ, der BIC zu einer IBAN oder der IBAN und der BIC zu einer Kombination aus Kontonummer und BLZ.<\/p>\n<p>F&uuml;r Funktionen wie etwa zum Abrufen des Kontostandes, zum Einlesen der Ums&auml;tze oder zum Durchf&uuml;hren von &uuml;berweisungen ist nat&uuml;rlich eine Authentifizierung n&ouml;tig.<\/p>\n<p>Wir schauen uns in diesem Beitrag zun&auml;chst die Funktionen an, f&uuml;r die keine Authentifizierung n&ouml;tig ist. Die &uuml;brigen drei folgen dann im zweiten Teil in der folgenden Ausgabe von <b>Access im Unternehmen<\/b>.<\/p>\n<p><b>Formular zum Testen der Konvertierungsfunktionen<\/b><\/p>\n<p>Erstellen Sie zun&auml;chst ein neues Formular namens <b>frmKonvertierungsfunktionen <\/b>und speichern Sie dieses.<\/p>\n<p> Wir werden nacheinander die einzelnen Konvertierungsfunktionen hinzuf&uuml;gen.<\/p>\n<p>Legen Sie als Erstes einen Bereich mit der &uuml;berschrift <b>BIC aus BLZ <\/b>an. Dort f&uuml;gen Sie ein Textfeld namens <b>txtBLZ_BLZZuBIC <\/b>an sowie ein weiteres Textfeld namens <b>txtBIC_BLZZuBIC<\/b>.<\/p>\n<p>Warum nicht einfach <b>txtBLZ <\/b>und <b>txtBIC<\/b> Weil wir gleich noch weitere Konvertierungsfunktionen hinzuf&uuml;gen werden, die ebenfalls Textfelder mit der BLZ und der BIC beinhalten (s. Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_010.png\" alt=\"Formular mit Konvertierungsfunktionen\" width=\"500\" height=\"273,3447\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Formular mit Konvertierungsfunktionen<\/span><\/b><\/p>\n<p>Zwischen den beiden Textfeldern f&uuml;gen Sie eine Schaltfl&auml;che namens <b>cmdBICAusBLZ <\/b>ein. Legen Sie f&uuml;r die Ereigniseigenschaft <b>Beim Klicken <\/b>eine Ereignisprozedur an, die Sie wie in Listing 13 mit Code f&uuml;llen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBICAusBLZ_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strBIC<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;\">If <\/span>BLZPruefen(Me!txtBLZ_BLZZuBIC) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strBIC = RetrieveBICForBankCode(Me!txtBLZ_BLZZuBIC, strErrorCode, strErrorText)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBIC) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             Me!txtBIC_BLZZuBIC = strBIC\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"BIC konnte nicht ermittelt werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorCode _\r\n                 & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorText\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Geben Sie eine g&uuml;ltige BLZ ein.\"\r\n         Me!txtBLZ_BLZZuBIC.SetFocus\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 13: Diese Ereignisprozedur startet die Ermittlung einer BIC aus einer Bankleitzahl.<\/span><\/b><\/p>\n<p>Die Prozedur ruft gleich in der ersten Anweisung eine weitere Funktion namens <b>BLZPruefen<\/b> auf, welche die G&uuml;ltigkeit einer BLZ pr&uuml;ft (s. Listing 14). Die Funktion  pr&uuml;ft nat&uuml;rlich nur die grundlegende G&uuml;ltigkeit einer BLZ, nicht, ob sie tats&auml;chlich einem Bankinstitut zugeordnet ist. Das bedeutet: Sie pr&uuml;ft, ob diese acht Zeichen lang ist, ob sie numerisch ist und ob das erste Zeichen nicht den Wert <b>0 <\/b>oder <b>9 <\/b>hat &euro;&#8220; denn es gibt keine Bankleitzahlen, die mit diesem Wert beginnen. Sind all diese Bedingungen erf&uuml;llt, liefert die Funktion den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BLZPruefen(strBLZ<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBLZ) = 8<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>IsNumeric(strBLZ)<span style=\"color:blue;\"> Then<\/span>\r\n             Select Case <span style=\"color:blue;\">Left<\/span>(strBLZ, 1)\r\n                 <span style=\"color:blue;\">Case <\/span>\"9\", \"0\"\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     BLZPruefen = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 14: Diese Funktion pr&uuml;ft, ob eine BLZ g&uuml;ltig ist.<\/span><\/b><\/p>\n<p>Die aufrufende Prozedur <b>cmdBLZZuBIC<\/b> f&auml;hrt bei g&uuml;ltiger BLZ mit einem weiteren Aufruf einer Funktion fort. Diese hei&szlig;t nun <b>RetrieveBICForBankCode <\/b>und erwartet die Bankleitzahl als ersten Parameter. Die beiden &uuml;brigen Parameter <b>strErrorCode <\/b>und <b>strErrorText <\/b>sind R&uuml;ckgabeparameter, die gegebenenfalls einen Fehler r&uuml;ckmelden. Diese Funktion, die wir uns gleich im Anschluss ansehen, liefert im Erfolgsfall die ermittelte BIC zur&uuml;ck und speichert diese in der Variablen <b>strBIC<\/b>. Ist diese nach dem Aufruf gef&uuml;llt, schreibt die Prozedur den Wert in das Textfeld <b>txtBIC_BLZZuBIC<\/b>.<\/p>\n<p>Anderenfalls erscheint ein Meldungsfenster mit dem Hinweis, dass die BIC nicht ermittelt werden konnte und gegebenenfalls die Fehlerinformationen aus <b>strErrorCode <\/b>und <b>strErrorText<\/b>. Sollte die Pr&uuml;fung der BLZ bereits durch die Funktion<b> BLZPruefen <\/b>fehlgeschlagen sein, erscheint ebenfalls eine entsprechende Meldung und der Fokus wird wieder auf das Eingabefeld f&uuml;r die BLZ verschoben.<\/p>\n<p>Die Funktion <b>RetrieveBICForBankCode<\/b> finden Sie in Listing 15. Die Funktion erwartet, wie erw&auml;hnt, mit dem Parameter <b>strBankCode <\/b>die zu untersuchende Bankleitzahl. Sie legt in der Variablen <b>strFunction <\/b>den Namen der zu verwendenden Webservice-Funktion fest, in diesem Fall <b>RetrieveBicForBankCode<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RetrieveBICForBankCode(strBankCode<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;\"> 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>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"RetrieveBicForBankCode\"\r\n     strRequest = CreateSoapRequest(\"            &lt;ser:sBankCode&gt;\" & strBankCode _\r\n         & \"&lt;\/ser:sBankCode&gt;\", strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.selectSingleNode(\"\/\/\" & strFunction & \"Response\").XML\r\n     strErrorCode = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorCode\")\r\n     strErrorText = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorText\")\r\n     RetrieveBICForBankCode = GetXMLElement(strResponse, strFunction & \"Result\/Bic\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 15: Funktion zum Ermitteln der BIC aus einer BLZ<\/span><\/b><\/p>\n<p>Danach stellt Sie mit der Funktion <b>CreateSoapRequest <\/b>den Request zusammen. Das einzige variable Element sieht dabei wie folgt aus und nimmt die zu untersuchende Bankleitzahl auf:<\/p>\n<pre>&lt;ser:sBankCode&gt;12345678&lt;\/ser:sBankCode&gt;<\/pre>\n<p>Der Request, den die Funktion <b>CreateSoapRequest<\/b> zur&uuml;ckliefert, sieht wie folgt aus:<\/p>\n<pre>&lt;soapenv:Envelope ...&gt;\r\n   &lt;soapenv:Body&gt;\r\n     &lt;ser:RetrieveBicForBankCode&gt;\r\n       &lt;ser:sBankCode&gt;76010085\r\n         &lt;\/ser:sBankCode&gt;\r\n     &lt;\/ser:RetrieveBicForBankCode&gt;\r\n   &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p>Mit diesem Ausdruck als ersten Parameter ruft die Routine die ebenfalls bereits vorgestellte Funktion <b>Request <\/b>auf. Diese f&uuml;hrt den Request aus und liefert dabei das Ergebnis aus Listing 16.<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;soap:Envelope ...&gt;\r\n     &lt;soap:Body&gt;\r\n         &lt;RetrieveBicForBankCodeResponse xmlns=\"http:\/\/service.ddbac.de\/\"&gt;\r\n             &lt;RetrieveBicForBankCodeResult&gt;\r\n                 &lt;SuccessText&gt;Erfolgreich&lt;\/SuccessText&gt;\r\n                 &lt;Bic&gt;PBNKDEFFXXX&lt;\/Bic&gt;\r\n             &lt;\/RetrieveBicForBankCodeResult&gt;\r\n         &lt;\/RetrieveBicForBankCodeResponse&gt;\r\n     &lt;\/soap:Body&gt;\r\n&lt;\/soap:Envelope&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 16: Ergebnis der Funktion zum Ermitteln der BIC zu einer BLZ<\/span><\/b><\/p>\n<p>Darum k&uuml;mmern sich nun die letzten Anweisungen der Funktion <b>RetrieveBICForBankCode<\/b>: Die erste ermittelt &uuml;ber den XPath-Ausdruck <b>\/\/RetrieveBICForBankCodeResponse <\/b>den fett gedruckten Ergebnisteil des <b>Response<\/b>-Textes.<\/p>\n<p>Die folgenden beiden Anweisungen ermitteln wieder, sofern vorhanden, den Fehlercode und den Fehlertext aus dem Dokument. Die letzte Anweisung ermittelt &uuml;ber das Element <b>Result\/Bic <\/b>den BIC f&uuml;r die &uuml;bergebene Bankleitzahl.<\/p>\n<p>Das Ergebnis gibt die Routine dann an die aufrufende Prozedur <b>cmdBLZZuBIC_Click <\/b>zur&uuml;ck, die das Ergebnis in das entsprechende Textfeld eintr&auml;gt (s. Bild 11) &euro;&#8220; es funktioniert!<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_011.png\" alt=\"Erfolgreiche Konvertierung einer BLZ in die entsprechende BIC\" width=\"500\" height=\"273,3447\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Erfolgreiche Konvertierung einer BLZ in die entsprechende BIC<\/span><\/b><\/p>\n<p><b>IBAN und BIC aus BLZ und Kontonummer ermitteln<\/b><\/p>\n<p>Als N&auml;chstes wollen wir aus der Kombination aus BLZ und Kontonummer die IBAN und die BIC ermitteln. Dies erledigt die Webservice-Funktion <b>RetrieveIbanAndBic<\/b>. Um die Funktion zu testen, f&uuml;gen wir dem Formular <b>frmKonvertierungsfunktionen<\/b> einen neuen Bereich hinzu. Dieser enth&auml;lt insgesamt vier Textfelder: <b>txtBLZ<\/b>, <b>txtKontonummer<\/b>, <b>txtBIC <\/b>und <b>txtIBAN<\/b>. Die Schaltfl&auml;che erh&auml;lt den Namen <b>cmdIBANUndBICAusBLZUndKontonummer<\/b> (s. Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_012.png\" alt=\"Steuerelemente f&uuml;r die Ermittlung von BIC und IBAN aus BLZ und Kontonummer\" width=\"500\" height=\"273,3447\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Steuerelemente f&uuml;r die Ermittlung von BIC und IBAN aus BLZ und Kontonummer<\/span><\/b><\/p>\n<p>F&uuml;r die Ereigniseigenschaft <b>Beim Klicken <\/b>dieser Schaltfl&auml;che legen Sie die Ereignisprozedur aus Listing 17 an.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdIBANUndBICAusBLZUndKontonummer_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strBIC<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strIban<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;\">If <\/span>BLZPruefen(Me!txtBLZ) = <span style=\"color:blue;\">True<\/span> And <span style=\"color:blue;\">Not<\/span> IsNull(Me!txtKontonummer)<span style=\"color:blue;\"> Then<\/span>\r\n         RetrieveIbanAndBic Me!txtBLZ, Me!txtKontonummer, strBIC, strIban, _\r\n             strErrorCode, strErrorText\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBIC) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             Me!txtBIC = strBIC\r\n             Me!txtIBAN = strIban\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"BIC und IBAN konnten nicht ermittelt werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & strErrorCode & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorText\r\n             Me!txtBIC = \"\"\r\n             Me!txtIBAN = \"\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Geben Sie eine g&uuml;ltige BLZ und eine Kontonummer ein.\"\r\n         Me!txtBLZ.SetFocus\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 17: Ereignisprozedur der Schaltfl&auml;che zum Ermitteln der IBAN und der BIC aus BLZ und Kontonummer<\/span><\/b><\/p>\n<p>Diese pr&uuml;ft zun&auml;chst wieder, ob die im Textfeld <b>txtBLZ <\/b>eingegebene Bankleitzahl ein g&uuml;ltiges Format besitzt. Au&szlig;erdem pr&uuml;ft die Prozedur, ob das Textfeld <b>txtKontonummer <\/b>einen Wert enth&auml;lt. Ist dies nicht der Fall, liefert die Prozedur eine entsprechende Meldung und beendet den Vorgang.<\/p>\n<p>Anderenfalls ruft sie die Funktion <b>RetrieveIbanAndBic <\/b>auf. Diese Funktion erwartet die BLZ und die Kontonummer als Eingangsparameter und liefert mit den beiden Parametern <b>strBIC <\/b>und <b>strIBAN<\/b>, die vor der &uuml;bergabe deklariert werden m&uuml;ssen, die Ergebniswerte zur&uuml;ck.<\/p>\n<p>Nachdem das Ergebnis vorliegt (mehr zur Funktion <b>RetrieveIbanAndBic <\/b>weiter unten), pr&uuml;ft die Ereignisprozedur, ob <b>strBIC <\/b>einen Wert enth&auml;lt. In diesem Fall landen der Wert von <b>strBIC <\/b>und <b>strIBAN <\/b>in den beiden Textfeldern <b>txtBIC <\/b>und <b>txtIBAN<\/b>.<\/p>\n<p>Ist dies nicht der Fall, konnten keine passenden Daten gefunden werden und die Prozedur gibt eine Meldung mit den Fehlerinformationen aus. Au&szlig;erdem leert die Prozedur die beiden Textfelder <b>txtIBAN <\/b>und <b>txtBIC<\/b>. Sollten Sie etwa eine falsche BLZ eingeben, sieht das Ergebnis wie in Bild 13 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_013.png\" alt=\"Fehler beim Konvertieren von BLZ und Kontonummer in BIC und IBAN\" width=\"575\" height=\"322,4299\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Fehler beim Konvertieren von BLZ und Kontonummer in BIC und IBAN<\/span><\/b><\/p>\n<p>Die Funktion <b>RetrieveIbanAndBic <\/b>erwartet die BLZ und die Kontonummer als Parameter und liefert per R&uuml;ckgabeparameter die Werte f&uuml;r die BIC und die IBAN sowie eventuell die Fehlernummer und die Fehlermeldung (s. Listing 18).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RetrieveIbanAndBic(strBLZ<span style=\"color:blue;\"> As String<\/span>, strKontonummer<span style=\"color:blue;\"> As String<\/span>, _\r\n         strBIC<span style=\"color:blue;\"> As String<\/span>, strIban<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>)\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>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"RetrieveIbanAndBic\"\r\n     strRequest = \"            &lt;ser:BankCode&gt;\" & strBLZ & \"&lt;\/ser:BankCode&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"            &lt;ser:AccountNumber&gt;\" & strKontonummer _\r\n         & \"&lt;\/ser:AccountNumber&gt;\"\r\n     strRequest = CreateSoapRequest(strRequest, strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.selectSingleNode(\"\/\/\" & strFunction & \"Response\").XML\r\n     strErrorCode = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorCode\")\r\n     strErrorText = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorText\")\r\n     strBIC = GetXMLElement(strResponse, strFunction & \"Result\/Bic\")\r\n     strIban = GetXMLElement(strResponse, strFunction & \"Result\/Iban\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 18: Funktion zum Ermitteln der IBAN und der BIC aus BLZ und Kontonummer<\/span><\/b><\/p>\n<p>Sie funktioniert prinzipiell wie die vorherigen Funktionen, stellt aber einen Kern f&uuml;r den Request zusammen, der aus zwei Zeilen besteht &euro;&#8220; etwa so:<\/p>\n<pre>&lt;ser:BankCode&gt;12345678&lt;\/ser:BankCode&gt;\"\r\n&lt;ser:AccountNumber&gt;987654321 &lt;\/ser:AccountNumber&gt;<\/pre>\n<p>Auch das Ergebnis erh&auml;lt nat&uuml;rlich nun zwei interessante Werte, welche die Funktion &uuml;ber die XPath-Ausdr&uuml;cke <b>RetrieveIbanAndBicResult\/Bic <\/b>und <b>RetrieveIbanAndBicResult\/Iban <\/b>aus dem Response ermittelt.<\/p>\n<p><b>BIC aus IBAN ermitteln<\/b><\/p>\n<p>Nachdem wir nun eine M&ouml;glichkeit gefunden haben, aus BLZ und Kontonummer eine IBAN zu erzeugen, k&ouml;nnen wir den umgekehrten Weg gehen. Ehrlich gesagt: Im Gegensatz zu Bankleitzahl und Kontonummer kann ich mir die IBAN immer noch nicht merken. Obwohl ja eigentlich fast die gleichen Informationen darin stecken &#8230;<\/p>\n<p>Schauen wir uns also an, wie wir die BIC aus der IBAN ermitteln. Dazu f&uuml;gen wir wieder ein paar neue Steuerelemente zum Formular <b>frmKonvertierungsfunktionen <\/b>hinzu (s. Bild 14). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_971_014.png\" alt=\"Steuerelemente f&uuml;r das Ermitteln der BIC aus der IBAN\" width=\"575\" height=\"406,1121\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Steuerelemente f&uuml;r das Ermitteln der BIC aus der IBAN<\/span><\/b><\/p>\n<p>Das Textfeld zur Eingabe der IBAN hei&szlig;t <b>txtIBAN_IBANZuBIC<\/b>, das f&uuml;r das Ergebnis, also die BIC, hei&szlig;t <b>txtBIC_IBANZuBIC<\/b>. Die Schaltfl&auml;che <b>cmdIBANZuBIC <\/b>startet die Konvertierung und sieht wie in Listing 19 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdIBANZuBIC_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strBIC<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;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!txtIBAN_IBANZuBIC)<span style=\"color:blue;\"> Then<\/span>\r\n         strBIC = RetrieveBICForIBAN(Me!txtIBAN_IBANZuBIC, strErrorCode, strErrorText)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBIC) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             Me!txtBIC_IBANZuBIC = strBIC\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"BIC konnte nicht ermittelt werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorCode _\r\n                 & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorText\r\n             Me!txtBIC_IBANZuBIC = \"\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Geben Sie einen IBAN ein.\"\r\n         Me!txtIBAN_IBANZuBIC.SetFocus\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 19: Ereignisprozedur, die beim Anklicken der Schaltfl&auml;che zum Ermitteln der BIC aus einer IBAN ausgel&ouml;st wird.<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft, ob der Benutzer f&uuml;r das Textfeld <b>txtIBAN_IBANZuBIC <\/b>einen Wert eingegeben hat, und liefert gegebenenfalls eine entsprechende Meldung.<\/p>\n<p>Liegt eine IBAN vor, ruft die Prozedur die Funktion <b>RetrieveBICForIBAN <\/b>auf und &uuml;bergibt die IBAN, aus welcher der BIC extrahiert werden soll. Verl&auml;uft der Aufruf erfolgreich, liefert diese Funktion die BIC zur&uuml;ck, anderenfalls f&uuml;llt sie die Parameter <b>strErrorCode <\/b>und <b>strErrorText <\/b>mit entsprechenden Hinweisen, welche die Ereignisprozedur dann in einem Meldungsfenster anzeigt.<\/p>\n<p>Die Funktion <b>RetrieveBICForIBAN<\/b> finden Sie in Listing 20. Die Funktion setzt folgendes XML-Element zusammen, um das dann die &uuml;brigen notwendigen Elemente positioniert werden:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RetrieveBICForIBAN(strIban<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;\"> 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>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"RetrieveBicForIban\"\r\n     strRequest = CreateSoapRequest(\"            &lt;ser:sIban&gt;\" & strIban & \"&lt;\/ser:sIban&gt;\", _\r\n         strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.selectSingleNode(\"\/\/\" & strFunction & \"Response\").XML\r\n     strErrorCode = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorCode\")\r\n     strErrorText = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorText\")\r\n     RetrieveBICForIBAN = GetXMLElement(strResponse, strFunction & \"Result\/Bic\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 20: Funktion zum Ermitteln der BIC aus einer IBAN<\/span><\/b><\/p>\n<pre>&lt;ser:sIban&gt;DE24350400380415109800 &lt;\/ser:sIban&gt;<\/pre>\n<p><b>IBAN pr&uuml;fen<\/b><\/p>\n<p>Bevor Sie mal eben schnell eine &uuml;berweisung an eine per Hand eingetippte IBAN durchf&uuml;hren, wolle Sie diese vielleicht noch schnell auf eventuelle Fehler pr&uuml;fen. W&auml;re doch schade, wenn das sch&ouml;ne Geld auf dem falschen Konto landen w&uuml;rde! Also f&uuml;gen wir unserem Formular noch einen weiteren Bereich hinzu, mit dem wir eine IBAN eingeben und diese per Knopfdruck auf Korrektheit pr&uuml;fen k&ouml;nnen. Das Textfeld f&uuml;r diesen Bereich hei&szlig;t <b>txtIbanPruefen<\/b>, die Schaltfl&auml;che, welche die Pr&uuml;fung startet, hei&szlig;t <b>cmdIBANPruefen<\/b>.<\/p>\n<p>Das Ergebnis landet diesmal nicht in einem Textfeld, sondern wird logischerweise in einem Kontrollk&auml;stchen abgebildet. Dieses hei&szlig;t <b>chkIBANOkay<\/b>. F&uuml;r die Ereignis-eigenschaft <b>Beim Klicken <\/b>der Schaltfl&auml;che <b>cmdIBANPruefen <\/b>hinterlegen Sie die Prozedur aus Listing 21.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdIBANPruefen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>bolIban<span style=\"color:blue;\"> As Boolean<\/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;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!txtIbanPruefen)<span style=\"color:blue;\"> Then<\/span>\r\n         bolIban = CheckIban(Me!txtIbanPruefen, strErrorCode, strErrorText)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strErrorCode) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             Me!chkIBANOkay = bolIban\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"IBAN konnte nicht gepr&uuml;ft werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorCode _\r\n                 & <span style=\"color:blue;\">vbCrLf<\/span> & strErrorText\r\n             Me!chkIBANOkay = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Geben Sie einen IBAN ein.\"\r\n         Me!txtIbanPruefen.SetFocus\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 21: Ereignisprozedur zum Pr&uuml;fen einer IBAN<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft, ob das Textfeld <b>txtIbanPruefen <\/b>einen Wert enth&auml;lt, und liefert eine Meldung, wenn dieses leer ist. Anderenfalls ruft sie die Funktion <b>CheckIban <\/b>auf, der sie den Wert des Textfeldes <b>txtIbanPruefen <\/b>&uuml;bermittelt. Das Ergebnis dieser Funktion ist ein <b>Boolean<\/b>-Wert, der Auskunft dar&uuml;ber gibt, ob die IBAN g&uuml;ltig ist oder nicht. Die beiden R&uuml;ckgabeparameter <b>strErrorCode <\/b>und <b>strErrorText<\/b> liefern im Falle eines Fehlers die Fehlernummer und eine Fehlerbeschreibung.<\/p>\n<p>Sollte keine Fehlermeldung zur&uuml;ckgeliefert werden, kann es nat&uuml;rlich immer noch sein, dass die IBAN nicht g&uuml;ltig ist. Die Prozedur tr&auml;gt dann den Wert der Variablen <b>bolIban <\/b>in das Kontrollk&auml;stchen <b>chkIBANOkay <\/b>ein. Die Funktion <b>CheckIban<\/b> finden Sie in Listing 22. Sie setzt wie &uuml;blich den Request zusammen und analysiert die Antwort. Das Element <b>CheckIbanResult <\/b>im <b>Response <\/b>liefert einen der beiden Werte <b>true <\/b>oder <b>false<\/b>, zum Beispiel:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CheckIban(strIban<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;\"> As Boolean<\/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>strFunction<span style=\"color:blue;\"> As String<\/span>\r\n     strFunction = \"CheckIban\"\r\n     strRequest = CreateSoapRequest(\"            &lt;ser:sIban&gt;\" & strIban & \"&lt;\/ser:sIban&gt;\", _\r\n         strFunction)\r\n     Request strRequest, objXMLResponse\r\n     strResponse = objXMLResponse.selectSingleNode(\"\/\/\" & strFunction & \"Response\").XML\r\n     strErrorCode = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorCode\")\r\n     strErrorText = GetXMLElement(strResponse, strFunction & \"Result\/Error\/ErrorText\")\r\n     CheckIban = Eval(GetXMLElement(strResponse, strFunction & \"Result\"))\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 22: Funktion zum Pr&uuml;fen einer IBAN<\/span><\/b><\/p>\n<pre>&lt;CheckIbanResponse ...&gt;\r\n   &lt;CheckIbanResult&gt;true&lt;\/CheckIbanResult&gt;\r\n&lt;\/CheckIbanResponse&gt;<\/pre>\n<p>Diesen Wert wandeln wir mithilfe der Funktion <b>Eval <\/b>in einen echten Boolean-Wert um, also <b>-1 <\/b>(<b>True<\/b>) oder <b>0 <\/b>(<b>False<\/b>).<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit den hier vorgestellten Funktionen k&ouml;nnen Sie innerhalb Ihrer eigenen Anwendungen schnell herausfinden, ob eine Bank mit dem Webservice ansprechbar ist, und dann verschiedene Konvertierungen von BLZ und Kontonummer zu IBAN und BIC vornehmen oder die G&uuml;ltigkeit einer IBAN pr&uuml;fen.<\/p>\n<p>Im zweiten Teil dieser Beitragsreihe lernen Sie die Funktionen zum Abrufen des Kontostands, zum Einlesen der Ums&auml;tze und zum Durchf&uuml;hren von &uuml;berweisungen kennen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OnlinebankingPerWebservice.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{6B39D0CB-444F-4227-8268-E051618C0CE9}\/aiu_971.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Firma B+S Banksysteme AG bietet einen Webservice f&uuml;r das Onlinebanking an. Damit k&ouml;nnen Sie einfache Aktionen durchf&uuml;hren &euro;&#8220; zum Beispiel den Kontostand ermitteln, Ums&auml;tze einlesen oder &Uuml;berweisungen t&auml;tigen. Bislang ist der Gebrauch f&uuml;r Privatpersonen kostenlos, und f&uuml;r die gesch&auml;ftliche Nutzung gibt es g&uuml;nstige Jahreslizenzen. Eine Einschr&auml;nkung ist, dass dieser Webservice aktuell nur mit Konten funktioniert, die PIN\/TAN per HBCI anbieten. Dies ist leider nicht bei allen Kreditinsituten der Fall.<\/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":[66012015,662015,44000027],"tags":[],"class_list":["post-55000971","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Onlinebanking per Webservice - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Onlinebanking per Webservice\" \/>\n<meta property=\"og:description\" content=\"Die Firma B+S Banksysteme AG bietet einen Webservice f&uuml;r das Onlinebanking an. Damit k&ouml;nnen Sie einfache Aktionen durchf&uuml;hren &euro;&quot; zum Beispiel den Kontostand ermitteln, Ums&auml;tze einlesen oder &Uuml;berweisungen t&auml;tigen. Bislang ist der Gebrauch f&uuml;r Privatpersonen kostenlos, und f&uuml;r die gesch&auml;ftliche Nutzung gibt es g&uuml;nstige Jahreslizenzen. Eine Einschr&auml;nkung ist, dass dieser Webservice aktuell nur mit Konten funktioniert, die PIN\/TAN per HBCI anbieten. Dies ist leider nicht bei allen Kreditinsituten der Fall.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:07:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907\" \/>\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=\"32\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\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Onlinebanking per Webservice\",\"datePublished\":\"2020-05-22T21:07:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/\"},\"wordCount\":4762,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ed3a8642e209473db9a40f5d6902f907\",\"articleSection\":[\"1\\\/2015\",\"2015\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/\",\"name\":\"Onlinebanking per Webservice - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ed3a8642e209473db9a40f5d6902f907\",\"datePublished\":\"2020-05-22T21:07:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ed3a8642e209473db9a40f5d6902f907\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ed3a8642e209473db9a40f5d6902f907\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Onlinebanking_per_Webservice\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Onlinebanking per Webservice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Onlinebanking per Webservice - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/","og_locale":"de_DE","og_type":"article","og_title":"Onlinebanking per Webservice","og_description":"Die Firma B+S Banksysteme AG bietet einen Webservice f&uuml;r das Onlinebanking an. Damit k&ouml;nnen Sie einfache Aktionen durchf&uuml;hren &euro;\" zum Beispiel den Kontostand ermitteln, Ums&auml;tze einlesen oder &Uuml;berweisungen t&auml;tigen. Bislang ist der Gebrauch f&uuml;r Privatpersonen kostenlos, und f&uuml;r die gesch&auml;ftliche Nutzung gibt es g&uuml;nstige Jahreslizenzen. Eine Einschr&auml;nkung ist, dass dieser Webservice aktuell nur mit Konten funktioniert, die PIN\/TAN per HBCI anbieten. Dies ist leider nicht bei allen Kreditinsituten der Fall.","og_url":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:07:03+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"32\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Onlinebanking per Webservice","datePublished":"2020-05-22T21:07:03+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/"},"wordCount":4762,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907","articleSection":["1\/2015","2015","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/","url":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/","name":"Onlinebanking per Webservice - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907","datePublished":"2020-05-22T21:07:03+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/ed3a8642e209473db9a40f5d6902f907"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Onlinebanking_per_Webservice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Onlinebanking per Webservice"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000971","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=55000971"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000971\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}