Vai al contenuto

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)

  1. 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.
  2. Accept parametri: tm-azz-arc, tm-aa-ini, tm-mm-ini, tm-mm-fin.
  3. Validazioni:
  4. tm-aa-ini >= 1988
  5. tm-aa-ini <= tm-aa-ult (anno non oltre ultimo consolidato)
  6. Se tm-aa-ini = tm-aa-ult, tm-mm-ini <= tm-mm-ult
  7. tm-mm-ini e tm-mm-fin in range [1..12]
  8. tm-mm-ini <= tm-mm-fin
  9. 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 (passando parametri: 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 da tm-mm-ini a tm-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 con mag-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): chiamata rot-merce per scrivere il record riepilogativo globale (mag=space) con IR medio e %CPV media.
  • calc-perc-cpv: calcola rtz-per-cpv = (rtz-cpv * 100) / val-tot-cpv(i-mag) usando la tabella interna tab-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-bid per 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 con mag-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 cogr02 per la cancellazione riceve in linkage la struttura parametri (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-cpv si costruisce dinamicamente durante la fase b11: il programma scorre l'array finché trova un'entry con low-value (slot libero) o space (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).