Lastschrifteinzug per Datenträgeraustausch

Mitgliedsbeiträge in Vereinen, Versicherungsbeiträge und andere regelmäßig anfallende Zahlungen zieht der Begünstigte am einfachsten per Lastschrift ein. Voraussetzung für den Lastschrifteinzug ist die Erteilung einer Einzugsermächtigung durch den Zahlungspflichtigen. Fallen nur wenige Lastschrifteinzüge an, verwendet man der Einfachheit halber ein entsprechendes Papierformular, aber wer etwa Kassenwart eines Vereins mit vielen Mitgliedern ist, möchte vielleicht mit weniger Arbeit auskommen.

Abgesehen von den nötigen Einzugsermächtigungen erfordert das Vereinfachen des Lastschrifteinzugs das Vorhandensein einiger Daten der Zahlungspflichtigen, am besten in Tabellenform:

  • Name
  • Bankleitzahl
  • Kontonummer

Damit ausgerüstet widmen Sie sich dann dem sogenannten Datenträgeraustauschverfahren (abgekürzt DTA beziehungsweise DTAUS) und dem damit verbundenen Format. Das Datenträgeraustauschverfahren dient der Ausführung bargeldloser Zahlungen wie etwa von Gutschriften oder der in diesem Beitrag betrachteten Lastschriften.

Kern dieses Verfahrens ist die Zusammenfassung der Informationen, die normalerweise auf dem Überweisungsträger landen, in einer Textdatei und deren Übermittlung per Speichermedium oder via Internet an die Bank des Begünstigten.

Das in dieser Textdatei zu verwendende Format wird zum Beispiel im Internet an verschiedenen Stellen beschrieben, etwa bei Wikipedia unter dem Stichwort Datenträgeraustauschverfahren.

Die Textdatei besteht aus drei Teilen:

  • Der A-Satz enthält Informationen über die Art der Transaktion (Lastschrift oder Gutschrift) und die Auftraggeberdaten sowie das Auftragsdatum und die Währung.
  • Der C-Satz enthält Informationen über die einzelnen Vorgänge. Dazu gehören – im Falle der Lastschrift – die Daten des Zahlungspflichtigen (also Name, Bankleitzahl und Kontonummer), Verwendungszweck und Währung.
  • Der E-Satz enthält die Anzahl der Transaktionen sowie diverse Prüfsummen wie etwa die Summe der Beträge.

Nun stellen sich zwei Fragen: Woher kommen die Daten und wie gelangen diese in die benötigte Textdatei

  • Die Auftraggeberdaten speichern wir am besten in einer Optionen-Tabelle.
  • Die Transaktionsdaten stammen aus einer weiteren Tabelle. Bei Institutionen wie Sportvereinen liegen diese meist in Form einer Excel-Tabelle vor. Diese können Sie verknüpfen oder importieren, um sie in Access verfügbar zu machen. Dazu später mehr – erstmal kümmern wir uns um die grundsätzliche Erstellung der Datenaustauschdatei.

Einschränkungen

Die hier vorgestellte Lösung zum Erstellen von Datenträgeraustauschdateien hat folgende Einschränkungen, die sich jedoch durch änderung des Codes beheben lassen – im Kontext der Erstellung einer solchen Datei etwa für den Einzug von Mitgliedsbeiträgen ist dies jedoch vermutlich nicht nötig:

  • Sie können damit nur Lastschriften anstoßen, keine anderen Vorgänge.
  • Bankleitzahl von Zahlungsempfänger und ausführender Bank sind identisch.
  • Die Angabe des Namens des Empfängers und des Begünstigten sowie der Verwendungszweck unterliegt Einschränkungen bezüglich der maximal zulässigen Zeichenanzahl (jeweils 27 Zeichen, theoretisch könnten diese Informationen um weitere 27 Zeichen erweitert werden).

Datenaustauschdatei erstellen

Das Format der Datenaustauschdatei können Sie für eine eingeschränkte Anzahl von Fällen direkt den nachfolgend vorgestellten Funktionen entnehmen. Die erste Funktion (s. Listing 1) liefert den A-Satz der Datenträgeraustauschdatei und erwartet die folgenden Parameter:

Listing 1: Diese Funktion liefert den ersten von mindestens drei Teilen der Datenträgeraustauschdatei.

