Convertiseur IBAN

falcon4 Messages postés 2 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 25 février 2009 - 24 févr. 2009 à 22:01
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 - 26 nov. 2010 à 20:54
Bonjour

Je suis un vrai néophite en la matière et suis à la recherche d'un convertiseur de numéros de comptes bancaires belges en comptes IBAN. Le language est le VB interne à Access 2003.
En effet il faut intégrer la conversion à une table access 2003. La table account a pour structure:
Bank-Account-Control
000-0000000-00
quelqu'un a-t-il une idée?

Merci à vous

13 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2009 à 22:50
Pour la belgique, le code IBAN à la structure suivante :
BExxbbbcccccccyy ou
xx = clé du code IBAN, c'est un modulo 97
bbb = code de la banque
ccccccc = n° du compte
yy = clé du n°

bbb-ccccccc-yy représentant ce que tu donne sous le terme Bank-Account-Control.

A partir donc du BAC, du code pays converti en nombre (A=10, B=11, ...,E=14, ....) et d'une clé xx nulle, tu construis le nombre suivant : bbbcccccccyy111400 et tu applique le modulo 97 suivant cette formule pour calculer la clé :
xx = 97 + 1 + (bbbcccccccyy111400 MOD 97)

Il ne te reste plus qu'à reconstruire le code IBAN

Exemple pour le compte 539-0075470-34
xx 97 + 1 - (539007547034111400 MOD 97) 68
et donc le code IBAN : BE68 5390 0754 7034 pour la version papier et  BE68539007547034 pour la version électronique

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
falcon4 Messages postés 2 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 25 février 2009
25 févr. 2009 à 20:16
Merci pour cette réponse ultra rapide.

N'y connaissant pas grand chose (rien du tout) comment mettre en place ce code pour des comptes IBAN?

