-- Drop function DBO.UDF_GetCheckDigitSSCC
IF OBJECT_ID('UDF_GetCheckDigitSSCC', 'FN') IS NOT NULL
DROP FUNCTION DBO.UDF_GetCheckDigitSSCC
GO
-- Create function dbo.UDF_GetCheckDigitSSCC
CREATE FUNCTION dbo.UDF_GetCheckDigitSSCC
(@Codice AS VARCHAR(18)) RETURNS SMALLINT
AS BEGIN
/*
Algoritmo per il calcolo della cifra di controllo:
1. Addizionare le cifre in posizione pari
2. Moltiplicare il risultato per 3
3. Addizionare le cifre in posizione dispari
4. Sommare il risultato dei 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 per numerazione */
SET @j = LEN(@tmpCodice) + 1 -- Viene sommato 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 pari */
SET @i = 1
SET @tmpLista = @Lista
--WHILE (@i <= LEN(tmpCodice))
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 dispari */
SET @i = 1
SET @tmpLista = @Lista
--WHILE (@i <= LEN(tmpCodice))
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 della 4 operazione dal multiplo di 10 superiore
(Se la 4 operazione da come risultato un multiplo di 10, la cifra di
controllo è uguale a ZERO)
*/
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 = 1
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
GO
-- Drop dbo.USP_GetCodeSSCC
IF (OBJECT_ID('USP_GetCodeSSCC', 'P') IS NOT NULL)
DROP PROCEDURE dbo.USP_GetCodeSSCC
GO
-- Create dbo.USP_GetCodeSSCC
CREATE PROCEDURE dbo.USP_GetCodeSSCC
(@CifraEstensione SMALLINT,
@EANAziendale VARCHAR(9),
@IsUCC12 AS SMALLINT,
@SSCC AS VARCHAR(18) OUTPUT)
AS BEGIN
/*
Generazione del codice SSCC (Serial Shipping Container Code)
Il codice SSCC restituito dalla stored procedure è composto da:
1. Cifra di estensione: compresa tra 0 e 9, la cifra di estensione è utilizzata per aumentare la capacità
dell'SSCC è a discrezione dell'azienda che lo attribuisce
2. Prefisso EAN aziendale
3. Codice sequenziale
4. Cifra di controllo
*/
DECLARE @MAXVALUE INT,
@FILLNUMBER INT,
@MSG VARCHAR(512)
SET @SSCC = ''
BEGIN TRANSACTION
BEGIN TRY
/*
1. Cifra di estensione
E' compresa tra 0 e 9, viene utilizzata per aumentare la capacità
dell'SSCC è a discrezione dell'azienda che lo attribuisce
*/
IF (@CifraEstensione < 0) OR
(@CifraEstensione > 9)
BEGIN
SET @SSCC = ''
SET @MSG = 'Cifra di estensione (' + LTRIM(RTRIM(STR(@CifraEstensione))) + ') errata. La cifra di estensione deve essere compresa tra 0 e 9'
RAISERROR(@MSG, 11, 1)
END
ELSE
SET @SSCC = LTRIM(RTRIM(STR(@CifraEstensione)))
/*
2. Prefisso EAN aziendale
*/
IF (@IsUCC12 = -1)
BEGIN
/*
Se il codice da generare è di tipo UCC-12, le 12 cifre devono essere precedute
da uno zero iniziale: questo riguarda il prefisso EAN Aziendale
*/
SET @SSCC = @SSCC + '0'
END
IF ((LEN(@EANAziendale) < 7) OR
(LEN(@EANAziendale) > 9))
BEGIN
SET @SSCC = ''
SET @MSG = 'Il prefisso EAN aziendale (' + @EANAziendale + ') non è corretto: lunghezza errata.'
RAISERROR(@MSG, 11, 1)
END
ELSE
SET @SSCC = @SSCC + @EANAziendale
/*
3. Codice sequenziale
*/
IF (Select Id From CountSSCC Where (Codice= 'SSCC')) IS NULL
BEGIN
/*
Inserimento record
*/
INSERT INTO CountSSCC
(CODICE, DESCR, VALORE, VALMIN, VALMAX)
VALUES ('SSCC', 'Serial Shipping Container Code', 0, 1, 2147483647)
END
/*
Ricerca valore MAX
*/
SELECT @MAXVALUE = MAX(Valore)
FROM CountSSCC
WHERE (Codice = 'SSCC')
/*
Update progressivo
*/
IF ((@MAXVALUE + 1) < 2147483647) AND
(LEN(LTRIM(RTRIM(STR((@MAXVALUE + 1))))) <= (18 - LEN(LTRIM(RTRIM(STR(@CifraEstensione)))) - LEN(@EANAziendale) -1))
BEGIN
UPDATE CountSSCC SET Valore = (Valore + 1)
WHERE (Codice = 'SSCC')
END
ELSE BEGIN
SET @MAXVALUE = 0
UPDATE CountSSCC SET Valore = 1
WHERE (Codice = 'SSCC')
END
COMMIT
SET @FILLNUMBER = (18 -
LEN(LTRIM(RTRIM(STR(@CifraEstensione)))) -
LEN(@EANAziendale) -
LEN(LTRIM(RTRIM(STR(@MAXVALUE + 1)))) -
1)
SET @SSCC = (@SSCC +
REPLICATE('0', @FILLNUMBER) +
LTRIM(RTRIM(STR(@MAXVALUE + 1))))
SET @SSCC = @SSCC + LTRIM(RTRIM(STR(dbo.UDF_GetCheckDigitSSCC(@SSCC))))
END TRY
BEGIN CATCH
-- Esecuzione della procedura di restituzione errori
EXECUTE USP_GetErrorInfo
ROLLBACK
SET @SSCC = ''
END CATCH
PRINT @SSCC
END
4. Eseguendo la stored procedure USP_GetCodeSSCC() con i seguenti parametri di input:
DECLARE @SSCC VARCHAR(17)
EXEC USP_GetCodeSSCC 8, '801234567', 0, @SSCC
Si ottiene il primo codice SSCC 880123456700000013