Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Tätigen Sie Überweisungen und verwalten Sie Ihre
Kontoumsätze per Access.

Techniken

Formulare, Berichte, VBA

Voraussetzungen

Access 2000 und höher, DDABC-Runtime (auf Heft-CD)

Beispieldateien

HBCI.mdb, DDBAC Software Development Kit Version 4.1.6.0

Shortlink

488

Onlinebanking mit HBCI, Teil 2

André Minhorst, Duisburg

Eine eigene Anwendung mit Zugriff auf das Konto oder die Konten des Benutzers - das könnte in vielen Fällen eine enorme Erleichterung sein. So könnten Sie beispielsweise regelmäßig die auf dem Bankserver gespeicherten Vorgänge herunterladen und in einer passenden Tabelle speichern. Auf diese Weise haben Sie alle Daten digital verfügbar anstatt nur diejenigen der letzten 90 Tage, wie es üblicherweise der Fall ist. Die Suche nach bestimmten Informationen und der Ausdruck individueller Auswertungen ist dann ein Kinderspiel, wie der vorliegende Beitrag zeigt.

Im ersten Teil dieser Beitragsreihe (Shortlink 468) haben Sie erfahren, wie Sie den Kontostand eines Kontos ermitteln und die Kontoumsätze einlesen. Dies sollen Sie nun ausnutzen und die gewonnenen Daten in die Tabelle einer Datenbank eintragen.

Nebenher sollen diese Daten natürlich auch in ansprechender Form präsentiert werden und auch eine neue Technik lernen Sie in diesem Beitrag kennen - nämlich das Absetzen einer Überweisung mit Access und der DDBAC-Bibliothek.

Die Beispieldatenbank empfängt den Benutzer mit dem Formular aus Abb. 1. Es zeigt im Wesentlichen die Vorgänge eines bestimmten Zeitraums für das aktuell im Kombinationsfeld ausgewählte Konto an.

pic001.tif

Abb. 1: Buchungsvorgänge im Formular

Zusammenfassend noch einmal die Voraussetzungen für den Online-Zugriff auf Ihre Konten:

  • Die DDBAC-Software muss installiert sein. Sie finden diese Software entweder auf der Heft-CD oder in der jeweils aktuellsten Fassung unter [1].
  • Sie müssen über ein für Onlinebanking eingerichtetes Konto verfügen, was in der Regel der Fall sein dürfte, wenn Sie via Internet auf das Konto zugreifen. Die DDBAC-Bibliothek erlaubt verschiedene Zugriffsarten - etwa HBCI/FinTS mit Schlüsseldatei oder Chipkarte sowie HBCI+ oder FinTS mit PIN und TAN. Im Rahmen der Erstellung dieses Beitrags werden die Schlüssel- sowie die PIN/TAN-Variante getestet und für gut befunden.
  • Sie haben das Konto für den Zugriff via DDBAC eingerichtet. Dies erledigen Sie nach der Installation der Software unter dem Punkt Homebanking Kontakte der Systemsteuerung. Fertig eingerichtete "Kontakte" sehen etwa wie in Abb. 2 aus.
  • Achten Sie unter neueren Access-Versionen (ab Access 2003) vorsichtshalber auch darauf, dass die Ausführung des VBA-Codes der Anwendungen nicht durch entsprechende Sicherheitseinstellungen unterbunden wird (das nur, weil es dem Autor beim Vorführen passiert ist ...).
pic002.tif

Abb. 2: Festlegen der Homebanking-Kontakte

Dann kann es losgehen: Mit einem Klick auf die Schaltfläche Vorgänge einlesen starten Sie den Zugriff auf den Bankserver. Je nach dem verwendeten Zugriffsschutz erscheint eine passende Abfrage: Im Falle der Schlüsseldatei müssen Sie die Passphrase eingeben (s. Abb. 3), bei Verwendung von PIN/TAN geben Sie den PIN in den nun erscheinenden Dialog ein (s. Abb. 4).

pic003.tif

Abb. 3: Passphrase bei Verwendung eines Schlüssels eingeben

pic004.tif