PS: comme je le disais dans mon premier message, la structure dans la db est (j'ai ajouté la colonne country)
country-bank-account-control =IBAN (chaque fois une colonne dans la db)

Merci d'avance
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
26 nov. 2010 à 13:59
bonjour

me risquerai je pour avoir la même information pour la France

obtenir l'iban à partir d'un rib

surtout la conversion des lettres du n° de compte.

D'avance merci



bidouille007
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 nov. 2010 à 14:16
Pour la france, la structure est la suivante :
FRxxbbbbbgggggcccccccccccyy
xx = clé du code IBAN, c'est un modulo 97
bbbbb = code de la banque
ggggg = code guichet
ccccccccccc = n° du compte
yy = clé du n° de compte

Les principes de calculs et les correspondances lettres/chiffres sont les même.

--> Norme ISO 13616:2003 Banque et services financiers connexes—Numéro de compte bancaire international (IBAN)


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
26 nov. 2010 à 14:46
Casy Merci pour ta rapidite

mais pardon de ne pas comprendre mais je vais etre concret, je comprends
mieux :

code banque : 11111
code guichet : 222222
numero compte : 123456789B9
clé RIB (je suppose) = 88 (bidon mais c'est juste que j'essaye de comprendre

dans ta réponse yy = clé du n° de compte ca correspond à la clé RIB ?

la banque est en France

comment je fais pour traduire le M puisque dans l'explication il est remplacé un caractère par 2 soit dans mon exemple le numéro de compte devient 123456789119 et donc le numéro de compte à 12 positions au lieu de 11 ?

xx = 97 + 1 + (1111112345678911988152600 MOD 97)

xx devrait contenir le code de la clef IBAN ?

mon raisonnement est bon ou


Désolé d'insister

bidouille007
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 nov. 2010 à 14:58
oui yy correspond à la clé RIB en france.

Oui, pour le calcul et uniquement pour le calcul, les lettres doivent être remplacées par leur équivalent à 2 chiffres.

Pour les données que tu donne :
code banque : 11111
code guichet : 222222
numero compte : 123456789B9 (tu parle de M mais tu as donné B dans n°)
clé RIB = 88
Tu vas avoir un IBAN de la forme : FR?? 1111 1222 2212 3456 789B 988

Pour calculer la clé tu construit le nombre de la sorte (avec une clé à 0):
1111122222123456789B988FR00 soit 111112222212345678911988152700
Tu en calcule la clé selon la formule
clé = 97 + 1 - (nombre Mod 97)
la clé est égale à 71 et donc l'IBAN est
en version papier : IBAN FR71 1111 1222 2212 3456 789B 988
en version électronique : FR711111122222123456789B988

Teste avec ton n° de compte et vérifie l'IBAN obtenu avec celui que tu as sur un RIB (dans ton chéquier par exemple)

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
26 nov. 2010 à 16:04
après plusieurs essais, je ne trouve pas pareil:

dans l'exemple le code retourne 40 au lieu de 71 et en faisant avec mon RIB perso je ne trouve pas pareil que la banque pourtant dans mon rib il n'y a pas de lettre dans mon n° de compte

    Public Function VerifCleIban(ByVal CodeBanque As String, ByVal CodeGuichet As String, ByVal CodeCompte As String, ByVal clerib As String) As String
        Dim AA As String
        Dim CodePays, Pays As String
        Pays = "FR"
        CodePays = Trim(Str(Asc(Mid(Pays, 1, 1)) - 55)) & Trim(Str(Asc(Mid(Pays, 2, 1)) - 55))
        CodePays = CodePays & "00"
        Dim ccb, ccg, cnc, ccr As String
        ccb = CodeBanque
        ccg = CodeGuichet
        cnc = CodeCompte
        ccr = clerib
        Dim A As String
        Dim B As String
        Dim i As Integer
        VerifCleIban = ""
        If Len(CodeBanque) < 5 Then
            ccb = StrDup(5 - Len(ccb), "0") + ccb
        End If
        If Len(clerib) < 2 Then
            ccr = StrDup(2 - Len(ccr), "0") + ccr
        End If
        If Len(CodeGuichet) < 5 Then
            ccg = StrDup(5 - Len(ccg), "0") + ccg
        End If
        If Len(CodeCompte) < 11 Then
            cnc = StrDup(11 - Len(cnc), "0") + cnc
        End If
        ' vérif si les coordonnées bancaires ne sont pas renseignées
        If ccb <> "" And ccg <> "" And cnc <> "" Then
            A = Trim(ccb) & Trim(ccg) & Trim(cnc) & Trim(ccr) & Trim(CodePays)
            ' remplacement des lettres alphabètiques par des nombres
            B = ""
            For i = 1 To Len(A)
                AA = UCase(Mid(A, i, 1))
                If IsNumeric(AA) = False Then
                    AA = Trim(Str(Asc(AA) - 55))
                End If
                B = B + AA
            Next i
            Dim clé As Object
            clé = 97 + 1 - (Val(B) Mod 97)
            ' on obtient la clé IBAN
            MsgBox(B & " - >" & clé)
            MsgBox("clef iban " & Pays & clé & "-" & ccb & ccg & cnc & ccr)
        End If
    End Function


Donc je suppose que quelque chose m'échappe mais je ne vois pas ou ?

bidouille007
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 nov. 2010 à 16:41
Attention à l'instruction Val(B) Mod 97.
Comme on a ici des nombres très grands, Val(B) sera donné en nombre flottant de type Double. Or les nombres flottants ne sont pas des nombres justes, certaines valeurs ne sont pas représentable en flotant, les nombres sont donc arrondis à la valeur la plus proche.

Pour utiliser de grands nombres justes ils font travailler avec des variables de type Decimal :

..........
Dim clé As Decimal
clé = 97 + 1 - (CDec(B) Mod 97)
' on obtient la clé IBAN
MsgBox(B & " - >" & clé.ToString)
MsgBox("clef iban " & Pays & clé.ToString & "-" & ccb & ccg & cnc & ccr)



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
26 nov. 2010 à 17:36
bon bein en faisant comme tu l'indiques

le code ne doit pas apprécier

 clé = 97 + 1 - (CDec(B) Mod 97)


car je n'ai même pas l'affiche des messages qui suivent cette instruction sans même que cela ne génére une erreur de toute sorte.



bidouille007
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 nov. 2010 à 17:47
En fait si, il y a une erreur, je m'en suis aussi aperçu. Le nombre généré par la concaténations des différentes informations est parfois tellement grand qu'aucune fonction ne permet un calcul du Modulo. On obtient une exception de dépassement de capacité.

Il faut donc calculer le modulo autrement. Le lien que j'ai donné vers wikipédia donne justement des exemples de codes avec, pour VB, une méthode différente.

Pour l'insérer dans ton code il falloir remplacer les lignes suivantes
Dim clé As Decimal
clé = 97 + 1 - (CDec(B) Mod 97)
' on obtient la clé IBAN
MsgBox(B & " - >" & clé.ToString)
MsgBox("clef iban " & Pays & clé.ToString & "-" & ccb & ccg & cnc & ccr)

par
Dim checksum As Integer = Integer.Parse(B.Substring(0, 1))
Dim idx As Integer = 1
While idx < B.Length
Dim v As Integer = Integer.Parse(B.Substring(idx, 1))
checksum *= 10
checksum += v
checksum = checksum Mod 97
System.Math.Max(System.Threading.Interlocked.Increment(idx), idx - 1)
End While
Dim clé As Integer = 97 + 1 - checksum

' on obtient la clé IBAN
MsgBox(B & " - >" & clé.ToString("00"))
MsgBox("clef iban " & Pays & clé.ToString("00") & "-" & ccb & ccg & cnc & ccr)




[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
26 nov. 2010 à 17:58
tu tiens le bon bout puisque avec mon rib personnel c'est OK par contre pour le rib bidon de l'exemple page 1 le resultat que ca trouve est 33 et pas 71 ?!





bidouille007
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 nov. 2010 à 18:10
c'est juste que 33 est la bonne clé et 71 était apparemment dû à une erreur de calcul


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
26 nov. 2010 à 20:54
Merci Casy de ta précieuse aide, sans toi j'y serai encore à me casser la tête.

Je te donne REPONSE ACCEPTEE

Et Merci Encore



bidouille007
0
Rejoignez-nous