L'etichetta logistica (SSCC)

 

Il codice SSCC (Serial Shipping Container Code) rappresenta il numero destinato a contrassegnare univocamente ed individualmente le unità logistiche, ovvero unità dal contenuto omogeneo o misto create per il trasporto e/o l’immagazzinamento delle merci lungo la filiera.

L'SSCC è rappresentato con la simbologia per codice a barre UCC/EAN-128.

Un'unità logistica è un articolo di qualsiasi composizione creato per il trasporto e/o l'immagazzinamento che deve essere gestito attraverso la filiera.

La lettura mediante scanner dell'SSCC sull'etichetta logistica consente di seguire e rintracciare le singole unità, fornendo un collegamento fra il movimento fisico delle merci e il relativo flusso di informazioni. Offre inoltre l'opportunità di realizzare un'ampia gamma di applicazioni quali il cross-docking, l'inoltro delle spedizioni, il ricevimento automatizzato, ecc.

Il layout dell'etichetta logistica supporta il processo della filiera raggruppando le informazioni in tre sezioni: per il fornitore, il cliente e lo spedizioniere.

Focalizzo l’attenzione sul codice SSCC e facendo riferimento alla documentazione ufficiale di INDICOD-ECR , riporto di seguito la sua struttura generale.

dove:

La cifra di estensione è compresa tra 0 e 9 ed è utilizzata per aumentare la capacità dell’SSCC, è a discrezione dell’azienda che lo attribuisce.

Il prefisso EAN aziendale rende il numero univoco a livello mondiale ma non identifica l’origine dell’unità.

Il codice sequenziale è assegnato ad una determinata unità. Il criterio di numerazione è a discrezione dell’azienda che lo applica ma il numero utilizzato deve essere univoco almeno per un anno.

La cifra di controllo è calcolata sulle precedenti 17 cifre presenti nel codice. La cifra di controllo ha la funzione di garantire che il codice sia letto dallo scanner e di verificare se lo stesso sia stato stampato correttamente.

Il codice SSCC deve essere assegnato dall’azienda che fisicamente assembla/compone l’unità logistica. 

Riporto di seguito un esempio di script T-SQL contenente i comandi di creazione delle strutture dati e delle procedure da utilizzare per la generazione automatica del codice SSCC comprensivo della cifra di controllo.

1. Per prima cosa è necessario create la tabella CountSSCC utilizzata per memorizzare l’ultimo progressivo generato.

-- Drop table DBO.CountSSCC

IF OBJECT_ID('CountSSCC', 'U') IS NOT NULL

  DROP TABLE DBO.CountSSCC

GO

-- Create table dbo.CountSSCC

CREATE TABLE dbo.CountSSCC

(ID INT IDENTITY(1, 1) NOT NULL,

 CODICE VARCHAR(4) NOT NULL,

 DESCR VARCHAR(40) NOT NULL,

 VALMIN INT NOT NULL,

 VALMAX INT NOT NULL,

 VALORE INT NOT NULL

)

GO

-- Creazione indice cluster sul campo dbo.CountSSCC.Codice

CREATE UNIQUE CLUSTERED INDEX IDX__CountSSCC_Codice ON dbo.CountSSCC

            (

            CODICE DESC

            ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

/* Creazione indice Non-Cluster sul campo dbo.CountSSCC.ID */

CREATE NONCLUSTERED INDEX [IDX__CountSSCC_ID] ON [DBO].[CountSSCC]

  (ID ASC) ON [PRIMARY]

GO

/* Creazione della chiave primaria sulla tabella dbo.CountSSCC */

ALTER TABLE [dbo].[CountSSCC] ADD CONSTRAINT PK__CountSSCC_ID PRIMARY KEY(ID)

 

2. Procediamo con la creazione della stored procedure USP_GetErrorInfo() che ci permetterà di reperire informazioni sugli eventuali errori.

-- Drop procedure DBO.USP_GetErrorInfo

IF OBJECT_ID('USP_GetErrorInfo', 'P') IS NOT NULL

  DROP PROCEDURE DBO.USP_GetErrorInfo

GO

-- Create procedure per la restituzione del tipo di errore

CREATE PROCEDURE USP_GetErrorInfo

AS

  SELECT

    ERROR_NUMBER() AS ErrorNumber,

    ERROR_SEVERITY() AS ErrorSeverity,

    ERROR_STATE() AS ErrorState,

    ERROR_LINE () AS ErrorLine,

    ERROR_PROCEDURE() AS ErrorProcedure,

    ERROR_MESSAGE() AS ErrorMessage

GO

 

3. Procediamo ora con la creazione della funzione UDF_GetCheckDigitSSCC() utilizzata per determinare la cifra di controllo:

UDF_GetCheckDigitSSCC()

e della stored procedure USP_GetCodeSSCC() di generazione del codice SSCC:

USP_GetCodeSSCC()

-- 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

 

Published venerdì 21 marzo 2008 0.35 by sgovoni

Comments

No Comments