Abb. 4: Das Abfragen von Konten mit PIN/TAN verlangt nach der PIN-Nummer.

Danach stellt die Anwendung die Verbindung her und speichert alle verfügbaren Vorgänge in einer entsprechenden Tabelle. "Alle verfügbaren" bezieht sich in der Regel auf die Vorgänge der letzten 90 Tage, zumindest lieferte keines der beim Testen angesprochenen Kreditinstitute ältere Daten.

Falls bis dahin noch keine Vorgänge gespeichert wurden, legt die Anwendung den vor dem ersten eingelesenen Vorgang bestehenden Kontostand als initialen Kontostand fest. Dies ist notwendig, damit der später vorgestellte Bericht jeweils den aktuellen Kontostand anzeigen kann. Auch diese Information liefern die Bankserver zwar, jedoch kann es auch interessant sein, vom Kontostand des ersten gespeicherten Vorgangs aus dessen Entwicklung nachzuverfolgen.

Sind die Daten einmal vom Bankserver heruntergeladen, kann man ganz nach Bedarf alle paar Tage die aktuelleren Buchungen herunterziehen. Die Anwendung prüft jeweils, ob ein Vorgang bereits gespeichert wurde, und holt dies gegebenenfalls nach. Dabei werden immer die Vorgänge der letzten 90 Tage untersucht, Sie sollten also zumindest vor Ablauf dieser Zeitspanne die vorhandenen Daten in der Datenbank speichern, damit zwischendrin keine Daten fehlen. Sollte dies doch einmal passieren, haben Sie sicher gedruckte Exemplare des Kontoauszugs zur Verfügung, um zumindest die wichtigsten Daten in die Tabelle zu übernehmen und damit eine lückenlose Darstellung des Kontostandes über diesen Zeitraum zu gewährleisten.

Wollen Sie nur die Einträge eines bestimmten Zeitraums anzeigen lassen, können Sie diesen über die Schaltfläche Zeitraum ändern und den daraufhin erscheinenden Dialog anpassen. Dieser Dialog und die darin verwendete Technik wird ausführlich im Beitrag Zeiträume komfortabel auswählen beschrieben. Die Schaltfläche Alle anzeigen hebt den so festgelegten Filter wieder auf.

Zum Ausdrucken der Informationen oder einfach für einen besseren Überblick liefert die Anwendung einen Bericht mit, der die wichtigsten Vorgangsdaten ausgibt. Diesen öffnen Sie mit einem Klick auf die Schaltfläche Bericht anzeigen (s. Abb. 5).

pic005.tif

Abb. 5: Ausgabe der Umsätze und des jeweils aktuellen Kontostandes per Access-Bericht

Der Bericht liefert genau die den im Formular festgelegten Einstellungen entsprechenden Vorgänge - also nur für das angegebene Konto und den passenden Zeitraum. Neben dem Buchungszeitpunkt enthält eine jede Zeile des Berichts Informationen zu Empfänger/Verwendungszweck (diese beiden Felder wurden der Übersichtlichkeit halber zusammengefasst), zum Betrag sowie zum aktuellen Kontostand. Zusätzlich ist die Ausgabe nach Monaten gruppiert. Für jeden Monat gibt der Bericht außerdem die Differenz zwischen Anfangs- und Endbestand aus.

Eine weitere Funktion, die in dieser Anwendung nicht fehlen darf, dient zum Ausführen einer Überweisung. Um dies zu veranlassen, klicken Sie auf die Schaltfläche Neue Überweisung und füllen die passenden Felder im nun erscheinenden Formular frmUeberweisung aus (s. Abb. 6).

pic006.tif

Abb. 6: Eingabe von Umsatzdetails per Formular

Dabei hilft das Formular tatkräftig mit: Mit dem oberen Kombinationsfeld wählen Sie das Konto des Auftraggebers aus, sofern dies nicht das im aufrufenden Formular ausgewählte ist. Im Bereich Empfänger tragen Sie den Namen, die BLZ und Kontonummer des Adressaten ein, im unteren Bereich schließlich noch den zu überweisenden Betrag sowie den Verwendungszweck.

