Le code de loulou ne fonctionne pas, j'ai décidé de tout reprendre à 0
Mon but étant de convertir un RIB en IBAN + BIC
Je me suis basé pour comprendre sur cette explication assez claire.
* Le RIB
code banque =5 BBBBB
code guichet = 5 AAAAA
numéro de compte = 11 CCCCCCCCCCC
clé rib =2 KK
* L'IBAN est composé des données du RIB (sur 27 caractères)
FRXXBBBBBAAAAACCCCCCCCCCCKK
Les premiers deux caractères sont : FR (code iso2 de la France)
Les 3ème et 4 ème caractères sont : XX (clé)
De 5 à 9 : BBBBB (code banque)
De 10 à 14 AAAAA (code guichet)
De 15 à 25 CCCCCCCCCCC (numéro de compte)
Les 26 et 27 KK (clé rib)
Si le pays de règlement est la France, la clé IBAN doit être calculée selon l'algorythme :
1- code IBAN placer 00 dans le champ clé IBAN FR00BBBBBAAAAACCCCCCCCCCCKK
2- placer les 4 premiers caractères en fin du code BBBBBAAAAACCCCCCCCCCCKKFR00
3- remplacer les lettres par leurs correspondants nombre (A=10, B=11, C=12... Z=35) et donc BBBBBAAAAACCCCCCCCCCCKK152700 (F=15 and R=27)
Toutes les lettres doivent être remplacées
C'est ici que la galère commence
4- Jouer la commande modulo 97 au résultat obtenu
Mod97 = BBBBBAAAAACCCCCCCCCCCKK152700 MODULO 97
5- effectuer la soustraction 98- Mod97 = IBAN key (XX)
6- le code iban répondu est donc : FRXXBBBBBAAAAACCCCCCCCCCCKK
Dis comme ça ça parait chouette mais le modulo d'un compte à plus de 9 chiffres est pas possible en 32bits
Il faut donc fractionner comme ceci.
On prend les 7 premiers chiffres auxquels on applique un %97
BBBBBAA % 97 = 64 par exemple
On place 34 devant les 7 prochains chiffres ce qui donne 34AAACCCC
34AAACCCC % 97 = 44
On continue avec un
24CCCCCCC % 97 = 31
Puis on termine avec
31CCCCKK % 97 = 13
La dernière est censée donner la clé FR13, ce qui ne fonctionne pas dans mon cas.
Le truc c'est que j'ai trouvé plein de méthodes voisines mais qu'aucune n'arrive à me donner satisfaction.
Voilà le code que j'ai pondu.
Code : Tout sélectionner
; Ar-S RIB 2 IBAN
Declare.s ConvertASC_to_IBAN(banque$, guichet$, NumCompte.s,CleRib.s)
Rib.s = "VOTRE RIB ICI"
Rib.s = Trim(Rib)
Rib.s = RemoveString(rib," ")
Structure RIB
Banque.s
Guichet.s
NumCompte.s
CleRIB.s
EndStructure
Global NewList IBAN.RIB()
; Séparation des éléments dans une liste
AddElement ( IBAN() )
IBAN()\Banque = Left(Rib, 5)
Debug "IBAN()\Banque " + IBAN()\banque
StartGuichet = 6
IBAN()\Guichet = Mid(Rib, StartGuichet, 5)
Debug "IBAN()\Guichet : " + IBAN()\Guichet
IBAN()\NumCompte = Mid(Rib, 11, 11)
Debug "IBAN()\NumCompte : " + IBAN()\NumCompte
IBAN()\CleRIB = Right(rib,2)
Debug "CleRIB : " + IBAN()\CleRIB
; test ;-
Compte.s = IBAN()\Banque+IBAN()\Guichet+IBAN()\NumCompte+IBAN()\CleRIB
Debug " C O M P T E : " + Compte
ComptePourCle.s = ConvertASC_to_IBAN (IBAN()\Banque, IBAN()\Guichet, IBAN()\NumCompte,IBAN()\CleRIB)
Procedure.s ConvertASC_to_IBAN(banque$, guichet$, NumCompte.s, Clerib.s)
Protected cle.i, Lpart, NewNum.s
CopyCompte.s = banque$+guichet$+NumCompte.s + clerib.s + "152700" ; "152700 est la conversion de FR00"
CopyCompte = RemoveString(CopyCompte," ")
Lpart = Len(CopyCompte)
Debug CopyCompte
Debug "longueur apres conversion :" + Str(Lpart)
For i = 1 To Lpart
Car.s = Mid(CopyCompte,i,1)
If Asc (car) > 65 And Asc (car) < 91 ; Si c'est une lettre
Debug "Lettre trouvée : " + car + " = Valeur ASCII : " + Str (Asc(car) )
NewNum = Str( Asc(car)-55 )
CopyCompte = ReplaceString(CopyCompte, car, NewNum )
EndIf
Next
Lcompte = Len(CopyCompte)
Debug "Compte modifié pour calcule clé "
Debug " == " + CopyCompte + " ==" ; 2004101007170210122038152700
Debug "Taille : " + Len(CopyCompte)
; V1
ZeDIV = Lcompte / 7
ZeRest = Lcompte % 7
Tot = 0
NewCOUNT.s = "0"
Pos = 0
For i = 0 To ZeDIV
NewCOUNT + Mid (CopyCompte, Pos, 7)
Debug "Fractionement : " + NewCOUNT
B = Val(NewCOUNT) %97
NewCOUNT = Str(B)
Debug "transformé en : " + Str(B)
TEST.s = test+Str(b)
Tot = Tot +B
pos+7
Next
If ZeRest > 0
B = Val( NewCOUNT + Mid (CopyCompte, Pos, ZeRest) ) %97
Tot = tot + B
TEST.s = test+Str(b)
EndIf
Debug "B : " + Str(B)
Debug "Test : " + Test
Cle = 98 - Val(test) %97
; Cle = 98 - Val(tot) %97 ; autre test
Debug "Clé iban : FR" + Str(Cle)
ProcedureReturn CopyCompte.s
EndProcedure
2 jours que je me pète la tête sur ce truc, ça me rend fou.
Je suis sûr que c'est une connerie du à la fraction du grand numéro de compte mais moi et les maths on a toujours été en froid, pourtant j'y met du miens... Bref si quelqu'un voit la pine.
sources que j'ai exploité :
http://fr.wikipedia.org/wiki/Basic_Bank_Account_Number
http://www.cnb.cz/miranda2/export/sites ... EBS204.pdf
y'en a d'autres mais j'ai pas gardé tous les liens
http://fr.wikipedia.org/wiki/ISO_13616