Jump to content
  • 0

Calcul Clefs de contrôle sur Code barre GS1 SSCC


dden
 Share

Question

Bonjour

Un petit coup de main SVP

Je souhaite tenter de créer des Codes barres conforme GS1 ( N° SSCC)

Pour ce faire il me faut réunir une suite de 17 chiffres + 1 clef de contrôle.

Avec les bonne rubrique rien d’impossible. Sauf que le dernier chiffre est une clef de contrôle. C'est un calcule basé sur "l'algorithme standard sg1"

Bref, une clef calculée en fonction de la suite de chiffre précédente. Filemaker est en mesure de faire ce calcule, mais la fonction en question est pour le moment, pour moi indéchiffrable.

En effet J'ai trouver dans un un exemple Excel, cette fonction sous forme de macro. Et je ne connais pas le langage macro d'Excel. (snif)

Qui pour m'aider à traduire ce langage Excel en langage FMP.

Donc voici la fonction Excel  et en pièce joint le fichier Excel de demo

 

"Function calculateCheckDigit(value)
    lenval = Len(value)
    factor = 3
    Sum = 0
    For Index = lenval To 1 Step -1
        Sum = Sum + (CInt(Mid(value, Index, 1)) * factor)
        factor = 4 - factor
    Next
    calculateCheckDigit = ((1000 - Sum) Mod 10)
End Function

Sub addCheckDigit()
    If TypeName(Selection) <> "Range" Then Exit Sub
    For Each i In Selection
        currentValue = i.value
        i.value = currentValue & calculateCheckDigit(currentValue)
    Next
End Sub"

 

Merci d'avance de votre aide

Cordialement

 

 

 

Excel Check Digit Calculator.xls

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

voila le code ... il y a peu être moyen de simplifier ;)

CodeBar & 10 - Extrait ( Extrait ( CodeBar ; 2 ; 1 )+Extrait ( CodeBar ; 4 ; 1 )+Extrait ( CodeBar ; 6 ; 1 )+Extrait ( CodeBar ; 8 ; 1 )+Extrait ( CodeBar ; 10 ; 1 )+Extrait ( CodeBar ; 12 ; 1 )+Extrait ( CodeBar ; 14 ; 1 )+Extrait ( CodeBar ; 16 ; 1 )+Extrait ( CodeBar ; 1 ; 1 )*3+Extrait ( CodeBar ; 3 ; 1 )*3+Extrait ( CodeBar ; 5 ; 1 )*3+Extrait ( CodeBar ; 7 ; 1 )*3+Extrait ( CodeBar ; 9 ; 1 )*3+Extrait ( CodeBar ; 11 ; 1 )*3+Extrait ( CodeBar ; 13 ; 1 )*3+Extrait ( CodeBar ; 15 ; 1 )*3+Extrait ( CodeBar ; 17 ; 1 )*3; 2 ; 1 )

 

de 54100000000000003 ( rubrique Codebar )

ca donne 541000000000000039 ( rubrique résultat )

qui est juste, j'ai vérifier avec le site "https://www.gs1belu.org/fr/calculez-le-chiffre-de-controle"

 

Link to comment
Share on other sites

  • 0

Wouahou

C'est l'effet que ça me fait

Super GRAND MERCI

Bon je vais essayer de comprendre le fonctionnement pour être moins Bête  ce soir .

Merci beaucoup

PS comment vous avez su que l’algorithme était celui ci ?

 

 

Link to comment
Share on other sites

  • 0

Oups

Effectivement ça marche pour certain code.

Mais j'en ai qui ne corresondent pas avec ce qui devrait être. Que peut il bine se passer ?

Exemple :

image.thumb.png.fef3aebbe705b2131954910b84d7afb8.png

Link to comment
Share on other sites

  • 0

J'ai chercher l'explication du check digit pour votre code sscc . Je l'avais déja fait avec le code du check digit de l' EAN13

L'explication est sur le même site que la vérif

Link to comment
Share on other sites

  • 0

Par exemple