Nach dem Betätigen der Schaltfläche Überweisen müssen Sie je nach Zugriffsschutz entweder nur auf die Antwort warten (Schlüsseldatei) oder eine passende TAN eingeben (s. Abb. 7).

pic007.tif

Abb. 7: Bei Bedarf fragt die HBCI-Schnittstelle TANs ab.

Sollte kein Fehler auftreten, liefert das Formular das Überweisungsdatum sowie die Antwort des Bankservers als Inhalt zweier Textfelder zurück.

Komfortabel ist, dass der aktuell verwendete Empfänger in der Datenbank gespeichert wird und bei folgenden Überweisungen über das passende Kombinationsfeld ausgewählt werden kann.

Technischer Hintergrund

Nachfolgend stellt Ihnen dieser Beitrag einige technische Finessen vor, die für den Betrieb dieser Anwendung wichtig sind.

Vorweg folgender Hinweis: Die Anwendung enthält nur die allernotwendigsten Fehlerbehandlungen. Wenn Sie also nicht vorschriftsgemäß damit umgehen, könnte es hier und da krachen.

Als Erstes betrachten Sie die Technik, die für das Speichern der Vorgänge in der Tabelle tblVorgaenge zum Einsatz kommt. Diese Tabelle enthält Felder für alle Informationen, die DDBAC überhaupt aus einem Buchungssatz vom Bankserver herausholen kann - sicher ist sicher: Die paar Daten mehr machen den Braten nicht fett, sind aber für Vorgänge, die länger als 90 Tage zurückliegen und noch nicht gespeichert wurden, verloren.

Neben diesen Feldern enthält die Tabelle ein Primärschlüsselfeld namens VorgangID und zwei Felder zum Speichern der BLZ und der Kontonummer des betroffenen Kontos (die Anwendung kann mehrere Konten verwalten!). Weiter vorne haben Sie erfahren, dass die Anwendung zwar jeweils alle Vorgänge der letzten 90 Tage einliest, aber nur diejenigen in der Datenbank speichert, die noch nicht vorhanden sind.

Dazu brauchen Sie ein passendes Kriterium, das die vom Bankserver gelieferten Daten leider nicht bieten: Es gibt unter den vielen Eigenschaften eines Vorgangs kein einziges eindeutiges Merkmal.

Da man davon ausgehen kann, dass üblicherweise niemals zwei Überweisungen auf das gleiche Konto erfolgen, bei denen Datum und Zweck übereinstimmen, legen Sie für die passenden Felder einen zusammengesetzten, eindeutigen Index fest (s. Abb. 8). In der Routine, die für das Einlesen der Vorgänge zuständig ist, löst das Einfügen eines - nach diesen Kriterien - schon vorhandenen Vorgangs einen Fehler aus, der mit einer passenden Fehlerbehandlung unschädlich gemacht wird.

pic008.tif

Abb. 8: Die Felder der Tabelle tblVorgaenge sind mit einem zusammengesetzten, eindeutigen Schlüssel versehen.

Listing 1 liefert die Routine, die das Einlesen und Schreiben der Vorgänge in die passende Tabelle übernimmt. Diese Routine ist eine erweiterte Version der Routine aus dem ersten Teil dieser Beitragsreihe (s. Shortlink 468). Hinzugekommen sind vor allem die Deklaration und die Instanzierung passender Database- und Recordset-Objekte. Geändert hat sich gegenüber der vorherigen Variante nicht nur der Bereich, in dem die einzelnen Vorgänge im Direktfenster ausgegeben wurden.

Listing 1: Eintragen der Kontoumsätze als Buchungen in die Tabelle tblVorgaenge (Teil 1)

