Home > Scripts > Calcolo della cifra di controllo di un codice EAN/UCC

Calcolo della cifra di controllo di un codice EAN/UCC

Lo standard di codifica EAN/UCC richiede che ogni codice generato termini con una cifra compresa tra zero e nove chiamata cifra di controllo (check digit).

La seguente Scalar-valued Function UDF_GetCheckDigitUCCEAN() implementa l’algoritmo di calcolo della cifra di controllo e può essere utilizzata per i seguenti tipi:

  • EAN/UCC-8
  • EAN/UCC-12
  • EAN/UCC-13
  • EAN/UCC-14
  • SSCC (EAN/UCC-128) 

— Drop Scalar-valued Function DBO.UDF_GetCheckDigitUCCEAN
IF OBJECT_ID(‘UDF_GetCheckDigitUCCEAN’, ‘FN’) IS NOT NULL
  DROP FUNCTION DBO.UDF_GetCheckDigitUCCEAN
GO

— Create Scalar-valued Function dbo.UDF_GetCheckDigitUCCEAN
CREATE FUNCTION dbo.UDF_GetCheckDigitUCCEAN
(@Codice AS VARCHAR(18))
RETURNS SMALLINT
AS BEGIN
  /*
    Algoritmo per il calcolo della cifra di controllo:

      0. Numerare la posizione delle cifre da destra a sinistra
      1. Addizionare le cifre in posizione pari
      2. Moltiplicare il risultato per 3
      3. Addizionare le cifre in posizione dispari
      4. Sommare (tra loro) i risultati ottenuti nei punti 2) e 3)
      5. Sottrarre il risultato del punto 4) dal multiplo di 10 superiore
  */

  DECLARE @tmpCodice AS VARCHAR(17),
          @tmpMulSup AS VARCHAR(8000),
          @tmp AS VARCHAR(8000),
          @i AS INT,
          @j AS INT,
          @z AS INT,
          @SumCPari AS INT,
          @SumCDispari AS INT,
          @Lista AS VARCHAR(8000),
          @tmpLista AS VARCHAR(8000),
          @CheckSum AS SMALLINT

  SET @SumCPari = 0
  SET @SumCDispari = 0
  SET @Lista = ”
  SET @tmpLista = ”
  SET @tmp = ”

  SET @tmpCodice = @Codice

  /* 0. Costruzione lista */
  SET @j = LEN(@tmpCodice) + 1  — Aggiungo 1 per la posizione della cifra di controllo
  SET @i = 1

  WHILE (@i <= LEN(@tmpCodice))
  BEGIN
    SET @Lista = @Lista + ‘|’ + LTRIM(RTRIM(STR(@j))) + ‘;’ + SUBSTRING(@tmpCodice, @i, 1)
    SET @j = (@j – 1)
    SET @i = (@i + 1)
  END

  /* 1. Addizionare le cifre nelle posizioni pari */
  SET @i = 1
  SET @tmpLista = @Lista
  WHILE (CHARINDEX(‘|’, @tmpLista) > 0)
  BEGIN
    SET @j = CHARINDEX(‘|’, @tmpLista)
    SET @z = CHARINDEX(‘;’, @tmpLista)

    IF (CAST(SUBSTRING(@tmpLista, (@j + 1), (@z – (@j + 1))) AS INTEGER) % 2) = 0
    BEGIN
      SET @SumCPari = @SumCPari + CAST(SUBSTRING(@tmpLista, (@z + 1), 1) AS INTEGER)
    END
    SET @tmpLista = SUBSTRING(@tmpLista, (@z + 2), LEN(@tmpLista))
  END

  /* 2. Moltiplicare il risultato per 3 (risultato del punto 1) */
  SET @SumCPari = (@SumCPari * 3)

  /* 3. Addizionare le cifre nelle posizioni dispari */
  SET @i = 1
  SET @tmpLista = @Lista
  WHILE (CHARINDEX(‘|’, @tmpLista) > 0)
  BEGIN
    SET @j = CHARINDEX(‘|’, @tmpLista)
    SET @z = CHARINDEX(‘;’, @tmpLista)

    IF (CAST(SUBSTRING(@tmpLista, (@j + 1), (@z – (@j + 1))) AS INTEGER) % 2) <> 0
    BEGIN
      SET @SumCDispari = @SumCDispari + CAST(SUBSTRING(@tmpLista, (@z + 1), 1) AS INTEGER)
    END
    SET @tmpLista = SUBSTRING(@tmpLista, (@z + 2), LEN(@tmpLista))
  END

  /* 4. Sommare @SumCPari con @SumCDispari */
  SET @CheckSum = (@SumCPari + @SumCDispari)

  /* 5. Sottrarre il risultato ottenuto nel punto 4) dal multiplo di 10 superiore.
        Se il punto 4) dà come risultato un multiplo di 10 (es. 20, 30, 40, ecc…)
        la cifra di controllo è uguale a 0.
  */
  IF ((@CheckSum % 10) = 0)
  BEGIN
    — Cifra di controllo uguale a ZERO
    SET @CheckSum = 0
  END
  ELSE BEGIN
    SET @tmpMulSup = LTRIM(RTRIM(STR(@CheckSum)))
   
    SET @i = 0
    WHILE @i <= (LEN(@tmpMulSup) – 1)
    BEGIN
      SET @tmp = @tmp + SUBSTRING(@tmpMulSup, @i, 1)
      IF (@i = LEN(@tmpMulSup) – 1)
      BEGIN
        SET @tmp = LTRIM(RTRIM(STR(CAST(@tmp AS INTEGER) + 1)))
        SET @tmp = @tmp + ‘0’
      END
      SET @i = (@i + 1)
    END

    SET @CheckSum = CAST(@tmp AS INTEGER) – @CheckSum
  END

  RETURN @CheckSum
END

Chi è Sergio Govoni

Sergio Govoni è laureato in Scienze e Tecnologie Informatiche. Da oltre 16 anni lavora presso una software house che produce un noto sistema ERP, distribuito a livello nazionale ed internazionale, multi azienda client/server su piattaforma Win32. Attualmente si occupa di progettazione e analisi funzionale, coordina un team di sviluppo ed è responsabile tecnico di prodotto. Lavora con SQL Server dalla versione 7.0 e si è occupato d'implementazione e manutenzione di database relazionali in ambito gestionale, ottimizzazione delle prestazioni e problem solving. Nello staff di UGISS si dedica alla formazione e alla divulgazione in ambito SQL Server e tecnologie a esso collegate, scrivendo articoli e partecipando come speaker ai workshop e alle iniziative del primo e più importante User Group Italiano sulla tecnologia SQL Server. Ha conseguito la certificazione MCP, MCTS SQL Server. Per il suo contributo nelle comunità tecniche e per la condivisione della propria esperienza con altri, dal 2010 riceve il riconoscimento SQL Server MVP (Microsoft Most Valuable Professional). Nel corso dell'anno 2011 ha contribuito alla scrittura del libro SQL Server MVP Deep Dives Volume 2 (http://www.manning.com/delaney/).

Leggi Anche

sp_alter_column – La stored procedure per modificare una colonna!

La stored procedure sp_alter_column permette di modificare agevolmente il tipo di dato ed il nome di una colonna!