Inventario Modula — Analisi di quadratura COGMA0 + DFNM02 + COGD60¶
Analisi del flusso di inventario per lotto con caricamento dati da Modula DB Frontiera, e verifica della quadratura tra le quantita' gestionale e quelle Modula.
Programmi coinvolti¶
| Programma | Ruolo |
|---|---|
| COGMA0 | Inventario per lotto: calcola giacenze, carica dati da Modula, genera documenti di adeguamento |
| DFNM02 | Sottoprogramma: legge le ubicazioni dal DB Frontiera Modula e aggiorna COGINVLT |
| COGD60 | Controllo quadratura: confronta quantita' gestionale vs quantita' comunicate a Modula |
| COGU31 | Calcolo giacenza contabile per merce/magazzino/data |
| COGS26 | Creazione documento di prima nota magazzino (adeguamento) |
Flusso di inventario con Modula DB Frontiera¶
Fase 1 — Ricreazione archivio (COGMA0, paragrafo ricrea-archivio)¶
Quando l'utente seleziona "Ricreo archivio" con dati precedenti = "M" (da Modula):
- Cicla tutte le merci (
COGMERCI) conmer-modula = "S" - Per ciascuna merce, elabora i lotti (
m-elabora-lotti-merce): - Scorre
COGMERLTper magazzino/merce - Per ogni lotto, calcola la quantita' da
COGMOVLTsommando i movimenti fino alla data inventario - Scrive il record in
COGINVLT(inventario per lotto) - Elimina i lotti con
qta-cal = 0eqta-inv = 0(se "Solo lotti aperti") - Calcola la compensazione: se la somma dei lotti != giacenza contabile (da COGU31), crea una riga senza lotto (
lnl-lotto-prog = 0) con la differenza
Fase 2 — Caricamento da Modula (COGMA0 → DFNM02)¶
Condizioni: tm-dati-prec = "M" AND tm-cfg-modula-db-frontiera = "S" AND tm-mag = az-mag-modula
COGMA0 chiama DFNM02 passando: magazzino, data, flag lotti aperti, eventuale merce filtro.
DFNM02 — paragrafo a1-inventario:
- Query SQL su
exp_ubicazioni: legge tutte le ubicazioni con tipo scomparto "FITT" o "MODUL" (la giacenza fisica) - Per ciascuna coppia articolo/lotto, accumula:
w-tot-ubi-qta= quantita' fisica sulle ubicazioniw-tot-qta-pren-vers= quantita' prenotata in versamentow-tot-qta-pren-prel= quantita' prenotata in prelievo- Calcolo giacenza virtuale (paragrafo
a11-agg-coginvlt):
Giacenza = Qta_ubicazioni + Qta_prenotata_versamento - Qta_prenotata_prelievo
Motivazione delle componenti: - Qta ubicazioni: giacenza fisica reale sugli scomparti - + Prenotata versamento: sul gestionale il versamento e' gia' un movimento fisico contabilizzato, ma Modula lo ha ancora "in coda" - - Prenotata prelievo: il prelievo genera su gestionale una quantita' prenotata; se gia' inviato a Modula, la merce e' ancora fisicamente presente ma va sottratta
- Aggiornamento COGINVLT: scrive
lnl-qta-inv = w-giacenzaper ogni lotto trovato - Secondo ciclo — BDP aperti (paragrafo
a12-calcola-bdp-inviati): - Per ogni merce Modula, scorre i BDP aperti (
COGRIGBP) - Filtra: BDP aperto, inviato a Modula (
tb2-inviato-modula = "S") OPPURE non provvisorio (tb2-invio-modula-prev = "N") - Somma la quantita' BDP alla
lnl-qta-invdel lotto corrispondente
Fase 3 — Visualizzazione e modifica (COGMA0)¶
Dopo il caricamento, COGMA0 mostra la griglia con:
- Qta calcolata (lnl-qta-cal): giacenza ricalcolata dai movimenti gestionale
- Qta inventario (lnl-qta-inv): dato proveniente da Modula (o manuale)
L'utente puo' modificare lnl-qta-inv per ciascun lotto.
Fase 4 — Generazione documento di adeguamento (COGMA0, genera-doc)¶
Per ogni lotto dove lnl-qta-inv != lnl-qta-cal:
- Calcola la differenza
- Se qta-inv < qta-cal → movimento di uscita ("U")
- Se qta-inv > qta-cal → movimento di entrata ("E")
- Scrive su TRAN-S26 e chiama COGS26 per creare il documento
Se DB Frontiera attivo: s26-fl-modula = "N" (il documento di adeguamento NON viene inviato a Modula, perche' l'inventario viene dal Modula stesso).
Simulazione casi di quadratura¶
Caso 1 — Giacenza allineata, nessun BDP¶
| Dato | Valore |
|---|---|
| Giacenza contabile (COGU31) | 100 |
| Qta lotti da movimenti (COGMOVLT) | 100 |
| Qta ubicazioni Modula (exp_ubicazioni) | 100 |
| Prenotata versamento | 0 |
| Prenotata prelievo | 0 |
| BDP aperti inviati | nessuno |
Calcolo DFNM02: Giacenza = 100 + 0 - 0 = 100 → lnl-qta-inv = 100
Compensazione COGMA0: qta_lotti (100) = giacenza contabile (100) → nessuna riga senza lotto
Adeguamento: lnl-qta-inv (100) - lnl-qta-cal (100) = 0 → nessun documento
Caso 2 — BDP inviato a Modula, merce non ancora prelevata¶
Un BDP di 20 pezzi e' stato inviato a Modula ma il prelievo non e' ancora avvenuto.
| Dato | Valore |
|---|---|
| Giacenza contabile | 100 |
| Qta ubicazioni Modula | 100 (merce ancora fisicamente presente) |
| Prenotata prelievo | 20 (in coda su Modula) |
| BDP aperto inviato | 20 pezzi |
Calcolo DFNM02 (a11): Giacenza = 100 + 0 - 20 = 80
DFNM02 (a12, BDP): aggiunge 20 → lnl-qta-inv = 80 + 20 = 100
Adeguamento: 100 - 100 = 0 → nessun documento ✓
La logica e' corretta: il BDP ha generato una prenotazione in prelievo su Modula (la merce e' "promessa" ma ancora li'). DFNM02 la sottrae, poi la riagiunge perche' il BDP e' aperto lato gestionale. Risultato netto: la giacenza non cambia.
Caso 3 — BDP inviato e prelievo completato su Modula¶
Il prelievo del caso 2 e' stato completato su Modula.
| Dato | Valore |
|---|---|
| Giacenza contabile | 100 (il BDP non ha ancora generato DDT) |
| Qta ubicazioni Modula | 80 (merce fisicamente prelevata) |
| Prenotata prelievo | 0 (prelievo completato) |
| BDP aperto inviato | 20 pezzi |
Calcolo DFNM02 (a11): Giacenza = 80 + 0 - 0 = 80
DFNM02 (a12, BDP): aggiunge 20 → lnl-qta-inv = 80 + 20 = 100
Adeguamento: 100 - 100 = 0 → nessun documento ✓
Corretto: la merce e' uscita fisicamente da Modula ma il gestionale la "riserva" ancora tramite il BDP aperto. Il risultato e' coerente.
Caso 4 — BDP chiuso con DDT emesso¶
Il BDP e' stato chiuso e il DDT emesso (la giacenza contabile e' stata ridotta).
| Dato | Valore |
|---|---|
| Giacenza contabile | 80 (DDT ha scaricato 20) |
| Qta ubicazioni Modula | 80 |
| BDP aperti | nessuno (chiuso) |
Calcolo DFNM02 (a11): Giacenza = 80 + 0 - 0 = 80 → lnl-qta-inv = 80
DFNM02 (a12, BDP): nessun BDP aperto
Adeguamento: 80 - 80 = 0 → nessun documento ✓
Caso 5 — Differenza reale: merce persa o trovata¶
Modula conta fisicamente una quantita' diversa da quella attesa.
| Dato | Valore |
|---|---|
| Giacenza contabile | 100 |
| Qta ubicazioni Modula | 95 (5 pezzi mancanti) |
| BDP aperti | nessuno |
Calcolo DFNM02 (a11): Giacenza = 95 + 0 - 0 = 95 → lnl-qta-inv = 95
Adeguamento: 95 - 100 = -5 → documento di uscita per 5 pezzi ✓
Caso 6 — Versamento in corso (merce spedita a Modula, non ancora collocata)¶
Un versamento di 30 pezzi e' stato comunicato a Modula ma la merce non e' ancora nell'ubicazione.
| Dato | Valore |
|---|---|
| Giacenza contabile | 130 (entrata gia' registrata in contabilita') |
| Qta ubicazioni Modula | 100 (la merce non e' ancora negli scomparti) |
| Prenotata versamento | 30 (in coda di versamento) |
Calcolo DFNM02 (a11): Giacenza = 100 + 30 - 0 = 130 → lnl-qta-inv = 130
Adeguamento: 130 - 130 = 0 → nessun documento ✓
Corretto: la prenotata versamento compensa il fatto che la merce e' contabilizzata ma non ancora fisicamente collocata.
Caso 7 — Merci non omogenee (lotti vs giacenza totale)¶
La somma dei lotti non corrisponde alla giacenza contabile.
| Dato | Valore |
|---|---|
| Giacenza contabile (COGU31) | 100 |
| Lotto A: qta movimenti | 60 |
| Lotto B: qta movimenti | 30 |
| Somma lotti | 90 |
Compensazione COGMA0 (m-elabora-lotti-merce):
- w-qta-tot-lotti = 90
- w-qta-tot-gen = 100 (da COGU31)
- Differenza: 100 - 90 = 10 → crea riga senza lotto (lnl-lotto-prog = 0) con lnl-qta-cal = 10
Questo allinea la somma dei record COGINVLT alla giacenza contabile. Se da Modula arrivano qta diverse, l'adeguamento corregge sia i lotti specifici sia la riga senza lotto.
Caso 8 — BDP provvisorio non ancora inviato a Modula¶
| Dato | Valore |
|---|---|
| Giacenza contabile | 100 |
| Qta ubicazioni Modula | 100 |
BDP aperto, invio-prev = "S", inviato = "N" |
15 pezzi |
DFNM02 (a12): il BDP ha tb2-inviato-modula <> "S" e tb2-invio-modula-prev <> "N" → viene saltato
Calcolo DFNM02: lnl-qta-inv = 100
Adeguamento: 100 - 100 = 0 → nessun documento ✓
Corretto: il BDP provvisorio non inviato non ha impatto ne' su Modula ne' sull'inventario. La giacenza contabile non e' ancora stata intaccata.
Controllo quadratura COGD60¶
COGD60 verifica la coerenza tra i movimenti registrati lato gestionale e quelli comunicati a Modula, per una merce e un intervallo di date.
Logica di calcolo¶
Per ogni riga di movimento Modula (COGMDRIG):
- Legge la testata (
COGMDTES) per ottenere causale, tipo e documento - Calcolo
trs-qta-modula(quantita' lato Modula):
| Tipo operazione | Riga cancellata? | Calcolo |
|---|---|---|
| GI (giacenza iniziale) | - | + qta-evasa (con logica trasferimento: -qta-trasf se tipo "G", +qta-trasf altrimenti) |
| LV (lista versamento) | No | + qta-evasa + qta-trasf |
| LV (lista versamento) | Si | - qta-evasa - qta-trasf |
| LP (lista prelievo) | No | - qta-evasa - qta-trasf |
| LP (lista prelievo) | Si | + qta-evasa + qta-trasf |
- Calcolo
trs-qta-coge(quantita' lato gestionale) —cerca-coge: - Se causale = "BP" → legge
COGRIGBP(righe BDP), sottraerbp-qta -
Altrimenti → legge
COGMOMAG(movimenti magazzino), somma se Entrata, sottrae se Uscita -
Importazioni carico (
tratta-impca): - Scorre
COGIMPCAnell'intervallo date - Esclude tipo "T"
-
Per il documento e per il documento di riferimento: aggiunge o sottrae
mpc-qtadatrs-qta-modula -
Quadratura OK se:
trs-qta-coge = trs-qta-modulaper ciascun documento
Criticita' note¶
Il commento a riga 1262-1264 segnala un'assunzione:
"Devo supporre che non venga mai rimessa indietro la numerazione dei B.d.P e delle P.N. di Magazzino, altrimenti questa parte potrebbe fare del casino"
Se la numerazione dei documenti viene resettata o riutilizzata, COGD60 potrebbe associare movimenti a documenti errati.
Tabelle coinvolte¶
| Tabella | Uso nel flusso |
|---|---|
COGINVLT (lnl-) |
Record inventario per lotto: chiave = data + mag + merce + lotto-prog |
COGMERLT (mlt-) |
Anagrafica lotti merce |
COGMOVLT (mvl-) |
Movimenti lotti (per ricalcolo giacenza) |
COGMERCI (mer-) |
Anagrafica merci (flag mer-modula, mer-lotti) |
COGSLMAG (msal-) |
Saldi di magazzino |
COGMERAP (map-) |
Appoggio merci (raggruppamenti per filtro) |
COGRACMC (rcm-) |
Raccordo codice merce ↔ codice avanzato Modula |
| exp_ubicazioni (SQL) | Vista DB Frontiera: giacenze fisiche per ubicazione/articolo/lotto |
COGTESBP (tbp-) / COGTBPAP (tb2-) |
Testata BDP e appendice (flag invio Modula) |
COGRIGBP (rbp-) |
Righe BDP |
COGMDRIG (mdr-) / COGMDTES (mdt-) |
Righe e testate movimenti Modula |
COGIMPCA (mpc-) |
Importazioni carico Modula |
COGMOMAG (mag-) |
Movimenti magazzino |
| TRAN-S26 | Transito per generazione documento adeguamento (via COGS26) |