Public Sub KontoauszugInTabelle(intCustomer As Integer, Optional dateStart As Date, _
Optional dateEnd As Date)

    'Deklarationsteil siehe Beispieldatenbank

    Set db = CurrentDb

    Set rst = db.OpenRecordset("SELECT * FROM tblVorgaenge WHERE 1=2", dbOpenDynaset)

    Set objBanking = New BACBanking

    Set objCustomer = objBanking.Customers(intCustomer)

    Set objAccountSegment = objCustomer.AccountData.Segments(0)

    Set objDialog = objCustomer.NewDialogUI

    If objDialog Is Nothing Then

        Exit Sub

    End If

    objDialog.BeginDialog

    Set objKontoauszugSegment = objBanking.NewSegment("HKKAZ", objCustomer("HBCIVersion"))

    objKontoauszugSegment("AuftraggeberKontoverbindung1", "Kontonummer1") = _
objAccountSegment("Kontoverbindung1", "Kontonummer1")

    objKontoauszugSegment("AuftraggeberKontoverbindung1", "Laenderkennzeichen1") = _
objAccountSegment("Kontoverbindung1", "Laenderkennzeichen1")

    objKontoauszugSegment("AuftraggeberKontoverbindung1", "Kreditinstitutcode1") = _
objAccountSegment("Kontoverbindung1", "Kreditinstitutcode1")

    objKontoauszugSegment("AuftraggeberKontoverbindung1", "Unterkontomerkmal1") = _
objAccountSegment("Kontoverbindung1", "Unterkontomerkmal1")

    objKontoauszugSegment("AlleKonten1") = False

    If dateStart > 0 And dateEnd > 0 And (dateEnd >= dateStart) Then

        objKontoauszugSegment("DatumVon1") = dateStart

        objKontoauszugSegment("DatumBis1") = dateEnd

    End If

    Set objMessage = objDialog.ExecuteSegment(objKontoauszugSegment)

    Set objTransaction = objMessage.Transactions(0)

    If objTransaction.ResponseSegments.Count = 1 Then

        Set objResponseSegment = objTransaction.ResponseSegments(0)

        If Not IsEmpty(objResponseSegment) Then

            Set objSwiftStatement = objResponseSegment("UmsaetzeGebucht1")

        End If

    End If

    If DCount("VorgangID", "tblVorgaenge", "BLZ = '" & objCustomer.BankCode _
& "' AND Kontonummer = '" & objCustomer.UserID & "'") = 0 Then

        rst.AddNew

        rst!BLZ = objCustomer.BankCode

        rst!Kontonummer = objCustomer.UserID

        rst!Purpose = "Kontostand vor dem Speichern des ersten Vorgangs"

        rst!Amount = objSwiftStatement.OpeningBalanceAmount

        rst!EntryDate = objSwiftStatement.OpeningBalanceDate

        rst.Update

    End If

    For Each objLine In objSwiftStatement.StatementLines

        With objLine

            On Error Resume Next

            rst.AddNew

            rst!BLZ = objCustomer.BankCode

            rst!Kontonummer = objCustomer.UserID

            rst!AccountNumber = .AccountNumber

            rst!Amount = .Amount

            rst!BankCode = .BankCode

            rst!EntryDate = .EntryDate

            rst!Name_ = .Name

            rst!Purpose = .Purpose

            '... weitere Felder ...

            rst.Update

            If Err.Number > 0 Then

                Select Case Err

                    Case 3022

                    Case Else

                        MsgBox "Fehler: " & Err.Number

                End Select

            Else

                i = i + 1

            End If

            On Error GoTo 0

        End With

    Next objLine

    If i > 0 Then

        MsgBox "Es wurden " & i & " neue Vorgänge gespeichert.", vbOKOnly Or vbExclamation, _
"Neue Vorgänge"

    End If

    objDialog.EndDialog

End Sub

Die dazu notwendigen Anweisungen sind nun nicht mehr vorhanden, stattdessen werden die Buchungsdaten direkt in die passenden Felder der Tabelle geschrieben. Nach den bereits bekannten Zeilen zur Anmeldung und zum Zusammenstellen des an den Bankserver zu sendenden Segments prüft die Routine zunächst, ob bereits ein Vorgang für das aktuelle Konto gespeichert wurde.

