Vai al contenuto

IMPGRSCO -- Import/Export Gruppi Sconto (raggruppamenti gerarchici)

Sorgente: cbl/impgrsco.cbl | Tipo: Sottoprogramma GUI (import/export batch) | Program-ID: IMPGRSCO

Sottoprogramma (non a menu, assente da prog.txt): riceve solo stringhe in linkage (procedure division using stringhe) ed e' pensato per essere richiamato via CALL. Alla data della stesura non risultano chiamanti in cbl/ (presenti solo gli artefatti dello Screen Designer cbl/screens/impgrsco.*): e' quindi un modulo nuovo, evoluzione di COGD32, non ancora agganciato a un menu o a un chiamante.


Scopo

Import ed export dei gruppi sconto (tabella COGSCONT, testata scc-tip = "G") da/verso un file esterno CSV delimitato o Excel (XLS/XLSX). Rispetto a COGD32 -- che fa solo import ed e' a colonne posizionali fisse -- IMPGRSCO:

  • gestisce entrambe le direzioni (tm-ope = "I" import / "E" export);
  • usa un file a colonne intestate (la prima riga contiene gli identificativi di campo SCC-...), quindi il tracciato non e' fisso ma guidato dall'header;
  • oltre alle righe sconto per articolo/merce gestisce anche le righe per raggruppamento gerarchico (famiglia di sconto, scc-sel-raggr = "#"), validate su COGANRAG.

E' quindi la versione "import/export completo" dei gruppi sconto discussa nel progetto COGD32/COGD78 ("Gruppi Sconto Fornitore su Excel").


File e tabelle principali