Public Function ASatz(strBLZAuftraggeber As String, strNameAbsender As String, _
    strKontoAuftraggeber As String) As String
    Dim str As String
    str = str & "0128" ''Satzlänge
    str = str & "A" ''Satzart
    str = str & "LK" ''Kennzeichen: L = Lastschrift, K = Kundendiskette
    str = str & strBLZAuftraggeber
    str = str & "00000000"
    str = str & Auffuellen(strNameAbsender, " ", 27) ''Name Absender
    str = str & Format(Date, "DDMMYY") ''Erstellungsdatum
    str = str & " "
    str = str & Auffuellen("", "0", 10 - Len(strKontoAuftraggeber)) _
    & strKontoAuftraggeber ''Kontonummer Auftraggeber
    str = str & Auffuellen("", "0", 10) ''Sammel-Referenznummer, hier Nullen)
    str = str & Auffuellen("", " ", 47)
    str = str & "1" ''Währung, Euro entspricht 1
    Debug.Print Len(str), str
    ASatz = str
End Function
  • strBLZAuftraggeber: Bankleitzahl des Auftraggebers
  • strNameAuftraggeber: Name des Auftraggebers
  • strKontoAuftraggeber: Kontonummer des Auftraggebers

Die Prozedur verwendet eine String-Variable namens str, um den Inhalt des A-Satzes zusammenzustellen. Den Start macht bei A-, C- und E-Satz jeweils die Satzlänge mit vier Stellen. Diese enthält die Länge der einzulesenden Zeichenkette. Das nächste Zeichen enthält jeweils einen Kennbuchstaben (A für A-Satz, C für C-Satz und E für E-Satz). Die folgenden beiden Zeichen des A-Satzes enthalten die Zeichenkombination LK für Lastschrift/Kundendiskette. Nach der Bankleitzahl des Auftraggebers (immer achtstellig) und einer Reihe Nullen, die keine Bedeutung hat, folgt die Kontonummer des Empfängers. Diese kann maximal zehn Stellen aufweisen, Kontonummern haben aber oft auch weniger Stellen.

Die fehlenden Stellen sollen vorne mit Nullen aufgefüllt werden. Zu diesem Zweck verwenden wir eine kleine Hilfsfunktion namens Auffuellen, die Sie in Listing 2 finden und welche die folgenden Parameter erwartet:

  • strOriginal: Aufzufüllende Zeichenkette
  • strFuellzeichen: Zeichen, mit dem aufgefüllt werden soll
  • intLaenge: Länge nach dem Auffüllen
  • bolVorne: Gibt an, ob vorn oder hinten aufgefüllt werden soll.

Listing 2: Die Hilfsfunktion Auffuellen füllt eine Zeichenkette bis zur gewünschten Anzahl mit dem angegebenen Zeichen auf – wahlweise vorn oder hinten.

Public Function Auffuellen(strOriginal As String, strFuellzeichen As String, _
    intLaenge As Integer, Optional bolVorne As Boolean = True) As String
    Dim str As String
    str = strOriginal
    If bolVorne Then
        If Len(str) < intLaenge Then
            str = str & String(strFuellzeichen, intLaenge - Len(str))
        Loop
    Else
        If Len(str) < intLaenge Then
            str = String(strFuellzeichen, intLaenge - Len(str)) & str
        Loop
    End If
    Auffuellen = str
End Function

Kontonummern werden in Datenträgeraustauschdateien immer vorn mit Nullen aufgefüllt, daher wird bei diesem Aufruf der Parameter bolVorne auf True eingestellt. Wenn Sie keine Sammelreferenznummer verwenden, geben Sie anschließend lauter Nullen an, und nach 47 folgenden Leerzeichen schließt die Zahl 1 stellvertretend für die hier verwendete Währung Euro den ersten Teil ab.

Der C-Satz wird ebenfalls mit einer eigenen Funktion erstellt, die folgende Parameter erwartet:

  • strKontoZahler: Kontonummer des Zahlungspflichtigen
  • strKontoEmpfaenger: Kontonummer des Empfängers
  • curBetrag: Einzuziehender Betrag
  • strNameZahler: Name des Zahlungspflichtigen
  • strVerwendungszweck: Verwendungszweck mit maximal 27 Zeichen
  • strNameEmpfaenger: Name des Empfängers
  • strBLZZahler: Bankleitzahl des Zahlungspflichtigen

Nachdem Sie die Auffuellen-Funktion und den Ablauf der Funktion zum Erstellen des A-Satzes kennen, verstehen Sie die durch die Funktion CSatz aus Listing 3 durchgeführten Schritte sicher ganz leicht.

Listing 3: Der C-Satz enthält die eigentlichen Buchungsinformationen und kann je Datenträgeraustauschdatei mehrmals vorkommen.

