Import/export commesse
Nel modulo "Laboratori odontotecnici" del progetto è presente la possibilità di trasferire commesse di lavorazione tra due ambienti. Questo ha la motivazione di permettere di fare test su nuove procedure in un ambiente e poi trasferire il risultato in quello definitivo. Il processo è gestito dai programmi COGZ66 che innesca COGZ63.
Ora stiamo implementando un processo simile ma architetturalmente migliorato, governato dai programmi COGZ6A che chiama COGZ6B La differenza fondamentale è data dal fatto che il processo di trasferimento può essere distinto in 2 fasi: - Esportazione - Importazione In mezzo a queste due fasi c'è un file XML che contiene tutti i dati in chiaro della commessa in modo che l'utente possa eseguire anche proprie elaborazioni.
La procedura e' stata estesa con: 1) Verifica completezza tabelle rispetto a COGZ63 (completata) 2) Esportazione/importazione di un secondo file XML con le referenze anagrafiche interessate dalle commesse trasferite (Fasi 1-2 completate)
Questo permette di fare in modo che nell'ambiente di destinazione i dati della commessa risultino consistenti (ad esempio potrebbe mancare un materiale o un modello inserito nell'altro ambiente).
Stato implementazione (aggiornamento 12/03/2026)¶
Fase 1 — Completata¶
Tabelle anagrafiche con approccio "record grezzo" (export/import dell'intero record): - COGMERCI — Anagrafica merci - COGGEANA — Clienti/fornitori/medici - COGMERAP — Dati aggiuntivi merci - LODTABEL — Tabelle codici laboratorio - COGTABEL — Tabelle codici generali
Fase 2 — Completata¶
Tabelle anagrafiche con approccio "tgg-idx" (export/import campo per campo): - LODAZION — Azioni di piano (chiave: azione x(08)) - LODMODEL — Modelli tecnici (chiave composita: mdl-tip+mdl-mod+mdl-pag+mdl-inf+mdl-prog) - COGLISNW — Corpo listino di vendita (chiave: lnw-merce+lnw-tip-lis+lnw-rif+lnw-fascia+lnw-data)
Per LODMODEL e' stato implementato un meccanismo di esportazione filtrata: vengono esportati solo i record i cui mdl-mod corrispondono ai codici modello accumulati durante la scansione delle prescrizioni (LODPRESC.lpm-mod). Questo evita di esportare l'intero archivio modelli.
Per COGLISNW viene usata la stessa logica di filtro: vengono esportati solo i record il cui codice merce (lnw-gru+lnw-sot+lnw-cod) corrisponde alle merci accumulate durante l'export delle commesse (accumulatore w-acc-merci). La tabella COGLISML (corpo listino multi-livello) non viene esportata perche' viene rigenerata automaticamente dal trigger COGS0C, invocato ad ogni write/rewrite/delete su COGLISNW.
Fase 2B — Completata¶
Scontistica cliente con approccio "record grezzo": - COGSCONT — Sconti generalizzati cliente (filtrati per scc-tip="A", accumulatore w-acc-anagr) - COGGRSCT — Testata gruppi sconto (filtrati per gst-tip="C", accumulatore w-acc-anagr)
Per COGSCONT vengono esportati solo gli sconti di tipo "A" (sconto su anagrafica) i cui riferimenti anagrafici corrispondono ai clienti accumulati. Per COGGRSCT vengono esportate le testate dei gruppi sconto di tipo "C" (gruppo sconto cliente) associate ai clienti accumulati.
Fase 3 — Da fare¶
Tabelle secondarie: LODMACCH, LODCONTR, LODISTRU, LODTABDU, LODAZOPE, LODMODST
Piano di implementazione (analisi del 23/02/2026)¶
Punto 1: Confronto COGZ63 vs COGZ6B¶
Risultato: COGZ6B copre tutte le tabelle transazionali di COGZ63. Le uniche tabelle "mancanti" (COGTABEL, COGMERCI, COGGEANA) in COGZ63 erano usate solo in lettura per configurazione, non come dati trasferiti. Nessuna modifica necessaria.
Punto 2: Export/Import anagrafiche¶
Architettura¶
Si estende COGZ6B con due nuove operazioni: - "EA" — Export Anagrafiche: genera un secondo file XML con le referenze raccolte - "IA" — Import Anagrafiche: legge il file XML anagrafiche e inserisce/aggiorna i record
Il file anagrafiche ha nome derivato automaticamente: se il file commesse è cogz6b-xxx.xml, il file anagrafiche sarà cogz6b-xxx-anagr.xml.
Flusso Export (modifiche a COGZ6A)¶
1. CALL COGZ6B "EP" → Prepara export commesse + inizializza accumulatori
2. FOR EACH commessa:
CALL COGZ6B "E" → Export commessa + accumula referenze anagrafiche
3. CALL COGZ6B "EE" → Finalizza XML commesse
4. CALL COGZ6B "EA" → Genera XML anagrafiche dagli accumulatori ← NUOVO
5. Copia entrambi i file in locale ← MODIFICA
Flusso Import (modifiche a COGZ6A)¶
1. Copia entrambi i file da locale a server ← MODIFICA
2. CALL COGZ6B "IA" → Import anagrafiche (PRIMA delle commesse) ← NUOVO
3. CALL COGZ6B "I" → Import commesse (invariato)
4. Pulizia
Tabelle anagrafiche da gestire¶
Fase 1 — Critiche (senza queste le commesse sono inconsistenti):
| Tabella | Descrizione | Referenziata da | Chiave | Già nel SELECT |
|---|---|---|---|---|
| COGMERCI | Anagrafica merci | LODPNMAT.lmt-merce, LODCMART.lca-articolo, LODCMMTA | mer-gru+mer-sot+mer-cod | Sì |
| COGGEANA | Clienti/fornitori/medici | LODCMTES.lct-med, LODPNMAT.lmt-for, LODSUBFR | ana-tipo+ana-cod | Sì |
| COGMERAP | Dati aggiuntivi merci | Complemento COGMERCI | mer-chia+mea-tipo | Sì |
| LODTABEL | Tabelle codici laboratorio (tipo 02=operatori, 08=dispositivi, 11=reparti) | LODCMTES.lct-resp, LODCMRIG.lcr-ope, LODCMDET.lcd-ope | lot-tipo+lot-cod | Sì |
| COGTABEL | Tabelle codici generali | Vari campi di configurazione | euta-tipo+euta-cod | Sì |
Fase 2 — Importanti (completano il quadro):
| Tabella | Descrizione | Referenziata da | Già nel SELECT |
|---|---|---|---|
| LODAZION | Azioni di piano | LODCMRIG.lcr-azione, LODPNRIG.lpr-azione | No → aggiungere |
| LODMODEL | Modelli tecnici | LODPROGE | No → aggiungere |
| COGLISNW | Corpo listino di vendita | Prezzi delle merci | Sì (aggiunto) |
| LODASSIS | Operatori/assistenti | Vari | No → aggiungere |
Fase 2B — Scontistica cliente:
| Tabella | Descrizione | Referenziata da | Già nel SELECT |
|---|---|---|---|
| COGSCONT | Sconti generalizzati | Condizioni sconto cliente | Sì (aggiunto) |
| COGGRSCT | Testata gruppi sconto | Gruppi sconto cliente | Da aggiungere |
Fase 3 — Secondarie (da valutare): LODMACCH, LODCONTR, LODISTRU, LODTABDU, LODAZOPE, LODMODST
Meccanismo di raccolta referenze¶
Durante l'export di ogni commessa (operazione "E"), si accumulano i codici univoci in tabelle working-storage. Le procedure di accumulo (ea-acc-merce, ea-acc-anagrafica, ecc.) cercano il codice nella tabella, se non presente lo aggiungono. Vengono richiamate durante l'export delle tabelle transazionali (LODPNMAT→merce+fornitore, LODCMTES→medico+responsabile, LODCMRIG→azione+operatore, ecc.).
Struttura del file XML anagrafiche¶
<?xml version="1.0" encoding="utf-8"?>
<set_anagrafiche>
<table>
<table_name>cogmerci</table_name>
<record>
<record_number>1</record_number>
<MER-GRU>01</MER-GRU>
<MER-SOT>02</MER-SOT>
<MER-COD>00001</MER-COD>
<MER-DESCR>Porcellana dentale tipo A</MER-DESCR>
...
</record>
</table>
<table>
<table_name>coggeana</table_name>
...
</table>
</set_anagrafiche>
Stessa struttura del file commesse ma senza il livello <commessa>. Tag radice: <set_anagrafiche>.
Comportamento in importazione¶
Per ogni record anagrafico nel file XML: 1. Leggi la chiave del record 2. Cerca il record nell'archivio di destinazione 3. Se non esiste → inserisci (write) 4. Se esiste → aggiorna (rewrite)
Viene prodotto un log con il conteggio: N inseriti, N aggiornati, N errori.
Modifiche ai file¶
/programmi/eurocoge/cbl/cogz6b.cbl — Modifiche principali:
- Working-storage: tabelle di accumulo referenze
- Evaluate principale (riga 610): aggiungere casi "EA" e "IA"
- Procedure accumulo: ea-acc-merce, ea-acc-anagrafica, ea-acc-lodtab
- Durante export tabelle transazionali: chiamate accumulo dopo lettura record
- Nuova sezione ea-esporta-anagrafiche: loop sugli accumulatori, leggi anagrafica, scrivi XML
- Nuova sezione ia-importa-anagrafiche: parsing XML, per ogni record read→write/rewrite
/programmi/eurocoge/cbl/cogz6a.cbl — Modifiche:
- Working-storage: variabile nome file anagrafiche
- Flusso export: aggiungere chiamata "EA" dopo "EE", copia secondo file
- Flusso import: aggiungere chiamata "IA" prima di "I", copia secondo file
/programmi/eurocoge/cbl/screens/cogz6b.select — Aggiungere:
- Fase 2: copy "lodazion.fd"., copy "lodmodel.fd"., copy "lodassis.fd".
- Fase 2B: copy "coglisnw.fd". (aggiunto), copy "cogscont.fd". (aggiunto), copy "coggrsct.fd". (DA AGGIUNGERE)
/programmi/eurocoge/cpy/ — Nuove copybook util-wrk da creare (MANUALMENTE):
- cogmerci-util-wrk.cpy (basata su cogmerci.cpy)
- coggeana-util-wrk.cpy (basata su coggeana.cpy)
- cogmerap-util-wrk.cpy (basata su cogmerap.cpy)
- lodtabel-util-wrk.cpy (basata su lodtabel.cpy)
- cogtabel-util-wrk.cpy (basata su cogtabel.cpy)
- Fase 2: lodazion-util-wrk.cpy, lodmodel-util-wrk.cpy, lodassis-util-wrk.cpy
Fasi di lavoro¶
- ~~Fase 1A: Creare le copybook util-wrk~~ — COMPLETATA
- ~~Fase 1B: Aggiungere accumulatori e procedure di raccolta in COGZ6B~~ — COMPLETATA
- ~~Fase 1C: Modificare l'export delle tabelle transazionali per raccogliere le referenze~~ — COMPLETATA
- ~~Fase 1D: Implementare operazione "EA" (export anagrafiche)~~ — COMPLETATA
- ~~Fase 1E: Implementare operazione "IA" (import anagrafiche)~~ — COMPLETATA
- Fase 1F: Modificare COGZ6A per orchestrare le nuove chiamate e la gestione file — DA FARE
- ~~Fase 2: Aggiungere LODAZION, LODMODEL, COGLISNW~~ — COMPLETATA (LODASSIS posticipata a Fase 3)
- ~~Fase 2B: Aggiungere COGSCONT, COGGRSCT~~ — COMPLETATA
- Fase 3: Aggiungere tabelle secondarie — DA FARE
Dettagli implementazione Fasi 1-2¶
Accumulatori (working-storage)¶
| Tabella | Costante max | Staging area | Tabella accumulo | Campo chiave |
|---|---|---|---|---|
| COGMERCI | k-acc-max-merci (200) | ea-stg-merce (gru+sot+cod) | w-acc-merci | mer-gru+mer-sot+mer-cod |
| COGGEANA | k-acc-max-anagr (200) | ea-stg-anagr (tipo+cod) | w-acc-anagr | ana-tipo+ana-cod |
| LODTABEL | k-acc-max-lodtab (200) | ea-stg-lodtab (tipo+cod) | w-acc-lodtab | lot-tipo+lot-cod |
| COGTABEL | k-acc-max-cogtab (200) | ea-stg-cogtab (tipo+cod) | w-acc-cogtab | euta-tipo+euta-cod |
| LODAZION | k-acc-max-lodazion (200) | ea-stg-lodazion (cod) | w-acc-lodazion | laz-cod x(08) |
| LODMODEL | k-acc-max-lodmodel (50) | ea-stg-lodmodel (cod) | w-acc-lodmodel | mdl-mod x(02) |
| COGLISNW | — (usa w-acc-merci) | — | — | lnw-gru+lnw-sot+lnw-cod |
| COGSCONT | — (usa w-acc-anagr) | — | — | scc-ana-tip+scc-ana-cod |
| COGGRSCT | — (usa w-acc-anagr) | — | — | gst-cod (chiave anagr.) |
Flag di overflow: w-acc-ovf-* (una segnalazione per tabella, evita messaggi ripetuti).
Punti di accumulo nelle sezioni di export commessa¶
I perform ea-acc-* sono inseriti nelle 9 sezioni di export delle tabelle transazionali:
| Sezione export | Accumula |
|---|---|
| LODPRESC (c-lodcmpra) | merce, lodazion, lodmodel (da lpm-mod) |
| LODCMTES (c-lodcmmta) | anagrafica (medico, responsabile) |
| LODCMRIG (c-lodcmctr) | lodazion, lodtab (operatore) |
| LODSUBFR (c-lodinfcc) | anagrafica (subfornitore) |
| LODCMDET (c-lodgirdt) | lodtab (operatore) |
| LODCMART (c-lodimpdt) | merce (articolo), cogtab |
| LODPNRIG (c-lodprris) | lodazion, lodtab (operatore) |
| LODPNMAT (c-lodpnprt) | merce, anagrafica (fornitore), cogtab |
| LODCMMTA (c-lodcmmor) | — (nessun accumulo specifico) |
Export anagrafiche (operazione "EA")¶
Paragrafi principali:
- ea-esporta-anagrafiche: apre XML anagrafiche, chiama le 7 sezioni di export, chiude XML
- ea-acc-merce, ea-acc-anagrafica, ea-acc-lodtab, ea-acc-cogtab, ea-acc-lodazion, ea-acc-lodmodel: procedure di accumulo (cerca duplicato, se non presente aggiunge)
- ea-exp-record-grezzo-merci, ea-exp-record-grezzo-geana, ea-exp-record-grezzo-merap, ea-exp-record-grezzo-cogtab, ea-exp-record-grezzo-lodtab: export record grezzo per Fase 1
- ea-exp-record-grezzo-cogscont, ea-exp-record-grezzo-coggrsct: export record grezzo per Fase 2B (scontistica)
Per LODAZION, LODMODEL e COGLISNW: export campo per campo usando le copybook *-util-prc.cpy (approccio tgg-idx).
Per LODMODEL: scansione sequenziale di tutti i record (rdnxt-lodmodel), filtro con flag e-commessa-ok verificando che mdl-mod corrisponda a uno dei codici accumulati.
Import anagrafiche (operazione "IA")¶
Paragrafi principali:
- ia-importa-anagrafiche: parsing XML, dispatch per tabella
- ia-parse-file-anagr: apre e parsa il file XML anagrafiche
- ia-importa-record-grezzo: dispatch evaluate su table_name (include cogscont, coggrsct)
- ia-importa-record-tgg: dispatch evaluate per tabelle tgg-idx (LODAZION, LODMODEL, COGLISNW)
- ia-imp-cogmerci, ia-imp-coggeana, ia-imp-cogmerap, ia-imp-cogtabel, ia-imp-lodtabel: import record grezzo
- ia-imp-cogscont, ia-imp-coggrsct: import record grezzo (scontistica)
- ia-imp-lodazion, ia-imp-lodmodel, ia-imp-coglisnw: import campo per campo (tgg-idx)
Logica di import: salva record importato → read per chiave → se esiste: rewrite; se non esiste: write. Log con conteggio inseriti/aggiornati/errori.
Verifica¶
- [x] Compilazione senza errori
- [ ] Esportare una commessa con materiali, medico e operatori dall'ambiente A
- [ ] Verificare che il file XML anagrafiche contenga i record referenziati senza duplicati
- [ ] Importare in un ambiente B vuoto: verificare che le anagrafiche vengano inserite
- [ ] Importare di nuovo: verificare che vengano aggiornate (rewrite) senza errori
- [ ] Importare poi le commesse: verificare che siano consistenti (nessun riferimento orfano)
- [ ] Esportare piu' commesse con referenze comuni: verificare consolidamento (no duplicati)
- [ ] Verificare backward compatibility: import/export senza file anagrafiche deve continuare a funzionare
Note tecniche¶
- Le copybook
.k01-agg(contenenti i paragrafi wr-/rwr-) sono incluse automaticamente dal generatore di Screens. Non vanno aggiunte manualmente nel sorgente. - LODAZION.k01 non ha paragrafi wr-/rwr-: sono stati aggiunti inline in cogz6b.cbl
- Il file sorgente deve essere in codifica Latin-1/CP437 (single-byte). I caratteri accentati nelle stringhe eseguibili vanno sostituiti con apostrofo (es.
gia'al posto digia+accento). - COGLISML non va esportata: viene rigenerata automaticamente dal trigger COGS0C, invocato ad ogni write/rewrite/delete su COGLISNW (vedi
coglisnw.k01-agg). - COGLISNW, COGSCONT e COGGRSCT non richiedono nuovi accumulatori: riutilizzano gli accumulatori esistenti w-acc-merci (per COGLISNW) e w-acc-anagr (per COGSCONT e COGGRSCT).
- COGGRSCT: va ancora aggiunto in
cbl/screens/cogz6b.selecttramite il tool Screens (copy "coggrsct.fd".) e rigenerato.