Files
ware_house/analisi_fix_pickinglist_nazione_destinazione.md

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

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:

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

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.