| 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 000000753XYZIl 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 23Dividendo 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: |