Ist das nicht der Fall, erzeugt sie einen generischen Eintrag, der den Kontostand zum Zeitpunkt des ersten verfügbaren Vorgangs sowie sein Buchungsdatum enthält. Damit ist die Grundlage für das Berechnen des aktuellen Kontostandes zu jedem beliebigen Zeitpunkt geschaffen. Während des Speicherns der Vorgänge läuft eine Zählervariable mit, die anschließend in Form einer Meldung die Anzahl der eingelesenen Vorgänge ausgibt.

Gegenüber der ersten Version weist diese Variante der Routine vor allem einen weiteren Parameter auf, der den Index des zu verwendenden Kontos erwartet. Dieser hat, sofern Sie in der Systemsteuerung nur ein Konto festgelegt haben, immer den Wert 0.

Vorgänge anzeigen

Das Formular frmVorgaenge und das darin enthaltene Unterformular sfmVorgaenge sind für die Anzeige der Vorgänge verantwortlich.

Die Auswahl des gewünschten Kontos erfolgt mit dem Kombinationsfeld cboAccounts, das durch eine in der Ereignisprozedur Beim Öffnen des Formulars aufgerufene Routine gefüllt wird und als gebundene Spalte den Index des Kontos in der gleichen Reihenfolge wie im passenden, über die Systemsteuerung erreichbaren Dialog besitzt.

Das Füllen des Kombinationsfeldes übernimmt die Routine cboAccountsFuellen (s. Listing 2). Die Routine erzeugt zunächst ein neues BACContacts-Objekt und füllt es mit der Populate-Methode. Anschließend durchläuft es alle enthaltenen Einträge und setzt diese zu einer Zeichenkette zusammen, die anschließend der Datensatzherkunft des Formulars zugewiesen wird. Beachten Sie, dass hierzu kein Kontakt zu einem Bankserver erforderlich ist - die Daten werden alle beim Hinzufügen der Accounts zu den Homebanking-Kontakten über die Systemsteuerung hinzugefügt und können bequem von dort ausgelesen werden.

Listing 2: Füllen des Account-Kombinationsfeldes

Private Sub cboAccountsFuellen()

    Dim strAccounts As String

    Dim objContact As BACContact

    Dim objContacts As BACContacts

    Dim strFilter As String

    Dim i As Integer

    Set objContacts = New BACContacts

    objContacts.Populate ""

    For Each objContact In objContacts

        strAccounts = strAccounts & i & ";" & objContact.UserID _
& ";" & objContact.BankCode & ";" _
& objContact.Fields("Contact") & ";"

        i = i + 1

    Next objContact

    Me!cboAccounts.RowSourceType = "Wertliste"

    Me!cboAccounts.RowSource = strAccounts

    Me!cboAccounts = Me!cboAccounts.ItemData(0)

End Sub

Einlesen der Vorgänge starten

Die Schaltfläche cmdVorgaengeEinlesen ruft die soeben beschriebene Routine KontoauszugInTabelle mit dem Index-Wert auf, der dem im Kombinationsfeld cboAccounts ausgewählten Eintrag entspricht, und aktualisiert anschließend über die Routine AlleAnzeigen die Anzeige des Unterformulars mit den Vorgängen. Der Rest der Funktionalität des Formulars besteht im Auswählen alternativer Zeiträume und dem Anpassen der im Unterformular angezeigten Daten, wobei zwei Variablen zum Festlegen des Zeitraums durch passende Public Property Get-Prozeduren für den öffentlichen Zugriff deklariert werden - mehr dazu weiter unten.

Kontoumsätze per Bericht

Bevor es gleich zu den Überweisungen geht, folgen noch einige Informationen zur Anzeige der Vorgänge im Bericht rptVorgaenge. Der Bericht bezieht seine Daten aus der Abfrage qryVorgaenge (s. Abb. 9). Hier ist wichtig, dass die beiden Felder Name_ und Purpose zu einem durch einen Zeilenumbruch getrennten Text zusammengefasst werden. Der Hintergrund ist, dass das Feld Name_ (das übrigens nicht wie die korrenspondierende Vorgangs-Eigenschaft Name heißt, weil dieser Ausdruck als Feld- oder Variablenname unter Access Probleme bereiten kann) nicht immer gefüllt ist und daher gegebenenfalls eine häßliche Lücke im Bericht hinterließe.

