Modifica e cancellazione documenti
Panoramica
Quando un documento di magazzino collegato alle locazioni viene modificato o cancellato, il sistema deve invertire i movimenti gia' registrati e aggiornare le giacenze nelle locazioni coinvolte. Questa pagina descrive nel dettaglio cosa succede in ogni scenario, quali operazioni sono consentite, quali sono bloccate e quali criticita' possono verificarsi.
Regola fondamentale: il flag fl-blocco
Ogni DDT di carico nel DB Frontiera ha un campo df-dtes-fl-blocco che determina il comportamento del sistema:
| Valore | Significato | Modifica gestionale | Aggiornamento WMS |
|---|---|---|---|
" " (spazio) |
DDT libero — nessun BDP collegato e nessuna movimentazione APP | Consentita | Si' — il ciclo cancella+ricrea viene eseguito |
"S" |
DDT bloccato — ha BDP collegati oppure l'APP ha gia' movimentato la merce | Consentita (solo avviso) | No — il WMS non viene aggiornato |
"X" |
Usato solo sui BDP — indica un BDP gia' usato in un DDT poi cancellato | — | Trattamento speciale (vedi Doppio conteggio) |
In sintesi: quando fl-blocco = "S", l'operatore puo' modificare il documento nel gestionale ma le tabelle WMS (dfgiacenzeloc, dfmovimentiloc) non vengono toccate. Il risultato e' una divergenza intenzionale tra dati gestionali e dati WMS. Il sistema avvisa l'operatore con un messaggio di warning.
DDT di carico
Cosa e' consentito e cosa e' bloccato
| Operazione | fl-blocco = spazio | fl-blocco = "S" |
|---|---|---|
| Modifica quantita' righe | Consentita + WMS aggiornato | Consentita + WMS invariato (solo avviso) |
| Aggiunta righe | Consentita + WMS aggiornato | Consentita + WMS invariato |
| Eliminazione righe | Consentita + WMS aggiornato | Consentita + WMS invariato |
| Duplicazione righe | Consentita + WMS aggiornato | Consentita + WMS invariato |
| Cancellazione DDT | Consentita + WMS aggiornato | Consentita + WMS invariato (solo avviso) |
| Completamento carico (F6) | Consentita | Bloccata se carico gia' stoccato da APP |
Nota storica: prima del 03/09/2025, le operazioni di modifica righe (aggiunta, eliminazione, duplicazione, cambio valori) erano bloccate quando fl-blocco = "S". La limitazione e' stata rimossa per permettere la gestione contabile indipendente dall'APP.
Il blocco "Completamento carico" (F6)
Questa e' l'unica operazione veramente bloccante nel sistema WMS. Quando l'operatore preme F6 per creare BDP dal DDT di carico:
- Il sistema chiama
carico-stoccatoper verificare se l'APP ha gia' confermato lo stoccaggio fisico (cerca indfmovimentilocun movimento condoc-key = "stock") - Se la merce e' gia' stoccata: "DDT di carico gia' Stoccato con movimentazione APP Locazioni: operazione 'COMPLETA-CARICO' non abilitata" — l'operazione viene impedita
Questo blocco e' necessario perche' creare un BDP su merce gia' stoccata dall'APP provocherebbe un doppio scarico dalla locazione di arrivo.
Messaggi di avviso all'operatore
| Messaggio | Quando appare | Bloccante? |
|---|---|---|
| "DDT collegato a Buoni di Prelievo: gestione carico abilitata ma non la movimentazione articoli su APP Locazioni!!" | All'apertura di un DDT che ha BDP collegati (COGGENER "EB") | No |
| "DDT collegato a movimentazione articoli da APP: gestione carico abilitata ma non la movimentazione articoli su APP Locazioni!!" | All'apertura di un DDT gia' movimentato dall'APP | No |
| "DDT collegato a movimentazione articoli da APP: Cancellazione Carico Abilitata. (verificare movimentazione su APP Locazioni)" | Alla cancellazione di un DDT movimentato dall'APP | No |
| "DDT di carico gia' Stoccato..." | F6 Completamento carico su DDT stoccato | Si' |
Modifica DDT di carico (fl-blocco = spazio)
La modifica segue un ciclo cancella + ricrea:
Fase 1 — Cancellazione vecchi movimenti (cancella-entrata):
- Il sistema individua la locazione assegnata al DDT da
dfdoctes - Se il DDT non e' presente nel DB Frontiera (inserito prima dell'attivazione del WMS):
esito = "X", nessuna azione - Per ogni riga del DDT originale (scan COGMOMAG):
dfgiacenzeloc: giacenza -= quantita' (ripristina la giacenza prima della modifica)dfmovimentiloc: DELETE del movimento collegato alla riga
Fase 2 — Reinserimento nuovi movimenti (modifica-entrata):
- Per ogni riga del DDT modificato (scan COGMOMAG):
- Esclude articoli di classe Servizio
dfgiacenzeloc: giacenza += quantita' (la giacenza riflette le nuove quantita')- Se il record di giacenza non esiste, lo crea
dfmovimentiloc: INSERT nuovo movimento con segno"E"
Il record dfdoctes non viene modificato: la locazione assegnata rimane la stessa.
Cancellazione DDT di carico
Fase 1 — Controllo preliminare (controllo-entrata):
- Se
fl-blocco = "S"(carico gia' movimentato da APP): il sistema mostra un avviso non bloccante. L'operatore deve verificare lo stato sull'APP
Fase 2 — Cancellazione effettiva (cancella-ddt) — solo se fl-blocco = spazio:
- Marca
dfdoctescome cancellato:df-dtes-val = "C" - Cancella tutti i movimenti collegati in
dfmovimentiloc - Per ogni movimento cancellato: aggiorna
dfgiacenzeloc(giacenza -= quantita' del movimento) - Se la giacenza nella locazione si azzera per tutti gli articoli: libera la locazione (
loc-ana = spaces)
Se fl-blocco = "S": il gestionale cancella il DDT (COGTESBO, COGMOMAG) ma il DB Frontiera non viene aggiornato. I record in dfdoctes, dfgiacenzeloc e dfmovimentiloc restano con i dati originali.
BDP (Buoni di Prelievo)
Modifica di un BDP gia' assegnato a una locazione
La modifica delle righe di un BDP (quantita', aggiunta/rimozione articoli) e' consentita anche dopo che il BDP e' stato assegnato a una locazione. Non c'e' alcun controllo WMS che la impedisca.
Criticita': quando l'operatore modifica le righe del BDP in COGM58, i record COGRIGBP vengono aggiornati normalmente, ma WMSW01 non viene chiamato. Di conseguenza:
dfgiacenzelocconserva le quantita' originali (quelle assegnate alla creazione del BDP)dfmovimentilocconserva i movimenti originali- Le quantita' nel gestionale e nel WMS divergono
Questa divergenza viene rilevata solo da WMS005 Giro 5 (riconciliazione per locazione specifica), che deve essere eseguito manualmente.
Non c'e' differenza tra un BDP ancora nella locazione di default e uno gia' spostato alla locazione reale: in entrambi i casi la modifica e' consentita senza aggiornamento WMS.
Cancellazione BDP collegato a DDT di carico
Quando si cancella un BDP che era stato creato tramite "completamento carico" di un DDT di entrata (raccordo COGGENER tipo "EB"):
Operazione: cancella-bdp
- Cancella tutti i movimenti in
dfmovimentiloccon chiave del BDP - Per ogni movimento cancellato: aggiorna
dfgiacenzeloc(inverte il segno: se il movimento era Entrata, la giacenza diminuisce; se era Uscita, aumenta) - Marca
dfdoctesdel BDP come cancellato:df-dtes-val = "C" - Cancella logicamente il raccordo
dfdocracpadre"DM"→ figlio"BDP":val = "C" - Verifica giacenze nella locazione: se tutti gli articoli a zero, libera la locazione
- Sblocca il DDT di carico padre: controlla se esistono altri BDP collegati allo stesso DDT (via COGGENER tipo
"EB"). Se il BDP cancellato era l'ultimo: impostadf-dtes-fl-blocco = spacessul DDT, rendendolo nuovamente disponibile per l'APP
Cancellazione BDP non collegato a DDT di carico
Quando si cancella un BDP che non ha raccordo "EB" (ad esempio creato manualmente o da evasione ordini):
Operazione: cancella-bdp-altri
Verifica preliminare: controlla se il BDP e' stato creato da "Evasione BDP da Locazione" cercando in dfdocrac un raccordo con padre "LOC" e figlio "BDP". Se trovato, usa una logica dedicata (vedi sotto).
Flusso standard:
- Cancella tutti i movimenti con chiave BDP
- Cerca un raccordo
dfdocraccon padre"COV"(ordine di vendita), figlio"BDPP"(BDP provvisorio) - Se trovato: cancella anche i movimenti collegati al BDP provvisorio; cancella logicamente
dfdoctesdel BDPP - Verifica giacenze e libera locazione se necessario
Flusso BDP da evasione locazione (cancella-bdp-locaz):
- Cancella tutti i movimenti con chiave BDP
- Cancella logicamente
dfdoctesdel BDP (classe"BDP") - Cancella logicamente
dfdocraccon padre"LOC"→ figlio"BDP" - Cancella logicamente
dfdocraccon padre"COV"→ figlio"BDP"
Programmi che cancellano BDP
La cancellazione del BDP viene gestita da piu' programmi, tutti con la stessa logica di chiamata a WMSW01:
| Programma | Contesto |
|---|---|
| COGM58 (a1.cbl) | Cancellazione diretta del BDP dall'interfaccia BDP |
| COGU11 | Cancellazione bolla che ha BDP collegati (via COGGENER tipo "BB") |
| COGSA5 | Cancellazione BDP da utility |
| COGSA0 | Cancellazione da gestione prenotazioni |
| COGM87 | Cancellazione BDP da packing list |
| COGO17W | Cancellazione da gestione consegne ordine |
DDT di uscita
Cancellazione DDT di uscita → riapertura BDP
La cancellazione di un DDT di uscita non inverte direttamente le giacenze delle locazioni. Invece, riapre i BDP collegati perche' la merce e' ancora fisicamente in magazzino.
Il comportamento dipende dalla configurazione uscite / riapertura-bdp-da-gestione-ddt:
| Valore | Significato |
|---|---|
"N" |
Nessuna riapertura: i BDP restano chiusi, le locazioni non vengono aggiornate |
"G" |
Solo gestionale: i BDP vengono riaperti nel gestionale (tbp-fl-cls = "A") ma l'APP tablet non viene avvisata |
"T" |
Gestionale + tablet: i BDP vengono riaperti nel gestionale E nel DB Frontiera; l'APP rivede i BDP come "aperti" |
Flusso con riapertura-bdp = "T" (riapertura completa):
- COGU11 / COGV50W cancella i raccordi COGGENER tipo
"BB"(DDT → BDP) - Per ogni BDP collegato: riapre la testata (
tbp-fl-cls = "A") - Chiama WMSW01
riapertura-bdp: - Aggiorna
dfdoctesdel BDP:stato = spaces(riaperto),fl-blocco = "X"(marcato come "gia' usato") - Il flag
fl-blocco = "X"e' fondamentale: quando questo BDP verra' usato in un nuovo DDT di uscita, l'operazioneddt-uscitariconoscera' il flag"X"e saltera' l'aggiornamento delle giacenze per quel BDP (perche' la giacenza era gia' stata scaricata la prima volta e non e' stata ripristinata)
Attenzione: la riapertura del BDP non ripristina le giacenze nella locazione. Il movimento di scarico rimane. Questo e' coerente con il fatto che la merce e' ancora fisicamente nel punto di prelievo — non e' stata "rimessa a posto" nel magazzino.
Modifica DDT di uscita con BDP aggiunti
Quando si aggiungono nuovi BDP a un DDT di uscita esistente:
- Il sistema chiama
modifica-ddt-usc - Per ogni BDP collegato al DDT (via COGGENER
"BB"): - Verifica se esistono gia' movimenti in
dfmovimentilocper quel BDP + DDT: se si', lo salta (gia' scaricato) - Se non esistono: procede come per
ddt-uscita(scarico giacenza, inserimento movimenti)
Modifica DDT di uscita con rimozione righe BDP
Quando tutte le righe di un BDP vengono rimosse dal DDT di uscita:
- COGV50W riapre il BDP (
tbp-fl-cls = "A") - Se
gestione-tablet = "S"eriapertura-bdp = "T": chiama WMSW01riapertura-bdp
Riepilogo operazioni WMSW01
| Evento | Programma | Operazione | Effetto su giacenze | Effetto su dfdoctes |
|---|---|---|---|---|
| Modifica DDT carico (fase 1) | COGV14W | cancella-entrata |
-= (ripristino) | Invariato |
| Modifica DDT carico (fase 2) | COGV14W | modifica-entrata |
+= (reinserimento) | Invariato |
| Cancellazione DDT carico | COGV14W | cancella-ddt |
-= (inversione) | val="C" |
| Modifica righe BDP | COGM58 | nessuna | Nessuno | Invariato |
| Cancellazione BDP (con DDT) | COGM58/COGU11 | cancella-bdp |
Inversione | val="C", sblocca DDT padre |
| Cancellazione BDP (senza DDT) | COGM58/COGU11 | cancella-bdp-altri |
Inversione | val="C" |
| Cancellazione DDT uscita | COGU11/COGV50W | riapertura-bdp |
Nessuno | stato=spaces, fl-blocco="X" |
| Modifica DDT uscita (+BDP) | COGV50W | modifica-ddt-usc |
-= (solo nuovi BDP) | stato="C" (nuovi BDP) |
Criticita' e problemi potenziali
Divergenza WMS dopo modifica con fl-blocco="S"
Quando fl-blocco = "S", le modifiche e le cancellazioni al DDT di carico aggiornano il gestionale (COGTESBO, COGMOMAG) ma non il DB Frontiera. Il risultato e':
- Le giacenze in
dfgiacenzelocnon corrispondono piu' ai movimenti del gestionale - I movimenti in
dfmovimentilocfanno riferimento a quantita' che nel gestionale sono cambiate - L'APP tablet mostra dati non aggiornati
Questa divergenza e' intenzionale e documentata dal messaggio di avviso. L'operatore deve verificare manualmente lo stato sull'APP.
Strumento di riconciliazione: WMS005 puo' essere usato per riallineare le giacenze (vedi Strumenti di gestione).
Divergenza WMS dopo modifica righe BDP
La modifica delle righe di un BDP (quantita', aggiunta/rimozione articoli) in COGM58 non aggiorna il WMS. Non c'e' nemmeno un avviso all'operatore. La divergenza puo' essere rilevata solo con WMS005 Giro 5.
Assenza di gestione transazionale
Le operazioni SQL del WMS (INSERT, UPDATE, DELETE su dfgiacenzeloc, dfmovimentiloc, dfdoctes) vengono eseguite una alla volta, senza transazioni atomiche (nessun BEGIN/COMMIT/ROLLBACK).
Di conseguenza:
- Se un'operazione SQL fallisce, le precedenti sono gia' state applicate e non vengono annullate
- Il programma logga l'errore ma non interrompe il salvataggio del documento gestionale
- Il risultato puo' essere un aggiornamento parziale del DB Frontiera
Finestra di rischio tra cancella-entrata e modifica-entrata
La modifica di un DDT di carico prevede due chiamate WMSW01 in momenti diversi del programma:
cancella-entrata— cancella i vecchi movimenti e decrementa le giacenze- (centinaia di righe di codice — salvataggio COGTESBO, COGMOMAG, calcoli prezzi, contabilizzazione...)
modifica-entrata— inserisce i nuovi movimenti e incrementa le giacenze
Se il programma si interrompe tra il punto 1 e il punto 3 (crash, interruzione rete, chiusura forzata), il DB Frontiera resta in uno stato intermedio: - I vecchi movimenti sono gia' cancellati - Le vecchie giacenze sono gia' decrementate - Ma i nuovi movimenti non sono ancora stati inseriti
Conseguenza: giacenze negative o azzerate nella locazione. Rilevabile e correggibile con WMS005 Giro 4 (pulizia giacenze negative).
Concorrenza tra APP tablet e gestionale
Non c'e' un meccanismo di lock condiviso tra la sessione gestionale e l'APP tablet. Il controllo controllo-entrata che verifica fl-blocco viene eseguito solo all'apertura del documento, non al momento del salvataggio.
Scenario di rischio:
1. L'operatore apre un DDT di carico → il sistema verifica fl-blocco = spazio (DDT libero)
2. L'operatore modifica il DDT (tempo di lavoro)
3. Nel frattempo l'APP tablet stocca la merce → scrive in dfmovimentiloc e aggiorna fl-blocco = "S"
4. L'operatore salva → il gestionale chiama cancella-entrata che rimuove i movimenti inclusi quelli appena creati dall'APP
Questo caso e' raro ma possibile. La prevenzione sta nel coordinamento operativo: l'operatore non deve modificare DDT di carico mentre l'APP li sta elaborando.
Inventario durante movimentazione in corso
Quando si esegue l'inventario in modalita' "T" (tablet), WMSW01 somma le giacenze da tutte le locazioni del magazzino, incluse quelle di classe "A" (Arrivo). Se nel momento dell'inventario ci sono DDT di carico parzialmente processati (merce in transito tra locazione di arrivo e stoccaggio finale), le quantita' possono risultare contate nella posizione di transito.
Casi particolari
DDT inserito prima dell'attivazione WMS
Se un DDT di carico e' stato inserito quando gestione-tablet non era ancora attivo, non esiste nel DB Frontiera. Tutte le operazioni di modifica/cancellazione restituiscono esito = "X" (non applicabile) e procedono senza aggiornare le locazioni.
Doppio conteggio su BDP riaperto
Quando un BDP viene usato in un DDT, cancellato e poi riusato in un altro DDT:
1. Alla cancellazione del primo DDT: dfdoctes del BDP riceve fl-blocco = "X"
2. Al secondo DDT: l'operazione ddt-uscita vede il flag "X" e segna stato = "C" senza aggiornare le giacenze
3. Questo evita di scaricare due volte la stessa giacenza dalla locazione
Causale esclusa dal tablet
I DDT con causale uguale a cau-no-aggancio-tablet (configurabile) non attivano mai la logica WMS, nemmeno in modifica o cancellazione.
Errore SQL non bloccante
Quando un'operazione SQL di WMSW01 fallisce (ad esempio rwr-dfgiacenzeloc), il sistema:
1. Mostra un messaggio critico all'operatore (vbx-msg-critico-es2000)
2. Restituisce esito = "N" al programma chiamante
3. Il programma chiamante logga l'errore nel file di debug ma non interrompe il salvataggio del documento
Il documento gestionale viene salvato normalmente. L'inconsistenza WMS rimane fino alla prossima riconciliazione con WMS005.
Riconciliazione con WMS005
Per correggere le divergenze descritte sopra, il programma WMS005 offre diversi livelli di verifica:
| Giro | Funzione | Cosa corregge |
|---|---|---|
| 2 | Verifica occupazione locazioni | Locazioni con BDP di clienti diversi; locazioni "occupate" senza BDP aperti |
| 3 | Pulizia giacenze residue | Locazioni libere (loc-ana = spazi) che hanno ancora giacenza > 0 |
| 4 | Pulizia giacenze negative | Record dfgiacenzeloc con giacenza < 0 (tipicamente da crash tra cancella-entrata e modifica-entrata) |
| 5 | Quadratura quantitativa per locazione | Confronto tra quantita' attese (somma righe BDP aperti) e quantita' effettive (dfgiacenzeloc). Genera movimenti di rettifica (doc-key = "rettifica-g5") e sovrascrive la giacenza con il valore calcolato |
Nota: il Giro 5 opera su una singola locazione specificata dall'operatore. Non esiste un modo per eseguirlo in batch su tutte le locazioni contemporaneamente.
Vedi anche
- Flusso di entrata
- Flusso di uscita
- Strumenti di gestione — WMS005 e altri strumenti di riconciliazione
- Panoramica