ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Calcul de la Clé IBAN   



L'auteur

Jean-Marc TESTUD
France France
Membre Actif (personne physique)
# 0000000026
enregistré le 15/10/2004

TESTUD JEAN MARC
GRAVESON 13690
de la société Transports JH MESGUEN
Fiche personnelle


Note des membres
pas de note

Contributions > 01 - PRG : Programmation > Calculs de clefs et Checksums (rib, iban, ...)

Calcul de la Clé IBAN
# 0000000687
ajouté le 22/04/2009 17:52:14 et modifié le 11/05/2009
consulté 12041 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0
VFP 5.0
VFP 3.0
FPW 2.6
FPD 2.x


Le téléchargement des pièces jointes est limité aux membres
Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description

Cette fonction permet à partir d'un Code Pays et d'un numéro de compte de renvoyer la Clé IBAN.

 

On envoie "FR" et un N° de Compte "132061100000000562...." complet donc pour les comptes français avec la Clé RIB incluse et cela renvoie le Code Pays passé en entrée suivi de la Clé de Contrôle (Exemple : FR76).

 

Cette fonction a été écrite en s'appuyant sur des Contributions AtoutFox, sur des réponses que j'ai eues dans le news "microsoft.public.fr.fox" et je remercie ceux qui y ont participés.

 

TESTUD Jean-Marc (www.testud.fr)

Code source :
*-------------------------------------------------------------------------------------------------------------------------*
FUNCTION CleIban
PARAMETER CodPay, NCpt
***********************************************************************
*   La fonction doit recevoir Code Pays en alpha (2 Car.) en parametres
*   La fonction doit recevoir le numéro de compte complet en parametres
*
*   L'IBAN est renvoyé par la fonction en AlphaNumérique ("XX99")
*  Code Pays + Cle IBAN calculée
*
*   Pour les N° comptes alpha les lettres sont remplacées par des chiffres
*   selon la convention ci_dessous
*
*   A=10 B=11 C=12 ...
*
***********************************************************************
PRIVATE MonIbanComplet, MonIbanTravail, BtI, BtRest
PRIVATE ValRetour

m.ValRetour=""

* Verification des Paramettres

IF LEN(ALLTRIM(UPPER(m.CodPay))) # 2 THEN
  RETURN m.ValRetour
ENDIF
IF EMPTY(ALLTRIM(m.NCpt)) OR LEN(ALLTRIM(m.NCpt))>30 THEN
  RETURN m.ValRetour
ENDIF

* Transformation des Lettres par leurs valeurs dans le N° de Compte

m.MonIbanComplet = UPPER(m.NCpt) + ALLTRIM(UPPER(m.CodPay))+"00"
m.MonIbanTravail = ""

FOR m.BtI = 1 TO LEN(m.MonIbanComplet)
  IF ISALPHA(SUBSTR(m.MonIbanComplet,m.BtI,1)) THEN
    m.MonIbanTravail = m.MonIbanTravail + STR(ASC(SUBSTR(m.MonIbanComplet,m.BtI,1))-55,2,0)
  ELSE
    m.MonIbanTravail = m.MonIbanTravail + SUBSTR(m.MonIbanComplet,m.BtI,1)
  ENDIF
NEXT m.BtI

* Calcul de la Valeur de l'IBAN

m.BtRest = ""

FOR m.BtI = 1 TO LEN(m.MonIbanTravail) STEP 10
  m.BtRest = LTRIM(STR(INT(MOD(VAL(m.BtRest + SUBSTR(m.MonIbanTravail, m.BtI, 10)), 97))))
NEXT m.BtI

m.ValRetour = 98 - VAL(m.BtRest)
m.ValRetour = ALLTRIM(UPPER(m.CodPay)) + RIGHT("00"+ALLTRIM(STR(m.ValRetour)),2)