pic009.tif

Abb. 9: Die Felder der Tabelle tblVorgaenge sind mit einem zusammengesetzten eindeutigen Schlüssel versehen.

Der Entwurf des Berichts sieht wie in Abb. 10 aus und enthält Gruppierungen nach der Bankleitzahl, der Kontonummer sowie nach dem Monat des Vorgangsdatums. Die ersten beiden sind nur interessant, wenn der Bericht mehrere Konten ausgeben soll. Die Gruppierung nach dem Monat soll zeigen, wie Sie den Gewinn oder Verlust innerhalb eines bestimmten Zeitraums ausgeben können. Genau dies passiert hier: Das Textfeld mit dem Inhalt =Summe(Amount) gibt nämlich die Summe aller Beträge innerhalb der Gruppierung aus. Rechts neben dem zum Vorgang gehörenden Umsatz befindet sich noch ein Textfeld zur Anzeige des zum Zeitpunkt des Vorgangs aktuellen Kontostands. Dazu enthält seine Eigenschaft Steuerelementinhalt den Wert =[txtAmount] und die Eigenschaft Laufende Summe den Wert Über alles.

pic010.tif

Abb. 10: Entwurfsansicht des Berichts zur Anzeige der Vorgangsliste

Filtern des Berichts ohne Beeinflussung des aktuellen Kontostands

Eine Herausforderung ist folgende: Die Daten im Bericht sollen nach dem im Formular frmVorgaenge angegebenen Zeitraum gefiltert werden. Nun ist das nicht so einfach über die Angabe eines passenden WhereCondition-Ausdrucks beim Öffnen des Berichts möglich, weil das Textfeld zum Ermitteln des zur Buchung passenden Kontostandes dann nicht auf allen vorherigen Vorgängen, sondern nur auf den angezeigten basiert - was das Ergebnis natürlich grob verfälscht.

Wie aber lassen sich sonst nur bestimmte Datensätze anzeigen, aber alle für den Kontostand relevanten Vorgänge berücksichtigen? Die erste Möglichkeit wäre, den Kontostand für den ersten angezeigten Vorgang per VBA zu ermitteln und zu allen angezeigten Kontoständen hinzuzuaddieren. Für dieses Beispiel wurde aber eine andere Möglichkeit gewählt. Der Bericht liest beim Öffnen zunächst die Grenzen des anzuzeigenden Zeitraums aus dem Formular frmVorgaenge in passende Variablen ein:

Private Sub Report_Open(Cancel As Integer)

    dateStart = Forms!frmVorgaenge.Startdatum

    dateEnd = Forms!frmVorgaenge.Enddatum

End Sub

Er wird aber nicht nach diesen Werten gefiltert, sondern er soll lediglich die außerhalb des angegebenen Zeitraums befindlichen Vorgänge ausblenden. Dafür sorgen die folgenden drei Ereignisprozeduren, die jeweils beim Formatieren verschiedener Bereiche ausgelöst werden (s. Listing 3). Befindet sich der aktuelle Eintrag nicht innerhalb der angegebenen Grenzen, wird die Ausgabe des Bereichs durch Setzen des Parameters Cancel auf den Wert True unterbunden. Interessanterweise wirkt sich dies nicht auf die laufenden Summen aus, diese werden wie gehabt aus allen vorherigen Vorgängen ermittelt.

Listing 3: Bereiche ausblenden

Private Sub Detailbereich_Format(Cancel As Integer,
FormatCount As Integer)

    If Me!EntryDate < dateStart Or Me!EntryDate > dateEnd Then

    Cancel = True

End If

End Sub

Private Sub Gruppenfuß1_Format(Cancel As Integer, _
FormatCount As Integer)

    If Me!EntryDate < dateStart Or Me!EntryDate > dateEnd Then

        Cancel = True

    End If

End Sub

Private Sub Gruppenkopf0_Format(Cancel As Integer, _
FormatCount As Integer)

    If Me!EntryDate < dateStart Or Me!EntryDate > dateEnd Then

        Cancel = True

    End If

