Page 1 sur 1

[UDF] _ean13.au3 et Code-barre

Posté : ven. 29 août 2008 22:28
par Gollem
Bonjour,
Je vous propose un UDF pour le calcul de la valeur numérique d'un barcode 13 et de le transformer en code ean13 utilisable par la font ean13.ttf

Ce script est inspiré d'un forum vbasic

Code : Tout sélectionner

Func _EAN13($chaine)
  ; Traduit par Gollem d'un forum Vbasic
  ;'Paramètres : une chaine de 12 chiffres
  ;'Retour : * une chaine qui, affichée avec la police EAN13.TTF, donne le code barre
  ;'         * une chaine vide si paramètre fourni incorrect
  Dim $i, $checksum, $first, $CodeBarre, $tableA
  $EAN13 = ""
  
  ;'Vérifier qu'il y a 12 caractères
  If StringLen($chaine) = 12 Then
    ;Et que ce sont bien des chiffres
    For $i = 1 To 12
      If Asc(STRINGMid($chaine, $i, 1)) < 48 Or Asc(stringMid($chaine, $i, 1)) > 57 Then
            $i = 0
            Exit
        EndIf
    Next
  
  If $i = 13 Then
      ;'Calcul de la clé de contrôle

    For $i = 2 To 12 Step 2
        $checksum = $checksum + stringMid($chaine, $i, 1)
    Next
    
    $checksum = $checksum * 3

    For $i = 1 To 11 Step 2
        $checksum = $checksum + stringMid($chaine, $i, 1)
    Next
    
        
      $chaine = $chaine & 10-(mod ($checksum,10))
      ;Le premier chiffre est pris tel quel, le deuxième vient de la table A
      $CodeBarre = stringLeft($chaine, 1) & Chr(65 +(stringMid($chaine, 2, 1)))
      $first = stringLeft($chaine, 1)
      
      For $i = 3 To 7
        $tableA = False
      
      Select 
        Case $i = 3
          
          
                if $first = 0  Then $tableA = True
                if $first = 1  Then $tableA = True
                if $first = 2  Then $tableA = True  
                if $first = 3  Then $tableA = True              
        Case $i = 4
          
                if $first = 0  Then $tableA = True
                if $first = 4  Then $tableA = True
                if $first = 7  Then $tableA = True  
                if $first = 8  Then $tableA = True  
        Case $i = 5
          
                if $first = 0  Then $tableA = True
                if $first = 1  Then $tableA = True
                if $first = 4  Then $tableA = True  
                if $first = 5  Then $tableA = True
                if $first = 9  Then $tableA = True
        Case $i = 6
          
                if $first = 0  Then $tableA = True
                if $first = 2  Then $tableA = True
                if $first = 5  Then $tableA = True  
                if $first = 6  Then $tableA = True
                if $first = 7  Then $tableA = True
        Case $i = 7
          
                if $first = 0  Then $tableA = True
                if $first = 3  Then $tableA = True
                if $first = 6  Then $tableA = True  
                if $first = 8  Then $tableA = True
                if $first = 9  Then $tableA = True
        EndSelect

        If $tableA Then
          $CodeBarre = $CodeBarre & Chr(65 + stringMid($chaine, $i, 1))
        Else
          $CodeBarre = $CodeBarre & Chr(75 + stringMid($chaine, $i, 1))
        EndIf
      
      Next
        
        $CodeBarre = $CodeBarre & "*"   ;'Ajout séparateur central
        For $i = 8 To 13
            $CodeBarre = $CodeBarre & Chr(97 + stringMid($chaine, $i, 1))
        Next
        $CodeBarre = $CodeBarre  & "+"   ;'Ajout de la marque de fin
        $EAN13 = $CodeBarre
    return $ean13
EndIf
  EndIf
EndFunc
 
L'utilisation est simple.
Il faut simplement spécifier que la zone texte qui recoit ce code est en font ean13.ttf

Exemple

Code : Tout sélectionner

#include "ean_13.au3"
$codeean = _ean13 ("540123456789")
MsgBox(0,"Result via clipboard",$codeean)
ClipPut($codeean)
 
Améliorations bien venue.
Gollem
EAN13.zip
(2.75 Kio) Téléchargé 388 fois

Re: [UDF] _ean13.au3

Posté : dim. 04 janv. 2009 16:20
par timmalos
Post Mis en ordre

Rajout de la police,
Modification de la ligne provocant l'erreur.

La police est à mettre dans le dossier Font de Windows, typiquement:
C:\WINDOWS\Fonts
ou
C:\WINDOWS\System32\Fonts

Re: [UDF] _ean13.au3 et Code-barre

Posté : mar. 21 juil. 2009 10:57
par BaKeMoNo
Bonjour,
j'ai également bricolé il y a quelques temps un petit algo d'ean13, a partir d'une source VB également, mais peut être un peu plus léger :

Code : Tout sélectionner

#Include <Misc.au3>
Global $i, $j, $total, $facteur, $ean13, $calculcle, $cle, $clefinal, $combien
Global $ean12 = InputBox("calcul de clé EAN13","entrez 12 chiffres","","",150,60)

If (StringLen($ean12) > 12) Then 
    MsgBox (0,"Erreur","Erreur de longueur du code !")  
    Exit
elseif not stringisint($ean12) Then
    MsgBox (0,"Erreur","Erreur de non numéricité !")  
    Exit
elseif (StringLen($ean12) < 12) Then
    $combien= 12-stringlen($ean12)
    for $j=1 to $combien 
        $ean12 = "0" & $ean12
    next
EndIf

$facteur = 3 

For $i = stringLen($ean12) To 1 Step -1 
    $total = $total + stringMid($ean12, $i, 1) * $facteur 
    $facteur = 4 - $facteur 
Next 

    $cle = execute("10"-Stringright($total,1))
    if $cle = 10 then $cle = 0

$ean13 = $ean12 & $cle

msgbox(0,"clé calculée", "resultat : " & $ean13 & chr(013) & "clé : " & $cle)
 
il faut bien sur rajouter une restriction sur la numéricité de la string saisie, éventuellement ajouter des "0" avant la string si la numéricité est bonne mais qu'il y a moins de 12 caractères... mais, sans ça, le script fonctionne bien.

edit. rajout des contraintes citées ci dessus.