{"id":55001544,"date":"2025-04-01T00:00:00","date_gmt":"2025-03-05T17:29:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1544"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Lastschriften_mit_DDBAC_und_VBA","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/","title":{"rendered":"Lastschriften mit DDBAC und VBA"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8\" width=\"1\" height=\"1\" alt=\"\"><b>Das Anlegen von Lastschriften ist eine wichtige Funktion, wenn man Kunden neben Zahlungsarten wie Rechnung, PayPal, Kreditkarte et cetera auch noch die M&ouml;glichkeit geben m&ouml;chte, die Bankverbindung anzugeben, um den Betrag zum F&auml;lligkeitsdatum einfach abbuchen zu lassen. Das ist gerade f&uuml;r wiederkehrende Leistungen wie Abonnements praktisch. Dazu sind jedoch erstens einige Voraussetzungen zu erf&uuml;llen wie zum Beispiel das Aktivieren der M&ouml;glichkeiten zum Einziehen von Lastschriften und das Beantragen einer sogenannten Gl&auml;ubiger-Identifikationsnummer. Schlie&szlig;lich ben&ouml;tigen wir noch den passenden VBA-Code. Allein damit kommen wir aber nicht aus: Wenn wir gem&uuml;tlich von unserer Datenbankanwendung aus Lastschriften anlegen wollen, ben&ouml;tigen wir eine zus&auml;tzliche Bibliothek. Dabei handelt es sich um die in vielen Anwendungen verwendete DDBAC-Bibliothek. Wie wir die einzelnen Schritte erledigen, um unsere Anwendung zum Anlegen von Lastschriften verwenden zu k&ouml;nnen, zeigen wir in diesem Beitrag.<\/b><\/p>\n<h2>Hinweis<\/h2>\n<p>Zum Umsetzen der Beispiele aus diesem Beitrag ist eine kostenpflichtige Lizenz der DDBAC-Komponenten Voraussetzung. Sie erhalten diese auf der folgenden Webseite:<\/p>\n<pre>https:\/\/www.andreminhorst.de\/ddbac<\/pre>\n<h2>Ben&ouml;tigte Informationen f&uuml;r eine Lastschrift<\/h2>\n<p>F&uuml;r eine SEPA-Lastschrift ben&ouml;tigen wir diese Informationen:<\/p>\n<ul>\n<li>Daten des Zahlungspflichtigen (Zahlungsempf&auml;ngers)<\/li>\n<li>Name und Adresse des Kontoinhabers<\/li>\n<li>IBAN des Kontos<\/li>\n<li>BIC (bei internationalen Lastschriften au&szlig;erhalb des SEPA-Raums)<\/li>\n<li>Gl&auml;ubiger-Identifikationsnummer (CID): Wird von der Bundesbank oder der jeweiligen nationalen Zentralbank vergeben und kennzeichnet den Zahlungsempf&auml;nger eindeutig.<\/li>\n<li>Mandatsreferenz: Eindeutige Nummer, die das Mandat identifiziert. Wird vom Zahlungsempf&auml;nger vergeben und muss einmalig sein.<\/li>\n<li>Mandatserteilung: Schriftliches oder elektronisches SEPA-Lastschriftmandat. Enth&auml;lt Erlaubnis zur Abbuchung vom Konto des Zahlungspflichtigen und muss vom Zahlungspflichtigen unterschrieben werden.<\/li>\n<\/ul>\n<p>Au&szlig;erdem ben&ouml;tigen wir folgende Angaben: <\/p>\n<ul>\n<li>Betrag der Abbuchung<\/li>\n<li>F&auml;lligkeitsdatum (Einzugstermin)<\/li>\n<li>Verwendungszweck (z. B. Rechnungsnummer)<\/li>\n<li>Wiederkehrende oder einmalige Lastschrift<\/li>\n<\/ul>\n<p>Zus&auml;tzliche Anforderungen:<\/p>\n<ul>\n<li>Pre-Notification: Der Zahlungspflichtige muss mindestens 14 Tage vor Abbuchung &uuml;ber den Einzug informiert werden (es sei denn, eine k&uuml;rzere Frist wurde vereinbart)<\/li>\n<\/ul>\n<h2>Schritt f&uuml;r Schritt<\/h2>\n<p>Wie bereits eingangs erw&auml;hnt, sind einige Schritte n&ouml;tig, die wir uns in der folgenden Reihenfolge ansehen:<\/p>\n<ul>\n<li>Aktivieren der Lastschrift-Funktionen f&uuml;r das Bankkonto<\/li>\n<li>Beantragen einer Gl&auml;ubiger-Identifikationsnummer<\/li>\n<li>Beantragen einer Registrierungsnummer f&uuml;r Onlinebanking<\/li>\n<li>Holen der DDBAC-Komponenten<\/li>\n<li>Holen des Lastschrift-Mandats<\/li>\n<li>Herstellen einer Verbindung per Onlinebanking<\/li>\n<li>Programmieren der Lastschrift-Funktionen<\/li>\n<\/ul>\n<h2>Aktivieren der Lastschrift-Funktionen f&uuml;r das Bankkonto<\/h2>\n<p>Ein Bankkonto ist normalerweise nicht f&uuml;r den Einsatz von Lastschriften vorgesehen. Dies m&uuml;ssen wir zuerst aktivieren. In meinem Fall reichte es aus, meinen Ansprechpartner bei der Bank anzurufen und ihn zu bitten, dies einzurichten. Man muss dazu ein, zwei Formulare ausf&uuml;llen. Der Hintergrund ist, dass es bei einer Lastschrift nicht sichergestellt ist, dass das Geld auch auf dem Konto verbleibt. Der Kunde hat immer die M&ouml;glichkeit, eine Lastschrift zur&uuml;ckzuholen. Die Aktivierung von Lastschriften ging in unserem Fall recht schnell &#8211; es h&auml;ngt aber von der jeweiligen Bank ab.<\/p>\n<h2>Beantragen einer Gl&auml;ubiger-Identifikationsnummer<\/h2>\n<p>Wie oben beschreiben, ben&ouml;tigen wir auch eine Gl&auml;ubiger-Identifikationsnummer. Diese k&ouml;nnen wir bei der Deutschen Bundesbank beantragen. Die Startseite dort sieht beispielsweise wie in Bild 1 aus. Der Vorgang ist hier gut dokumentiert und es sind keine weiteren Voraussetzungen zu erf&uuml;llen, um diese ID zu erhalten. Der Erhalt sollte in der Regel innerhalb eines Werktages zu bewerkstelligen sein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_001.png\" alt=\"Start der Beantragung einer Gl&auml;ubiger-Identifikationsnummer\" width=\"700\" height=\"451,6308\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Start der Beantragung einer Gl&auml;ubiger-Identifikationsnummer<\/span><\/b><\/p>\n<p>Wem dies zu lange dauert, der kann auch eine Gl&auml;ubiger-Identifikationsnummer zum Testen holen. Diese finden wir auf der Seite mit den h&auml;ufig gestellten Fragen zu der Gl&auml;ubiger-Identifikationsnummer.<\/p>\n<p>Die Test-ID lautet: <b>DE98ZZZ09999999999<\/b><\/p>\n<h2>Beantragen einer Registrierungsnummer f&uuml;r Onlinebanking <\/h2>\n<p>Wer mit Komponenten wie den DDBAC-Komponenten Onlinebanking betreiben m&ouml;chte, ben&ouml;tigt dazu eine eigene Registrierungsnummer.<\/p>\n<p>Diese kann hier beantragt werden (siehe Bild 2):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_002.png\" alt=\"Seite zum Registrieren einer FinTS-Nummer\" width=\"700\" height=\"447,9274\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Seite zum Registrieren einer FinTS-Nummer<\/span><\/b><\/p>\n<pre>https:\/\/www.fints.org\/de\/hersteller\/produktregistrierung<\/pre>\n<p>Hier finden wir unter dem Link <b>Registrierungsprozess <\/b>ein Formular, in das wir die notwendigen Informationen eintragen k&ouml;nnen.<\/p>\n<p>Die Vergabe dieser Nummer dauerte bei uns einige Tage, aber wir wissen nicht, wie schnell der Prozess aktuell durchgef&uuml;hrt wird.<\/p>\n<p>Diese Nummer machen wir im VBA-Projekt beispielsweise &uuml;ber eine wie folgt angelegte Konstante verf&uuml;gbar:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cstrFints<span style=\"color:blue;\"> As String<\/span> = \"XXXXXXXXXXXXXXXXXXXXX\"<\/pre>\n<h2>Holen der DDBAC-Komponenten<\/h2>\n<p>Schlie&szlig;lich ben&ouml;tigen wir die kostenpflichtigen DDBAC-Komponenten. Diese finden wir auf der folgenden Webseite:<\/p>\n<pre>https:\/\/www.andreminhorst.de\/ddbac<\/pre>\n<h2>Installieren der DDBAC-Komponenten<\/h2>\n<p>Im Download der DDBAC-Komponenten befinden sich zwei Zip-Dateien. Wir installieren die aus der Zipdatei <b>DDBACNetWrapper-Version-x-x-x-x.zip<\/b>.<\/p>\n<p>Hier finden wir wiederum drei Verzeichnisse, von denen wir das Verzeichnis <b>DDBACWrapper <\/b>ausw&auml;hlen. Hier installieren wir abh&auml;ngig davon, ob das installierte Windows 32-Bit oder 64-Bit verwendet, die Datei <b>DDBACSetup.msi <\/b>oder <b>DDBACSetupx64.msi<\/b>.<\/p>\n<p>Die meisten Windows-Versionen haben derzeit 64-Bit.<\/p>\n<h2>Holen des Lastschrift-Mandats<\/h2>\n<p>Ein sehr wichtiger Faktor ist, dass wir von dem Kunden, von dem wir Geld per Lastschrift einziehen wollen, ein Lastschriftmandat erhalten m&uuml;ssen. Zu beschreiben, wie dieser Vorgang abl&auml;uft, w&uuml;rde hier den Rahmen sprengen.  Wichtig ist jedoch, dass die Lastschrift mit Zustimmung des Kunden geschieht.<\/p>\n<h2>Herstellen einer Verbindung per Onlinebanking<\/h2>\n<p>Wenn die Onlinebanking-Komponenten installiert sind, ben&ouml;tigen wir vor dem eigentlichen Programmieren erst einmal eine Verbindung zum Bankserver.<\/p>\n<p>Dazu starten wir eine Anwendung, die wir in der Systemsteuerung unter dem Namen <b>Homebanking Administrator (32-Bit) <\/b>finden (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_003.png\" alt=\"Anlegen eines neuen Banking-Kontakts\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen eines neuen Banking-Kontakts<\/span><\/b><\/p>\n<p>Hier klicken wir auf die Schaltfl&auml;che <b>Neu&#8230; <\/b>und finden einen weiteren Dialog namens <b>HBCI\/FinTS-Kontakt <\/b>vor. Hier geben wir beispielsweise die Bankleitzahl oder den Banknamen ein, um die Bank zu finden. Nachdem wir die Bank ausgew&auml;hlt haben, klicken wir auf <b>Weiter<\/b> (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_004.png\" alt=\"Auswahl der Bank\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Auswahl der Bank<\/span><\/b><\/p>\n<p>Das Programm ermittelt dann die verf&uuml;gbaren Zugangsdaten (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_005.png\" alt=\"Ermitteln der Zugangsdaten\" width=\"424,5589\" height=\"430,4283\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ermitteln der Zugangsdaten<\/span><\/b><\/p>\n<p>Die verf&uuml;gbaren Zugangsarten erscheinen dann im folgenden Dialog zur Auswahl. Hier w&auml;hlt man in der Regel <b>PIN\/TAN<\/b>, was &uuml;blicherweise auch alle aktuellen Zugangsarten wie <b>photoTan <\/b>abdeckt (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_006.png\" alt=\"Auswahl der Zugangsart\" width=\"424,5589\" height=\"430,4283\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Auswahl der Zugangsart<\/span><\/b><\/p>\n<p>Anschlie&szlig;end m&uuml;ssen wir den Benutzernamen beziehungsweise die Teilnehmernummer eingeben. Das ist die gleiche Nummer, unter der Sie sich vermutlich auch beim Onlinebanking anmelden (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_007.png\" alt=\"Angabe der Teilnehmernummer\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Angabe der Teilnehmernummer<\/span><\/b><\/p>\n<p>Schlie&szlig;lich ben&ouml;tigen wir zum Synchronisieren mit diesem Bankkontakt noch die Eingabe der PIN (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_008.png\" alt=\"Eingabe des PIN\" width=\"424,5589\" height=\"430,4283\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Eingabe des PIN<\/span><\/b><\/p>\n<p>Danach folgen je nach Bank und Zugangsart noch weitere Abfragen beispielsweise zum Sicherheitsverfahren. Abschlie&szlig;end erhalten wir die Meldung &uuml;ber die erfolgreiche Synchronisierung (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_009.png\" alt=\"Erfolgsmeldung\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erfolgsmeldung<\/span><\/b><\/p>\n<p>Damit liegen die grundlegenden Daten nun auf dem aktuellen Rechner und wir k&ouml;nnen von Access aus per VBA auf die Informationen nicht nur des Bank Kontakts, sondern auch auf die darin enthaltenen Bankverbindungen zugreifen.<\/p>\n<h2>Bank Kontakt und Konten einsehen<\/h2>\n<p>Bleiben wir noch kurz im <b>Administrator f&uuml;r Homebanking Kontakte<\/b> und schauen uns an, wie wir die Konten zu diesem Kontakt einsehen k&ouml;nnen. Dazu klicken wir auf den Banking Kontakt und dann auf die Schaltfl&auml;che <b>Bearbeiten<\/b> (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_010.png\" alt=\"Der neue Banking Kontakt in der Liste der Kontakte\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Der neue Banking Kontakt in der Liste der Kontakte<\/span><\/b><\/p>\n<p>Dies &ouml;ffnet einen weiteren Dialog (siehe Bild 11). Hier finden wir neben einigen anderen M&ouml;glichkeiten, unseren Banking Kontakt zu bearbeiten, auch den Link <b>Konten verwalten<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_011.png\" alt=\"Bearbeiten eines Banking Kontakts\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Bearbeiten eines Banking Kontakts<\/span><\/b><\/p>\n<p>Wenn wir diesen anklicken, landen wir auf einer weiteren Seite, die uns alle Konten anzeigt, die mit diesem Banking Kontakt verkn&uuml;pft sind (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_012.png\" alt=\"Dialog zum Verwalten der Konten\" width=\"424,5589\" height=\"430,4283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Dialog zum Verwalten der Konten<\/span><\/b><\/p>\n<h2>Programmieren der Lastschrift-Funktionen<\/h2>\n<p>Damit kommen wir zum eigentlichen Thema dieses Beitrags, n&auml;mlich dem Programmieren der Lastschrift.<\/p>\n<p>Dazu wechseln wir in unserer Beispieldatenbank als Erstes zum VBA-Editor und f&uuml;gen einen Verweis auf die ben&ouml;tigte Bibliothek der DDBAC-Komponenten hinzu.<\/p>\n<p>Dabei handelt es sich um den Eintrag <b>DataDesign DDBAC FinTS 4.0<\/b> (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_013.png\" alt=\"Verweis auf die DDBAC-Komponente\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Verweis auf die DDBAC-Komponente<\/span><\/b><\/p>\n<h2>Unterschiede zwischen SEPA-Basislastschrift und SEPA-Firmenlastschrift<\/h2>\n<p>F&uuml;r SEPA-Lastschriften gibt es zwei Verfahren: die SEPA-Basislastschrift und die SEPA-Firmenlastschrift.<\/p>\n<ul>\n<li>Die SEPA-Basislastschrift (<b>CORE<\/b>) kann sowohl von Verbrauchern als auch Unternehmen genutzt werden. Nach einer Belastung hat der Zahler die M&ouml;glichkeit, die Lastschrift innerhalb von acht Wochen ohne Angabe von Gr&uuml;nden zur&uuml;ckzugeben. Die Buchung wird dabei r&uuml;ckg&auml;ngig gemacht.<\/li>\n<li>Die SEPA-Firmenlastschrift (<b>B2B<\/b>) ist ausschlie&szlig;lich f&uuml;r Gesch&auml;ftskunden (Nicht-Verbraucher) vorgesehen und dient als zus&auml;tzliches Verfahren zur Vereinfachung der gesch&auml;ftlichen Zahlungsabwicklung. Im Gegensatz zur Basislastschrift besteht bei der Firmenlastschrift keine M&ouml;glichkeit zur R&uuml;ckgabe der Lastschrift.<\/li>\n<\/ul>\n<p>Unabh&auml;ngig vom Verfahren kann eine nicht autorisierte Lastschrift &#8211; also ein Lastschrifteinzug ohne g&uuml;ltiges Mandat &#8211; innerhalb von 13 Monaten nach der Kontobelastung vom Zahler zur&uuml;ckgegeben werden.<\/p>\n<h2>Banking Kontakte und Accounts in Access einlesen<\/h2>\n<p>Damit wir von Access aus per VBA Lastschriften einreichen k&ouml;nnen, m&uuml;ssen wir auf die entsprechenden Banking Kontakte und die darin enthaltenen Konten zugreifen k&ouml;nnen.<\/p>\n<p>Dabei handelt es sich um die Informationen, die wir soeben bereits &uuml;ber die Anwendung <b>Homebanking Administrator <\/b>in der Systemsteuerung hinterlegt haben.<\/p>\n<p>Die Banking Kontakte wollen wir in einem Formular in ein Kombinationsfeld einlesen. Der Benutzer kann dann einen der Eintr&auml;ge ausw&auml;hlen.<\/p>\n<p>Nachdem dies geschehen ist, sollen die Accounts, also die Konten, dieses Banking Kontakts in einem zweiten Auswahlfeld bereitgestellt werden. Hat der Benutzer auch hier einen Wert selektiert, haben wir schon einmal die Informationen zu dem Konto, zu dessen Gunsten die Lastschrift ausfallen soll.<\/p>\n<h2>Formular anlegen<\/h2>\n<p>Dazu legen wir als Erstes ein neues, leeres Formular an. Diesem f&uuml;gen wir ein Kombinationsfeld namens <b>cboBankingkontakte <\/b>f&uuml;r die Banking Kontakte hinzu und ein weiteres Kombinationsfeld namens <b>cboAccounts <\/b>f&uuml;r die Konten.<\/p>\n<p>F&uuml;r beide Kombinationsfelder stellen wir die Eigenschaft <b>Datensatzherkunft <\/b>auf den Eintrag <b>Wertliste <\/b>ein (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_014.png\" alt=\"Formular zur Auswahl der Banking Kontakte und Accounts\" width=\"649,559\" height=\"538,7815\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Formular zur Auswahl der Banking Kontakte und Accounts<\/span><\/b><\/p>\n<h2>Banking Kontakte f&uuml;llen<\/h2>\n<p>Beim F&uuml;llen der Banking Kontakte wollen wir direkt ber&uuml;cksichtigen, ob diese &uuml;berhaupt das Hinzuf&uuml;gen von Lastschriften erlauben.<\/p>\n<p>Dies k&ouml;nnen wir ebenfalls aus den Informationen abfragen, die f&uuml;r unsere Banking Kontakte gespeichert wurden.<\/p>\n<p>Dazu nutzen wir die Funktion <b>getContacts <\/b>aus Listing 1. F&uuml;r die Liste der Bankkontakte stellen wir eine Variable namens <b>m_Contacts <\/b>bereit, in der wir die Kontakte tempor&auml;r speichern. Diese deklarieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetContacts(<span style=\"color:blue;\">Optional<\/span> bolReset<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As <\/span>BACContacts\r\n     <span style=\"color:blue;\">If <\/span>m_Contacts Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> m_Contacts = <span style=\"color:blue;\">New<\/span> BACContacts\r\n         m_Contacts.Populate \"\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolReset = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             m_Contacts.Populate \"\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n     For Each objContact In m_Contacts\r\n         objContact.Fields(\"ProductName\") = cstrFints\r\n         objContact.Fields(\"Produktbezeichnung\") = cstrFints\r\n     <span style=\"color:blue;\">Next<\/span> objContact\r\n     <span style=\"color:blue;\">Set<\/span> GetContacts = m_Contacts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einlesen aller Kontakte<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Contacts<span style=\"color:blue;\"> As <\/span>BACContacts<\/pre>\n<p>Die Funktion <b>GetContacts <\/b>pr&uuml;ft, ob <b>m_Contacts <\/b>bereits eingelesen wurde. Falls nicht, f&uuml;llen wir es mit einer neuen Instanz der Klasse <b>BACContacts <\/b>und rufen ihre <b>Populate<\/b>-Methode auf.<\/p>\n<p>Sollte <b>m_Contacts <\/b>bereits gef&uuml;llt sein, wird es einfach als Datenquelle verwendet &#8211; au&szlig;er in dem Fall, dass wir den Parameter <b>bolReset <\/b>der Funktion auf den Wert <b>True <\/b>einstellen.<\/p>\n<p>Dann rufen wir auch in diesem Fall die <b>Populate<\/b>-Methode auf, um <b>m_Contacts <\/b>erneut zu f&uuml;llen.<\/p>\n<p>Nun deklarieren wir eine Variable namens <b>objContact <\/b>mit dem Datentyp <b>BACContact<\/b>. Diesen verwenden wir als Laufvariable f&uuml;r die folgende <b>For Each<\/b>-Schleife, in der wir alle Elemente der Auflistung aus <b>m_Contacts <\/b>durchlaufen.<\/p>\n<p>Anschlie&szlig;end weisen wir den Feldern <b>ProductName <\/b>und <b>Produktbezeichnung <\/b>den FinTS-Registrierungsschl&uuml;ssel zu und geben den Inhalt von <b>m_Contacts <\/b>an die aufrufende Prozedur zur&uuml;ck.<\/p>\n<p>Zum Testen k&ouml;nnen wir die folgende Prozedur verwenden:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_GetContacts()\r\n     <span style=\"color:blue;\">Dim <\/span>objContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n     For Each objContact In GetContacts\r\n         <span style=\"color:blue;\">Debug.Print<\/span> objContact.BankCode, objContact.UserID\r\n     <span style=\"color:blue;\">Next<\/span> objContact\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies gibt beispielsweise die Bankleitzahl und die Benutzerkennung f&uuml;r diesen Banking Kontakt im Direktbereich aus.<\/p>\n<h2>Banking Kontakte unter Ber&uuml;cksichtigung der Verf&uuml;gbarkeit einer Funktion holen<\/h2>\n<p>Wir wollen im Kombinationsfeld zur Anzeige der Banking Kontakte auch gleich anzeigen, ob der jeweilige Kontakt &uuml;berhaupt die M&ouml;glichkeit bietet, Lastschriften anzulegen. Manchen Banken bieten diese Funktion grunds&auml;tzlich nicht an.<\/p>\n<p>Dazu f&uuml;gen wir die Funktion <b>GetContactListWithFeature <\/b>hinzu, mit der wir das Segment, also die Funktion, angeben, auf die wir den Banking Kontakt untersuchen wollen (siehe Listing 2). Au&szlig;erdem &uuml;bergeben wir auch hier den Parameter <b>bolReset<\/b>, um gegebenenfalls die Kontakte neu einlesen zu k&ouml;nnen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetContactListWithFeature(strSegment<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolReset<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n     <span style=\"color:blue;\">Dim <\/span>strContacts<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolFeature<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objContacts<span style=\"color:blue;\"> As <\/span>BACContacts\r\n     <span style=\"color:blue;\">Set<\/span> objContacts = GetContacts(bolReset)\r\n     For i = 0 To objContacts.Count - 1\r\n         <span style=\"color:blue;\">Set<\/span> objContact = objContacts.Item(i)\r\n         <span style=\"color:blue;\">If <\/span>BACBPDSegmentVorhanden(objContact, strSegment)<span style=\"color:blue;\"> Then<\/span>\r\n             bolFeature = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             bolFeature = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strContacts = strContacts & i & \";\" & objContact.UserID & \";\" _\r\n             & objContact.BankCode & \";\" _\r\n             & IIf(bolFeature = True, \"[x] \", \"[-] \") _\r\n             & objContact(\"Contact\") _\r\n             & \"|\" & objContact.BankCode _\r\n             & \"|\" & objContact.UserID & \";\"\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     GetContactListWithFeature = strContacts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Einlesen der Kontaktlisten f&uuml;r ein bestimmtes Feature<\/span><\/b><\/p>\n<p>Hier legen wir erneut eine Variable des Typs <b>BACContact<\/b> namens <b>objContact <\/b>an, mit der wir die Kontakte aus <b>objContacts <\/b>(Datentyp <b>BACContacts<\/b>) durchlaufen. <b>objContacts <\/b>f&uuml;llen wir mit der oben beschriebenen Funktion <b>GetContacts<\/b>.<\/p>\n<p>Dann durchlaufen wir alle Elemente in einer <b>For&#8230;Next<\/b>-Schleife von <b>0 <\/b>bis zur Anzahl der Elemente minus eins. Hier nutzen wir eine <b>For&#8230;Next<\/b>-Schleife statt einer <b>For Each<\/b>-Schleife, weil wir den Index des aktuellen Elements ben&ouml;tigen.<\/p>\n<p>Innerhalb der Schleife weisen wir den aktuellen Kontakt der Variablen <b>objContact <\/b>zu. Dann rufen wir die Funktion <b>BACPDSegmentVorhanden <\/b>auf und &uuml;bergeben dieser mit <b>objContact <\/b>den Kontakt und mit <b>strSegment <\/b>das zu untersuchende Segment. Liefert diese Funktion den Wert <b>True <\/b>zur&uuml;ck, stellen wir die Variable <b>bolFeature <\/b>auf den Wert <b>True <\/b>ein &#8211; anderenfalls auf <b>False<\/b>.<\/p>\n<p>Nun stellen wir in der Variablen <b>strContacts <\/b>eine per Semikola separierte Liste mit verschiedenen Informationen zusammen. Diese enth&auml;lt den Wert der Z&auml;hlervariablen <b>i<\/b>, die Felder <b>UserID <\/b>und <b>BankCode <\/b>des Kontakts und einen aus diesen Informationen zusammengestellten Ausdruck. Das Ergebnis wird schlie&szlig;lich an die aufrufende Routine zur&uuml;ckgegeben und sieht beispielsweise wie folgt aus:<\/p>\n<pre>0;735160;70000997;[x] B+S Banksysteme Demobank FinTS3|70000997|735160;<\/pre>\n<h2>Funktionen eines Banking Kontakts ermitteln<\/h2>\n<p>Die Funktion <b>BACBPDSegmentVorhanden <\/b>erwartet einen Verweis auf den zu untersuchenden Banking Kontakt sowie das zu pr&uuml;fende Segment als Parameter (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BACBPDSegmentVorhanden(objContact<span style=\"color:blue;\"> As <\/span>BACContact, strSegment<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSegment<span style=\"color:blue;\"> As Integer<\/span>\r\n     intSegment = objContact.BankData.Segments.FindSegmentType(strSegment)\r\n     <span style=\"color:blue;\">If <\/span>intSegment = -1<span style=\"color:blue;\"> Then<\/span>\r\n         BACBPDSegmentVorhanden = <span style=\"color:blue;\">True<\/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 3: Pr&uuml;fen, ob ein Banking Kontakt eine bestimmte Funktion aufweist<\/span><\/b><\/p>\n<p>Woher wissen wir, welche Funktion welche Segmentzeichenkette verwendet? Zum Beispiel f&uuml;r das Abfragen von Ums&auml;tzen oder Kontost&auml;nden oder zum Durchf&uuml;hren von &Uuml;berweisungen oder zum Anlegen von Lastschriften? <\/p>\n<p>Dies erfahren wir aus der Datei <b>FinTS Segmente.html<\/b>, die wir nach dem Installieren der DDBAC-Komponenten etwa im Verzeichnis <b>C:\\Program Files (x86)\\DataDesign\\DDBACSDK <\/b>vorfinden.<\/p>\n<p>Hier k&ouml;nnen wir beispielsweise nach Lastschrift einreichen suchen.<\/p>\n<p>Die Eintr&auml;ge mit <b>HI&#8230; <\/b>sind jeweils die Antworten, die mit <b>HK&#8230; <\/b>sind die zum Einreichen von Auftr&auml;gen.<\/p>\n<p>F&uuml;r das Einreichen einer terminierten SEPA Lastschrift verwenden wir also beispielsweise das Segment <b>HKDSE <\/b>(siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_015.png\" alt=\"Ermitteln des Segments f&uuml;r eine SEPA Lastschrift\" width=\"649,559\" height=\"365,2813\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Ermitteln des Segments f&uuml;r eine SEPA Lastschrift<\/span><\/b><\/p>\n<p>Dieses untersuchen wir in der Funktion mit <b>objContact.BankData.Segments.FindSegmentType(strSegment)<\/b>. Hier erhalten wir entweder den Wert <b>True <\/b>oder <b>False <\/b>als Ergebnis und dieses geben wir auch als Funktionswert zur&uuml;ck.<\/p>\n<p>Hier sind einige verschiedene Lastschriftsegmente:<\/p>\n<ul>\n<li><b>HKBDS<\/b>: SEPA Firmeneinzellastschrift einreichen<\/li>\n<li><b>HKBME<\/b>: Terminierte SEPA Firmensammellastschrift einreichen<\/li>\n<li><b>HKBSE<\/b>: Terminierte SEPA Firmeneinzellastschrift einreichen<\/li>\n<li><b>HKDME<\/b>: Terminierte SEPA-Sammellastschrift einreichen<\/li>\n<li><b>HKDSE<\/b>: Terminierte SEPA Lastschrift einreichen<\/li>\n<li><b>HKSLE<\/b>: Terminierte Sammellastschrift einreichen<\/li>\n<li><b>HKTEE<\/b>: Terminierte Einzellastschrift einreichen<\/li>\n<\/ul>\n<p>Weiter unten in diesem Dokument finden wir die entsprechenden Parameter, die wir sp&auml;ter beschreiben.<\/p>\n<h2>Accounts auslesen<\/h2>\n<p>Auf &auml;hnliche Weise wollen wir nun die Daten f&uuml;r das zweite Kombinationsfeld laden. <\/p>\n<p>Dazu verwenden wir zun&auml;chst eine Funktion namens <b>GetAccounts<\/b>, die uns alle Accounts f&uuml;r einen bestimmten Banking Kontakt holt. Den Banking Kontakt ermitteln wir &uuml;ber den Index, den dieser in der Anwendung in der Systemsteuerung aufweist (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetAccounts(intContact<span style=\"color:blue;\"> As Integer<\/span>)<span style=\"color:blue;\"> As <\/span>BACAccounts\r\n     <span style=\"color:blue;\">Dim <\/span>objContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n     <span style=\"color:blue;\">Set<\/span> objContact = GetContacts.Item(intContact)\r\n     <span style=\"color:blue;\">Set<\/span> GetAccounts = objContact.Accounts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Einlesen der Accounts<\/span><\/b><\/p>\n<p>Zun&auml;chst wird die Variable namens BACContact deklariert, die wir &uuml;ber <b>GetContacts.Item(intContact) <\/b>f&uuml;llen. Die Funktion <b>GetContacts <\/b>haben wir oben bereits beschrieben. F&uuml;r diesen Banking Kontakt gibt die Funktion die <b>Accounts<\/b>-Auflistung als Ergebnis zur&uuml;ck.<\/p>\n<p>&Auml;hnlich wie bei den Banking Kontakten verwenden wir auch f&uuml;r die Accounts eine Funktion, die uns die wichtigsten Informationen zum jeweiligen Account in einer Liste zusammenstellt (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetAccountList(intContact<span style=\"color:blue;\"> As Integer<\/span>, <span style=\"color:blue;\">Optional<\/span> bolSepa<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objAccount<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     <span style=\"color:blue;\">Dim <\/span>strAccounts<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     For Each objAccount In GetAccounts(intContact)\r\n         <span style=\"color:blue;\">If <\/span>bolSepa = <span style=\"color:blue;\">False<\/span> Or (bolSepa = <span style=\"color:blue;\">True<\/span> And objAccount.IsSepa)<span style=\"color:blue;\"> Then<\/span>\r\n             strAccounts = strAccounts & i & \";\" _\r\n                 & objAccount.AccountNumber & \";\" _\r\n                 & objAccount.BIC & \";\" & objAccount.IBAN & \";\" _\r\n                 & objAccount.AccountNumber _\r\n                 & \"|\" & objAccount.AcctName & \";\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         i = i + 1\r\n     <span style=\"color:blue;\">Next<\/span> objAccount\r\n     GetAccountList = strAccounts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Erstellen einer Liste aus den Accounts<\/span><\/b><\/p>\n<p>Diese hei&szlig;t <b>GetAccountList <\/b>und erwartet ebenfalls den Index des zu untersuchenden Banking Kontakts als Parameter.<\/p>\n<p>Mit dem zweiten Parameter <b>bolSepa <\/b>k&ouml;nnen wir angeben, ob wir nur SEPA-Konten zur&uuml;ckgeliefert bekommen wollen.<\/p>\n<p>Die Funktion durchl&auml;uft alle <b>BACAccount<\/b>-Eintr&auml;ge der mit <b>GetAccounts <\/b>geholten Elemente in einer <b>For Each<\/b>-Schleife.<\/p>\n<p>Falls <b>bolSepa <\/b>den Wert <b>False <\/b>hat oder falls <b>bolSepa <\/b>den Wert <b>True <\/b>hat und die Eigenschaft <b>IsSepa <\/b>des aktuellen Elements auch <b>True <\/b>ist, f&uuml;gen wir die Eigenschaften des Accounts zur Variablen <b>strAccounts <\/b>hinzu.<\/p>\n<p>Dazu geh&ouml;ren der Index <b>i<\/b>, die Kontonummer (<b>AccountNumber<\/b>), die BIC, die IBAN und nochmal alle wichtigen Informationen in einem Feld zur Anzeige.<\/p>\n<p>Zum Testen dieser Funktion k&ouml;nnen wir folgende Prozedur nutzen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_GetAccountList()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> GetAccountList(1)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r das Testkonto der DDBAC-Hersteller finden wir dann folgende Ausgabe im Direktbereich:<\/p>\n<pre>0;1000735160;DDBADEMM002;DE43700009971000735160;1000735160|Girokonto;1;2000735160;DDBADEMM002;DE95700009972000735160;2000735160|Girokonto (verz&ouml;gert);2;9000735160;DDBADEMM002;DE71700009979000735160;9000735160|Depot;<\/pre>\n<h2>Tabelle zum Speichern der zuletzt verwendeten Daten<\/h2>\n<p>Wenn wir mehrere Banking Kontakte und Accounts haben, wollen wir nach der Benutzung daf&uuml;r sorgen, dass die zuletzt verwendete Kombination gespeichert und beim n&auml;chsten &Ouml;ffnen wiederhergestellt wird. Deshalb legen wir eine Tabelle wie in Bild 16 in der Datenbank an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_016.png\" alt=\"Die Tabelle tblOptionen\" width=\"424,5589\" height=\"152,5602\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Die Tabelle tblOptionen<\/span><\/b><\/p>\n<p>Die beiden Felder <b>LetzterBankkontakt <\/b>und <b>LetztesKonto<\/b> speichern die Indizes der zuletzt verwendeten Eintr&auml;ge.<\/p>\n<h2>Bankdaten beim Laden ins Kombinationsfeld schreiben<\/h2>\n<p>Bevor wir uns die Prozedur ansehen, mit der wir die Banking Kontakte und die Accounts in die Kombinationsfelder laden, erweitern wir das Formular noch um zwei Steuerelemente namens <b>txtIBAN <\/b>und <b>txtBIC<\/b>, die wir mit den entsprechenden Daten des ausgew&auml;hlten Kontos f&uuml;llen.<\/p>\n<p>Au&szlig;erdem stellen wir noch die Eigenschaften der Kombinationsfelder ein. Die Eigenschaft <b>Herkunftsart <\/b>haben wir bereits auf <b>Wertliste <\/b>eingestellt. F&uuml;r <b>cboBankingKontakte <\/b>stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>4 <\/b>und die Eigenschaft <b>Spaltenbreiten <\/b>auf <b>0cm;0cm;0cm <\/b>ein.<\/p>\n<p>F&uuml;r <b>cboAccounts <\/b>legen wir <b>Spaltenanzahl <\/b>auf <b>5 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm;0cm;0cm;0cm <\/b>fest. Dies sieht nun wie in Bild 17 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_017.png\" alt=\"Einstellen der Kombinationsfeld-Eigenschaften\" width=\"499,5589\" height=\"427,9375\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Einstellen der Kombinationsfeld-Eigenschaften<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen wir die Prozedur anlegen, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Diese finden wir in Listing 6.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intLastContact<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLastAccount<span style=\"color:blue;\"> As Integer<\/span>\r\n     Me!cboBankingKontakte.RowSourceType = \"Value List\"\r\n     Me!cboAccounts.RowSourceType = \"Value List\"\r\n     Me.cboBankingKontakte.RowSource = GetContactListWithFeature(\"HKDSE\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Me!cboBankingKontakte.RowSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es wurden noch keine Kontakte angelegt.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"Dies k&ouml;nnen Sie &uuml;ber den Eintrag \" _\r\n             & \"''Homebanking Kontakte'' in der Systemsteuerung erledigen.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     intLastContact = Nz(DLookup(\"LetzterBankkontakt\", \"tblOptionen\"), -1)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intLastContact = -1<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cboBankingKontakte = intLastContact\r\n         Me!cboAccounts.RowSource = GetAccountList(intLastContact, <span style=\"color:blue;\">True<\/span>)\r\n         intLastAccount = Nz(DLookup(\"LetztesKonto\", \"tblOptionen\"), -1)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intLastAccount = -1<span style=\"color:blue;\"> Then<\/span>\r\n             Me!cboAccounts = intLastAccount\r\n             Me!txtBIC = Me!cboAccounts.Column(2)\r\n             Me!txtIBAN = Me!cboAccounts.Column(3)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me.TimerInterval = 100\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     Me!cboBankingKontakte.SetFocus\r\n     Me!cboBankingKontakte.Dropdown\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: F&uuml;llen der Steuerelemente beim Laden des Formulars<\/span><\/b><\/p>\n<p>Sie deklariert die beiden Variablen <b>intLastContact<\/b> und <b>intLastAccount<\/b>. Dann ruft sie die Funktion <b>GetContactListWithFeature <\/b>f&uuml;r das Segment <b>HKDSE <\/b>auf und weist die Liste der Eigenschaft <b>RowSource <\/b>des Kombinationsfeldes <b>cboBankingKontakte <\/b>zu.<\/p>\n<p>Wenn die Datensatzherkunft dieses Kombinationsfeldes danach leer sein sollte, erscheint eine Meldung, dass erst einmal Banking Kontakte angelegt werden m&uuml;ssen und die Prozedur wird verlassen.<\/p>\n<p>Anderenfalls lesen wir per <b>DLookup <\/b>den Wert des Feldes <b>LetzterBankkontakt <\/b>der Tabelle <b>tblOptionen <\/b>in die Variable <b>intLastContact <\/b>ein.<\/p>\n<p>Finden wir keinen Datensatz, erh&auml;lt die Variable den Wert <b>-1<\/b>.<\/p>\n<p>Hat <b>intLastContact <\/b>danach nicht den Wert <b>-1<\/b>, stellen wir das Kombinationsfeld auf diesen Wert ein, damit es den entsprechenden Banking Kontakt anzeigt.<\/p>\n<p>Au&szlig;erdem lesen wir dann mit <b>GetAccountList <\/b>die Accounts  f&uuml;r diesen Banking Kontakt ein und weisen diesen der Datensatzherkunft des Kombinationsfeldes <b>cboAccounts <\/b>zu.<\/p>\n<p>Danach lesen wir den Wert der Option <b>LetztesKonto <\/b>ein. Auch hier verwenden wir den Wert <b>-1<\/b>, wenn dieses nicht angegeben ist. Liegt nun ein anderer Wert als <b>-1 <\/b>vor, stellen wir das Kombinationsfeld <b>cboAccounts <\/b>auf diesen Wert ein. Au&szlig;erdem tragen wir die entsprechenden Werte aus dem Kombinationsfeld in die beiden Textfelder <b>txtBIC <\/b>und <b>txtIBAN <\/b>ein.<\/p>\n<p>Wenn bereits kein zuletzt verwendeter Banking Kontakt angegeben war, stellen wir die Eigenschaft <b>TimerInterval <\/b>auf <b>100 <\/b>ein. Dadurch wird 100 Millisekunden sp&auml;ter die Prozedur <b>Form_Timer <\/b>ausgel&ouml;st.<\/p>\n<p>Diese stellt den Fokus auf das Kombinationsfeld <b>cboBankingKontakte <\/b>ein und klappt dieses aus. Danach wird <b>Me.TimerInterval <\/b>wieder auf <b>0 <\/b>eingestellt, damit das Ereignis nicht erneut ausgel&ouml;st wird.<\/p>\n<p>Das Formular sieht anschlie&szlig;end wie in Bild 18 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_018.png\" alt=\"Ausgeklapptes Kombinationsfeld\" width=\"499,5589\" height=\"213,819\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Ausgeklapptes Kombinationsfeld<\/span><\/b><\/p>\n<h2>Nach der Auswahl eines Banking Kontakts<\/h2>\n<p>Wenn der Benutzer mit dem ersten Kombinationsfeld einen Banking Kontakt ausgew&auml;hlt hat, sollen die entsprechenden Accounts in das Kombinationsfeld <b>cboAccounts <\/b>geladen werden.<\/p>\n<p>Dazu hinterlegen wir eine Ereignisprozedur f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes <b>cboBankingKontakte<\/b> (siehe Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboBankingKontakte_AfterUpdate()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.cboBankingKontakte)<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cboAccounts.RowSource = GetAccountList(Me.cboBankingKontakte, <span style=\"color:blue;\">True<\/span>)\r\n         Me!cboAccounts = Me!cboAccounts.ItemData(0)\r\n         Me!cboAccounts.SetFocus\r\n         Me!cboAccounts.Dropdown\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!cboAccounts.RowSource = \"\"\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: F&uuml;llen des Kombinationsfeldes cboAccounts nach der Auswahl eines Banking Kontakts<\/span><\/b><\/p>\n<p>Diese pr&uuml;ft, ob das Kombinationsfeld <b>cboBankingKontakte <\/b>&uuml;berhaupt einen Wert enth&auml;lt. Falls ja, stellt sie die Datensatzherkunft des Kombinationsfeldes <b>cboAccounts <\/b>auf das Ergebnis der Funktion <b>GetAccountList <\/b>ein. Au&szlig;erdem wird <b>cboAccounts <\/b>auf den ersten enthaltenen Wert eingestellt und das Kombinationsfeld dann ausgeklappt &#8211; siehe Bild 19.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_019.png\" alt=\"Auswahl des Accounts\" width=\"499,5589\" height=\"244,9199\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Auswahl des Accounts<\/span><\/b><\/p>\n<p>Damit nach der Auswahl eines Accounts ebenfalls die beiden Felder <b>txtIBAN <\/b>und <b>txtBIC <\/b>gef&uuml;llt werden, f&uuml;gen wir f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>die folgende Prozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboAccounts_AfterUpdate()\r\n     Me!txtBIC = Me!cboAccounts.Column(2)\r\n     Me!txtIBAN = Me!cboAccounts.Column(3)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zuletzt verwendeten Banking Kontakt und Account speichern<\/h2>\n<p>Damit beim n&auml;chsten &Ouml;ffnen des Formulars die zuletzt verwendeten Daten wieder angezeigt werden, hinterlegen wir die Prozedur aus Listing 8 f&uuml;r das Ereignis <b>Beim Entladen <\/b>des Formulars.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboBankingKontakte)<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"UPDATE tblOptionen SET LetzterBankkontakt = ''\" & Me!cboBankingKontakte _\r\n             & \"''\", dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>db.RecordsAffected = 0<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblOptionen(LetzterBankkontakt) VALUES(''\" & Me!cboBankingKontakte & \"'')\", dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboAccounts)<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"UPDATE tblOptionen SET LetztesKonto = ''\" & Me!cboAccounts _\r\n                 & \"''\", dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Speichern des zuletzt verwendeten Banking Kontakts und Accounts<\/span><\/b><\/p>\n<p>Sie deklariert die Variable <b>db <\/b>f&uuml;r das aktuelle <b>Database<\/b>-Objekt und pr&uuml;ft, ob <b>cboBankingKontakte<\/b> den Wert <b>Null <\/b>enth&auml;lt.<\/p>\n<p>Falls nicht, versucht die Prozedur, mit einer <b>UPDATE<\/b>-Anweisung einen bestehenden Datensatz in der Tabelle <b>tblOptionen <\/b>auf den neuen Wert f&uuml;r das Feld <b>LetzterBankkontakt <\/b>einzustellen.<\/p>\n<p>Danach liest sie mit <b>db.RecordsAffected <\/b>die Anzahl der von der <b>UPDATE<\/b>-Anweisung betroffenen Datens&auml;tze aus.<\/p>\n<p>Liefert dies den Wert <b>0<\/b>, wurde offensichtlich kein Datensatz ge&auml;ndert, weil kein Datensatz in der Tabelle vorliegt.<\/p>\n<p>In diesem Fall legt die Tabelle mit <b>INSERT INTO <\/b>einen neuen Datensatz an und tr&auml;gt f&uuml;r das Feld <b>LetzterBankkontakt <\/b>den Wert des Kombinationsfeldes <b>cboBankingKontakte <\/b>ein.<\/p>\n<p>Gleiches geschieht anschlie&szlig;end f&uuml;r den Wert aus dem Kombinationsfeld <b>cboAccounts<\/b>. Allerdings k&ouml;nnen wir hier davon ausgehen, dass nun bereits ein Datensatz in der Tabelle <b>tblOptionen <\/b>vorliegt und hier einfach den Wert aus <b>cboAccounts <\/b>f&uuml;r das Feld <b>LetztesKonto <\/b>eintragen.<\/p>\n<h2>Daten f&uuml;r die Lastschrift speichern<\/h2>\n<p>Weiter oben haben Sie erfahren, dass f&uuml;r eine Lastschrift eine Gl&auml;ubiger-Identifikationsnummer n&ouml;tig ist.<\/p>\n<p>Diese wollen wir in einer weiteren Optionentabelle namens <b>tblOptionenLastschrift <\/b>in einem Feld namens <b>GlaeubigerID<\/b> speichern.<\/p>\n<h2>Funktion zum Ausf&uuml;hren einer Sammellastschrift<\/h2>\n<p>Da wir mit dem verf&uuml;gbaren Konto keine Einzellastschrift ausf&uuml;hren konnten, da das Segment <b>HKDSE <\/b>nicht verf&uuml;gbar war, sondern nur <b>HKDME<\/b>, haben wir zu Beispielzwecken eine Funktion zum Durchf&uuml;hren einer Sammellastschrift angelegt (Teil 1 siehe Listing 9).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SEPASammellastschrift(intCustomer<span style=\"color:blue;\"> As Integer<\/span>, objZahlungspflichtiger<span style=\"color:blue;\"> As <\/span>BACAccount, _\r\n         intAuftraggeber<span style=\"color:blue;\"> As Integer<\/span>, curBetrag<span style=\"color:blue;\"> As Currency<\/span>, strVerwendungszweck<span style=\"color:blue;\"> As String<\/span>, datAusfuehrung<span style=\"color:blue;\"> As Date<\/span>, _\r\n         strMandatID<span style=\"color:blue;\"> As String<\/span>, datMandat<span style=\"color:blue;\"> As Date<\/span>, strCreditorID<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objSegmentAnfrage<span style=\"color:blue;\"> As <\/span>BACSegment\r\n     <span style=\"color:blue;\">Dim <\/span>objSegmentVersion<span style=\"color:blue;\"> As <\/span>BACSegment\r\n     <span style=\"color:blue;\">Dim <\/span>objSepaMessage<span style=\"color:blue;\"> As <\/span>BACSepaMessage\r\n     <span style=\"color:blue;\">Dim <\/span>objSepaOrder<span style=\"color:blue;\"> As <\/span>BACSepaOrder\r\n     <span style=\"color:blue;\">Dim <\/span>objCustomer<span style=\"color:blue;\"> As <\/span>BACCustomer\r\n     <span style=\"color:blue;\">Dim <\/span>objAuftraggeber<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     <span style=\"color:blue;\">Dim <\/span>objBanking<span style=\"color:blue;\"> As <\/span>BACBanking\r\n     <span style=\"color:blue;\">Dim <\/span>strError<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objMessage<span style=\"color:blue;\"> As <\/span>BACMessage\r\n     <span style=\"color:blue;\">Dim <\/span>objBACDialog<span style=\"color:blue;\"> As <\/span>BACDialog\r\n     <span style=\"color:blue;\">Dim <\/span>objTransaction<span style=\"color:blue;\"> As <\/span>BACTransaction\r\n     <span style=\"color:blue;\">Dim <\/span>strAntwort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSegment<span style=\"color:blue;\"> As String<\/span>\r\n     strSegment = \"HKDME\"\r\n     <span style=\"color:blue;\">Set<\/span> objBanking = GetBanking\r\n     <span style=\"color:blue;\">Set<\/span> objCustomer = objBanking.Customers(intCustomer)\r\n     <span style=\"color:blue;\">Set<\/span> objAuftraggeber = objCustomer.Accounts(intAuftraggeber)\r\n     <span style=\"color:blue;\">Set<\/span> objSegmentVersion = objAuftraggeber.FindOptimalBPDSegment(strSegment, 0)<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Die Prozedur zum Ausf&uuml;hren einer Sammellastschrift (Teil 1)<\/span><\/b><\/p>\n<p>Diese nimmt einige Parameter entgegen:<\/p>\n<ul>\n<li><b>intCustomer<\/b>: Index des zu verwendenden Kontakts<\/li>\n<li><b>objZahlungspflichtiger<\/b>: <b>BACAccount<\/b>-Objekt des Zahlungspflichtigen (noch zu erstellen)<\/li>\n<li><b>intAuftraggeber<\/b>:  Index des zu verwendenden Accounts<\/li>\n<li><b>curBetrag<\/b>: Einzuziehender Betrag<\/li>\n<li><b>strVerwendungszweck<\/b>: Verwendungszweck f&uuml;r die Lastschrift<\/li>\n<li><b>datAusfuehrung<\/b>: Datum der Ausf&uuml;hrung<\/li>\n<li><b>strMandatID<\/b>: Mandatsnummer<\/li>\n<li><b>datMandat<\/b>: Datum, an dem das Mandat erteilt wurde<\/li>\n<li><b>strCreditorID<\/b>: Gl&auml;ubiger-Identifikationsnummer<\/li>\n<\/ul>\n<p>Die Funktion legt als Erstes das Segment f&uuml;r die Variable <b>strSegment <\/b>fest, in diesem Fall <b>HKDME<\/b>. Danach erstellt sie ein neues Objekt des Typs <b>BACBanking<\/b>. Dazu nutzen wir die Funktion <b>GetBanking<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetBanking()<span style=\"color:blue;\"> As <\/span>BACBanking\r\n     <span style=\"color:blue;\">If <\/span>m_Banking Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> m_Banking = <span style=\"color:blue;\">New<\/span> BACBanking\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     m_Banking.Options(\"ProductName\") = cstrFints\r\n     <span style=\"color:blue;\">Set<\/span> GetBanking = m_Banking\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion pr&uuml;ft, ob die Variable <b>m_Banking <\/b>bereits ein <b>BACBanking<\/b>-Objekt enth&auml;lt und erstellt dieses gegebenenfalls neu.<\/p>\n<p>Dabei wird f&uuml;r die Option <b>ProductName <\/b>die FinTS-Registrierungsnummer aus <b>cstrFints <\/b>zugewiesen. Die folgende Variable speichert das aktuelle <b>BACBanking<\/b>-Objekt:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Banking<span style=\"color:blue;\"> As <\/span>BACBanking<\/pre>\n<p>Danach stellt die Prozedur die Variable <b>objCustomer <\/b>auf das mit dem Index <b>intCustomer <\/b>angegebene Element der <b>Customers<\/b>-Auflistung fest. <b>Customer <\/b>ist in diesem Fall gleichbedeutend mit <b>BACContact<\/b>, zumindest was den Index angeht.<\/p>\n<p>Das Objekt <b>objAuftraggeber <\/b>f&uuml;llen wir mit dem entsprechenden Konto, das wir als Ziel der Lastschrift verwenden wollen. Schlie&szlig;lich finden wir mit <b>FindOptimalBPDSegment <\/b>die optimale Segmentversion f&uuml;r <b>HKDME<\/b>, also die Sammellastschrift.<\/p>\n<p>Damit geht es in der Fortsetzung des Codes weiter (siehe Listing 10). Wenn <b>objSegmentVersion <\/b>danach nicht leer ist, erstellen wir in <b>objSegmentAnfrage <\/b>ein Anfrage-Segment. Dazu nutzen wir die Methode <b>NewSegment <\/b>des <b>BACBanking<\/b>-Objekts.<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objSegmentVersion Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objSegmentAnfrage = GetBanking.NewSegment(strSegment, objSegmentVersion.Version)\r\n         <span style=\"color:blue;\">Set<\/span> objSepaMessage = <span style=\"color:blue;\">New<\/span> BACSepaMessage\r\n         <span style=\"color:blue;\">With<\/span> objSepaMessage\r\n             .Segment = objSegmentAnfrage\r\n             .Segment.Item(\"Summenfeld1\", \"Wert1\") = curBetrag\r\n             .Segment.Item(\"Summenfeld1\", \"Waehrung1\") = \"EUR\"\r\n             .FromAccount = objAuftraggeber\r\n             .Recipient = objAuftraggeber\r\n             .ExecutionDate = datAusfuehrung\r\n             .SequenceType = \"OOFF\"\r\n             .LclInstrm = \"CORE\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objSepaOrder = objSepaMessage.Orders.Add\r\n         <span style=\"color:blue;\">With<\/span> objSepaOrder\r\n             .ToAccount = objZahlungspflichtiger\r\n             .Amount = fctRound(curBetrag, 2)\r\n             .CurrencyCode = \"EUR\"\r\n             .Purpose = strVerwendungszweck\r\n             .MandateId = strMandatID\r\n             .MandateDate = datMandat\r\n             .CreditorId = strCreditorID\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         objSepaMessage.Verify strError\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strError) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> strError\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objCustomer = GetBanking.Customers(intCustomer)\r\n         <span style=\"color:blue;\">Set<\/span> objAuftraggeber = objCustomer.Accounts(intAuftraggeber)\r\n         <span style=\"color:blue;\">Set<\/span> objBACDialog = objCustomer.NewDialogUI\r\n         objBACDialog.BeginDialog\r\n         <span style=\"color:blue;\">Set<\/span> objMessage = objBACDialog.ExecuteSegment(objSegmentAnfrage)\r\n         <span style=\"color:blue;\">Set<\/span> objTransaction = objMessage.Transactions(0)\r\n         For i = 1 To 100\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(objTransaction.Acknowledgement.Item(i, 3)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strAntwort = strAntwort & objTransaction.Acknowledgement.Item(i, 3)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         SEPAEinzellastschrift = strAntwort\r\n         objBACDialog.EndDialog\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Segment ''HKDSE'' konnte nicht gefunden werden.\"\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 10: Die Prozedur zum Ausf&uuml;hren einer Sammellastschrift (Teil 2)<\/span><\/b><\/p>\n<p>Anschlie&szlig;end legen wir ein neues <b>BACSepaMessage<\/b>-Objekt an. Dieses statten wir mit einige Informationen aus, zum Beispiel dem soeben erstellten Anfragesegment.<\/p>\n<p>Danach f&uuml;llen wir einige weitere Eigenschaften mit der Gesamtsumme der Lastschrift (dies ist nur bei Sammellastschriften n&ouml;tig und soll die Summe aller nachfolgend hinzugef&uuml;gten <b>BACSepaOrder<\/b>-Objekte enthalten), der W&auml;hrung, dem Auftraggeber, dem Ausf&uuml;hrungsdatum und zwei weiteren wichtigen Informationen:<\/p>\n<ul>\n<li>dem Sequenztyp und<\/li>\n<li>der Lastschriftart.<\/li>\n<\/ul>\n<p>Der Sequenztyp kann die folgenden Werte annehmen:<\/p>\n<ul>\n<li><b>FRST <\/b>(First) &#8211; Erste Lastschrift: Wird nur einmal verwendet, wenn eine neue wiederkehrende Lastschrift eingereicht wird. Markiert die erste Lastschrift einer wiederkehrenden Zahlungsserie und muss bei fortlaufenden Lastschriften von <b>RCUR <\/b>(Recurrent) gefolgt werden.<\/li>\n<li><b>RCUR <\/b>(Recurrent) &#8211; Wiederkehrende Lastschrift: Wird f&uuml;r alle regelm&auml;&szlig;igen Lastschriften verwendet, die nach der ersten Zahlung (<b>FRST<\/b>) erfolgen. Gilt f&uuml;r wiederkehrende Zahlungen wie Mieten, Abonnements oder Mitgliedsbeitr&auml;ge und bleibt gleich, solange das Mandat aktiv ist.<\/li>\n<li><b>OOFF <\/b>(One-Off) &#8211; Einmalige Lastschrift: Wird f&uuml;r einmalige Zahlungen verwendet, zum Beispiel f&uuml;r eine einmalige Rechnung. Nach der Zahlung ist das Mandat erledigt und kann nicht erneut genutzt werden.<\/li>\n<li><b>FNAL <\/b>(Final) &#8211; Letzte Lastschrift einer Serie: Wird als letzte Lastschrift einer wiederkehrenden Serie verwendet. Nach dieser Zahlung ist das Mandat abgeschlossen und kann nicht weiter genutzt werden und wird eher selten verwendet, da viele Banken einfach <b>RCUR <\/b>bis zur letzten Zahlung nutzen.<\/li>\n<\/ul>\n<p>Die Lastschriftart kann die Werte <b>CORE <\/b>(Basislastschrift) und <b>B2B <\/b>(Firmenlastschrift) annehmen &#8211; weitere Erl&auml;uterungen siehe weiter oben unter <b>Unterschiede zwischen SEPA-Basislastschrift und SEPA-Firmenlastschrift<\/b>.<\/p>\n<p>Wir stellen hier auf eine einfache Basislastschrift ein (OOFF und CORE).<\/p>\n<p>Danach legen wir ein <b>BACSepaOrder<\/b>-Element an und weisen dieses der Auflistung <b>Orders <\/b>des <b>BACSepaMessage<\/b>-Objekt <b>objSepaMessage <\/b>zu.<\/p>\n<p>Wir k&ouml;nnen hier ein oder mehrere <b>BACSepaOrder<\/b>-Elemente hinzuf&uuml;gen, da wir hier eine Sammellastschrift verwenden. Es gelingt aber auch mit einer einzelnen Lastschrift. Wichtig ist, dass die oben angegebene Summe der Summe aller einzelnen Lastschriften entspricht.<\/p>\n<p>Dem <b>BACSepaOrder <\/b>weisen wir dann weitere Informationen zu &#8211; das <b>BACAccount<\/b>-Objekt f&uuml;r den Zahlungspflichtigen, den Betrag dieser einzelnen Lastschrift, die W&auml;hrung, den Verwendungszweck, die Mandatsnummer, das Mandatsdatum und die Gl&auml;ubiger-Identifikationsnummer.<\/p>\n<p>Schlie&szlig;lich rufen wir die <b>Verify<\/b>-Methode auf, um das <b>BACSepaMessage<\/b>-Objekt zu pr&uuml;fen. Hier wird zum Beispiel sichergestellt, dass die Summe der einzelnen Lastschriften korrekt im Summenfeld abgebildet ist.<\/p>\n<p>Finden wir hier einen Fehler, wird dieser in einer Meldung ausgegeben und die Funktion wird an dieser Stelle verlassen.<\/p>\n<p>Finden wir keinen Fehler, holen wir ein <b>BACCustomer<\/b>-Objekt f&uuml;r unser Konto und speichern es in <b>objCustomer<\/b>. Den Auftraggeber holen wir uns auf die gleiche Weise. Damit rufen wir nun die Methode <b>NewDialogUI <\/b>auf. Dies zeigt den Dialog an, mit dem wir uns bei der Bank authentifizieren.<\/p>\n<p>Ist dies erfolgreich, wird der Dialog mit <b>BeginDialog <\/b>er&ouml;ffnet. Wir stellen ein <b>BACMessage<\/b>-Objekt mit dem Ergebnis der <b>ExecuteSegment<\/b>-Methode von <b>objBACDialog <\/b>zusammen.<\/p>\n<p>Dieses enth&auml;lt eine <b>Transactions<\/b>-Auflistung, deren erstes Element die R&uuml;ckmeldung zu diesem Auftrag liefert. Diese kann unterschiedlich aufgebaut sein, sodass wir die ersten 100 Elemente untersuchen und in einer Variablen namens <b>strAntwort <\/b>zusammenstellen.<\/p>\n<p>Dies ist auch gleichzeitig der R&uuml;ckgabewert der Funktion. Bevor wir diese verlassen, beenden wir noch den <b>BACDialog <\/b>mit der Methode <b>EndDialog<\/b>.<\/p>\n<h2>Testen der Sammellastschrift<\/h2>\n<p>Die Sammellastschrift k&ouml;nnen wir nun mit der Prozedur aus Listing 11 testen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_SEPAEinzellastschrift()\r\n     <span style=\"color:blue;\">Dim <\/span>strZahlungspflichtiger1<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZahlungspflichtiger2<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZahlungspflichtigerIBAN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZahlungspflichtigerBIC<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objZahlungspflichtiger<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     <span style=\"color:blue;\">Dim <\/span>intContactID<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intAccountID<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>curBetrag<span style=\"color:blue;\"> As Currency<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVerwendungszweck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>datAusfuehrungsdatum<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMandatsreferenz<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>datMandatsdatum<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strGlaeubigerID<span style=\"color:blue;\"> As String<\/span>\r\n     intContactID = 0\r\n     intAccountID = 0\r\n     curBetrag = 1\r\n     strVerwendungszweck = \"Verwendungszweck\"\r\n     datAusfuehrungsdatum = Date + 10\r\n     strMandatsreferenz = \"AA1234567890\"\r\n     datMandatsdatum = Date\r\n     strGlaeubigerID = \"DE98ZZZ09999999999\"\r\n     \r\n     strZahlungspflichtiger1 = \"Andre Minhorst\"\r\n     strZahlungspflichtiger2 = \"\"\r\n     strZahlungspflichtigerIBAN = \"DE98350400380591362900\"\r\n     strZahlungspflichtigerBIC = \"COBADEFFXXX\"\r\n     <span style=\"color:blue;\">Set<\/span> objZahlungspflichtiger = AccountErstellen(strZahlungspflichtiger1, strZahlungspflichtiger2, _\r\n         strZahlungspflichtigerIBAN, strZahlungspflichtigerBIC)\r\n     <span style=\"color:blue;\">MsgBox<\/span> SEPASammellastschrift(intContactID, objZahlungspflichtiger, intAccountID, curBetrag, _\r\n         strVerwendungszweck, datAusfuehrungsdatum, strMandatsreferenz, datMandatsdatum, strGlaeubigerID)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Testen der Funktion f&uuml;r die Sammellastschrift<\/span><\/b><\/p>\n<p>Hier stellen wir testweise alle ben&ouml;tigten Parameter f&uuml;r den Aufruf der Funktion <b>SEPASammellastschrift <\/b>zusammen. Einen Beispielverwendungszweck, als Ausf&uuml;hrungsdatum das aktuelle Datum plus zehn Tage, damit es ausreichend weit in der Zukunft liegt sowie Beispielwerte f&uuml;r die Mandatsreferenz, das heutige Datum als Mandatsdatum und eine Test-Gl&auml;ubiger-Identifikationsnummer.<\/p>\n<p>Au&szlig;erdem legen wir den Namen des Zahlungspflichtigen, seine IBAN und seine BIC fest.<\/p>\n<p>Ein wichtiger Part ist der Aufruf der Funktion <b>AccountErstellen<\/b>, mit der wir aus den Daten des Zahlungspflichtigen ein <b>BACAccount<\/b>-Objekt machen. Diese Funktion sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AccountErstellen(strName1<span style=\"color:blue;\"> As String<\/span>, _\r\n         strName2<span style=\"color:blue;\"> As String<\/span>, strIban<span style=\"color:blue;\"> As String<\/span>, _\r\n         strBIC<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     <span style=\"color:blue;\">Dim <\/span>objToAccount<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     <span style=\"color:blue;\">Set<\/span> objToAccount = <span style=\"color:blue;\">New<\/span> BACAccount\r\n     <span style=\"color:blue;\">With<\/span> objToAccount\r\n         .NameEins = strName1\r\n         .NameZwei = strName2\r\n         .IBAN = strIban\r\n         .BIC = strBIC\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> AccountErstellen = objToAccount\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Sie erstellt ein neues <b>BACAccount<\/b>-Objekt und weist diesem die Werte aus den Parametern zu.<\/p>\n<p>Dieses wird neben weiteren Parametern an die Funktion <b>SEPASammellastschrift <\/b>&uuml;bergeben.<\/p>\n<h2>&Uuml;bertragen des Tests auf das Formular frmLastschriften<\/h2>\n<p>Nun m&uuml;ssen wir nur noch das Formular <b>frmLastschriften <\/b>mit Steuerelementen ausstatten, in die der Benutzer die Daten eingeben kann, die wir in der Testprozedur manuell in den Code eingetragen haben.<\/p>\n<p>Dazu erweitern wir das Formular wie in Bild 20 um einige Felder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1544_020.png\" alt=\"Das Formular frmLastschriften\" width=\"499,5589\" height=\"626,823\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Das Formular frmLastschriften<\/span><\/b><\/p>\n<p>Zur Vereinfachung beim Ausprobieren der L&ouml;sung haben wir noch eine Prozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>hinzugef&uuml;gt, die einige Testdaten in das Formular schreibt (siehe Listing 12).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me.txtZahlungspflichtiger1 = \"Andre Minhorst\"\r\n     Me.txtIBANZahlungspflichtiger = \"DE98350400380xxxxxxxx\"\r\n     Me.txtBICZahlungspflichtiger = \"COBADEFFXXX\"\r\n     Me.txtVerwendungszweck = \"Beispielverwendungszweck\"\r\n     Me.txtBetrag = 1\r\n     Me.txtAusfuehrungsdatum = Date + 10\r\n     Me.txtMandatsreferenz = \"A0123456789\"\r\n     Me.txtMandatsdatum = Date\r\n     Me.txtGlaeubigerID = \"DE98ZZZ09999999999\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: Zuweisen von Testdaten beim Laden des Formulars<\/span><\/b><\/p>\n<p>Die Daten des Zahlungsempf&auml;ngers werden nach dem erstmaligen Ausw&auml;hlen und Schlie&szlig;en des Formulars ohnehin gespeichert, daher m&uuml;ssen wir diese nicht mehr separat ausf&uuml;llen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit diesem Beitrag zeigen wir, wie man unter Zuhilfenahme der DDBAC-Komponenten eine Funktion erstellen kann, mit der sich Lastschriftauftr&auml;ge an die eigene Bank &uuml;bergeben lassen.<\/p>\n<p>In weiteren Beitr&auml;gen in zuk&uuml;nftigen Ausgaben zeigen wir noch, wie wir die vorhandenen Lastschriften einlesen und auch wieder stornieren k&ouml;nnen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>LastschriftenMitDDBACUndVBA.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/16EBC809-0E27-411C-9920-EF452CBF307C\/aiu_1544.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Anlegen von Lastschriften ist eine wichtige Funktion, wenn man Kunden neben Zahlungsarten wie Rechnung, PayPal, Kreditkarte et cetera auch noch die M&ouml;glichkeit geben m&ouml;chte, die Bankverbindung anzugeben, um den Betrag zum F&auml;lligkeitsdatum einfach abbuchen zu lassen. Das ist gerade f&uuml;r wiederkehrende Leistungen wie Abonnements praktisch. Dazu sind jedoch erstens einige Voraussetzungen zu erf&uuml;llen wie zum Beispiel das Aktivieren der M&ouml;glichkeiten zum Einziehen von Lastschriften und das Beantragen einer sogenannten Gl&auml;ubiger-Identifikationsnummer. Schlie&szlig;lich ben&ouml;tigen wir noch den passenden VBA-Code. Allein damit kommen wir aber nicht aus: Wenn wir gem&uuml;tlich von unserer Datenbankanwendung aus Lastschriften anlegen wollen, ben&ouml;tigen wir eine zus&auml;tzliche Bibliothek. Dabei handelt es sich um die in vielen Anwendungen verwendete DDBAC-Bibliothek. Wie wir die einzelnen Schritte erledigen, um unsere Anwendung zum Anlegen von Lastschriften verwenden zu k&ouml;nnen, zeigen wir in diesem Beitrag.<\/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":[66022025,662025,44000027],"tags":[],"class_list":["post-55001544","post","type-post","status-publish","format-standard","hentry","category-66022025","category-662025","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Lastschriften mit DDBAC und VBA - 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\/Lastschriften_mit_DDBAC_und_VBA\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lastschriften mit DDBAC und VBA\" \/>\n<meta property=\"og:description\" content=\"Das Anlegen von Lastschriften ist eine wichtige Funktion, wenn man Kunden neben Zahlungsarten wie Rechnung, PayPal, Kreditkarte et cetera auch noch die M&ouml;glichkeit geben m&ouml;chte, die Bankverbindung anzugeben, um den Betrag zum F&auml;lligkeitsdatum einfach abbuchen zu lassen. Das ist gerade f&uuml;r wiederkehrende Leistungen wie Abonnements praktisch. Dazu sind jedoch erstens einige Voraussetzungen zu erf&uuml;llen wie zum Beispiel das Aktivieren der M&ouml;glichkeiten zum Einziehen von Lastschriften und das Beantragen einer sogenannten Gl&auml;ubiger-Identifikationsnummer. Schlie&szlig;lich ben&ouml;tigen wir noch den passenden VBA-Code. Allein damit kommen wir aber nicht aus: Wenn wir gem&uuml;tlich von unserer Datenbankanwendung aus Lastschriften anlegen wollen, ben&ouml;tigen wir eine zus&auml;tzliche Bibliothek. Dabei handelt es sich um die in vielen Anwendungen verwendete DDBAC-Bibliothek. Wie wir die einzelnen Schritte erledigen, um unsere Anwendung zum Anlegen von Lastschriften verwenden zu k&ouml;nnen, zeigen wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-05T17:29:44+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8\" \/>\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=\"29\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Lastschriften mit DDBAC und VBA\",\"datePublished\":\"2025-03-05T17:29:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/\"},\"wordCount\":4783,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4c9648acb6294768a0354352e83be7c8\",\"articleSection\":[\"2\\\/2025\",\"2025\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/\",\"name\":\"Lastschriften mit DDBAC und VBA - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4c9648acb6294768a0354352e83be7c8\",\"datePublished\":\"2025-03-05T17:29:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4c9648acb6294768a0354352e83be7c8\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4c9648acb6294768a0354352e83be7c8\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Lastschriften_mit_DDBAC_und_VBA\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lastschriften mit DDBAC und VBA\"}]},{\"@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":"Lastschriften mit DDBAC und VBA - 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\/Lastschriften_mit_DDBAC_und_VBA\/","og_locale":"de_DE","og_type":"article","og_title":"Lastschriften mit DDBAC und VBA","og_description":"Das Anlegen von Lastschriften ist eine wichtige Funktion, wenn man Kunden neben Zahlungsarten wie Rechnung, PayPal, Kreditkarte et cetera auch noch die M&ouml;glichkeit geben m&ouml;chte, die Bankverbindung anzugeben, um den Betrag zum F&auml;lligkeitsdatum einfach abbuchen zu lassen. Das ist gerade f&uuml;r wiederkehrende Leistungen wie Abonnements praktisch. Dazu sind jedoch erstens einige Voraussetzungen zu erf&uuml;llen wie zum Beispiel das Aktivieren der M&ouml;glichkeiten zum Einziehen von Lastschriften und das Beantragen einer sogenannten Gl&auml;ubiger-Identifikationsnummer. Schlie&szlig;lich ben&ouml;tigen wir noch den passenden VBA-Code. Allein damit kommen wir aber nicht aus: Wenn wir gem&uuml;tlich von unserer Datenbankanwendung aus Lastschriften anlegen wollen, ben&ouml;tigen wir eine zus&auml;tzliche Bibliothek. Dabei handelt es sich um die in vielen Anwendungen verwendete DDBAC-Bibliothek. Wie wir die einzelnen Schritte erledigen, um unsere Anwendung zum Anlegen von Lastschriften verwenden zu k&ouml;nnen, zeigen wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-03-05T17:29:44+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"29\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Lastschriften mit DDBAC und VBA","datePublished":"2025-03-05T17:29:44+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/"},"wordCount":4783,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8","articleSection":["2\/2025","2025","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/","url":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/","name":"Lastschriften mit DDBAC und VBA - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8","datePublished":"2025-03-05T17:29:44+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/4c9648acb6294768a0354352e83be7c8"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Lastschriften_mit_DDBAC_und_VBA\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Lastschriften mit DDBAC und VBA"}]},{"@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\/55001544","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=55001544"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001544\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}