Aggiungi sequenza prelievo e gestisci destinazioni senza nazione
This commit is contained in:
247
analisi_fix_pickinglist_nazione_destinazione.md
Normal file
247
analisi_fix_pickinglist_nazione_destinazione.md
Normal file
@@ -0,0 +1,247 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user