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