CodeBar & Cas ( Extrait ( CodeBar ; 2 ; 1 )+Extrait ( CodeBar ; 4 ; 1 )+Extrait ( CodeBar ; 6 ; 1 )+Extrait ( CodeBar ; 8 ; 1 )+Extrait ( CodeBar ; 10 ; 1 )+Extrait ( CodeBar ; 12 ; 1 )+Extrait ( CodeBar ; 14 ; 1 )+Extrait ( CodeBar ; 16 ; 1 )+Extrait ( CodeBar ; 1 ; 1 )*3+Extrait ( CodeBar ; 3 ; 1 )*3+Extrait ( CodeBar ; 5 ; 1 )*3+Extrait ( CodeBar ; 7 ; 1 )*3+Extrait ( CodeBar ; 9 ; 1 )*3+Extrait ( CodeBar ; 11 ; 1 )*3+Extrait ( CodeBar ; 13 ; 1 )*3+Extrait ( CodeBar ; 15 ; 1 )*3+Extrait ( CodeBar ; 17 ; 1 )*3 = 10 ; 0 ; Extrait ( Extrait ( CodeBar ; 2 ; 1 )+Extrait ( CodeBar ; 4 ; 1 )+Extrait ( CodeBar ; 6 ; 1 )+Extrait ( CodeBar ; 8 ; 1 )+Extrait ( CodeBar ; 10 ; 1 )+Extrait ( CodeBar ; 12 ; 1 )+Extrait ( CodeBar ; 14 ; 1 )+Extrait ( CodeBar ; 16 ; 1 )+Extrait ( CodeBar ; 1 ; 1 )*3+Extrait ( CodeBar ; 3 ; 1 )*3+Extrait ( CodeBar ; 5 ; 1 )*3+Extrait ( CodeBar ; 7 ; 1 )*3+Extrait ( CodeBar ; 9 ; 1 )*3+Extrait ( CodeBar ; 11 ; 1 )*3+Extrait ( CodeBar ; 13 ; 1 )*3+Extrait ( CodeBar ; 15 ; 1 )*3+Extrait ( CodeBar ; 17 ; 1 )*3; 2 ; 1 ) )

Link to comment
Share on other sites

  • 0

Bonsoir,

en moins…touffu…

Definir  ([
  sscc = "00718908562723189" ; 

  sumEven = 
  Extrait ( sscc ; 2 ; 1 ) + Extrait ( sscc ; 4 ; 1 ) +
  Extrait ( sscc ; 6 ; 1 ) + Extrait ( sscc ; 8 ; 1 ) +
  Extrait ( sscc ; 10 ; 1 ) + Extrait ( sscc ; 12 ; 1 ) +
  Extrait ( sscc ; 14 ; 1 ) + Extrait ( sscc ; 16 ; 1 ) ; 

  sumOdd = (
     Extrait ( sscc ; 1 ; 1 ) + Extrait ( sscc ; 3 ; 1 ) + Extrait ( sscc ; 5 ; 1 ) + 
     Extrait ( sscc ; 7 ; 1 ) + Extrait ( sscc ; 9 ; 1 ) + Extrait ( sscc ; 11 ; 1 ) +
     Extrait ( sscc ; 13 ; 1 ) + Extrait ( sscc ; 15 ; 1 ) + Extrait ( sscc ; 17 ; 1 )
  ) * 3 ;

  sum = sumEven + sumOdd ;
  checksum = Si ( not Mod ( sum ; 10 ) ; 0 ; 10 - Mod ( sum ; 10 ) )

] ;

sscc & checksum // result: 007189085627231896
   
)

auquel calcul il serait judicieux d'ajouter un contrôle du nombre de chiffres et de la présence en première position du chiffre 0 (le contenant est une caisse ou un carton).

Link to comment
Share on other sites

  • 0

Bonjour

Merci a tous d'avoir pris le temps de répondre.

@Apophis : j'ai trouvé le calcule manuel sur tes indication dans SG1 mercie de l'info

Pour avoir tester ta dernière fonction j'ai des écarts de résultat. je chiffre clef ne fonctionne pas toujours.

@Clément : Après étude de la stucture de ta fonction, je suis surpris par la fin et la condition "Si" :