RETURN m.ValRetour
Commentaires
le 22/04/2009, eric leissler a écrit :
simple, clair et net
Bravo Jean Marc !
je te donne 20/20 ( si tant est que je sois capable de donner quoi que ce soit.
Amitiés
Eric

le 29/04/2009, Gregory Adam a écrit :
Salut Jean-Marc,

Quelques observations

(1) Tu n’aimes pas les boucles
(2) ? CleIban('MK', '250120000058984') retourne ‘MK7’ au lieu de ‘MK07’
(3) Selon http://en.wikipedia.org/wiki/International_Bank_Account_Number , la clef ne peut être 98 (eg FR98) et doit être FR01
a. Convert the string to an integer (i.e. ignore leading zeroes) and mod-97 the entire number minus 1, then add 1.
b. J’ai fait le calcul et essaye avec FR98 et FR01 (http://www.tbg5-finance.org/?ibancheck.shtml)
i. Il n’accepte pas les FR01 (ou BE01). Donc le wiki doit avoir une erreur
ii. J’ai modifie ma contrib – et ajoute AL
(4) Le format des IBAN se trouve aussi ici > http://www.swift.com/57387/bic_downloads_documents/pdfs/IBAN_Registry.pdf
a. ( page principale http://www.swift.com/solutions/messaging/information_products/directory_products/iban_format_registry/index.page?lang=en )
i. Ou http://www.swift.com/solutions/messaging/information_products/directory_products/iban_format_registry/index.page?lang=fr

le 30/04/2009, Jean-Marc TESTUD a écrit :
Bonjour Greg,

Je viens de corriger le cas du "MK07" à la place du "MK7".

Les boucles, je n'ai rien contre mais dans ce cas là, je trouve le code moins lisible, je l'ai fait en boucle et je l'ai remis en commentaire.

Par contre, je n'ai pas d'exemple pour essayer le "FR01" ou le "FR98" ou alors je n'ai pas compris ce que tu voulais dire.

A+

TESTUD Jean-Marc (www.testud.fr)

le 30/04/2009, Gregory Adam a écrit :
J'explique
(1) La boucle
btRest = ''
For i = 1 to len(m.MonIbanTravail) step 10
BtRest = ltrim(str(int(mod(val(BtRest + substr(MonIbanTravail, m.i, 10)), 97))))
endfor

(2)
Supposons (exemple) que NCpt = 00000097
Cela veut dire que le mod(nCpt, 97) sera 0
Maintenant compare ces deux facons de calculer

n = '00000097'

&& wiki
&& Convert the string to an integer (i.e. ignore leading zeroes) and mod-97 the entire number minus 1, then add 1.
x = mod(int(val(n)) -1, 97) + 1
?x && 97
?'Clef wiki', padl(98 - x, 2, '0') && 01

&& ?
x = mod(int(val(n)), 97)
?x && 0
?'Clef', padl(98 - x, 2, '0') && 98

Mes tests prouvent que la facon du wiki est mauvaise

le 11/05/2009, Jean-Marc TESTUD a écrit :
Voici, grace à la participation éclairée de Grégory, la version definitive ... j'espère

TESTUD Jean-Marc (www.testud.fr)

le 11/09/2009, Jean à Grenoble a écrit :
et pour faire un peu plus 'moderne' (cela doit dater de ... FPD2.0 !) :
sur l'avant dernière ligne :
RIGHT("00"+ALLTRIM(STR(m.ValRetour)),2) peut s'écrire

TRANSFORM(m.ValRetour, "@L 99")

Jean

le 11/09/2009, Jean-Marc TESTUD a écrit :
Jean,

J'adore ton commentaire sur la vétusté du code proposé, je ne te savais pas si en pointe au niveau des nouvelles technologies et c’est vrai que de mon coté je suis monté dans le dernier wagon du train du progrès que de justesse.

Toutefois pour amener plus de précisions, quand tu parles de FPD2.0, je suppose qu'il s'agit en réalité de FPW2.0.

Jean-Marc

le 11/09/2009, Francis Faure a écrit :
:-)
à y être :

PADL(m.ValRetour, 2, "0")

est il plus "moderne" ?

Cordialement

le 11/09/2009, Jean-Marc TESTUD a écrit :
Le maitre a parlé, c'est beau ... et efficace en plus.

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3