Modules

5.62 Funzione per verificare l'esattezza di un codice BBAN
  Riccardi Giacheri

Che cosa è il BBAN
Il BBAN (Basic Bank Account Number) è lo standard di comunicazione delle coordinate bancarie nazionali.
Questo standard permette, all'ordinante o alla banca del destinatario del bonifico, di verificare la correttezza del dato grazie alla presenza del carattere di controllo.
Per l'Italia la struttura delle coordinate bancarie è stata indicata dall'ABI (Associazione Bancaria Italiana).

Il BBAN ha una lunghezza di 23 caratteri, non può contenere né spazi né caratteri speciali, come trattino o barra, è composto di numeri e di lettere maiuscole, secondo il seguente schema:
Campo                               CIN                                           ABI                                                     CAB                                             Conto
Descrizione           carattere di controllo          codice della banca destinataria         codice della filiale destinataria        numero del conto bancario
Posizione                             0                                         da 1 a 5                                             da 6 a 10                                      da 11 a 22
Composizione             una lettera                                cinque cifre                                        cinque cifre                           dodici tra lettere e cifre
Esempio                               Q                                          01234                                                 12345                                      000000753XYZ
Il primo campo del BBAN è il carattere di controllo dell'esatta scrittura dei successivi 22 caratteri.
Seguono i codici a cinque cifre ABI e CAB.
Il numero del conto corrente bancario è allineato a destra, ed è riempito di zeri a sinistra per occupare tutto lo spazio di dodici caratteri.
Nei sistemi applicativi attuali il BBAN può essere registrato nei campi CIN, ABI, CAB e nel campo del conto corrente.

Algoritmo di controllo del BBAN
Il BBAN deve essere una stringa di 23 caratteri, con le posizioni numerate da 0 a 22.
Deve contenere solo lettere maiuscole dell'alfabeto latino da A a Z e cifre da 0 a 9.
Inoltre, la posizione 0 può essere occupata esclusivamente da una lettera, mentre le posizioni da 1 a 10 esclusivamente da cifre.
Ogni carattere è convertito in un codice da 0 a 25 secondo la seguente regola.
1) La cifra è trasformata nel numero corrispondente, ad esempio 7 in 7.
2) La lettera A si converte in 0, B in 1, ecc., Z si converte in 25.
Viene calcolata la somma di controllo per le posizioni da 1 a 22, in modo diverso per le posizioni pari e quelle mtrDisp.
Ogni posizione pari contribuisce alla somma con il proprio codice calcolato nel punto precedente dell'algoritmo.
Ogni posizione mtrDisp contribuisce con una funzione del proprio codice, descritta nella seguente tabella:
Codice         0  1  2  3  4   5   6   7   8   9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Contributo   1  0  5  7  9 13 15 17 19 21   2   4 18 20 11   3   6  8  12 14 16 10 22 25 24 23
Dividendo la somma di controllo per 26, si ottiene il resto che deve coincidere con il codice del carattere nella posizione 0.

