/* Patch cumulativa DB online - ramo Python WMS Da eseguire una sola volta in SSMS sul database Mediseawall. Questa patch NON modifica gli oggetti legacy usati dal programma C#. Include: - dbo.PyPickingListReservation - dbo.py_XMag_ViewPackingList - dbo.py_ViewPackingListRestante - dbo.py_sp_xExePackingListPallet - dbo.py_sp_xExePackingListPalletPrenota - dbo.py_sp_ControllaPrenotazionePackingListPalletNew - dbo.py_vPreparaPackingListSAMA1 - dbo.py_vPreparaPackingList - dbo.py_XMag_ViewPackingListStorico - dbo.py_BarcodePickingListSkip - dbo.py_PickingListPrelievoSequenza - dbo.py_ViewPackingListPrelievo Include inoltre: - intervallo operativo massimo di 30 giorni, filtrato dalla UI a 10/15/20/30; - destinazione senza nazione ammessa nel ramo Python mediante LEFT JOIN; - ordine predefinito con UDC Non scaff. prima degli scaffali; - ordine personalizzabile per singolo Documento. Nota storico: dbo.py_vPreparaPackingListSAMA1 usa ANNDOC >= YEAR(GETDATE()) per mantenere visibili solo le picking list dall'inizio dell'anno corrente. */ SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO /* ============================================================ 1. Stato prenotazione picking list ramo Python ============================================================ */ IF OBJECT_ID(N'dbo.PyPickingListReservation', N'U') IS NULL BEGIN CREATE TABLE [dbo].[PyPickingListReservation]( [ID] [tinyint] NOT NULL, [Documento] [varchar](8) NULL, [IDOperatore] [int] NULL, [ModUtente] [varchar](50) NULL, [ModDataOra] [datetime] NULL, CONSTRAINT [PK_PyPickingListReservation] PRIMARY KEY CLUSTERED ([ID] ASC), CONSTRAINT [CK_PyPickingListReservation_Singleton] CHECK ([ID] = 1) ) ON [PRIMARY]; END GO IF NOT EXISTS (SELECT 1 FROM dbo.PyPickingListReservation WHERE ID = 1) BEGIN INSERT INTO dbo.PyPickingListReservation (ID, Documento, IDOperatore, ModUtente, ModDataOra) VALUES (1, NULL, NULL, NULL, GETDATE()); END GO /* ============================================================ 2. Viste operative picking list ramo Python ============================================================ */ CREATE OR ALTER VIEW [dbo].[py_XMag_ViewPackingList] AS SELECT TOP 10000 legacy.Pallet, legacy.Lotto, legacy.Articolo, legacy.Descrizione, legacy.Qta, legacy.Documento, legacy.CodNazione, legacy.NAZIONE, legacy.Stato, legacy.PalletCella, legacy.Magazzino, legacy.Area, legacy.Cella, legacy.Ordinamento, legacy.Ubicazione, legacy.DEST, CASE WHEN pr.Documento IS NOT NULL AND pr.Documento = CAST(legacy.Documento AS varchar(8)) THEN 1 ELSE 0 END AS IDStato FROM dbo.XMag_ViewPackingList legacy LEFT JOIN dbo.PyPickingListReservation pr ON pr.ID = 1 AND NULLIF(LTRIM(RTRIM(pr.Documento)), '') IS NOT NULL ORDER BY CASE WHEN pr.Documento IS NOT NULL AND pr.Documento = CAST(legacy.Documento AS varchar(8)) THEN 1 ELSE 0 END DESC, legacy.Documento, legacy.Ordinamento; GO CREATE OR ALTER VIEW [dbo].[py_ViewPackingListRestante] AS SELECT Pallet, Lotto, Articolo, Descrizione, Qta, Documento, CodNazione, NAZIONE, Stato, PalletCella, Magazzino, Area, Cella, Ordinamento, Ubicazione, DEST, IDStato FROM dbo.py_XMag_ViewPackingList WHERE Cella <> 9999; GO /* ============================================================ 3. Stored procedure operative ramo Python ============================================================ */ CREATE OR ALTER PROCEDURE [dbo].[py_sp_xExePackingListPallet] @IDOperatore int, @Documento varchar(8), @Azione char(1) = 'P', @RC int OUTPUT AS BEGIN SET NOCOUNT ON; SET @RC = 0; DECLARE @Nominativo varchar(50) = ''; DECLARE @DocumentoAttivo varchar(8) = NULL; DECLARE @Description varchar(255) = ''; DECLARE @Message varchar(255) = ''; DECLARE @IDResult int = 0; DECLARE @ID int = 0; SELECT @Nominativo = [Login] FROM dbo.Operatori WHERE ID = @IDOperatore; IF @Nominativo IS NULL SET @Nominativo = 'SYSTEM'; IF @Azione NOT IN ('P', 'S') BEGIN SET @RC = -10; RETURN; END; IF NOT EXISTS ( SELECT 1 FROM dbo.py_XMag_ViewPackingList WHERE CAST(Documento AS varchar(8)) = @Documento ) BEGIN SET @RC = -20; RETURN; END; IF NOT EXISTS (SELECT 1 FROM dbo.PyPickingListReservation WHERE ID = 1) BEGIN INSERT INTO dbo.PyPickingListReservation (ID, Documento, IDOperatore, ModUtente, ModDataOra) VALUES (1, NULL, NULL, NULL, GETDATE()); END; SELECT @DocumentoAttivo = NULLIF(LTRIM(RTRIM(Documento)), '') FROM dbo.PyPickingListReservation WHERE ID = 1; DECLARE @TargetCelle TABLE ( IDCella int PRIMARY KEY ); INSERT INTO @TargetCelle (IDCella) SELECT DISTINCT Cella FROM dbo.py_XMag_ViewPackingList WHERE CAST(Documento AS varchar(8)) = @Documento AND Cella IS NOT NULL; IF @Azione = 'P' BEGIN IF @DocumentoAttivo = @Documento RETURN; UPDATE c SET c.IDStato = 0, c.ModUtente = @Nominativo, c.ModDataOra = GETDATE() FROM dbo.Celle c WHERE ISNULL(c.IDStato, 0) <> 0; UPDATE c SET c.IDStato = 1, c.ModUtente = @Nominativo, c.ModDataOra = GETDATE() FROM dbo.Celle c INNER JOIN @TargetCelle t ON t.IDCella = c.ID; UPDATE dbo.PyPickingListReservation SET Documento = @Documento, IDOperatore = @IDOperatore, ModUtente = @Nominativo, ModDataOra = GETDATE() WHERE ID = 1; SELECT TOP 1 @Description = NAZIONE FROM dbo.py_XMag_ViewPackingList WHERE CAST(Documento AS varchar(8)) = @Documento; EXEC dbo.sp_LogPackingList @ID = @ID, @Code = @Documento, @Description = @Description, @Message = @Message OUTPUT, @IDResult = @IDResult OUTPUT; RETURN; END; IF @Azione = 'S' BEGIN IF ISNULL(@DocumentoAttivo, '') <> @Documento RETURN; UPDATE c SET c.IDStato = 0, c.ModUtente = @Nominativo, c.ModDataOra = GETDATE() FROM dbo.Celle c INNER JOIN @TargetCelle t ON t.IDCella = c.ID; UPDATE dbo.PyPickingListReservation SET Documento = NULL, IDOperatore = @IDOperatore, ModUtente = @Nominativo, ModDataOra = GETDATE() WHERE ID = 1; RETURN; END; END; GO CREATE OR ALTER PROCEDURE [dbo].[py_sp_xExePackingListPalletPrenota] @IDOperatore int, @Documento varchar(8), @RC int OUTPUT AS BEGIN SET NOCOUNT ON; SET @RC = 0; DECLARE @Nominativo varchar(50) = ''; SELECT @Nominativo = LOGIN FROM dbo.Operatori WHERE ID = @IDOperatore; IF @Nominativo IS NULL SET @Nominativo = 'SYSTEM'; UPDATE c SET c.IDStato = 1, c.ModUtente = @Nominativo, c.ModDataOra = GETDATE() FROM dbo.Celle c WHERE c.ID IN ( SELECT DISTINCT Cella FROM dbo.py_ViewPackingListRestante WHERE CAST(Documento AS varchar(8)) = @Documento AND Cella IS NOT NULL ); END; GO CREATE OR ALTER PROCEDURE [dbo].[py_sp_ControllaPrenotazionePackingListPalletNew] AS BEGIN SET NOCOUNT ON; DECLARE @Documento varchar(8) = NULL; DECLARE @IDOperatore int = 0; DECLARE @Nominativo varchar(50) = 'SYSTEM'; DECLARE @RC int = 0; SELECT @Documento = NULLIF(LTRIM(RTRIM(Documento)), ''), @IDOperatore = ISNULL(IDOperatore, 0), @Nominativo = ISNULL(NULLIF(LTRIM(RTRIM(ModUtente)), ''), 'SYSTEM') FROM dbo.PyPickingListReservation WHERE ID = 1; IF ISNULL(@Documento, '') = '' RETURN; IF NOT EXISTS ( SELECT 1 FROM dbo.py_ViewPackingListRestante WHERE CAST(Documento AS varchar(8)) = @Documento ) BEGIN UPDATE dbo.Celle SET IDStato = 0, ModUtente = @Nominativo, ModDataOra = GETDATE() WHERE ISNULL(IDStato, 0) <> 0; UPDATE dbo.PyPickingListReservation SET Documento = NULL, IDOperatore = @IDOperatore, ModUtente = @Nominativo, ModDataOra = GETDATE() WHERE ID = 1; RETURN; END; UPDATE dbo.Celle SET IDStato = 0, ModUtente = @Nominativo, ModDataOra = GETDATE() WHERE ISNULL(IDStato, 0) <> 0; IF @IDOperatore <= 0 BEGIN SELECT TOP 1 @IDOperatore = ID FROM dbo.Operatori WHERE LOGIN = @Nominativo; END; EXEC dbo.py_sp_xExePackingListPalletPrenota @IDOperatore = @IDOperatore, @Documento = @Documento, @RC = @RC OUTPUT; END; GO /* ============================================================ 4. Viste storico picking list ramo Python ============================================================ */ CREATE OR ALTER VIEW [dbo].[py_vPreparaPackingListSAMA1] AS SELECT SAMA1.dbo.LOTSER.NUMLOT, SAMA1.dbo.ARTICO.CODICE, SAMA1.dbo.FATRIG.DESCR, LEFT(SAMA1.dbo.LOTSER.NUMSER, 6) AS UDC, SUM(SAMA1.dbo.LOTSER.QTTGIAI) AS Qta, SAMA1.dbo.BAMTES.NUMDOC, SAMA1.dbo.BAMTES.DATDOC, SAMA1.dbo.BAMTES.ID, SAMA1.dbo.BAMTES.DESCRDEST, SAMA1.dbo.BAMTES.STATO AS StatoDocumento, SAMA1.dbo.NAZIONI.CODICE AS Expr1, SAMA1.dbo.MTRASP.CODICE + ' ' + SAMA1.dbo.NAZIONI.DESCR AS NAZIONE, SAMA1.dbo.BAMTES.IDMTRASP FROM SAMA1.dbo.BAMTES LEFT OUTER JOIN SAMA1.dbo.NAZIONI ON SAMA1.dbo.NAZIONI.ID = SAMA1.dbo.BAMTES.IDNAZDEST RIGHT OUTER JOIN SAMA1.dbo.LOTTIBF LEFT OUTER JOIN SAMA1.dbo.LOTSER ON SAMA1.dbo.LOTTIBF.IDLOTSER = SAMA1.dbo.LOTSER.ID LEFT OUTER JOIN SAMA1.dbo.ARTICO ON SAMA1.dbo.LOTSER.IDARTICO = SAMA1.dbo.ARTICO.ID LEFT OUTER JOIN SAMA1.dbo.FATRIG ON SAMA1.dbo.LOTTIBF.IDFATRIG = SAMA1.dbo.FATRIG.ID ON SAMA1.dbo.BAMTES.ID = SAMA1.dbo.FATRIG.IDBAM LEFT OUTER JOIN SAMA1.sam.EXTUC ON LEFT(SAMA1.dbo.LOTSER.NUMSER, 6) = SAMA1.sam.EXTUC.CODICE LEFT OUTER JOIN SAMA1.dbo.MTRASP ON SAMA1.dbo.BAMTES.IDMTRASP = SAMA1.dbo.MTRASP.ID WHERE SAMA1.dbo.BAMTES.ANNDOC >= YEAR(GETDATE()) AND SAMA1.dbo.BAMTES.STATO IN ('P', 'D') AND SAMA1.dbo.LOTSER.NUMLOT <> '00000000000' GROUP BY SAMA1.dbo.LOTSER.NUMLOT, SAMA1.dbo.ARTICO.CODICE, SAMA1.dbo.FATRIG.DESCR, LEFT(SAMA1.dbo.LOTSER.NUMSER, 6), SAMA1.dbo.BAMTES.NUMDOC, SAMA1.dbo.BAMTES.DATDOC, SAMA1.dbo.BAMTES.ID, SAMA1.dbo.BAMTES.DESCRDEST, SAMA1.dbo.BAMTES.STATO, SAMA1.dbo.NAZIONI.CODICE, SAMA1.dbo.NAZIONI.DESCR, SAMA1.dbo.BAMTES.IDMTRASP, SAMA1.dbo.MTRASP.CODICE; GO CREATE OR ALTER VIEW [dbo].[py_vPreparaPackingList] AS SELECT NUMLOT, CODICE, DESCR, UDC, Qta, NUMDOC, DATDOC, ID, DESCRDEST, StatoDocumento, Expr1, NAZIONE FROM dbo.py_vPreparaPackingListSAMA1 WHERE NUMLOT <> ''; GO CREATE OR ALTER VIEW [dbo].[py_XMag_ViewPackingListStorico] AS SELECT TOP (100000) prep.UDC AS Pallet, prep.NUMLOT AS Lotto, prep.CODICE AS Articolo, prep.DESCR AS Descrizione, prep.Qta, prep.NUMDOC AS Documento, prep.DATDOC AS DataDocumento, prep.StatoDocumento, prep.Expr1 AS CodNazione, prep.NAZIONE, CASE WHEN prep.Expr1 = 'DE' THEN 10 WHEN prep.Expr1 = 'TH' THEN CASE WHEN SUBSTRING(prep.DESCRDEST, 1, 2) = 'NA' THEN 11 ELSE 13 END WHEN prep.Expr1 = 'MEX' THEN 12 ELSE 4 END AS Stato, ISNULL(g.NumeroPallet, 0) AS PalletCella, ISNULL(g.IDMagazzino, 1) AS Magazzino, ISNULL(g.IDArea, 5) AS Area, ISNULL(g.IDCella, 1000) AS Cella, ISNULL(c.Ordinamento, 99999) AS Ordinamento, ISNULL(c.Corsia + ' - ' + c.Colonna + ' - ' + c.Fila, 'Non scaff.') AS Ubicazione, SUBSTRING(prep.DESCRDEST, 1, 2) AS DEST, CASE WHEN MAX(CASE WHEN pr.Documento IS NOT NULL AND pr.Documento = CAST(prep.NUMDOC AS varchar(8)) THEN 1 ELSE 0 END) = 1 THEN 1 ELSE 0 END AS IDStato FROM dbo.Celle c INNER JOIN dbo.XMag_GiacenzaPallet g ON c.ID = g.IDCella RIGHT OUTER JOIN dbo.py_vPreparaPackingList prep ON g.BarcodePallet COLLATE SQL_Latin1_General_CP1_CI_AS = prep.UDC LEFT JOIN dbo.PyPickingListReservation pr ON pr.ID = 1 AND NULLIF(LTRIM(RTRIM(pr.Documento)), '') IS NOT NULL GROUP BY prep.Expr1, prep.NAZIONE, prep.UDC, prep.NUMDOC, prep.DATDOC, prep.StatoDocumento, prep.NUMLOT, prep.CODICE, prep.DESCR, prep.Qta, g.NumeroPallet, g.IDMagazzino, g.IDArea, g.IDCella, c.Ordinamento, c.Corsia, c.Colonna, c.Fila, prep.DESCRDEST; GO /* ============================================================ 5. Tabella salta UDC barcode picking list ============================================================ */ IF OBJECT_ID(N'dbo.py_BarcodePickingListSkip', N'U') IS NULL BEGIN CREATE TABLE dbo.py_BarcodePickingListSkip ( ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_py_BarcodePickingListSkip PRIMARY KEY, Documento varchar(50) COLLATE Latin1_General_CI_AS NOT NULL, Pallet varchar(50) COLLATE Latin1_General_CI_AS NOT NULL, IDStato int NOT NULL, IDOperatore int NOT NULL, DataOra datetime2(0) NOT NULL CONSTRAINT DF_py_BarcodePickingListSkip_DataOra DEFAULT SYSDATETIME(), Motivo nvarchar(200) NULL, Risolto bit NOT NULL CONSTRAINT DF_py_BarcodePickingListSkip_Risolto DEFAULT 0, RisoltoDa int NULL, RisoltoDataOra datetime2(0) NULL ); END; GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE name = N'UX_py_BarcodePickingListSkip_Open' AND object_id = OBJECT_ID(N'dbo.py_BarcodePickingListSkip', N'U') ) BEGIN CREATE UNIQUE INDEX UX_py_BarcodePickingListSkip_Open ON dbo.py_BarcodePickingListSkip (Documento, Pallet, IDStato) WHERE Risolto = 0; END; GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE name = N'IX_py_BarcodePickingListSkip_Queue' AND object_id = OBJECT_ID(N'dbo.py_BarcodePickingListSkip', N'U') ) BEGIN CREATE INDEX IX_py_BarcodePickingListSkip_Queue ON dbo.py_BarcodePickingListSkip (IDStato, Documento, Pallet, Risolto); END; GO /* ============================================================ 6. Intervallo operativo 30 giorni e sequenza di prelievo La vista di preparazione Python creata al punto 4 contiene sia P sia D. Qui il ramo operativo viene ristretto alle sole liste P degli ultimi 30 giorni; la UI applica successivamente il valore scelto (10/15/20/30). ============================================================ */ CREATE OR ALTER VIEW dbo.py_XMag_ViewPackingList AS SELECT TOP (10000) prep.UDC AS Pallet, prep.NUMLOT AS Lotto, prep.CODICE AS Articolo, prep.DESCR AS Descrizione, prep.Qta, prep.NUMDOC AS Documento, prep.DATDOC AS DataDocumento, prep.Expr1 AS CodNazione, prep.NAZIONE, CASE WHEN prep.Expr1 = 'DE' THEN 10 WHEN prep.Expr1 = 'TH' THEN CASE WHEN SUBSTRING(prep.DESCRDEST, 1, 2) = 'NA' THEN 11 ELSE 13 END WHEN prep.Expr1 = 'MEX' THEN 12 ELSE 4 END AS Stato, ISNULL(g.NumeroPallet, 0) AS PalletCella, ISNULL(g.IDMagazzino, 1) AS Magazzino, ISNULL(g.IDArea, 5) AS Area, ISNULL(g.IDCella, 1000) AS Cella, ISNULL(c.Ordinamento, 99999) AS Ordinamento, ISNULL(c.Corsia + ' - ' + c.Colonna + ' - ' + c.Fila, 'Non scaff.') AS Ubicazione, SUBSTRING(prep.DESCRDEST, 1, 2) AS DEST, CASE WHEN MAX(CASE WHEN pr.Documento IS NOT NULL AND pr.Documento = CAST(prep.NUMDOC AS varchar(8)) THEN 1 ELSE 0 END) = 1 THEN 1 ELSE 0 END AS IDStato FROM dbo.Celle AS c INNER JOIN dbo.XMag_GiacenzaPallet AS g ON c.ID = g.IDCella RIGHT OUTER JOIN dbo.py_vPreparaPackingList AS prep ON g.BarcodePallet COLLATE SQL_Latin1_General_CP1_CI_AS = prep.UDC LEFT JOIN dbo.PyPickingListReservation AS pr ON pr.ID = 1 AND NULLIF(LTRIM(RTRIM(pr.Documento)), '') IS NOT NULL WHERE prep.StatoDocumento = 'P' AND prep.DATDOC > CAST((GETDATE() - 30) AS int) GROUP BY prep.Expr1, prep.NAZIONE, prep.UDC, prep.NUMDOC, prep.DATDOC, prep.NUMLOT, prep.CODICE, prep.DESCR, prep.Qta, g.NumeroPallet, g.IDMagazzino, g.IDArea, g.IDCella, c.Ordinamento, c.Corsia, c.Colonna, c.Fila, prep.DESCRDEST; GO CREATE OR ALTER VIEW dbo.py_ViewPackingListRestante AS SELECT Pallet, Lotto, Articolo, Descrizione, Qta, Documento, DataDocumento, CodNazione, NAZIONE, Stato, PalletCella, Magazzino, Area, Cella, Ordinamento, Ubicazione, DEST, IDStato FROM dbo.py_XMag_ViewPackingList WHERE Cella <> 9999; GO IF OBJECT_ID(N'dbo.py_PickingListPrelievoSequenza', N'U') IS NULL BEGIN CREATE TABLE dbo.py_PickingListPrelievoSequenza ( ID bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_py_PickingListPrelievoSequenza PRIMARY KEY, Documento varchar(50) NOT NULL, GruppoChiave varchar(160) NOT NULL, GruppoEtichetta varchar(100) NOT NULL, Ordine int NOT NULL, InsUtente varchar(50) NULL, InsDataOra datetime2(0) NOT NULL CONSTRAINT DF_py_PickingListPrelievoSequenza_InsDataOra DEFAULT SYSDATETIME(), ModUtente varchar(50) NULL, ModDataOra datetime2(0) NULL, DelUtente varchar(50) NULL, DelDataOra datetime2(0) NULL, CONSTRAINT CK_py_PickingListPrelievoSequenza_Ordine CHECK (Ordine >= 0) ); END; GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.py_PickingListPrelievoSequenza', N'U') AND name = N'UX_py_PickingListPrelievoSequenza_DocGruppo' ) BEGIN CREATE UNIQUE INDEX UX_py_PickingListPrelievoSequenza_DocGruppo ON dbo.py_PickingListPrelievoSequenza (Documento, GruppoChiave) WHERE DelDataOra IS NULL; END; GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.py_PickingListPrelievoSequenza', N'U') AND name = N'UX_py_PickingListPrelievoSequenza_DocOrdine' ) BEGIN CREATE UNIQUE INDEX UX_py_PickingListPrelievoSequenza_DocOrdine ON dbo.py_PickingListPrelievoSequenza (Documento, Ordine) WHERE DelDataOra IS NULL; END; GO CREATE OR ALTER VIEW dbo.py_ViewPackingListPrelievo AS WITH Gruppi AS ( SELECT pl.*, CASE WHEN pl.Cella = 1000 THEN 'NON_SCAFF' ELSE CONCAT( 'M:', pl.Magazzino, '|A:', pl.Area, '|C:', LTRIM(RTRIM(CASE WHEN CHARINDEX(' - ', pl.Ubicazione) > 0 THEN LEFT(pl.Ubicazione, CHARINDEX(' - ', pl.Ubicazione) - 1) ELSE pl.Ubicazione END)) ) END AS GruppoPrelievoChiave, CASE WHEN pl.Cella = 1000 THEN 'Non scaff.' ELSE LTRIM(RTRIM(CASE WHEN CHARINDEX(' - ', pl.Ubicazione) > 0 THEN LEFT(pl.Ubicazione, CHARINDEX(' - ', pl.Ubicazione) - 1) ELSE pl.Ubicazione END)) END AS GruppoPrelievo, CASE WHEN pl.Cella = 1000 THEN 0 ELSE 1000 + ISNULL(pl.Ordinamento, 99999) END AS OrdineGruppoDefault FROM dbo.py_ViewPackingListRestante AS pl ), Sequenza AS ( SELECT g.*, s.Ordine AS OrdineGruppoConfigurato, CASE WHEN EXISTS ( SELECT 1 FROM dbo.py_PickingListPrelievoSequenza AS any_s WHERE any_s.Documento COLLATE Latin1_General_CI_AS = CAST(g.Documento AS varchar(50)) COLLATE Latin1_General_CI_AS AND any_s.DelDataOra IS NULL ) THEN 1 ELSE 0 END AS HaSequenzaPersonalizzata FROM Gruppi AS g LEFT JOIN dbo.py_PickingListPrelievoSequenza AS s ON s.Documento COLLATE Latin1_General_CI_AS = CAST(g.Documento AS varchar(50)) COLLATE Latin1_General_CI_AS AND s.GruppoChiave COLLATE Latin1_General_CI_AS = g.GruppoPrelievoChiave COLLATE Latin1_General_CI_AS AND s.DelDataOra IS NULL ) SELECT Sequenza.*, CASE WHEN OrdineGruppoConfigurato IS NOT NULL THEN OrdineGruppoConfigurato WHEN HaSequenzaPersonalizzata = 1 THEN 100000 + OrdineGruppoDefault ELSE OrdineGruppoDefault END AS OrdinePrelievoGruppo FROM Sequenza; GO PRINT 'Patch cumulativa Python WMS completata.'; GO