Public Function CSatz(strBLZEmpfaenger As String, _
    strKontoZahler As String, _
    strKontoEmpfaenger As String, _
    curBetrag As Currency, _
    strNameZahler As String, _
    strVerwendungszweck As String, _
    strNameEmpfaenger As String, _
    strBLZZahler As String)
    Dim str As String
    Dim strBetrag As String
    str = str & "0187" ''Satzlänge
    str = str & "C" ''Satzart
    str = str & Auffuellen("", "0", 8) ''BLZ erstbeteiligte Bank, optional
    str = str & strBLZZahler ''BLZ Begünstigter
    str = str & Auffuellen(strKontoZahler, "0", 10, False) ''Kontonummer Zahlungsverpflichteter
    str = str & Auffuellen("", "0", 13) ''interne Kundennummer
    str = str & "05" ''Textschlüssel: 04 - Abbuchung, 05 - Einzug, 51 - Überweisung, 53 - Gehalt,
    ''54 - Vermögenswirksame Leistungen, 56 - Öffentliche Kassen
    str = str & "000" ''Ergänzung
    str = str & " "
    str = str & Auffuellen("", "0", 11)
    str = str & strBLZEmpfaenger
    str = str & Auffuellen(strKontoEmpfaenger, "0", 10, False)
    strBetrag = CStr(CLng(curBetrag * 100))
    str = str & Auffuellen(strBetrag, "0", 11, False) ''Betrag
    str = str & Auffuellen("", " ", 3)
    str = str & Auffuellen(strNameZahler, " ", 27)
    str = str & Auffuellen("", " ", 8)
    str = str & Auffuellen(strNameEmpfaenger, " ", 27)
    str = str & Auffuellen(strVerwendungszweck, " ", 27)
    str = str & "1" ''Währung
    str = str & " "
    str = str & "00"
    CSatz = str
End Function

Wichtig ist hier, dass die Funktion mehrmals hintereinander aufgerufen werden könnte. Außerdem kann man an der einen oder anderen Stelle weitere Zeichen unterbringen. Aus Gründen der Übersichtlichkeit verzichten wir an dieser Stelle auf die Umsetzung dieser Möglichkeit. Fehlt noch der abschließende E-Satz, der im Wesentlichen einige Prüfsummen enthält. Die zu seiner Erstellung notwendige Funktion finden Sie in Listing 4. Die Parameter wurden sämtlich noch nicht verwendet und sind komplett von Anzahl und Inhalt der in den C-Sätzen enthaltenen Daten abhängig:

  • intAnzahl: Anzahl der Lastschriften
  • lngSummeKontonummern: Summe der Kontonummern
  • lngSummeBLZ: Summe der Bankleitzahlen
  • curSummeBetraege: Summe der Beträge aller Lastschriften

Listing 4: Der letzte Satz der Datenträgeraustauschdatei enthält eine Reihe Prüfsummen.

Public Function ESatz(intAnzahl As Integer, lngSummeKontonummern As Long, lngSummeBLZ As Long, _
    curSummeBetraege As Currency)
    Dim str As String
    Dim strSummeBetraege As String
    str = str & "0128" ''Satzlänge
    str = str & "E" ''Satzart
    str = str & Auffuellen("", " ", 5)
    str = str & Auffuellen(CStr(intAnzahl), "0", 7, False)
    str = str & Auffuellen("", "0", 13)
    str = str & Auffuellen(CStr(lngSummeKontonummern), "0", 17, False)
    str = str & Auffuellen(CStr(lngSummeBLZ), "0", 17, False)
    strSummeBetraege = CStr(CLng(curSummeBetraege * 100))
    str = str & Auffuellen(strSummeBetraege, "0", 13, False)
    str = str & Auffuellen("", " ", 51)
    ESatz = str
End Function

Aufruf der Funktionen und Zusammenstellung der Datei

Prinzipiell ist die Vorgehensweise zum Zusammenstellen des Inhalts der Datenträgeraustauschdatei ganz einfach: Sie rufen die Funktion ASatz auf, dann für jede Lastschrift je einmal die Funktion BSatz, wobei Sie mitzählen und die Werte von Bankleitzahl, Kontonummern und Beträgen aufsummieren müssen und schließlich einmal die Funktion CSatz. Die Rückgabewerte hängen Sie aneinander und schreiben diese in eine Textdatei – fertig!

In der Praxis müssen Sie natürlich noch den Zugriff auf die benötigten Daten bereitstellen, was dem geneigten Leser von Access im Unternehmen natürlich keine Probleme bereitet. Trotzdem gehen wir im Detail darauf ein.

Grundlage für die einzelnen Lastschriften bildet eine stark reduzierte Mitglieder-Tabelle, deren Entwurf wie in Bild 1 aussieht.

pic004.png

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar