# Picking list con nazione di destinazione mancante ## Scopo Questo documento descrive il difetto che rendeva invisibile una picking list quando il documento SAM utilizzava un indirizzo di destinazione alternativo senza nazione valorizzata. Descrive inoltre la correzione applicata al solo ramo dati Python del WMS, le conseguenze funzionali e le verifiche da eseguire. La correzione non modifica tabelle o viste legacy utilizzate dal programma C# e non aggiorna dati anagrafici o documentali in SAM. ## Caso che ha evidenziato il difetto Il problema e' stato rilevato sulla picking list `244/2026`: | Dato | Valore | |---|---| | `BAMTES.ID` | `11896` | | `BAMTES.NUMDOC` | `244` | | `BAMTES.ANNDOC` | `2026` | | Data documento | `24/09/2026` | | `BAMTES.STATO` | `P` | | `BAMTES.IDINDDEST` | `274` | | Destinazione | `c/o UNITRANS Magazzino 4 Mirandola` | | `BAMTES.IDNAZDEST` | `NULL` | L'indirizzo alternativo `SAMA1.dbo.INDANA.ID = 274` esiste, ma anche il suo campo `IDNAZIONI` e' `NULL`. L'indirizzo abituale della stessa controparte ha invece `IDNAZIONI = 21`, corrispondente all'Italia. Il documento non aveva altri problemi: - anno corrente valido; - stato `P` valido; - data compresa nell'intervallo operativo; - 4 righe documento; - 494 righe lotto valide; - 26 UDC distinte; - trasportatore esistente. ## Causa tecnica La preparazione delle picking list collegava la testata del documento alla tabella delle nazioni con un collegamento obbligatorio: ```sql FROM SAMA1.dbo.NAZIONI INNER JOIN SAMA1.dbo.BAMTES ON SAMA1.dbo.NAZIONI.ID = SAMA1.dbo.BAMTES.IDNAZDEST ``` Un `INNER JOIN` conserva soltanto le testate per le quali esiste una nazione compatibile. Quando `BAMTES.IDNAZDEST` e' `NULL`, il confronto non puo' trovare alcuna riga e l'intero documento scompare prima che vengano elaborate righe, lotti e UDC. Nel caso 244 la diagnosi ha prodotto: ```text Righe valide senza join obbligatorio a NAZIONI: 494 Righe valide con join obbligatorio a NAZIONI: 0 ``` Il filtro della GUI a 10 giorni, la prenotazione e la sequenza di prelievo non erano quindi responsabili del problema. ## Flusso dati interessato La pagina Gestione Picking List usa questa catena: ```text SAMA1.dbo.BAMTES / FATRIG / LOTTIBF / LOTSER | v dbo.py_XMag_ViewPackingList | v dbo.py_ViewPackingListRestante | v dbo.py_ViewPackingListPrelievo | v Gestione Picking List e barcode Python ``` Lo storico Python utilizza inoltre: ```text SAMA1 -> dbo.py_vPreparaPackingListSAMA1 -> dbo.py_vPreparaPackingList -> dbo.py_XMag_ViewPackingListStorico ``` Per evitare comportamenti diversi fra operativita' e storico, la correzione e' stata applicata sia alla preparazione operativa sia alla preparazione storica. ## Correzione applicata Il collegamento e' stato reso opzionale: ```sql FROM SAMA1.dbo.BAMTES AS bt LEFT OUTER JOIN SAMA1.dbo.NAZIONI AS n ON n.ID = bt.IDNAZDEST ``` Con il `LEFT OUTER JOIN` la testata BAMTES viene conservata anche quando la nazione e' assente. Gli altri collegamenti essenziali verso righe, lotti e seriali restano obbligatori. Sono state modificate soltanto queste viste Python: - `dbo.py_vPreparaPackingListSAMA1`; - `dbo.py_XMag_ViewPackingList`. Le viste dipendenti ricevono automaticamente i dati corretti: - `dbo.py_vPreparaPackingList`; - `dbo.py_XMag_ViewPackingListStorico`; - `dbo.py_ViewPackingListRestante`; - `dbo.py_ViewPackingListPrelievo`. ## Gestione dei valori mancanti La patch non assegna automaticamente una nazione. Questo evita di trasformare un'anagrafica incompleta in un dato apparentemente certo. Quando la nazione manca: - `CodNazione` resta `NULL`; - `NAZIONE` resta `NULL`; - il documento e le sue UDC restano visibili; - il `CASE` applicativo gia' esistente usa il ramo generico `Stato = 4`; - prenotazione, dettaglio UDC e sequenza di prelievo continuano a funzionare. La correzione dell'anagrafica SAM rimane comunque consigliata. La robustezza della vista impedisce pero' che un campo descrittivo incompleto blocchi un processo operativo di magazzino. ## Script di installazione La patch autonoma e' contenuta in: ```text apply_pickinglist_optional_destination_country_patch.sql ``` Lo stesso cambiamento e' stato integrato anche negli script cumulativi: - `apply_pickinglist_days_filter_patch.sql`; - `apply_online_python_wms_full_patch.sql`. Per aggiornare un database che possiede gia' le viste Python e' sufficiente eseguire una sola volta in SSMS la patch autonoma. Gli script usano `CREATE OR ALTER VIEW`, quindi possono essere rieseguiti senza duplicare dati. ## Verifica post-patch Controllo della vista operativa: ```sql SELECT Documento, DataDocumento, CodNazione, NAZIONE, Stato, IDStato, COUNT(DISTINCT Pallet) AS NumeroUDC FROM dbo.py_ViewPackingListPrelievo WHERE Documento = 244 GROUP BY Documento, DataDocumento, CodNazione, NAZIONE, Stato, IDStato; ``` Risultato ottenuto dopo la correzione: ```text Documento: 244 CodNazione: NULL NAZIONE: NULL Stato: 4 IDStato: 0 Numero UDC: 26 ``` Controllo dei quattro livelli principali: ```sql SELECT COUNT(DISTINCT UDC) AS UDC FROM dbo.py_vPreparaPackingListSAMA1 WHERE NUMDOC = 244 AND StatoDocumento = 'P'; SELECT COUNT(DISTINCT Pallet) AS UDC FROM dbo.py_XMag_ViewPackingList WHERE Documento = 244; SELECT COUNT(DISTINCT Pallet) AS UDC FROM dbo.py_ViewPackingListRestante WHERE Documento = 244; SELECT COUNT(DISTINCT Pallet) AS UDC FROM dbo.py_ViewPackingListPrelievo WHERE Documento = 244; ``` Tutte e quattro le query devono restituire `26` per il caso analizzato. ## Impatto e compatibilita' - Nessuna riga SAM viene inserita, aggiornata o cancellata. - Nessuna prenotazione viene modificata. - Nessuna stored procedure di movimentazione viene modificata. - Le picking list con nazione valida mantengono lo stesso risultato. - Le picking list prima invisibili per nazione nulla diventano visibili. - Gli oggetti legacy senza prefisso `py_` non vengono modificati. ## Ripristino concettuale Per ripristinare il comportamento precedente occorrerebbe riportare il collegamento `BAMTES -> NAZIONI` da `LEFT OUTER JOIN` a `INNER JOIN` nelle due viste Python modificate. Tale rollback farebbe nuovamente scomparire tutti i documenti con `IDNAZDEST` nullo e non e' quindi raccomandato come soluzione operativa. ## Miglioramento futuro consigliato Una diagnostica separata potrebbe mostrare le picking list con dati anagrafici incompleti, senza impedirne l'uso: ```sql SELECT ID, ANNDOC, NUMDOC, IDINDDEST, DESCRDEST FROM SAMA1.dbo.BAMTES WHERE STATO = 'P' AND IDNAZDEST IS NULL; ``` In questo modo il WMS rimane operativo e l'amministratore puo' correggere l'anagrafica SAM in un secondo momento.