Olivier Hamou France Membre Simple # 0000000017 enregistré le 13/10/2004 http://www.planitron.com Hamou Olivier 94100 Saint Maur des fossés de la société PLANITRON Fiche personnelle
Note des membres 16/20 1 vote
Contributions > 01 - PRG : Programmation > Calculs de clefs et Checksums (rib, iban, ...)
Test le numero d'un rib
# 0000000755
ajouté le 14/05/2010 15:10:19 et modifié le 17/05/2010
consulté 11561 fois
Niveau
débutant
Version(s) Foxpro : VFP 9.0
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
Function qui permet de tester si le relevé d'identité bancaire est correct.
Code source :
*=================================================================== * Method : RibTest * Date creation : 13/05/2010 * Date de modification : 15/05/2010 * Description : Method qui test la cle rib d'un compte * Return : Si Succes doit renvoyer 1 * nError : Test des chiffres pour greg * : -1 = Code Banque mal rempli ou different de 5 Chiffres * : -2 = Code Guichet mal rempli ou different de 5 Chiffres * : -3 = n° de compte mal rempli ou different de 11 Chiffres * : -4 = Cle Rib non numerique ou inferieur à 2 chiffres * : -5 = Cle Rib non valide * : -6 = Rib non valide *=================================================================== Lparameters cCODEBANQUE, cCODEGUICHET, cNUMCOMPTE, cCLERIB
Local nCodeBanque asInteger, nCodeGuichet asInteger Local nNumCompte asInteger, nCLERIB asInteger Local nCleRibCalcule asInteger, nValRetour asInteger
* changement eventuel des lettres en chiffres info par eric and wiki
m.cNUMCOMPTE = ChrTran(m.cNUMCOMPTE,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","12345678912345678923456789")
DOCASE CASE ! This.IsDigit(m.cCODEBANQUE) ORLen(m.cCODEBANQUE)<>5
m.nValRetour = -1 CASE ! This.IsDigit(m.cCODEGUICHET) ORLen(m.cCODEGUICHET)<>5
m.nValRetour = -2 CASE ! This.IsDigit(m.cNumCompte) ORLen(m.cNumCompte)<>11
m.nValRetour = -3 CASE ! This.IsDigit(m.cCLERIB) ORLen(m.cCLERIB)<>2
m.nValRetour = -4 ENDCASE
if m.nValRetour = 0
m.nCleRibCalcule = 97 - ((89 * m.nCodeBanque + 15 * m.nCODEGUICHET + 3 * m.nNUMCOMPTE) % 97) &&Messagebox(m.nCleRibCalcule) If ! Between(m.nCLERIB,1,97)&& une cle rib n'est valable que si elle est compris entre 1 et 97
m.nValRetour = -5 Else If m.nCLERIB == m.nCleRibCalcule
m.nValRetour = 1 Else
m.nValRetour = -6 EndIF EndIF EndIF
Return m.nValRetour
*=================================================================== * Method : isDigit * Date creation : 15/05/2010 * Date de modification : 15/05/2010 * Description : Method qui test la chaine * Return : True ou False *=================================================================== Lparameters cChaine asString
Local lValRetour as Boolean
m.lValRetour = .F.
m.cChaine = ChrTran(m.cChaine,"1234567890","")
m.lValRetour = Empty(Len(m.cChaine))
Return m.lValRetour
Commentaires
le 14/05/2010, eric leissler a écrit : Bonjour Olivier
Ta fonction ne gère pas les numéros de compte bancaires comportant des lettres. Ex le comptes de style CPP. Si tu teste 11111 11111 11111111111 tu compare bien avec 48 mais si tu fait 11111 11111 aaaaaaaaaaa il ne te donne rien alors que la clé rib existe et est 48 regarde le code dans http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000716 ou dans http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000054
qui gèrent les numéros de compte lettrés. Cordialemnet eric
Il me renvoit 1 et -3 donc cela fonctionne bien, mais je peux rajouter un test comme tu le soulignes pour tester s' il y a des alphas.
Fais le test et dis moi ce que tu en penses.
Bonjour à la mauritanie !
le 14/05/2010, eric leissler a écrit : je ne comprend pas comment cette procédure peut te renvoyer à la fois 1 et -3
il ne peut comparer If m.nCLERIB == m.nCleRibCalcule m.nValRetour = 1 car m.nNumCompte = val(m.cNUMCOMPTE) fait que lorsque le numéro de compte comporte une lettre, la variable m.nnumcompte devient égale à 0
or tu peux avoir des comptes du style 225145DB25Z
il existe un système d'équivalence entre les lettres et les chiffres. Regarde dans le deux contrib que j'ai mis dont celle qui a six ans et qui fonctionne avec tout type de compte
Alamalecum salam de la part de mauritaniens Cordialement Eric
le 15/05/2010, Gregory Adam a écrit : Regarde ici, Olivier: http://fr.wikipedia.org/wiki/Cl%C3%A9_RIB
le 15/05/2010, Olivier Hamou a écrit : Eric je viens de comprendre que le rib peut contenir aussi des lettres sur le wiki j'ai rajouté la transformation comme tu le précises.
Tu ne testerais pas si les champs sont numeriques ?
le 15/05/2010, Olivier Hamou a écrit : -5 la cle rib saisi par le user est fausse car non compris en 1 et 97
et - 6 , ma cle rib est comprise entre 1 et 97 mais n'est pas bien saisi.
Cela permet d'affiner le code erreur pour le messagebox du user.
le 15/05/2010, eric leissler a écrit : Bonjour Olivier *------------- le 15/05/2010, Olivier Hamou a écrit : Eric je viens de comprendre que le rib peut contenir aussi des lettres sur le wiki j'ai rajouté la transformation comme tu le précises. *------------------ Ca prouve qu'atoutfox était en avance sur wiki dès novembre 2004 *----------- fonction de calcul d'une clé rib # 0000000054 ajouté le 15/11/2004 09:38:11 et modifié le 29/03/2006 *-------------
c'est ce qui fait la force de notre association. Il ne faut pas hésiter à voir et chercher les diverses contributions des uns et des autres. Il y a la une mine d'or.
Et vive atoutfox Cordialement Eric
le 15/05/2010, Olivier Hamou a écrit : Modif pour Greg !
Pour Eric, il fallait que je fasse ma function car en regardant les contribs je n'ai pas compris au 1er abord, cela me permet de tout assimiler.
le 15/05/2010, eric leissler a écrit : Mais tu n'a pas à te justifier Olivier. Je n'ai pas le monopole des calculs de clé rib. C'est justement ce qui fait la richesse de notre association, c'est d'avoir plusieurs approches pour un même problème et l'essentiel est que tu ai compris le fonctionnement. Donc plus que jamais Vive atoutfox
(1) Local lValRetour as Boolean m.lValRetour = .F. m.cChaine = ChrTran(m.cChaine,"1234567890","")
If Empty(m.cChaine) && IsDigit m.lValRetour = .T. EndIF
Faut changer le test en Empty(len(m.cChaine))
(2) CASE ! This.IsDigit(m.cCODEBANQUE) OR Len(m.cCODEBANQUE)<5 Et que se passe-t-il si je passe un cCODEBANQUE avec une longueur de 6 ou plus ?
(3) tu ne testes pas la longueur ni le contenu de cNUMCOMPTE
le 16/05/2010, eric leissler a écrit : voir dans http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000716 ou dans http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000054
Ca y est je t'ai mis la function au plus au niveau de sécurité.
What do you think ?
La function la plus commenté d'atoutfox
greg, je crois qu'eric veut que tu jettes un coup d'oeil sur ses contribs !
Hi Hi Eric je t'envois le greg ! (Maitre Obiwan va optimiser ton code ! je suis encore un padawan)
le 16/05/2010, eric leissler a écrit : Non Olivier, je ne veux pas que greg regardes ma contrib. Elle fonctionne, teste le numéro de compte et me va très bien comme ca
En revanche, j'ai juste l'impression que tu cherche à réinventer la roue, mais c'est juste ton choix. Cordialement Eric
le 17/05/2010, Olivier Hamou a écrit : Eric , dans tes contribs j'ai pas compris les règles de calcul, la deuxieme me semble plus abordable mais cela est resté flou, et je ne peux pas appliquer des functions que je ne comprends pas.
(1) CASE Empty(m.nNumCompte) OR Len(m.nNumCompte)<>11 Tu veux dire CASE Empty(m.nNumCompte) OR Len(m.cNumCompte)<>11
(2) Pourquoi tu ne testes pas this IsDigit(m.cNumCompte) ??
le 17/05/2010, eric leissler a écrit : Olivier, te comprendre ? euh comment te le dire élégament ? , non Je n'ai jamais compris la réinvention de la roue. C'est pour moi une perte de temps. J'espère pour toi que cette perte de temps est juste investie pour la compréhension et ne fait pas partie d'un projet commercial.
Chacun son point de vue. @+
le 17/05/2010, Olivier Hamou a écrit : I hope that all is alright maitre Kwai Chang Ken ?
Bonjour Olivier
Ta fonction ne gère pas les numéros de compte bancaires comportant des lettres.
Ex le comptes de style CPP.
Si tu teste 11111 11111 11111111111 tu compare bien avec 48 mais si tu fait
11111 11111 aaaaaaaaaaa il ne te donne rien alors que la clé rib existe et est 48
regarde le code dans http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000716
ou dans
http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000054
qui gèrent les numéros de compte lettrés.
Cordialemnet
eric