Freeze 2.0 warehouse monolista e documento fisso F1/F2

This commit is contained in:
2026-10-02 10:09:44 +02:00
parent 3a2893dc3d
commit a60610c03e
10 changed files with 1019 additions and 20 deletions

38
sql_tests/README.md Normal file
View File

@@ -0,0 +1,38 @@
# Dati per il collaudo a due picking list, 01/10/2026
Questi script riguardano esclusivamente la copia di test su HOMESERVER.
Non includerli nella patch cumulativa per la produzione.
`riattiva_pickinglist_20261001.sql` cambia da D a P le testate SAM 233, 234,
240 e 241 dell'anno 2026. Mantiene date, righe, lotti e posizioni delle UDC.
Salva gli stati originali in Mediseawall.dbo.py_TestPickingListReactivation_20261001
e controlla le precondizioni nella stessa transazione dell'aggiornamento.
In Gestione Picking List selezionare **30 giorni** per vedere tutte le liste:
| Lista | UDC residue | In celle fisiche | Non scaffalate nella vista |
|---|---:|---:|---:|
| 233 | 28 | 3 | 25 |
| 234 | 28 | 2 | 26 |
| 240 | 11 | 0 | 11 |
| 241 | 28 | 0 | 28 |
| 244 (gia attiva) | 26 | 24 | 2 |
La 240 conserva altre 33 UDC gia spedite, escluse dalla vista operativa.
La qualifica non scaffalata deriva dalla vista: puo' comprendere UDC che non
hanno una giacenza WMS, mostrate mediante il fallback convenzionale 1000.
Nessuna cella fisica candidata risulta contenere altre UDC. La condivisione
della locazione virtuale non scaffalata e' ammessa. Le liste 233/234 e 244
contengono celle distinte nelle stesse colonne, utili per il futuro test del
cambio automatico fra documenti. Non sono stati creati movimenti di test.
`ripristina_testate_pickinglist_20261001.sql` ripristina solo gli stati SAM.
Non ripristina UDC movimentate, skip o sequenze creati durante le prove.
Per ripetere identicamente un test che modifica le giacenze occorre un backup
coerente dei due database, oppure un ripristino specifico dei dati del test.
La piccola tabella di backup degli stati non sostituisce tale backup completo.
Controllato anche il trigger SAM `StatoLottoRientrato`: il passaggio D -> P
non soddisfa la sua condizione e non modifica i lotti. Il ripristino P -> D
si ferma se esistono lotti marcati T, per evitare gli effetti di quel trigger.

View File

@@ -0,0 +1,82 @@
/* Solo copia locale di test HOMESERVER. Non distribuire come patch produzione.
Riattiva 233,234,240,241 conservando date, righe, UDC e posizioni attuali.
Salva i valori di testata per un rollback mirato; non e' un backup dei DB.
*/
USE Mediseawall;
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF CONVERT(nvarchar(128), SERVERPROPERTY('MachineName')) <> N'HOMESERVER'
THROW 51000, 'Script riservato alla copia di test su HOMESERVER.', 1;
BEGIN TRY
BEGIN TRANSACTION;
IF OBJECT_ID('dbo.py_TestPickingListReactivation_20261001', 'U') IS NOT NULL
THROW 51001, 'Preparazione gia eseguita: controllare il backup prima di ripetere.', 1;
DECLARE @Targets TABLE (ID int PRIMARY KEY, Documento int NOT NULL);
INSERT INTO @Targets VALUES (11882,233),(11883,234),(11890,240),(11891,241);
IF (SELECT COUNT(*) FROM SAMA1.dbo.BAMTES b WITH (UPDLOCK,HOLDLOCK)
JOIN @Targets t ON b.ID=t.ID AND b.NUMDOC=t.Documento
WHERE b.ANNDOC=2026 AND b.STATO='D'
AND b.DATDOC>CAST(GETDATE()-30 AS int)) <> 4
THROW 51002, 'Le quattro testate non corrispondono allo scenario atteso.', 1;
IF EXISTS (
SELECT 1 FROM dbo.py_XMag_ViewPackingListStorico h
JOIN dbo.XMag_GiacenzaPallet g ON g.IDCella=h.Cella
WHERE h.Documento IN (233,234,240,241,244) AND h.Cella NOT IN (1000,9999)
AND LTRIM(RTRIM(g.BarcodePallet)) COLLATE Latin1_General_CI_AS <>
h.Pallet COLLATE Latin1_General_CI_AS
) THROW 51003, 'Cella fisica con altre UDC: preparazione annullata.', 1;
IF EXISTS (
SELECT Pallet FROM dbo.py_XMag_ViewPackingListStorico
WHERE Documento IN (233,234,240,241,244) AND Cella<>9999
GROUP BY Pallet HAVING COUNT(DISTINCT Documento)>1
) THROW 51004, 'Una UDC residua appartiene a piu liste candidate.', 1;
IF EXISTS (SELECT 1 FROM dbo.py_BarcodePickingListSkip
WHERE Documento IN ('233','234','240','241') AND Risolto=0)
OR EXISTS (SELECT 1 FROM dbo.py_PickingListPrelievoSequenza
WHERE Documento IN ('233','234','240','241') AND DelDataOra IS NULL)
OR EXISTS (SELECT 1 FROM dbo.PyPickingListReservation
WHERE NULLIF(LTRIM(RTRIM(Documento)),'') IS NOT NULL)
THROW 51005, 'Prenotazioni, skip o sequenze attive: verificare prima del test.', 1;
CREATE TABLE dbo.py_TestPickingListReactivation_20261001 (
BamtesID int NOT NULL PRIMARY KEY,
Anno smallint NOT NULL,
Documento int NOT NULL,
StatoOriginale char(1) NOT NULL,
DataDocumentoOriginale float NOT NULL,
ApplicataIl datetime2 NOT NULL,
RipristinataIl datetime2 NULL
);
INSERT INTO dbo.py_TestPickingListReactivation_20261001
(BamtesID,Anno,Documento,StatoOriginale,DataDocumentoOriginale,ApplicataIl)
SELECT b.ID,b.ANNDOC,b.NUMDOC,b.STATO,b.DATDOC,SYSDATETIME()
FROM SAMA1.dbo.BAMTES b JOIN @Targets t ON t.ID=b.ID;
UPDATE b SET STATO='P'
FROM SAMA1.dbo.BAMTES b JOIN @Targets t ON t.ID=b.ID;
IF @@ROWCOUNT<>4 THROW 51006, 'Numero di testate aggiornate inatteso.', 1;
IF (SELECT COUNT(DISTINCT Documento) FROM dbo.py_ViewPackingListPrelievo
WHERE Documento IN (233,234,240,241,244)
AND DataDocumento>CAST(GETDATE()-30 AS int))<>5
THROW 51007, 'Le cinque liste non risultano tutte visibili. Rollback.', 1;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT>0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
SELECT Documento,COUNT(DISTINCT Pallet) AS UdcResidue
FROM dbo.py_ViewPackingListPrelievo
WHERE Documento IN (233,234,240,241,244)
GROUP BY Documento ORDER BY Documento;