Si ( not Mod ( sum ; 10 ) ; 0 ; 10 - Mod ( sum ; 10 )

En effet  " SI" Reclame un test

Test : une valeur numérique ou une expression logique

Résultat1 : une expression ou un nom de rubrique

Résultat2 : une expression ou un nom de rubrique

 

et dans ton calcul je ne voie pas de test du genre " bidule=machin"

Seul NOT, en tant qu' opérateur logique inverse la fonction " Mod ", qui si j'ai bien compris donne le reste de la division par 10 ( exemple 53 / 10 = 5X10 + 3) soit 3.

Mais c'est quoi NOT MOD .... ?? l'inverse de 3 c'est quoi ???

Donc je suis surpris. Peux tu m'expliquer car je suis un peu bas de plafond sur le coup...

Pour ma par j'ai retravaillé la fonction aimablement fournis par Apophis et avec mes connaissances des outils de Filemaker

et ça donne ça :

Definir (
[CCA=
Tronque(
 Extrait ( test code barre::Codebar ; 2 ; 1 )
+Extrait ( test code barre::Codebar ; 4 ; 1 )
+Extrait ( test code barre::Codebar ; 6 ; 1 )
+Extrait ( test code barre::Codebar ; 8 ; 1 )
+Extrait ( test code barre::Codebar ; 10 ; 1 )
+Extrait ( test code barre::Codebar ; 12 ; 1 )
+Extrait ( test code barre::Codebar ; 14 ; 1 )
+Extrait ( test code barre::Codebar ; 16 ; 1 )
+Extrait ( test code barre::Codebar ; 1 ; 1 )*3
+Extrait ( test code barre::Codebar ; 3 ; 1 )*3
+Extrait ( test code barre::Codebar ; 5 ; 1 )*3
+Extrait ( test code barre::Codebar ; 7 ; 1 )*3
+Extrait ( test code barre::Codebar ; 9 ; 1 )*3
+Extrait ( test code barre::Codebar ; 11 ; 1 )*3
+Extrait ( test code barre::Codebar ; 13 ; 1 )*3
+Extrait ( test code barre::Codebar ; 15 ; 1 )*3
+Extrait ( test code barre::Codebar ; 17 ; 1 )*3;
-1);

CC=
( Extrait ( test code barre::Codebar ; 2 ; 1 )
+Extrait ( test code barre::Codebar ; 4 ; 1 )
+Extrait ( test code barre::Codebar ; 6 ; 1 )
+Extrait ( test code barre::Codebar ; 8 ; 1 )
+Extrait ( test code barre::Codebar ; 10 ; 1 )
+Extrait ( test code barre::Codebar ; 12 ; 1 )
+Extrait ( test code barre::Codebar ; 14 ; 1 )
+Extrait ( test code barre::Codebar ; 16 ; 1 )
+Extrait ( test code barre::Codebar ; 1 ; 1 )*3
+Extrait ( test code barre::Codebar ; 3 ; 1 )*3
+Extrait ( test code barre::Codebar ; 5 ; 1 )*3
+Extrait ( test code barre::Codebar ; 7 ; 1 )*3
+Extrait ( test code barre::Codebar ; 9 ; 1 )*3
+Extrait ( test code barre::Codebar ; 11 ; 1 )*3
+Extrait ( test code barre::Codebar ; 13 ; 1 )*3
+Extrait ( test code barre::Codebar ; 15 ; 1 )*3
+Extrait ( test code barre::Codebar ; 17 ; 1 )*3)

]
;
Cas (
Extrait(CC;2;1)=0;
Extrait(CCA;2;1);
CCA+10-CC
))

A priori les testes que j'ai fait donne le même résulté que SG1 et  que la fonction de Clem.

 

Maintenant il me faut faire Code barre et QR Code

Clément dans un précédent message tu proposait une solution avec

https://developers.google.com/chart/infographics/docs/qr_codes

ça marche encore, mais pour combien de temps ...

Existe une autre solution simple à mettre en œuvre pour faire de même ?

Merci encore

 

 

 

 

 

Link to comment
Share on other sites

  • 0
Le 12/02/2021 à 23:07, Clem a dit :

Bonsoir,

en moins…touffu…

Hello @Clem!

Pardon, pas pu m'empêcher de tenter de transposer ton calcul avec le couple Substitue Evaluate 10 ^n... 😊

Let  ([
$sscc = "00718908562723189" ;
$n[0] = 0 ; $n[1] = 0 ; $s = 0 ;

Calc = "Let ([ $s = $s + 1 ; v = Mod ( $s ; 2 ) ; $n[v] = $n[v] + Middle ( $sscc ; $s ; 1 ) ]; 0 )&" ;
Res = Evaluate ( Substitute ( ( 10 ^ Length ( $sscc ) ) -1; 9 ; Calc ) & 0 )
] ;
$sscc & Right ( 10 - Mod ( $n[0] + ( $n[1] * 3 ) ; 10 )  ; 1 )
)

J'ai vu qu'il y avait TantQue() en 18 que je n'ai point

Par pure curiosité, est ce que du coup ce type de calcul est réalisable juste avec TantQue () ?

Merci !

Agnès

 

Link to comment
Share on other sites

  • 0

Bonjour,

Le 14/02/2021 à 12:06, dden a dit :

Si ( not Mod ( sum ; 10 ) ; 0 ; 10 - Mod ( sum ; 10 )

En effet  " SI" Reclame un test

Test : une valeur numérique ou une expression logique

Résultat1 : une expression ou un nom de rubrique

Résultat2 : une expression ou un nom de rubrique

et dans ton calcul je ne voie pas de test du genre " bidule=machin"

Comme le dit l'aide en ligne que tu mentionnes, le Test de la condition attend une valeur numérique (un nombre) ou une expression logique (un calcul produisant une valeur. Les expressions peuvantt contenir des fonctions, des valeurs de rubrique, des variables et des constantes).

Un peu plus loin dans la même aide, la description mentionne dans ce paragraphe les éléments capitaux à la compréhension de la logique:

Si Test est Vrai (résultat numérique différent de zéro), FileMaker Pro Advanced renvoie Résultat1. Si Test est Faux(0), FileMaker Pro renvoie Résultat2. ……. La fonction Test doit correspondre à une expression qui renvoie un résultat numérique ou une valeur booléenne (Vrai, Faux).

Ce qui veut dire que dans le Test, tout résultat numérique différent de zéro (même une valeur négative!) ou toute expression booléenne retournant l'expression protégée True sera dirigé sur Résultat1. Libre à toi ensuite d'inverser la logique avec l'opérateur logique Not… Il est vrai que j'aurais pu m'en dispenser dans le calcul et juste inverser les résultats.

Juste une petite remarque sur le calcul que tu as posté, l'évaluation du SSCC-17 (la concaténation du Préfixe de l'entreprise et du numéro de série du conteneur ) avec la valeur "00350123451234567" retourne 0 au lieu de 9

 

Le 14/02/2021 à 12:06, dden a dit :

Maintenant il me faut faire Code barre et QR Code

Clément dans un précédent message tu proposait une solution avec

https://developers.google.com/chart/infographics/docs/qr_codes

ça marche encore, mais pour combien de temps ...

Existe une autre solution simple à mettre en œuvre pour faire de même ?

L'API étant estampillée "deprecated", qui sait combien de temps encore elle sera accessible ?… on est chez Google après tout.

En revanche, Google à produit une excellente API nommée ZebraCrossing (zXing) et d'après ma base de données relative au plug-in ScriptMaster j'ai posté en 2012 deux fonctions utilisant cette API; l'une permet de créer des QR Codes (zxing_QRCodeWrite), l'autre de lire/décoder une image jp/png représentant un QR Code (zxing_QRCodeRead). Une recherche dans le forum dédié aux plug-ins te permettra certainement de les retrouver. Le cas échéant je les re-posterai si cela t'interesse.

Mais il y a peut-être aussi une API sur le web qui permette d'importer un QR Code par le biais de la fonction "Insérer depuis URL"… Cela étant, j'ai lu ce matin sur le site de GS1.org que le QRCode n'est utilisable que dans certaines conditions. Mais où ?? … je ne sais plus :-((

Link to comment
Share on other sites

  • 0

Hello M'selle @Agnès!! Ca fait plaisir de t'voir reprendre du service 😉 'fait un bail dis donc !

Chapeau bas pour ta formule👏👏, mais c'est hélas trop pour mon neurone (obtus) qui s'est toujours refusé à mettre cette (ta devrais-je dire) technique en œuvre (peut être parce que la ""récursion"" est limitée à 404 … va savoir …)

En revanche, TantQue (et c'était mon intention première mais restée à ce stade) est encore dans mes cordes. Si la compresser te tente, ne gêne surtout pas

TantQue ( [ 
  ai = "00" ;		// Application Identifier. 00 to indicate an Serial Shipping Container Code
  ext = "0" ;		// Extension Digit [0-9] assigned by the company
  cp = "003501234";	// Company Prefixe [6-11 digits] assigned by GS1
  sr = "51234567" ;	// Sequential Serial Reference Number [5-10 digits]

  ref = ObtenirNombre ( cp & sr ) ;
  i = Longueur ( ref )  ; 
  sum = 0  
] ; 

i > 0 ; 

[ 
   n = Extrait ( ref ; i ; 1 ) ;
   sum = sum + Si ( not Mod ( i ; 2 ) ; n ; n * 3 ) ; 
   i = i - 1 
] ; 

"(" & ai & ")" & ext & ref & Si ( Mod ( sum ; 10 ) ; 10 - Mod ( sum ; 10 ) ; 0 )
 
) // Résultat: (00)0003501234512345679

@+

Link to comment
Share on other sites

  • 0

Merci @Clem !! :)

 

La limite de 404 n'est pas génante ici, j'avoue ne peu l'utiliser, uniquement quand je veux pas me casser la tête et que je sais que l'iteration ne dépassera jamais 100

bon, top TantQue() alors, c'est ce que j'ai cru voir dans l'aide, c'est une récursion sans fonction perso, sans Evaluate() donc sans les "" qui cassaient les pieds quand même, le i est mon [n] si je comprends bien, je suppose que c'est à 100% ce que pouvait faire CustomList(), extra :)

Me donnerais presqu'envie de passer en 18, mais je suis resté en 16 pour encore un bon moment, et je ne toucherai certainement pas à ton calcul, j'ai compris comment trouver la clés, uniquement en décortiquant le tien, j'ai même faillit passer à coté du *3 ;)

Merci d'avoir pris le temps !

Agnès

Link to comment
Share on other sites

  • 0

Bonjour

Merci Clem de ton éclairage. Tous s'explique ...☺

Effectivement mon calcule était faux car la somme des chiffres dépassait 100, Soit 3 digits pour faire 101. Donc le complement à 101 est bien 9 .

Donc en modifiant légèrement ma fonction pour ça donne:

 Definir (
[CCA=
Tronque(
 Extrait ( test code barre::Codebar ; 2 ; 1 )
+Extrait ( test code barre::Codebar ; 4 ; 1 )
+Extrait ( test code barre::Codebar ; 6 ; 1 )
+Extrait ( test code barre::Codebar ; 8 ; 1 )
+Extrait ( test code barre::Codebar ; 10 ; 1 )
+Extrait ( test code barre::Codebar ; 12 ; 1 )
+Extrait ( test code barre::Codebar ; 14 ; 1 )
+Extrait ( test code barre::Codebar ; 16 ; 1 )
+Extrait ( test code barre::Codebar ; 1 ; 1 )*3
+Extrait ( test code barre::Codebar ; 3 ; 1 )*3
+Extrait ( test code barre::Codebar ; 5 ; 1 )*3
+Extrait ( test code barre::Codebar ; 7 ; 1 )*3
+Extrait ( test code barre::Codebar ; 9 ; 1 )*3
+Extrait ( test code barre::Codebar ; 11 ; 1 )*3
+Extrait ( test code barre::Codebar ; 13 ; 1 )*3
+Extrait ( test code barre::Codebar ; 15 ; 1 )*3
+Extrait ( test code barre::Codebar ; 17 ; 1 )*3;
-1);

CC=
( Extrait ( test code barre::Codebar ; 2 ; 1 )
+Extrait ( test code barre::Codebar ; 4 ; 1 )
+Extrait ( test code barre::Codebar ; 6 ; 1 )
+Extrait ( test code barre::Codebar ; 8 ; 1 )
+Extrait ( test code barre::Codebar ; 10 ; 1 )
+Extrait ( test code barre::Codebar ; 12 ; 1 )
+Extrait ( test code barre::Codebar ; 14 ; 1 )
+Extrait ( test code barre::Codebar ; 16 ; 1 )
+Extrait ( test code barre::Codebar ; 1 ; 1 )*3
+Extrait ( test code barre::Codebar ; 3 ; 1 )*3
+Extrait ( test code barre::Codebar ; 5 ; 1 )*3
+Extrait ( test code barre::Codebar ; 7 ; 1 )*3
+Extrait ( test code barre::Codebar ; 9 ; 1 )*3
+Extrait ( test code barre::Codebar ; 11 ; 1 )*3
+Extrait ( test code barre::Codebar ; 13 ; 1 )*3
+Extrait ( test code barre::Codebar ; 15 ; 1 )*3
+Extrait ( test code barre::Codebar ; 17 ; 1 )*3)

]
;
Cas (CC<100;

CAS(Extrait(CC;2;1)=0;
Extrait(CCA;2;1);
CCA+10-CC);

CC ≥  100;

CAS(Extrait(CC;3;1)=0;
Extrait(CCA;3;1);
CCA+10-CC)
))

Il me faut teste plein de solution mais pour voir.

C'est Bien moins parfait que les votre bien sûr, ( surtout celle d'Agnès que je ne comprend pas du tout) ....  Je vais toute les tester pou r voir