Il BBAN può essere verificato tramite la seguente funzione:
Function fcBank_BBANChek(pstrBBan As String, pstrMsg As String) As Boolean
'----------------------------------------------------------------------------------------------------
' VERIFICA DI UN CODICE BBAN
'----------------------------------------------------------------------------------------------------
' Parametri:
'       pstrBBan = Codice BBAN da verificare
'       pstrMsg = Messaggio di risposta (solo se BBAN non è corretto !!)
'----------------------------------------------------------------------------------------------------
' Autore: Riccardo Giacheri
' Email: riccardo@giacheri.it
'----------------------------------------------------------------------------------------------------
' Funzione originale in Java estratta da :
'       http://it.geocities.com/arodichevski/comp-iban-it.html
'       Autore: Alexandre Rodichevski
'----------------------------------------------------------------------------------------------------
        Dim mtrDisp
        Dim mtrString(0 To 22)
        Dim intS As Integer
        Dim intJ As Integer
        Dim intK As Integer
        Dim intCin As Integer
        Dim varChair
        mtrDisp = Array(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23)
        ' Controllo della lunghezza
        ' Il BBAN deve essere una stringa di 23 caratteri, con le posizioni numerate da 0 a 22.
        If Len(pstrBBan) <> 23 Then
                pstrMsg = "La lunghezza è diversa da 23 caratteri"
                Exit Function
        End If
        ' Memorizza srtinga e verifica caratteri consentiti
        intS = 0
        For intJ = 1 To 23
                varChair = Mid(pstrBBan, intJ, 1)
                mtrString(intS) = Mid(pstrBBan, intJ, 1)
                intS = intS + 1
        Next intJ
        ' Ogni carattere è convertito in un codice da 0 a 25 secondo la seguente regola.
        '       1) La cifra è trasformata nel numero corrispondente, ad esempio 7 in 7.
        '       2) La lettera A si converte in 0, B in 1, ecc., Z si converte in 25.
        ' Ciclo tra caratteri della stringa
        intS = 0
        For intJ = 0 To 22
                ' Estrae il prossimo carattere varChair
                varChair = Asc(mtrString(intJ))
                ' Calcola il codice intK da 0 a 25
                If varChair >= 48 And varChair <= 57 Then     ' per cifra 0-9
                        ' La posizione 0 può essere occupata esclusivamente da una lettera
                        If (intJ = 0) Then
                                pstrMsg = "CIN non può contenere cifre"
                                Exit Function
                        End If
                        intK = varChair - 48
                ElseIf varChair >= 65 And varChair <= 90 Then ' per lettera A-Z
                        ' Le posizioni da 1 a 10 possono essere occupate esclusivamente da cifre
                        If intJ >= 1 And intJ <= 10 Then
                                pstrMsg = "ABI e CAB non possono contenere lettere"
                                Exit Function
                        End If
                        intK = varChair - 65
                ' Deve contenere solo lettere maiuscole dell'alfabeto latino da A a Z e cifre da 0 a 9.
                Else
                        pstrMsg = "Sono ammesse solo cifre e lettere maiuscole"
                        Exit Function
                End If
                ' Calcola la somma di controllo intS e il codice di controllo CIN
                ' Viene calcolata la somma di controllo per le posizioni da 1 a 22, in modo diverso per i posti pari e quelli mtrDisp.
                ' Ogni posizione pari contribuisce alla somma con il proprio codice calcolato nel punto precedente dell'algoritmo.
                ' Ogni posizione mtrDisp contribuisce con una funzione del proprio codice, descritta nella seguente tabella:
                '       Codice        0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
                '       Contributo   1 0 5 7 9 13 15 17 19 21 2 4 18 20 11 3 6 8 12 14 16 10 22 25 24 23
                If intJ = 0 Then ' codice di controllo
                        intCin = intK
                ElseIf (intJ Mod 2) = 0 Then ' posizione pari
                        intS = intS + intK
                Else ' posizione mtrDisp
                        intS = intS + mtrDisp(intK)
                End If

        Next intJ
        ' Il resto della divisione deve coincidere con il codice di controllo
        ' Dividendo la somma di controllo per 26, si ottiene il resto che deve coincidere con il codice del carattere nella posizione 0.
        If (intS Mod 26) <> intCin Then
                pstrMsg = "Il codice di controllo è errato"
                Exit Function
        End If
        ' Fine del controllo
        fcBank_BBANChek = True
End Function
Qui di seguito sono riportati degli esempi di richiamo della funzione fcBank_BBANChek:
'----------------------------------------------------------------------------------------------------
' VERIFICA DI UN CODICE BBAN (SUBROUTINE DI TEST)
'----------------------------------------------------------------------------------------------------
' Autore: Riccardo Giacheri
' Email: riccardo@giacheri.it
'----------------------------------------------------------------------------------------------------

        Dim strIBan As String
        Dim strMsg As String
        Dim intJ As Integer
        
        ' ESEMPIO 1
        ' Si seguano i passi dell'algoritmo nella seguente tabella:
        '       Posizione                                       0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16   17  18  19  20  21  22
        '       Posizione pari/mtrDisp                          d  p  d  p  d  p  d  p  d  p    d   p    d    p    d    p    d    p    d   p    d    p
        '       Carattere                                      Q  0  1  2  3  4  1  2  3  4  5    0   0    0    0    0    0    7    5    3   X    Y    Z
        '       Codice                                          16 0  1  2  3  4  1  2  3  4  5    0   0    0    0    0    0    7    5    3   23  24  25
        '       Contributo alla somma di controllo       1  1  5  3  9  1  5  3  9  5    1   0    1    0    1    0    17   5   7   23  24  25
        ' La stringa è composta di 23 caratteri, contiene solo lettere maiuscole Q, X, Y, Z e cifre.
        ' Al CIN Q corrisponde il codice 16 coincidente con il resto della divisione della somma di controllo 146 per 26. Quindi questo codice BBAN è corretto.
        intJ = 1
        strIBan = "Q0123412345000000753XYZ"
        If fcBank_BBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE BBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE BBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If

        ' ESEMPIO 2
        ' La lunghezza è di 26 caratteri, quindi è errata.
        ' Inoltre, questa stringa contiene alcuni spazi.
        intJ = 2
        strIBan = "Q 01234 12345 000000753XYZ"
        If fcBank_BBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE BBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE BBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If
        
        ' ESEMPIO 3
        ' Questa stringa contiene contiene un carattere speciale /, quindi è errata.
        intJ = 3
        strIBan = "Q012341234500000753/XYZ"
        If fcBank_BBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE BBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE BBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If

        ' ESEMPIO 4
        ' Questo esempio è identico al primo, ad eccezione del CIN B.
        ' A questo carattere corrisponde il codice 1 che non coincide con il resto della divisione della somma di controllo per 26.
        ' Quindi il codice di controllo è errato.
        intJ = 4
        strIBan = "B0123412345000000753XYZ"
        If fcBank_BBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE BBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE BBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If

Download:
 
  BBAN.zip (18Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.