6.7 KiB
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
Pvalido; - 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:
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:
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:
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:
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:
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:
CodNazionerestaNULL;NAZIONErestaNULL;- il documento e le sue UDC restano visibili;
- il
CASEapplicativo gia' esistente usa il ramo genericoStato = 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:
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:
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:
Documento: 244
CodNazione: NULL
NAZIONE: NULL
Stato: 4
IDStato: 0
Numero UDC: 26
Controllo dei quattro livelli principali:
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:
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.