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 suCOGANRAG.
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 cuik-inf-tip-alfa/k-inf-tip-numero)coganrag.cpy,utilcogsa1.cpy,utilcrms02.cpyutilncnf.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.cpyin linkage (wcont1.cpyincludeutilgridtoxs.cpyper l'interfaccia GRIDTOXS)
Configurazione (RNEWCONF)¶
Caricate in x99-load-config:
| Chiave | Gruppo | Variabile | Uso |
|---|---|---|---|
delimitatore-colonne-excel |
cogesys |
tm-cfg-delimiter → w-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 diNUMVAL(b12-dato-num).
Flusso -- Import (tm-ope = "I")¶
- Maschera (
a-tm-*): operazione, importa solo esistenti, gruppo sconto (F8 = W81), file, elaborazione di prova. - Preparazione file (
a-richiesta-conferma): copia del file in temp conC$COPY; se estensionexls/xlsxchiamaESTRXLSper convertirlo inimport.txte forza il delimitatore. - Lettura header (
a1-carica-campi→a11-carica-inf): scandisce la prima riga, popolatab-campie verifica i campi obbligatori. - Cancellazione preventiva (
b-cancella-gruppo, solo se non "prova"): scorreCOGSCONTperscc-tip = "G",scc-ana = k-ana-null,scc-gruppo-sconto = tm-gruppoe 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. - Loop righe (
b-10-loop→b1-carica-delimitato): per ogni riga isola le colonne con il delimitatore (gestisce l'apice"), riempietab-dati. - Scrittura (
b3-scrivi-cogscont, solo se non "prova"): - determina il tipo riga:
"R"se e' valorizzatoSCC-RGR-COD, altrimenti"M"se e' valorizzatoSCC-CMAoSCC-GRU; - riga articolo (
b3-risolvi-merce): se c'e'SCC-CMArisolve la merce viaCOGRACMC(rcm-cod-ava→rcm-merce); altrimenti componescc-merceda GRU/SOT/COD e, se completo, verifica suCOGMERCI; - riga famiglia (
b3-risolvi-raggruppamento): impostascc-sel-raggr = "#",scc-rgr-classe(dalla colonna o dal default di config),scc-rgr-cod, e valida l'esistenza suCOGANRAG(arag-tip = "R"); - prezzo vs sconto (mutuamente esclusivi): se
SCC-PRE ≠ 0scrivescc-pre(e segnala se sono valorizzati anche sconti); altrimenti scrivescc-sco-1/scc-sco-2; WRITEsu COGSCONT; se chiave duplicata (w-verbo-invalido)REWRITE.- 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-campicostruisce il tracciato completo con tutti gli IDSCC-*; salta la lettura header e va diretto ac-esporta. c-esporta:- scrive un record di testa con i tipi colonna (
N/S) e uno con gli identificativi (separati da TABx'09'); - scorre
COGSCONTperscc-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, perSCC-CMA, risale al codice avanzato viaCOGRACMCchiave 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.txtin directory temp) tramitex-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 conOPENFILE.- Le
declaratives(impgrsco.decla) gestiscono gli errori I/O sui file COGEXPRT/COGSEQUE/COGRISUL.
Note¶
- Modalita' "prova" (
tm-test): contm-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-CURRENCYe' assente/vuota si usa la divisa di conto (COGU10WGetDivisaConto). - 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