Vai al contenuto

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:

  1. Il sistema chiama carico-stoccato per verificare se l'APP ha gia' confermato lo stoccaggio fisico (cerca in dfmovimentiloc un movimento con doc-key = "stock")
  2. 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):

  1. Il sistema individua la locazione assegnata al DDT da dfdoctes
  2. Se il DDT non e' presente nel DB Frontiera (inserito prima dell'attivazione del WMS): esito = "X", nessuna azione
  3. Per ogni riga del DDT originale (scan COGMOMAG):
  4. dfgiacenzeloc: giacenza -= quantita' (ripristina la giacenza prima della modifica)
  5. dfmovimentiloc: DELETE del movimento collegato alla riga

Fase 2 — Reinserimento nuovi movimenti (modifica-entrata):

  1. Per ogni riga del DDT modificato (scan COGMOMAG):
  2. Esclude articoli di classe Servizio
  3. dfgiacenzeloc: giacenza += quantita' (la giacenza riflette le nuove quantita')
  4. Se il record di giacenza non esiste, lo crea
  5. 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:

  1. Marca dfdoctes come cancellato: df-dtes-val = "C"
  2. Cancella tutti i movimenti collegati in dfmovimentiloc
  3. Per ogni movimento cancellato: aggiorna dfgiacenzeloc (giacenza -= quantita' del movimento)
  4. 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:

  • dfgiacenzeloc conserva le quantita' originali (quelle assegnate alla creazione del BDP)
  • dfmovimentiloc conserva 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

  1. Cancella tutti i movimenti in dfmovimentiloc con chiave del BDP
  2. Per ogni movimento cancellato: aggiorna dfgiacenzeloc (inverte il segno: se il movimento era Entrata, la giacenza diminuisce; se era Uscita, aumenta)
  3. Marca dfdoctes del BDP come cancellato: df-dtes-val = "C"
  4. Cancella logicamente il raccordo dfdocrac padre "DM" → figlio "BDP": val = "C"
  5. Verifica giacenze nella locazione: se tutti gli articoli a zero, libera la locazione
  6. 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: imposta df-dtes-fl-blocco = spaces sul 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:

  1. Cancella tutti i movimenti con chiave BDP
  2. Cerca un raccordo dfdocrac con padre "COV" (ordine di vendita), figlio "BDPP" (BDP provvisorio)
  3. Se trovato: cancella anche i movimenti collegati al BDP provvisorio; cancella logicamente dfdoctes del BDPP
  4. Verifica giacenze e libera locazione se necessario

Flusso BDP da evasione locazione (cancella-bdp-locaz):

  1. Cancella tutti i movimenti con chiave BDP
  2. Cancella logicamente dfdoctes del BDP (classe "BDP")
  3. Cancella logicamente dfdocrac con padre "LOC" → figlio "BDP"
  4. Cancella logicamente dfdocrac con 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):

  1. COGU11 / COGV50W cancella i raccordi COGGENER tipo "BB" (DDT → BDP)
  2. Per ogni BDP collegato: riapre la testata (tbp-fl-cls = "A")
  3. Chiama WMSW01 riapertura-bdp:
  4. Aggiorna dfdoctes del BDP: stato = spaces (riaperto), fl-blocco = "X" (marcato come "gia' usato")
  5. Il flag fl-blocco = "X" e' fondamentale: quando questo BDP verra' usato in un nuovo DDT di uscita, l'operazione ddt-uscita riconoscera' 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:

  1. Il sistema chiama modifica-ddt-usc
  2. Per ogni BDP collegato al DDT (via COGGENER "BB"):
  3. Verifica se esistono gia' movimenti in dfmovimentiloc per quel BDP + DDT: se si', lo salta (gia' scaricato)
  4. 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:

  1. COGV50W riapre il BDP (tbp-fl-cls = "A")
  2. Se gestione-tablet = "S" e riapertura-bdp = "T": chiama WMSW01 riapertura-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 dfgiacenzeloc non corrispondono piu' ai movimenti del gestionale
  • I movimenti in dfmovimentiloc fanno 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:

  1. cancella-entrata — cancella i vecchi movimenti e decrementa le giacenze
  2. (centinaia di righe di codice — salvataggio COGTESBO, COGMOMAG, calcoli prezzi, contabilizzazione...)
  3. 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