COGK52 - Calcolo Indici di Rotazione del Magazzino¶
Descrizione¶
Calcola gli indici di rotazione (IR) e l'incidenza percentuale del costo del prodotto venduto (%CPV) per ogni articolo/magazzino, su un intervallo di mesi di un anno. I dati di input provengono da COGMEMOR (movimenti memorizzati per anno/merce/magazzino); i risultati vengono scritti su COGROTAZ.
Il programma fu scritto originariamente in RM-COBOL e convertito in AcuCOBOL.
Tabelle utilizzate¶
| Tabella | Accesso | Descrizione |
|---|---|---|
| COGMEMOR | Read sequential (chiave 2: anno+merce+magazzino) | Movimenti memorizzati per anno — sorgente dati per calcolo |
| COGROTAZ | Write/Rewrite (chiavi 1, 4) | Risultati indici di rotazione — destinazione elaborazione |
| COGTABEL (tipo 57, codr 1) | Read | Data ultimo consolidamento (euta-dc-aa-acc, euta-dc-mm-acc) |
| FEURTAB | Read | Tabella file di sistema |
Algoritmo di calcolo¶
Per ogni record COGMEMOR (identificato da anno + merce + magazzino), nell'intervallo di mesi [tm-mm-ini .. tm-mm-fin]:
tot-val-acq = somma mav-val-acq(mese) per mese da tm-mm-ini a tm-mm-fin
tot-qta-acq = somma mav-qta-acq(mese)
tot-qta-gia = somma mav-qta-gia(mese) (giacenza cumulata)
tot-qta-ven = somma mav-qta-ven(mese)
PMA = tot-val-acq / tot-qta-acq (prezzo medio acquisto, arrotondato via COGU10W)
G = tot-qta-gia / numero_mesi (giacenza media)
CPV = PMA * tot-qta-ven (costo prodotto venduto)
IR = (tot-qta-ven / G) * (12 / numero_mesi) (indice di rotazione annualizzato)
GV = PMA * G (giacenza media valorizzata)
Se tot-qta-acq = 0 allora PMA = 0.
Se G = 0 allora IR = 0.
Flusso di elaborazione¶
Inizializzazione (apri / a4)¶
- Lettura data ultimo consolidamento da COGTABEL tipo 57 codr 1 (
euta-dc-aa-acc,euta-dc-mm-acc) — mostrata a video come limite massimo del periodo. - Accept parametri:
tm-azz-arc,tm-aa-ini,tm-mm-ini,tm-mm-fin. - Validazioni:
tm-aa-ini >= 1988tm-aa-ini <= tm-aa-ult(anno non oltre ultimo consolidato)- Se
tm-aa-ini = tm-aa-ult,tm-mm-ini <= tm-mm-ult tm-mm-inietm-mm-finin range [1..12]tm-mm-ini <= tm-mm-fin- Se
tm-azz-arc = "S": apre COGROTAZ in OUTPUT (truncate) poi riapre in I-O.
Verifica duplicato (esisto)¶
- Tentativo di READ diretto su COGROTAZ con chiave
rtz-anno1 + rtz-per-ini1 + rtz-per-fin1. - Se già esistente: messaggio di avviso, richiesta conferma sovrascrittura.
- In caso di sovrascrittura: chiamata a
cogr02(passandoparametri: anno, da, a) per cancellazione dei record esistenti; poi riapertura COGROTAZ.
Creazione record di riferimento (b6tris)¶
- Scrittura record "testa" su COGROTAZ con mag=space e merce=low-value per marcare l'elaborazione.
Fase calcolo per merce/magazzino (b7 / b8 / b9 / b10 / b11)¶
- Start notmin su COGMEMOR chiave 2 (
mav-anno2 = tm-aa-ini,mav-merce2 = low-value,mav-mag2 = low-value). - Per ogni record COGMEMOR con
mav-anno2 = tm-aa-ini: - Loop
b9: accumulo totali per i mesi datm-mm-iniatm-mm-fin. - Conversione valuta tramite COGU10W se
mav-currency <> w-currency-conto. - Calcolo PMA, G, CPV, IR, GV (
b10). - Scrittura record su COGROTAZ con tutte le chiavi (mag1..mag5, merce1..merce2, anno1..anno3, per-ini1..3, per-fin1..3) —
b11. - Accumulo CPV nella tabella interna
tab-tot-cpv(max 200 entry): entry "space" = totale generale, entry conmag-tot-cpv = rtz-mag1= totale per magazzino specifico.
Fase calcolo %CPV e riepilogo per merce (c10 / c20)¶
- Start notmin su COGROTAZ chiave 4 (
rtz-anno1 + rtz-per-ini1 + rtz-per-fin1). - Per ogni record (salto record con mag=space o merce vuota):
- A rottura di merce (
rtz-merce1 <> mem-merce): chiamatarot-merceper scrivere il record riepilogativo globale (mag=space) con IR medio e %CPV media. calc-perc-cpv: calcolartz-per-cpv = (rtz-cpv * 100) / val-tot-cpv(i-mag)usando la tabella internatab-tot-cpv.- Rewrite del record COGROTAZ con %CPV aggiornata.
- Accumulo
wgm(giacenza media),wqv(quantità venduta),wnmag(numero magazzini),wcpv(CPV totale) per il riepilogo globale della merce.
Paragrafo rot-merce¶
- Scrive record di riepilogo su COGROTAZ (via
wr-bogrotaz/rwr-bogrotaz) con: - mag1..mag5 = space (indica record aggregato tutti i magazzini)
- IR medio =
(wqv/wnmag) / (wgm/wnmag) * 12 / numero_mesi - CPV totale =
wcpv calc-perc-cpv-bidper la %CPV del record aggregato.
Note implementative¶
- La tabella interna
tab-tot-cpv(max 200 entry,ele-tot-cpv occurs 200) tiene traccia del CPV totale per magazzino: entry conmag-tot-cpv = space= totale generale, le altre con il codice magazzino. Se si supera il limite di 200, il programma mostra un avviso e interrompe. - I record COGMEMOR contengono array di valori mensili (
mav-val-acq(mese),mav-qta-acq(mese), ecc.) indicizzati per numero di mese (1..12). - La chiamata
cogr02per la cancellazione riceve in linkage la strutturaparametri(anno, da-mese, a-mese). - L'arrotondamento del PMA usa COGU10W con ope=k-u10-arrotonda, tipo-dato="A" (importo), divisa = w-currency-conto.
- Le chiavi di COGROTAZ sono multiple e ridondanti (mag1..5, merce1..2, anno1..3, per-ini1..3, per-fin1..3) per supportare diversi accessi; il programma usa la chiave 1 per la scrittura iniziale e la chiave 4 (solo anno+periodo, senza merce né magazzino) per la scansione della fase %CPV.
- Il progressivo dei magazzini nell'array
tab-tot-cpvsi costruisce dinamicamente durante la fase b11: il programma scorre l'array finché trova un'entry conlow-value(slot libero) ospace(totale generale) o il codice del magazzino corrente. - La variabile
alfaè usata come flag "prima merce incontrata" nella fase c20 (0=non inizializzato, 9=inizializzato).