Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Sicherheit / BLZ

Bankleitzahlen und co.

Einleitung

Bankleitzahlen sind bei der Abwicklung von Geldgeschäften das "A und O". Leider ändern sie sich ständig (es kommen neue Banken hinzu, andere werden geschlossen). Daher ist eine statische BLZ-Datenbank nicht geeignet und die manuelle Nacherfassung ist kaum zumutbar.

Glücklicherweise gibt es auf www.bankleitzahlen.de eine Internet-Anwendung, die eine Bank-Suche gemäß BLZ, Bankname und/oder Standort ermöglicht. Was liegt da näher, als diese Quelle zu nutzen? Smile!

Prinzip

Die unten vorgestellte GetBLZInfos-Funktionen simuliert mit Hilfe der im Artikel "HTML-Formulare mit VB ausfüllen" gezeigten HttpPost-Funktion das Ausfüllen der Suchmaske. Das aus dem Internet erhaltene Ergebnis wird dann (mehr oder weniger mühselig) mit den bekannten String-Funktionen analysiert und passend auseinander geschnitten.

Da u.U. als Suchergebnis mehrere relevante Bank-Einträge existieren können, werden die Daten in einem sogenannten disconnected Recordset abgeliefert. Dazu wird ADO benötigt, also muss unter "Projekt/Verweise" (engl. Project/References) das Häckchen vor "Microsoft ActiveX Data Objects 2.1 Library" (o.ä.) aktiviert sein.

Beispiel

Das folgende Beispiel sucht alle Banken, die eine BLZ der Form "44010..." haben und gibt das Resultat im Debug-Fenster aus:

Dim rs As Recordset

Set rs = GetBLZInfos("44010")
Debug.Print rs.RecordCount; "Treffer:"
Do Until rs.EOF
  Debug.Print rs("BLZ"); " - "; rs("Bank"); ", "; rs("Ort")
  rs.MoveNext
Loop

Als Ergebnis erscheinen folgende Daten im Testfenster (Stand: 09.11.2001):

 6 Treffer:
44010400 - Westfälische Hypothekenbank, Dortmund
44010300 - ABN AMRO Bank, Dortmund
44010200 - AXA Colonia Bausparkasse, Dortmund
44010111 - SEB, Dortmund
44010111 - SEB, Lünen
44010046 - Postbank, Dortmund

Code / Quelltext

In der Hauptfunktion werden die Suchparameter zu einem Internet-genehmen String zusammengebaut. Falls die Suche erfolgreich war, wird die Analyse-Funktion aufgerufen. Ansonsten wird ein abfangbarer VB-Error erzeugt.

' ©2001 by Jost Schwider, http://vb-tec.de/
Public Function GetBLZInfos( _
    Optional ByRef BLZ As String, _
    Optional ByRef Bank As String, _
    Optional ByRef Ort As String, _
    Optional ByVal OpenType As InternetOpenType = IOTPreconfig, _
    Optional ByVal Port As Integer = 80, _
    Optional ByRef Username As String, _
    Optional ByRef Password As String _
  ) As Recordset
  'Deklarationen:
  Const URL = "http://www.bankleitzahlen.de/bankleitzahlen.php"
  Dim Param As String
  Dim HTML As String
  
  If IsNumeric(BLZ) Then
    'Suche via Leitzahl:
    Param = "blz=" & URLEncode(BLZ)
  End If
  
  If Len(Bank) Then
    'Suche via Bankname:
    If Len(Param) Then Param = Param & "&"
    Param = Param & "name=" & URLEncode(Bank)
  End If
  
  If Len(Ort) Then
    'Suche via Standort:
    If Len(Param) Then Param = Param & "&"
    Param = Param & "ort=" & URLEncode(Ort)
  End If
  
  If Len(Param) Then
    'HTML-Seite holen:
    HTML = HttpPost(URL, Param, OpenType, Port, Username, Password)
    
    If InStr(HTML, "Anfrage ergab") Then
      Set GetBLZInfos = BLZInfos(HTML)
    ElseIf Len(HTML) Then
      Err.Raise 17 'Can't perform requested operation
    Else
      Err.Raise 52 'Bad file name or number
    End If
  Else
    Err.Raise 5 'Invalid procedure call or argument
  End If
End Function

Die eigentliche Arbeit geschieht in der Analyse-Funktion: Es wird ein Recordset "aus dem Nichts" erzeugt - es liegt also keine Datenbank dahinter. Dann werden mit den bekannten String-Funktionen nach und nach die Informationen aus dem HTML-Code herausgeschnitten und dem Recordset hinzugefügt.

' ©2001 by Jost Schwider, http://vb-tec.de/
Private Function BLZInfos(ByRef HTML As String) As Recordset
  Dim iDetails As Long
  Dim iStart As Long
  Dim iBLZ As Long
  Dim BLZ As String
  Dim iBank As Long
  Dim Bank As String
  Dim iOrt As Long
  Dim Ort As String
  Dim i As Long
  
  Set BLZInfos = New Recordset
  With BLZInfos
  
    'Recordset anlegen:
    With .Fields
      .Append "BLZ", adChar, 8
      .Append "Bank", adVarChar, 40
      .Append "Ort", adVarChar, 40
    End With
    .CursorLocation = adUseClient
    .CursorType = adOpenStatic
    .Open
    
    'Ergebnis analysieren:
    iDetails = InStr(HTML, ">Details</a>")
    Do While iDetails
      iStart = InStrRev(HTML, "<tr", iDetails)
      
      'Bankleitzahl ausschneiden:
      iBLZ = InStr(iStart, HTML, "</td><td>") - 8
      BLZ = Mid$(HTML, iBLZ, 8)
      
      'Bankname ausschneiden:
      iBank = InStr(iBLZ + 17, HTML, ">") + 1
      i = InStr(iBank, HTML, "</td>")
      Bank = Mid$(HTML, iBank, i - iBank)
      
      'Standort ausschneiden:
      i = InStr(i + 1, HTML, "</td>")
      iOrt = InStr(i + 9, HTML, ">") + 1
      i = InStr(iOrt, HTML, "</td>")
      Ort = Mid$(HTML, iOrt, i - iOrt)
      
      'Datensatz hinzufügen:
      .AddNew _
          Array("BLZ", "Bank", "Ort"), _
          Array(BLZ, Bank, Ort)
      
      'Nächsten Eintrag suchen:
      iDetails = InStr(iDetails + 1, HTML, ">Details</a>")
    Loop
    
    'Recordset positionieren:
    If iStart Then .MoveFirst
  
  End With
End Function

© Jost Schwider, 09.11.200-09.11.2001 - http://vb-tec.de/blz.htm