IBMi (AS400) fans only : how to calculate the check digit for EAN-13 codes



#IBMiSample

The check digit is the last digit of each barcode and is used to verify the correctness of the GS1 codes (formerly EAN codes).

This program calculates the check digit of an EAN-13 barcode:




EAN13C.RPGLE

**FREE
  ctl-opt option(*nodebugio:*srcstmt:*nounref) dftactgrp(*no);
  // ****************************************************************
  // * Autore.......: ALDO SUCCI                                    *
  // * Descrizione..: CALCOLO DEL CHECK DIGIT X EAN13               *
  // * Data.........: 15/06/09                                      *
  // ****************************************************************
  // *                                                              *
  // * Parametri in input:PARAM (12 cifre EAN)                      *
  // *             output:WDIGIT (13° carattere Check digit)        *
  // *                                                              *
  // *                                                              *
  // * il carattere piu` a destra assume la funzione di check digit *
  // * (cifra di controllo), ed e` calcolato sulla base delle       *
  // * restanti 12 cifre con l'algoritmo seguente (le posizioni dei *
  // * caratteri sono numerate da destra verso sinistra):           *
  // *                                                              *
  // * Step 1: Partendo dalla posizione 2 sommare i valori          *
  // * dei caratteri in posizione pari.                             *
  // *                                                              *
  // * Step 2 : Moltiplicare per 3 il risultato                     *
  // * dell'Step 1.                                                 *
  // *                                                              *
  // * Step 3 : Partendo dalla posizione 1 sommare i valori         *
  // * dei caratteri in posizione dispari.                          *
  // *                                                              *
  // * Step 4 : Sommare i risultati delle operazioni 2 e 3.         *
  // *                                                              *
  // * Step 5 : Il check digit e' il piu' piccolo numero            *
  // * che sommato al risultato dell'Step 4 da un numero            *
  // * multiplo di 10.                                              *
  // * Se il check digit che risulta รจ 10, si prende 0.             *
  // *                                                              *
  // * Esempio :                                                    *
  // *                                                              *
  // * Esempio di codice: 427622135746                              *
  // *                                                              *
  // * Step 1: 2 + 6 + 2 + 3 + 7 + 6 = 26                           *
  // * Step 2: 26 * 3 = 78                                          *
  // * Step 3: 4 + 7 + 2 + 1 + 5 + 4 = 23                           *
  // * Step 4: 78 + 23 = 101                                        *
  // * Step 5: 110 - 101 = 09 (cifra di controllo = 9)              *
  // *                                                              *
  // * Esempio di codice: 191919191939                              *
  // *                                                              *
  // * Step 1: 9 + 9 + 9 + 9 + 9 + 9 = 54                           *
  // * Step 2: 54 * 3 = 162                                         *
  // * Step 3: 1 + 1 + 1 + 1 + 1 + 3 = 8                            *
  // * Step 4: 162 + 8 = 170                                        *
  // * Step 5: 180 - 170 = 10 (cifra di controllo = 0)              *
  // *                                                              *
  // ****************************************************************
  // Standalone
  dcl-s WOPER1 packed(5:0);
  dcl-s WOPER2 packed(5:0);
  dcl-s WOPER3 packed(5:0);
  dcl-s WOPER4 packed(5:0);
  dcl-s WOPER5 packed(5:0);
  dcl-s WOPER5STR char(5);
  // data structure
  dcl-ds PARAM ;
    EAN01 zoned(1);
    EAN02 zoned(1);
    EAN03 zoned(1);
    EAN04 zoned(1);
    EAN05 zoned(1);
    EAN06 zoned(1);
    EAN07 zoned(1);
    EAN08 zoned(1);
    EAN09 zoned(1);
    EAN10 zoned(1);
    EAN11 zoned(1);
    EAN12 zoned(1);
    PARAM12 zoned(12) Pos(1);
  end-ds ;
  // Entry parameter list
  Dcl-pi EAN13C;
    pPARAM packed(12:0);
    pWDIGIT packed(1:0);
  End-pi;
  //*****************************************************************
  // Start working...                                               *
  //*****************************************************************
  PARAM12 = pPARAM;
  // Step 1:
  WOPER1 = EAN02 + EAN04 + EAN06 + EAN08 + EAN10 + EAN12;
  // Step 2:
  WOPER2 = WOPER1 * 3;
  // Step 3:
  WOPER3 = EAN01 + EAN03 + EAN05 + EAN07 + EAN09 + EAN11;
  // Step 4:
  WOPER4 = WOPER2 + WOPER3;
  // Step 5a: DETERMINAZIONE DECINA SUPERIORE
  WOPER5 = WOPER4 + 10;
  WOPER5str = %editc(WOPER5:'X');
  WOPER5str = %subst(WOPER5str:1:4) + '0';
  WOPER5 = %dec(WOPER5str:5:0);
  // Step 5b: DETERMINAZIONE CHECK DIGIT
  if (WOPER5 - WOPER4) = 10 ;
    pWDIGIT = 0;
  else;
    pWDIGIT = WOPER5 - WOPER4;
  endif;
  Dsply pWDIGIT;
  *inlr = *on;  

Now try with this:

CALL       PGM(EAN13C) PARM(X'0123456789012F' X'0F')


I appreciate all the comments made on this blog.

Comments

Popular posts from this blog

(IBM i fans only) Efficient WRKSPLF with WSF - How to Search string into spooled files, Sort, and Generate PDFs on IBMi

(IBM i fans only) Detecting and Handling Non-Printable Characters in DB2 SQL Using LOCATE() and REPLACE() Functions

(IBM i fans only) How to Sniff User Access