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

Calcul Clé EAN13   



L'auteur

buldo84
France France
Membre Simple
# 0000000730
enregistré le 10/11/2005

http://www.vitacroc.fr
Soubigou laurent
de la société vitacroc
Fiche personnelle


Note des membres
pas de note

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

Calcul Clé EAN13
# 0000000293
ajouté le 23/02/2006 08:58:49 et modifié le 23/02/2006
consulté 14863 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0

Description

voici une petite contribution (c'est la première)

Il s'agit d'une procédure permettant de calculer la clé d'un code EAN13.

J'espère quelle pourra servir à quelqu'un.

Merci à vous tous.

Code source :
*--------------------------------------------------------------------------*
*---> Cle_Ean(p_pays, p_societe, p_code)
*---> Calcul de la clé d'un code EAN13
*---> Un code EAN13 est toujours sous la forme
*---> Code Pays     3 pour la france
*---> Code Société     zzzzzz    Code à 6 chiffres attribué par GS1 France
*---> Code Article     xxxxx   Code à 5 chiffres identifiant un article (officiel ou personnel)
*---> Clé       Y    CLE suivant algorythme GENCOD GS1
*---> les valeurs sont passées en STRING
*--------------------------------------------------------------------------*
PROCEDURE Cle_Ean(p_pays, p_societe, p_code)
LOCAL v_code, v_numero, v_cle

  v_code = p_pays + p_societe + p_code
  v_cle = ""  && Valeur à calculer
  *---> Calcul de la cle
  *---> Principe: Numéroté de droite à gauche les 13 chiffres (La cle est le N° 1)
  *---> Additionné les rangs pairs puis * 3
  *---> Ajouter les rangs impairs
  *---> la clé est égale à la différence entre ce nombre et la dizaine suppérieure

  *---> Addition des chiffres pairs
  v_cle = VAL(SUBSTR(v_newcode,12,1)) +;
          VAL(SUBSTR(v_newcode,10,1)) +;
          VAL(SUBSTR(v_newcode,8,1)) +;
          VAL(SUBSTR(v_newcode,6,1)) +;
          VAL(SUBSTR(v_newcode,4,1)) +;
          VAL(SUBSTR(v_newcode,2,1))
  *---> Multiplication par 3
  v_cle = v_cle * 3
  *---> Addition des chiffres impairs
  v_cle = v_cle + VAL(SUBSTR(v_newcode,11,1)) +;
                  VAL(SUBSTR(v_newcode,9,1)) +;
                  VAL(SUBSTR(v_newcode,7,1)) +;
                  VAL(SUBSTR(v_newcode,5,1)) +;
                  VAL(SUBSTR(v_newcode,3,1)) +;
                  VAL(SUBSTR(v_newcode,1,1))
  *---> Calcul de la dizaine suppérieure et soustraction
  v_cle = ((VAL(SUBSTR(STRTRAN(STR(v_cle, 2, 0), " ""0"), 1, 1))+1) * 10) - v_cle
  *---> Si multiple de 10 => 0
  IF v_cle = 10
    v_cle = 0
  ENDIF

  *---> Création du code définitif
  v_code = v_code + STR(v_cle, 1)

  RETURN v_code
ENDPROC
*--------------------------------------------------------------------------*

Commentaires
le 05/06/2009, Jean à Grenoble a écrit :
dans une table qui contient 21000 références, j'en ai environ 2000 qui ont un code-barre à 12 caractères au lieu de 13. Ta contribution va donc m'aider. MAIS, pour la tester, j'ai fait calculer la clef des codes-barre à 13 caractères et j'ai comparé le résultat de ta fonction avec la clef réelle. Il y a beaucoup d'erreur (10%). Où est le loup ?

le 05/06/2009, eric leissler a écrit :
Jean j 'ai vu ca et voici la correction que j'avais apporté

*--------------------------------------------------------------------------*
*---> Cle_Ean(p_pays, p_societe, p_code)
*---> Calcul de la clé d'un code EAN13
*---> Un code EAN13 est toujours sous la forme
*---> Code Pays 3 pour la france
*---> Code Société zzzzzz Code à 6 chiffres attribué par GS1 France
*---> Code Article xxxxx Code à 5 chiffres identifiant un article (officiel ou personnel)
*---> Clé Y CLE suivant algorythme GENCOD GS1
*---> les valeurs sont passées en STRING
*--------------------------------------------------------------------------*
function Cle_Ean13(monparam)
LOCAL v_newcode, v_numero, v_cle

v_newcode = monparam
v_cle = "" && Valeur à calculer
*---> Calcul de la cle
*---> Principe: Numéroté de droite à gauche les 13 chiffres (La cle est le N° 1)
*---> Additionné les rangs pairs puis * 3
*---> Ajouter les rangs impairs
*---> la clé est égale à la différence entre ce nombre et la dizaine suppérieure

*---> Addition des chiffres pairs
v_cle = VAL(SUBSTR(v_newcode,12,1)) +;
VAL(SUBSTR(v_newcode,10,1)) +;
VAL(SUBSTR(v_newcode,8,1)) +;
VAL(SUBSTR(v_newcode,6,1)) +;
VAL(SUBSTR(v_newcode,4,1)) +;
VAL(SUBSTR(v_newcode,2,1))
*---> Multiplication par 3
v_cle = v_cle * 3
*---> Addition des chiffres impairs
v_cle = v_cle + VAL(SUBSTR(v_newcode,11,1)) +;
VAL(SUBSTR(v_newcode,9,1)) +;
VAL(SUBSTR(v_newcode,7,1)) +;
VAL(SUBSTR(v_newcode,5,1)) +;
VAL(SUBSTR(v_newcode,3,1)) +;
VAL(SUBSTR(v_newcode,1,1))
*---> Calcul de la dizaine suppérieure et soustraction
v_cle = ((VAL(SUBSTR(STRTRAN(STR(v_cle, 2, 0), " ", "0"), 1, 1))+1) * 10) - v_cle
*---> Si multiple de 10 => 0
IF v_cle = 10
v_cle = 0
ENDIF

*---> Création du code définitif
v_newcode = v_newcode + STR(v_cle, 1)

RETURN STR(v_cle, 1)
ENDPROC
*--------------------------------------------------------------------------*


cordialement

le 05/06/2009, Jean à Grenoble a écrit :
euh, à part pour le paramètre, je ne vois pas beaucoup de différence !

A+
Jean

le 05/06/2009, Jean à Grenoble a écrit :
J'ai modifié le calcul de la dizaine supérieure comme suit :

v_cle = (INT(v_cle/10)+1) * 10 - v_cle

et cela a l'air de bien mieux fonctionner (mais j'ai quand même une dizaine d'erreurs sur 10000

A+
Jean

le 06/06/2009, Gregory Adam a écrit :
Jean,

La dizaine superieure ...
v_cle = 10 - mod(v_cle,10)

le 06/06/2009, eric leissler a écrit :
jean ca fonctione bien mais tes codes sont faux
Tu dois avoir 12 digits à coder
1 pour le code pays
6 pour le code entreprise
5 pour le code article
la clé est le 13° digit
4078500407850 ne peut te donner que
4078500407854
4 code pays
078500 code société
40785 code article et
4 la clé
A+
Eric

le 18/11/2009, buldo84 a écrit :
Merci à tous pour vos commentaires et corrections. J'ai suivi vos corrections et cela m'a bien aidé (calcul avec clé négative !!!). Attention aux futurs évolutions sur les code Ean13, la grande distribution souhaite modifier ce code car les 5 caractères du code article sont insuffisant ... à suivre

Publicité

Les pubs en cours :


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