End Sub

Überweisungen vornehmen

Nach diesem Praxisbeispiel lernen Sie nun noch eine weitere Funktion kennen, die Sie mit der DDBAC-Bibliothek realisieren können (es gäbe noch viele mehr, doch Lastschriften, Sammellastschriften, Sammelüberweisungen oder Zugriffe auf Depots bleiben im Rahmen dieses Beitrags außen vor). Wer mag, kann sich die notwendigen Routinen aber im VB-Projekt HBCIPAD des Entwicklerpakets von DDBAC ansehen.

Bei der nun vorgestellten Funktion handelt es sich um eine einfache Überweisung. Die Routine aus Listing 3 tut das, was Sie früher (oder vielleicht auch noch heutzutage) mit dem klassischen Überweisungsträger erledigt haben ("Bitte möglichst mit Schreibmaschine ausfüllen! Bei Handausschreibung in Druckschrift und »GROSSBUCHSTABEN«"). Die Routine erwartet einige Parameter zur Übergabe der Kontonummer, der Bankleitzahl und des Besitzers des Zielkontos sowie des Betrags und des Verwendungszwecks. Für Letzteren gilt: Nicht mehr als 27 Zeichen pro Zeile!

Listing 3: Diese Routine nimmt eine einfache Überweisung vor.

Public Function Ueberweisung(intContact As Integer, strKontonummer As String, strBLZ As String, strEmpfaengername As String, curBetrag As Currency, strVerwendungszweck As String) As String

    'Deklaration siehe Beispieldatenbank

    Set objBanking = New BACBanking

    Set objCustomer = objBanking.Customers(intContact)

    Set objAccountSegment = objCustomer.AccountData.Segments(0)

    Set objDialog = objCustomer.NewDialogUI

    objDialog.BeginDialog

    Set objUeberweisungSegment = objBanking.NewSegment("HKUEB", objCustomer("HBCIVersion"))

    objUeberweisungSegment("AuftraggeberKontoverbindung1", "Kontonummer1") = _
objAccountSegment("Kontoverbindung1", "Kontonummer1")

    objUeberweisungSegment("AuftraggeberKontoverbindung1", "Laenderkennzeichen1") = _
objAccountSegment("Kontoverbindung1", "Laenderkennzeichen1")

    objUeberweisungSegment("AuftraggeberKontoverbindung1", "Kreditinstitutcode1") = _
objAccountSegment("Kontoverbindung1", "Kreditinstitutcode1")

    objUeberweisungSegment("AuftraggeberKontoverbindung1", "Unterkontomerkmal1") = _
objAccountSegment("Kontoverbindung1", "Unterkontomerkmal1")

    objUeberweisungSegment("AlleKonten1") = False

    objUeberweisungSegment("EmpfaengerKontoverbindung1", "Kontonummer1") = strKontonummer

    objUeberweisungSegment("EmpfaengerKontoverbindung1", "Laenderkennzeichen1") = 280

    objUeberweisungSegment("EmpfaengerKontoverbindung1", "Kreditinstitutcode1") = strBLZ

    objUeberweisungSegment("EmpfaengernameEins1") = strEmpfaengername

    objUeberweisungSegment("Zahlungsbetrag1", "Wert1") = curBetrag

    objUeberweisungSegment("Zahlungsbetrag1", "Waehrung1") = "EUR"

    objUeberweisungSegment("Textschluessel1") = 51

    strZeile() = Split(strVerwendungszweck, vbCrLf)

    j = 1

    For i = LBound(strZeile()) To UBound(strZeile())

        objUeberweisungSegment("Verwendungszweck1", "Zeile" & j) = strZeile(i)

        j = j + 1

    Next i

    Set objMessage = objDialog.ExecuteSegment(objUeberweisungSegment)

    Set objTransaction = objMessage.Transactions(0)

    Set objErgebnis = objTransaction.Acknowledgement

    For i = 1 To 100

        If Len(objErgebnis(i, 3)) > 0 Then

            strErgebnis = strErgebnis & vbCrLf & objErgebnis(i, 3)

        End If

    Next i

    Ueberweisung = strErgebnis

    objDialog.EndDialog