Pour info, et pour tous voici comment la clef se calcul  pour  tous les type De Code barre

 

image.png.f0d414e7bb61bfc22d54104941c32e86.png

 

Link to comment
Share on other sites

  • 0

  

Il y a 3 heures, dden a dit :

( surtout celle d'Agnès que je ne comprend pas du tout)

Oui, c'est logique, même moi de temps en temps. et en plus, je ne suis plus aussi alerte qu'avant ;)

C'est un calcul de paresseux, il permet d'écrire une chaine de caractère incrémentée puis de l'évaluer, sans écrire et répeter une chaine comme tu le fais

La variable Res s'ecrit automatiquement :

Let ([ $n = $n + 1 ]; (Middle ( $sscc ; $n ; 1 )*Case ( Mod ( $n ; 2 ) ; 3 ; 1 )) )+
Let ([ $n = $n + 1 ]; (Middle ( $sscc ; $n ; 1 )*Case ( Mod ( $n ; 2 ) ; 3 ; 1 )) )+(...) et Evaluate evalue l'ensemble.

 

bon, merci le tableau est fort intéressant et m'a aidé à comprendre un peu mieux cette histoire de clés, pas besoin de s'embringuer avec 3 variables, le calcul de @Clem est donc pour les 18 et + et cuici sera pour les 17 et moins ;)