View File

@@ -0,0 +1,54 @@
/* Ripristina SOLO lo stato delle quattro testate riattivate per i test.
Non annulla movimentazioni effettuate durante il collaudo.
Eseguire sullo stesso DB locale con applicazioni ferme e liste sprenotate.
*/
USE Mediseawall;
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF CONVERT(nvarchar(128),SERVERPROPERTY('MachineName'))<>N'HOMESERVER'
THROW 51000, 'Script riservato alla copia di test su HOMESERVER.', 1;
IF OBJECT_ID('dbo.py_TestPickingListReactivation_20261001','U') IS NULL
THROW 51001, 'Backup delle testate non trovato.', 1;
BEGIN TRY
BEGIN TRANSACTION;
IF EXISTS (
SELECT 1 FROM dbo.PyPickingListReservation r
JOIN dbo.py_TestPickingListReactivation_20261001 s
ON r.Documento=CAST(s.Documento AS varchar(8))
WHERE s.RipristinataIl IS NULL
) THROW 51002, 'Sprenotare le liste di test prima del ripristino.', 1;
IF EXISTS (
SELECT 1 FROM dbo.py_TestPickingListReactivation_20261001 s
LEFT JOIN SAMA1.dbo.BAMTES b WITH (UPDLOCK,HOLDLOCK) ON b.ID=s.BamtesID
WHERE s.RipristinataIl IS NULL AND
(b.ID IS NULL OR b.ANNDOC<>s.Anno OR b.NUMDOC<>s.Documento
OR b.DATDOC<>s.DataDocumentoOriginale OR b.STATO IS NULL
OR b.STATO NOT IN ('P','D'))
) THROW 51003, 'Testate cambiate rispetto al backup: verificare manualmente.', 1;
-- Il trigger SAM StatoLottoRientrato modifica LOTSER.DESCR tornando in D.
-- In presenza di lotti marcati T fermarsi prima di attivarlo.
IF EXISTS (
SELECT 1 FROM dbo.py_TestPickingListReactivation_20261001 s
JOIN SAMA1.dbo.BAMTES b ON b.ID=s.BamtesID
JOIN SAMA1.dbo.FATRIG f ON f.IDBAM=b.ID
JOIN SAMA1.dbo.LOTTIBF lb ON lb.IDFATRIG=f.ID
JOIN SAMA1.dbo.LOTSER l ON l.ID=lb.IDLOTSER
WHERE s.RipristinataIl IS NULL AND b.STATO<>'D' AND l.DESCR='T'
) THROW 51004, 'Lotti rientrati marcati T: ripristino da valutare per il trigger SAM.', 1;
UPDATE b SET STATO=s.StatoOriginale
FROM SAMA1.dbo.BAMTES b
JOIN dbo.py_TestPickingListReactivation_20261001 s ON s.BamtesID=b.ID
WHERE s.RipristinataIl IS NULL;
UPDATE dbo.py_TestPickingListReactivation_20261001
SET RipristinataIl=SYSDATETIME() WHERE RipristinataIl IS NULL;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT>0 ROLLBACK TRANSACTION;
THROW;
END CATCH;