End Function

Mit alldem arbeiten weitgehend die aus den Beispielen des ersten Teils bekannten Protagonisten. Im Mittelpunkt steht zunächst ein Segment namens objUeberweisungssegment, das nach dem Herstellen der Verbindung mit dem Bankserver zunächst mit den Auftraggeberdaten gefüllt wird - bis hierher nichts Neues. Dann aber kommt der Empfänger ins Spiel, zunächst über die Zuweisung der Kontonummer, der Bankleitzahl sowie der obligatorischen Länderkennung. Es folgen der Name des Empfängers, der Betrag, die Währung sowie ein weiterer notwendiger Wert namens Textschluessel1. Die als Verwendungszweck angegebene Zeichenfolge nimmt die Routine auseinander und trägt die einzelnen Zeilen in je ein Element einer Auflistung ein. Das so zusammengestellte Segment wird schließlich mit der Methode ExecuteSegment ausgeführt. Hier handelt es sich nicht wie in den ersten beiden Beispielen zur Ermittlung des Kontostandes und der Kontoumsätze um die Abfrage von Daten, sondern um die Ausführung einer Transaktion. Dennoch liefert der Bankserver Informationen zurück, und zwar um den Erfolg oder den Misserfolg der Transaktion zu melden. Diese Informationen kommen in Form eines weiteren Segments, das Elemente mit den während der Transaktion aufgelaufenen Meldungen liefert. Diese liest die letzte For Next-Schleife der Routine aus und gibt die resultierende Zeichenkette als Funktionswert an die aufrufende Routine zurück.

Das Formular frmUeberweisung hält wenig Überraschungen bereit, sodass der geneigte Leser an die Quellen in der Beispieldatenbank verwiesen wird. Dort findet er etwa eine ähnliche Routine wie im Formular frmVorgaenge, um das Kombinationsfeld mit den Auftraggebern zu füllen, oder die Funktion, die neue Empfänger einer Überweisung in der Tabelle tblEmpfaenger speichert und diese fortan im Kombinationsfeld zur Auswahl des Empfängers zur Verfügung stellt.

Zusammenfassung und Ausblick

Wenn auch die vorgestellten Techniken und die dazu gehörende Beispielanwendung zum Einlesen von Vorgängen und zum Tätigen von Überweisungen taugen, darf dies nicht darüber hinwegtäuschen, dass die Programmierung von Routinen, die über alle Unwägbarkeiten erhaben sind, viel mehr Code erfordern würde - etwa zur Plausibilitätsprüfung von Eingaben.

Wer mag, kann sich dazu die im VB-Beispielprojekt HBCIPAD enthaltenen Prozeduren ansehen. Die hier vorgestellten Routinen sind von den dortigen Abläufen abgeleitet und orientieren sich am optimalen Vorgang. Was den Funktionsumfang angeht, scheinen die hier abgedeckten Funktionen dem zu entsprechen, was man im Allgemeinen beim Onlinebanking erledigt - Kontostände und -umsätze abfragen und Überweisungen tätigen. Alles andere geschieht wohl eher selten, sodass Sie dazu entweder auf die Internetvariante zurückgreifen oder sich die eine oder andere Funktion hinzuprogrammieren - das DDBAC-SDK liefert genügend Anregungen. Davon abgesehen ist eine solche Access-Anwendung wesentlich komfortabler als eine Web-Anwendung: Hier entscheiden Sie nämlich selbst, ob und wann die Benutzeroberfläche, an die Sie sich seit langer Zeit gewöhnt haben, ein Facelifting nötig hat. Auch die Gewissheit, auf alle Vorgänge und nicht nur auf die der letzten 90 Tage zugreifen zu können, ist sehr tröstlich. In diesem Sinne: Viel Spaß beim Onlinebanking!

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Download

Download

Die .zip-Datei enthält folgende Dateien:

HBCI.accdb

HBCI.mdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.