File/Tabella Copybook Uso
COGSCONT cogscont.cpy, .fd, .k01, .k02, .k03 I-O -- Sconti generalizzati; testata gruppo scc-tip = "G". Sia letto (export/cancellazione) sia scritto/riscritto (import)
COGANRAG coganrag.cpy (con replacing leading "arag-" by "oldg-" per l'header, ma usato come arag-) Input -- Raggruppamenti gerarchici; valida i codici famiglia di sconto (arag-tip = "R")
COGRACMC cogracmc.cpy, cogracmc.k02 Input -- Raccordo codice merce avanzato (CMA) ↔ merce interna; usato per risolvere/riscrivere il codice merce avanzato
COGMERCI (gestore tabella) Input -- Verifica esistenza merce quando il codice merce interno e' completo
FEURTAB cogfiles.cpy Input -- Tabella path/nomi file di sistema
COGSEQUE (inline, seq-rec pic x(8000)) Input -- File sequenziale di lavoro (copia del file da importare, gia' convertito in testo)
COGEXPRT (inline, exp-rec OCCURS DEPENDING c-pnt) Output -- File di esportazione a lunghezza variabile
COGRISUL (inline, ris-rec OCCURS DEPENDING ris-rec-len) Output -- File segnalazioni/scarti (impgrsco.txt in temp)

Programmi chiamati (CALL)

Programma Scopo
COGU10W GetDivisaConto -- divisa di conto per la data (default scc-currency)
RNEWCONF Carica le tre configurazioni (delimitatore, upper, classe raggr.)
ESTRXLS Conversione file Excel (XLS/XLSX) in testo CSV; forza il delimitatore
GRIDTOXS In export, apre il file .txt prodotto (GRIDTOXS-CALLED / apri-file)
OPENFILE Apre il file segnalazioni nel viewer di sistema
C$OPENSAVEBOX Dialog di selezione file (F7 "Trova file")
C$COPY Copia del file sorgente in temp (supporto thin client)
W81 (sendw81.cpy) Ricerca/selezione del gruppo sconto (F8 sul campo gruppo)

Copybook principali

  • impgrsco.select / .fd / .wrk / .prc / .decla / impgrsco-01.scr -- definizioni generate da Screens (file, working, procedure I/O, declaratives, screen)
  • k-personal.cpy, k-tipi-cogtabel.cpy, costanti-clipot.cpy -- costanti (fra cui k-inf-tip-alfa/k-inf-tip-numero)
  • coganrag.cpy, utilcogsa1.cpy, utilcrms02.cpy
  • utilncnf.cpy (RNEWCONF), utilestrxls.cpy (ESTRXLS), utilopenfile.cpy (OPENFILE), utilu10.cpy (COGU10W), utilw81.cpy / sendw81.cpy (W81)
  • opensave.def (C$OPENSAVEBOX), cogazien.cpy, mmmask.cpy (programma GUI standalone: z-99-init-program/z-99-exit-program)
  • wcont.cpy / wcont1.cpy in linkage (wcont1.cpy include utilgridtoxs.cpy per l'interfaccia GRIDTOXS)

Configurazione (RNEWCONF)

Caricate in x99-load-config:

Chiave Gruppo Variabile Uso
delimitatore-colonne-excel cogesys tm-cfg-delimiterw-delimiter Carattere separatore colonne
ricerca-upper ricegenera tm-cfg-upper Flag ricerca in maiuscolo
classe-raggr-sconti listvend tm-cfg-classe-raggr-sconti Classe di raggruppamento di default per le righe famiglia di sconto

Identificativi di colonna (header del file)

Il primo record del file (import) o i primi due record (export) contengono gli identificativi di campo. Ogni identificativo mappa un campo COGSCONT:

ID colonna Campo COGSCONT Tipo Note
SCC-GRU scc-mer-gru alfa Gruppo merceologico (riga articolo)
SCC-SOT scc-mer-sot alfa Sottogruppo merce
SCC-COD scc-mer-cod alfa→num Codice merce (NUMVAL)
SCC-CMA (via rcm-cod-ava / COGRACMC) alfa Codice merce avanzato; in import risolto in scc-merce
SCC-RGR-CLASSE scc-rgr-classe alfa Classe raggruppamento (riga famiglia)
SCC-RGR-COD scc-rgr-cod alfa Codice famiglia di sconto (riga famiglia)
SCC-PRE scc-pre numerico Prezzo particolare
SCC-SCO1 scc-sco-1 numerico Sconto 1
SCC-SCO2 scc-sco-2 numerico Sconto 2
SCC-CURRENCY scc-currency alfa Divisa

Campi obbligatori (import). Deve essere presente almeno un identificatore di riga -- SCC-GRU oppure SCC-CMA oppure SCC-RGR-COD -- e almeno una colonna condizione -- SCC-PRE oppure SCC-SCO1 oppure SCC-SCO2 (controllo in a1-carica-campi; in mancanza scrive errore in COGRISUL e blocca).

La tabella tab-campi mantiene per ogni colonna: intestazione (tc-inf), tipo dato (tc-inf-tip) e l'indice della colonna per ciascun identificativo noto (tc-id-scc-...). La tabella tab-dati (td-dato / td-dato-num / td-azzera) contiene i valori della riga corrente.

Convenzioni sui valori di cella (import)

  • #@# (k-campo-svuotato) → forza l'azzeramento del campo (td-azzera = "S").
  • prefisso '!' → rimosso dal valore (marcatore per forzare il testo).
  • valori numerici: . e : convertiti in , prima di NUMVAL (b12-dato-num).

Flusso -- Import (tm-ope = "I")

  1. Maschera (a-tm-*): operazione, importa solo esistenti, gruppo sconto (F8 = W81), file, elaborazione di prova.
  2. Preparazione file (a-richiesta-conferma): copia del file in temp con C$COPY; se estensione xls/xlsx chiama ESTRXLS per convertirlo in import.txt e forza il delimitatore.
  3. Lettura header (a1-carica-campia11-carica-inf): scandisce la prima riga, popola tab-campi e verifica i campi obbligatori.
  4. Cancellazione preventiva (b-cancella-gruppo, solo se non "prova"): scorre COGSCONT per scc-tip = "G", scc-ana = k-ana-null, scc-gruppo-sconto = tm-gruppo e cancella (del-cogscont) le righe con merce valorizzata (salta il record "ancora", scc-merce = k-merce-null). Semantica replace: il gruppo viene ricostruito da zero.
  5. Loop righe (b-10-loopb1-carica-delimitato): per ogni riga isola le colonne con il delimitatore (gestisce l'apice "), riempie tab-dati.
  6. Scrittura (b3-scrivi-cogscont, solo se non "prova"):
  7. determina il tipo riga: "R" se e' valorizzato SCC-RGR-COD, altrimenti "M" se e' valorizzato SCC-CMA o SCC-GRU;
  8. riga articolo (b3-risolvi-merce): se c'e' SCC-CMA risolve la merce via COGRACMC (rcm-cod-avarcm-merce); altrimenti compone scc-merce da GRU/SOT/COD e, se completo, verifica su COGMERCI;
  9. riga famiglia (b3-risolvi-raggruppamento): imposta scc-sel-raggr = "#", scc-rgr-classe (dalla colonna o dal default di config), scc-rgr-cod, e valida l'esistenza su COGANRAG (arag-tip = "R");
  10. prezzo vs sconto (mutuamente esclusivi): se SCC-PRE ≠ 0 scrive scc-pre (e segnala se sono valorizzati anche sconti); altrimenti scrive scc-sco-1/scc-sco-2;
  11. WRITE su COGSCONT; se chiave duplicata (w-verbo-invalido) REWRITE.
  12. Contatori: righe lette (tm-r-l), valide (tm-r-v), aggiornate (tm-a-i), mostrati in maschera. Interruzione con ESC (conferma).

Flusso -- Export (tm-ope = "E")

  • Con tm-esp-tutto = "S" (esporta tutte le colonne): a2-carica-campi costruisce il tracciato completo con tutti gli ID SCC-*; salta la lettura header e va diretto a c-esporta.
  • c-esporta:
  • scrive un record di testa con i tipi colonna (N/S) e uno con gli identificativi (separati da TAB x'09');
  • scorre COGSCONT per scc-tip = "G", scc-ana = k-ana-null, scc-gruppo-sconto = tm-gruppo; salta il record "ancora" (scc-merce = k-merce-null) e i cancellati logici (scc-val = "C");
  • per ogni riga compila le colonne in base a scc-sel-raggr: se ≠ "#" esporta merce (GRU/SOT/COD e, per SCC-CMA, risale al codice avanzato via COGRACMC chiave 2); se = "#" esporta classe/codice raggruppamento. Prezzi/sconti editati con virgola decimale (w-num-ed);
  • chiude e apre il file con GRIDTOXS (apri-file).

Gestione errori

  • Le segnalazioni (bloccanti e warning) sono scritte su COGRISUL (impgrsco.txt in directory temp) tramite x-aggiungi-errore / x-scrivi-ris-rec / b11-aggiungi-errore-riga / b31-aggiungi-errore-rif; ogni segnalazione riporta riga/colonna/record.
  • tm-errori = "S" a fine elaborazione (a-fine) propone di aprire il file segnalazioni con OPENFILE.
  • Le declaratives (impgrsco.decla) gestiscono gli errori I/O sui file COGEXPRT/COGSEQUE/COGRISUL.

Note

  • Modalita' "prova" (tm-test): con tm-test ≠ "N" il programma legge/valida ma non cancella ne' scrive su COGSCONT -- utile per il collaudo del file prima dell'import reale.
  • Merce vs raggruppamento: la stessa testata gruppo scc-tip = "G" ospita sia righe merce (scc-merce) sia righe famiglia di sconto (scc-dettaglio-raggr / scc-sel-raggr = "#"); IMPGRSCO gestisce entrambe, cosa che COGD32 (solo merce) non fa.
  • Prezzo e sconto insieme: se una riga ha sia prezzo sia sconti, vince il prezzo e viene emesso un warning non bloccante.
  • Divisa: se la colonna SCC-CURRENCY e' assente/vuota si usa la divisa di conto (COGU10W GetDivisaConto).
  • Dimensioni: record file fino a 8000 byte (k-len-record), max 300 colonne (k-max-campi), record segnalazioni fino a 256 byte (k-len-ris-rec).
  • Relazione con COGD78: COGD78 e' a menu come "Gruppi Sconto Fornitore su Excel" (Contabilita' > Archivi & Tabelle > Varie); IMPGRSCO copre il caso piu' generale import+export dei gruppi sconto con tracciato a colonne intestate.

Documentazione tecnica -- 2026-07-11