Vai al contenuto

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

  1. Cicla tutte le merci (COGMERCI) con mer-modula = "S"
  2. Per ciascuna merce, elabora i lotti (m-elabora-lotti-merce):
  3. Scorre COGMERLT per magazzino/merce
  4. Per ogni lotto, calcola la quantita' da COGMOVLT sommando i movimenti fino alla data inventario
  5. Scrive il record in COGINVLT (inventario per lotto)
  6. Elimina i lotti con qta-cal = 0 e qta-inv = 0 (se "Solo lotti aperti")
  7. 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:

  1. Query SQL su exp_ubicazioni: legge tutte le ubicazioni con tipo scomparto "FITT" o "MODUL" (la giacenza fisica)
  2. Per ciascuna coppia articolo/lotto, accumula:
  3. w-tot-ubi-qta = quantita' fisica sulle ubicazioni
  4. w-tot-qta-pren-vers = quantita' prenotata in versamento
  5. w-tot-qta-pren-prel = quantita' prenotata in prelievo
  6. 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

  1. Aggiornamento COGINVLT: scrive lnl-qta-inv = w-giacenza per ogni lotto trovato
  2. Secondo ciclo — BDP aperti (paragrafo a12-calcola-bdp-inviati):
  3. Per ogni merce Modula, scorre i BDP aperti (COGRIGBP)
  4. Filtra: BDP aperto, inviato a Modula (tb2-inviato-modula = "S") OPPURE non provvisorio (tb2-invio-modula-prev = "N")
  5. Somma la quantita' BDP alla lnl-qta-inv del 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 = 100lnl-qta-inv = 100 Compensazione COGMA0: qta_lotti (100) = giacenza contabile (100) → nessuna riga senza lotto Adeguamento: lnl-qta-inv (100) - lnl-qta-cal (100) = 0nessun 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 = 80lnl-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 = 95lnl-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 = 130lnl-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):

  1. Legge la testata (COGMDTES) per ottenere causale, tipo e documento
  2. 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
  1. Calcolo trs-qta-coge (quantita' lato gestionale) — cerca-coge:
  2. Se causale = "BP" → legge COGRIGBP (righe BDP), sottrae rbp-qta
  3. Altrimenti → legge COGMOMAG (movimenti magazzino), somma se Entrata, sottrae se Uscita

  4. Importazioni carico (tratta-impca):

  5. Scorre COGIMPCA nell'intervallo date
  6. Esclude tipo "T"
  7. Per il documento e per il documento di riferimento: aggiunge o sottrae mpc-qta da trs-qta-modula

  8. Quadratura OK se: trs-qta-coge = trs-qta-modula per 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)