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é 14899 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)
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)
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
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 ?