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

Test le numero d'un rib   



L'auteur

Olivier Hamou
France 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 as Integer, nCodeGuichet as Integer
Local nNumCompte as Integer, nCLERIB as Integer
Local nCleRibCalcule as Integer, nValRetour as Integer

* changement eventuel des lettres en chiffres info par eric and wiki
m.cNUMCOMPTE   = ChrTran(m.cNUMCOMPTE,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","12345678912345678923456789")

m.nCodeBanque    = val(m.cCODEBANQUE)
m.nCodeGuichet   = val(m.cCODEGUICHET)
m.nNumCompte     = val(m.cNUMCOMPTE)
m.nCLERIB        = val(m.cCLERIB)
m.nCLERIBCALCULE = 0
m.nValRetour     = 0

DO CASE
  CASE ! This.IsDigit(m.cCODEBANQUE) OR Len(m.cCODEBANQUE)<>5
  m.nValRetour = -1
  CASE ! This.IsDigit(m.cCODEGUICHET) OR Len(m.cCODEGUICHET)<>5
  m.nValRetour = -2
  CASE ! This.IsDigit(m.cNumCompte) OR Len(m.cNumCompte)<>11
  m.nValRetour = -3
  CASE ! This.IsDigit(m.cCLERIB) OR Len(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 as String

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

le 14/05/2010, Olivier Hamou a écrit :
Salut Eric,

Si je lance tes deux rib

m.cCODEBANQUE = "11111"
m.cCODEGUICHET = "11111"
m.cNUMCOMPTE = "11111111111"
m.cCLERIB = "48"

m.cCODEBANQUE = "11111"
m.cCODEGUICHET = "11111"
m.cNUMCOMPTE = "aaaaaaaaaaa"
m.cCLERIB = "48"

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.

Merci @+

le 15/05/2010, Gregory Adam a écrit :
Olivier,

Pourquoi tu fais le test: Between(m.nCLERIB,1,97)

Retour -5 ou -6, c'est la meme chose, non ?

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

Cordialement
Eric

le 16/05/2010, Gregory Adam a écrit :
Olivier,

(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

Il y a les tests de longueur !

le 16/05/2010, Olivier Hamou a écrit :
Pour greg,

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.

J'espere que tu me comprendras

le 17/05/2010, Gregory Adam a écrit :
Olivier,

(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 ?

petit skarabee


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