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 FunctionQui 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: |