Let  ([
$sscc = SSCC ; $n = 0 ;
Calc = "Let ([ $n = $n + 1 ]; (Middle ( $sscc ; $n ; 1 )*Case ( Mod ( $n ; 2 ) ; 3 ; 1 )) )+" ;
Res = Evaluate ( Substitute ( ( 10 ^ Length ( $sscc ) ) -1; 9 ; Calc ) & 0 )
] ;
$sscc & Right ( 10 - Mod ( res ; 10 )  ; 1 )
)

 

Du coup il était tentant de l'adapter pour le panier des autres Digit non ?

oui :)

[Mais je ne peux vérifier je n'ai pas de Digit 8, 13 ou autre sous la main]

Let  ([
$Digit = "00718908562723189" ;

$n = 0 ;
Calc = "Let ([ $n = $n + 1 ; Ldg = Length ( $Digit ) ; m = Case ( Ldg = 13 or Ldg = 16 ; 2 )];
( Middle ( $Digit ; $n ; 1 ) * Case ( Mod ( $n ; 2 ) ; 3 -m ; 1+m )) )+" ;
Res = Evaluate ( Substitute ( ( 10 ^ Length ( $Digit ) ) -1; 9 ; Calc ) & 0 )
] ; $Digit & Right ( 10 - Mod ( res ; 10 )  ; 1 )
)
//Calcul Clés pour GTIN-8/12/13/14, GSIN et SSCC

Agnès

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...