COGR06 - Ricostruzione ricerca: Descrizione Merce¶
Sorgente: cbl/cogr06.cbl | Tipo: Programma di menu / utility batch | Program-ID: COGR06
Menu: Sistema > Archivi > Ricostruzioni > Ricerche [Descrizione Merce]
Scopo¶
COGR06 ricostruisce da zero l'indice invertito di ricerca per descrizione merce COGSTDME. Per ogni merce dell'anagrafica scompone la descrizione (mer-descr) in singole parole e, per ciascuna parola, memorizza un riferimento compatto (il numero interno ram-nume letto da COGRACME) nella lista dei codici merce associati a quella parola. E' l'indice che consente la ricerca "per parola" della descrizione merce (ogni parola punta all'elenco delle merci che la contengono).
Se abilitata la relativa opzione di configurazione, COGR06 ricostruisce contestualmente anche l'indice delle descrizioni aggiuntive merce COGSTDAM, scandendo le righe descrittive in COGDESAG e delegando la scrittura alla subroutine COGS37B.
Il programma svuota fisicamente COGSTDME (e, se abilitato, COGSTDAM) e li riscrive scandendo tutta l'anagrafica COGMERCI.
File e tabelle principali¶
| File/Tabella | Copybook (record) | Uso |
|---|---|---|
| COGMERCI | cogmerci.cpy (mer-rec) |
Anagrafica merce: sorgente scandita in sequenza; da ogni record si prende mer-descr (descrizione, X(36)) |
| COGRACME | cogracme.cpy (ram-rec) |
Raccordo merce/numero: si legge per ottenere ram-nume (numero interno della merce da indicizzare) |
| COGSTDME | cogstdme.cpy (stdm-rec) |
Indice ricostruito: parola -> lista di numeri merce. Svuotato e riscritto |
| COGSTDAM | cogstdam.cpy (stdam-rec) |
Indice descrizioni aggiuntive merce: svuotato e ricostruito solo se euta-c008-dam = S (via COGS37B) |
| COGDESAG | cogdesag.cpy (dag-rec) |
Righe descrittive aggiuntive: scandite per tipo M (Merce) per alimentare COGSTDAM |
| COGTABEL | cogtabel.cpy (euta-rec, tipo 70) |
Configurazione ricerche: record RICE/DEFINE |
| feurtab | cogfiles.cpy |
File tabellare di servizio |
Programmi chiamati¶
| Programma | Ruolo |
|---|---|
| COGS34 | Tokenizzazione: riceve la stringa (s34-stringa), la lunghezza (s34-l-str) e la chiave tabella #70 (s34-key = RICDM), restituisce l'array s34-paro (occurs 0 to 1000) con le singole parole significative e il conteggio s34-t. Metodo di scomposizione 'B'. A fine elaborazione viene fatto cancel 'COGS34' |
| COGS37B | Gestione dell'indice descrizioni aggiuntive COGSTDAM: riceve s37b-merce, s37b-des-i (descrizione da inserire), s37b-ope (I = inserimento, X = chiusura/finalizzazione). Chiamato solo se euta-c008-dam = S. Con s37b-ope = 'X' a fine ciclo per finalizzare, poi cancel "COGS37B" |
Le parole restituite da COGS34 vengono inserite nell'indice tramite i paragrafi interni aggpal / aggpal-1..4 (nessuna subroutine esterna per COGSTDME).
Configurazione (COGTABEL tipo 70 - RICE/DEFINE)¶
Legge da COGTABEL (euta-tipo=70, euta-cfg-arg=RICE, euta-cfg-key=DEFINE). Se assente: "Configurazione Assente!!" e termina.
Flag euta-c008 |
Uso in COGR06 |
|---|---|
euta-c008-dm |
Abilitazione ricerca per descrizione merce. Se = N -> "Manca Abilitazione !!" e termina |
euta-c008-dam |
Abilitazione ricerca su Descrizione Aggiuntiva Merce. Copiato in tm-cfg-dam; se = S attiva anche la ricostruzione di COGSTDAM via COGS37B |
Flusso principale¶
main / a000- init (ctr-abil,open-files,rd-azi), finestra di avviso con contatori "Merci Lette", "Stringhe Scritte", "Stringhe Riscrit.".- Lettura configurazione e controllo abilitazione
euta-c008-dm; salvataggio dieuta-c008-damintm-cfg-dam. a010-acc-conf: ESC esce, solo F3 prosegue.a020- reinizializzazione fisica:close/open output/close/open i-osuCOGSTDME. Setm-cfg-dam = "S"ancheclose/open output/closesuCOGSTDAM(svuotamento). Azzeraw-nume.a1-agg-mer- scansione anagrafica (start/read nextsuCOGMERCIda low-values):- per ogni merce incrementa "Merci Lette";
read cogracme key ram-chia1conram-chia1=mer-chia: recuperaram-nume(numero interno) della merce corrente;- chiama COGS34 su
mer-descr(chiaveRICDM) per ottenere le parole; aggpal: per ogni parola non vuota inserisceram-numenell'indice COGSTDME;- se
tm-cfg-dam = "S": scandisceCOGDESAG(dag-chiacondag-r-m = 'M',dag-merce = mer-chia) e per ogni riga con descrizione non vuota chiama COGS37B in inserimento (s37b-ope = 'I'), passandodag-descin maiuscolo. z-chiudi/fine- se DAM attivo, chiamata finale a COGS37B cons37b-ope = 'X';cancel 'COGS34'; chiusura di tutti i file; uscita.
Logica dell'indice COGSTDME¶
Ogni parola diventa una chiave stdm-paro1 (X(09)). Poiche' i codici merce associati possono superare la capacita' di un singolo record (stdm-tabe occurs 0 to 40), l'indice usa un progressivo di chiave (stdm-prog1) per "impaginare" gli elenchi lunghi:
aggpal-1- la parola non esiste: crea il primo record (prog. 0) con il primo codice.aggpal-2- la parola esiste e il record ha spazio (stdm-ulti < 40): aggiunge il codice in coda al record corrente e lo riscrive.aggpal-3/aggpal-4- il record e' pieno (multipli di 40): crea/aggiorna un record aggiuntivo con progressivostdm-prog1maggiore di zero (calcolato viadivide ... by 40), mantenendo aggiornati i puntatori (stdm-ultinumero di elementi occupati,stdm-puntindice tabella) sul record capofila.
Note¶
- COGR06 dipende da un
COGRACMEgia' ricostruito e coerente: se manca il raccordo per una merce,ram-numenon viene aggiornato e verrebbe indicizzato un valore non corretto. La sequenza corretta e' quindi COGR05 (raccordo) prima di COGR06 (descrizione). - La chiave passata a COGS34 e'
RICDM(RICerca Descrizione Merce): individua nella tabella #70 le regole di scomposizione/stop-word applicate alla descrizione. - Copybook chiave secondaria:
cogstdam.k01ecogdesag.k01sono incluse manualmente a fine procedure division (chiavi non generate automaticamente). - La ricostruzione di COGSTDAM e' opzionale e disaccoppiata: se
euta-c008-dam = Nviene saltata interamente (nessun open output su COGSTDAM, nessuna chiamata a COGS37B). - Il file
feurtabe i paragrafisearch-file/rd-tabsono le routine standard di apertura e lettura tabella.