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
Post a Comment