@@liste parametriche - manuale utente@@
La   videata   visualizzata   mostra   il   contenuto    dell'archivio
selezionato; si vede un record per ogni riga, sulle colonne  i  campi;
il record attuale e` evidenziato.
Se al record attuale e` associata una @nota@ ,  viene  evidenziato  un
asterisco a destra del primo campo del record.
Per uscire dalla  lista,  occorre  digitare  [Invio]  selezionando  un
record, oppure digitare [ESC], senza selezionare nulla.

  Se la  lunghezza  della  riga  e`  maggiore  della  grandezza  della
finestra, si possono vedere i dati non visualizzati spostandosi tra  i
vari campi e tra i vari records.

  Per spostarsi, si possono usare vari tasti funzionali:

              SPOSTAMENTI TRA RECORDS (VERTICALI)
- [Freccia in alto]             record precedente
- [Freccia in basso]            record successivo
- [Pagina indietro]             pagina precedente
- [Pagina avanti]               pagina successiva
- [HOME]                        inizio archivio
- [Fine]                        fine archivio

              SPOSTAMENTI TRA CAMPI (ORIZZONTALI)
- [Freccia sinistra]
- [Tab-indietro]                campo precedente
- [Freccia destra]
- [Tab]                         campo successivo

  Premendo   il   tasto   [Shift-F1],   si   accede   al   menu`    di
personalizzazione  della  lista:  vengono  presentate  alcune  tra  le
seguenti opzioni (ad alcune di esse e` associato un tasto funzionale).

- @ricerca stringa@
- @visualizzazione verticale@
- @seleziona/deseleziona@
- @seleziona tutti@
- @deseleziona tutti@
- @editazione/selezione dati@
- @lancio del programma di gestione@ (Associata ad F1)
- @set estremi@ (Associata ad F2)
- @set inclusioni@ (Associata ad F3)
- @set ordinamento@
- @set join@
- @richiedi parametri@
- @stampa@ (Associata ad F10)
- @export@
- @set campi@
- @campi calcolati@
- @set posizioni@
- @set schermo@
- @memorizza lista@
- @modifica@
- @cancellazione@
- @inserisco rigo@
- @ripristino annullato@
- @bufferizzo rigo@
- @annullo rigo@
- @import dati@
- Uscita (Associata ad ESC)


@@liste parametriche - note generali@@

  Lo  scopo  primo  del  programma  'Liste   parametriche'   e`'g   di
permettere la visualizzazione  e  la  stampa  (in  modo  'predefinito'
oppure 'libero')  dei  dati  contenuti  in  un  archivio;  si  possono
inoltre modificare o annullare record esistenti, oppure  inserirne  di
nuovi; si possono inoltre importare ed esportare dati.
  Il programma  puo`  essere  richiamato  dal  menu`  o  da  un  altro
programma che necessita di una lista.

  Se richiamato da menu` il  programma,  alla  partenza,  richiede  il
numero  dell'archivio  desiderato  ed  il  suo   tipo   record   (vedi
'Dizionario dati'), oppure il nome della lista voluta (su tutti e  tre
i campi e`'g possibile effettuare  uno  zoom).  Se  si  inseriscono  i
primi due dati, si attiva il programma in modalita`  'libera';  se  si
inserisce il terzo, si attiva in modalita` 'predefinita'.

  Se sul  numero  del  file  si  specifica  9999,  il  file  preso  in
considerazione sara` un sequenziale; si deve specificare il suo  nome,
se il primo record contiene i nomi  dei  campi  contenuti  nei  record
successivi (se no, il programma assegna  dei  nomi  standard  ai  vari
campi), qual e`'g il separatore tra i vari  campi.  Il  programma,  in
base  alle  informazioni  contenute   nel   sequenziale   specificato,
costruisce un dizionario dati 'locale' alla lista stessa,  su  cui  si
puo` lavorare poi come se questo fosse  in  file  normale:  effettuare
calcoli, join, selezioni, ordinamenti e quant'altro. Il nome del  file
sequenziale puo` essere ridefinito all'atto  della  chiamate,  tramite
parametro (vedi @come richiamare una lista@ ).

  Se     richiamato     da     un      altro      programma      (vedi
@come richiamare una lista@ ), la  lista  sara`  sempre  in  modalita`
'predefinita'.

  Dopo tale scelta, viene  presentata  una  videata  composta  da  una
matrice contenente i dati dell'archivio  selezionato,  sulle  righe  i
records, sulle colonne i campi; il record attuale e`'g evidenziato.

  Se la lunghezza della  riga  e`'g  maggiore  della  grandezza  della
finestra, si possono vedere i dati non visualizzati spostandosi tra  i
vari campi.

  Per spostarsi, si possono usare vari tasti funzionali:

              SPOSTAMENTI TRA RECORDS (VERTICALI)
- [Freccia in alto]             record precedente
- [Freccia in basso]            record successivo
- [Pagina indietro]             pagina precedente
- [Pagina avanti]               pagina successiva
- [HOME]                        inizio archivio
- [Fine]                        fine archivio

              SPOSTAMENTI TRA CAMPI (ORIZZONTALI)
- [Freccia sinistra]
- [Tab-indietro]                campo precedente
- [Freccia destra]
- [Tab]                         campo successivo

  In modalita` 'libera', la lista e`'g di tutto  l'archivio,  ordinato
per chiave primaria, con tutti i  campi  cosi`  come  specificati  nel
dizionario dati.
  A questo punto, e`'g possibile personalizzare  la  lista,  cambiando
l'ordinamento dei records, dei campi, eliminando  dalla  lista  alcuni
campi, cambiandone la  'picture',  escludendo  records  secondo  certi
criteri, creando campi calcolati, etc.

  Premendo   il   tasto   [Shift-F1],   si   accede   al   menu`    di
personalizzazione della lista: vengono presentate tutte o  alcune  tra
le opzioni possibili, che sono:

- @ricerca stringa@
- @visualizzazione verticale@
- @seleziona/deseleziona@
- @seleziona tutti@
- @deseleziona tutti@
- @editazione/Selezione dati@
- @lancio del programma di gestione@ (Associata ad F1)
- @set estremi@ (Associata ad F2)
- @set inclusioni@ (Associata ad F3)
- @set ordinamento@
- @set join@
- @richiedi parametri@
- @stampa@ (Associata ad F10)
- @export@
- @set campi@
- @campi calcolati@
- @set posizioni@
- @set schermo@
- @memorizza lista@
- @modifica@
- @cancellazione@
- @inserisco rigo@
- @ripristino annullato@
- @bufferizzo rigo@
- @annullo rigo@
- @import dati@
- uscita (Associata ad ESC)

@@seleziona/deseleziona@@
  Se la lista e`'g stata lanciata con parametro di selezione  multipla
(vedi @come richiamare una lista@ ), si utilizzera` il  tasto  [INVIO]
per selezionare (se non gia` selezionato) o deselezionare  (  se  gia`
selezionato) un record. I record selezionati vengono  evidenziati  con
una "X" sulla sinistra.

@@seleziona tutti@@
  Se la lista e`'g stata lanciata con parametro di selezione  multipla
(vedi @come  richiamare  una  lista@  ),  tramite  questa  opzione  si
possono selezionare  tutti  i  record  che  rispettano  le  specifiche
indicate in @set inclusioni@ e @set estremi@ .

@@deseleziona tutti@@
  Se la lista e`'g stata lanciata con parametro di selezione  multipla
(vedi @come  richiamare  una  lista@  ),  tramite  questa  opzione  si
possono deselezionare tutti i  record  che  rispettano  le  specifiche
indicate in @set inclusioni@ e @set estremi@ .

@@ricerca stringa@@
  Permette di ricercare, sul campo che e`'g  visualizzato  come  prima
colonna sul video,  una  stringa;  dopo  la  ricerca,  si  ottiene  la
visualizzazione dell'archivio a partire dal primo record su cui si  e'
trovata la stringa richiesta.
  Il programma richiede una stringa da  ricercare:  si  puo`  digitare
una  sequenza  di   caratteri   qualunque,   che   saranno   ricercati
considerando uguali caratteri maiuscoli e minuscoli; inoltre  si  puo`
usare la sintassi della funzione like di @set inclusioni@
@@editazione/selezione dati@@
  Normalmente, si puo` solamente  vedere  il  contenuto  dell'archivio
selezionato; tramite questa opzione, e`'g possibile la  variazione  di
campi, l'annullamento e l'inserimento di records nell'archivio. Se  ci
sono join selezionati, totalizzazioni o  raggruppamenti  attivi,  tale
opzione non e' attivata.
  Se si sceglie la modalita` editazione, il cursore  si  posiziona  su
un singolo campo, invece che su tutta la riga attuale, e  se  ne  puo`
modificare il valore; l'aggiornamento effettivo dell'archivio  avviene
pero`  solamente  all'uscita  dalla   modalita`   editazione   o   dal
programma, e si puo` anche scegliere di non aggiornare l'archivio  con
le modifiche effettuate.
  Inoltre,  sono   attive   l'operazione   di   @inserisco   rigo@   ,
@cancello rigo@ e @bufferizzo rigo@ .
  Per uscire dalla modalita`  'EDITAZIONE',  bisognera`  scegliere  la
modalita` 'SELEZIONE'; se nel frattempo  si  sono  modificati  dati  o
cancellati/inseriti record, viene richiesto se  aggiornare  l'archivio
con le modifiche fatte.

@@lancio del programma di gestione@@
      (selezionabile anche con F1 direttamente della lista)
  Tramite questa funzione, si ottiene l'esecuzione  del  programma  di
generazione/modifica dell'archivio  selezionato;  all'uscita  da  tale
programma, si rientrera` nella lista. L'opzione e`'g attiva  solamente
se nel dizionario e' specificato, a livello di tipo  record,  il  nome
del programma di gestione corrispondente.

@@set estremi@@
      (selezionabile anche con F2 direttamente della lista)
  All'ingresso della modalita` 'libera', si ha la  visualizzazione  di
tutto l'archivio, ordinato per la chiave principale;  questa  funzione
permette di scegliere un'altra chiave di ordinamento (se c'e'), ed  un
range di record su cui operare.
  Se c'e' piu` di una chiave, viene  proposto  l'elenco  delle  chiavi
definite tra le quali  se  ne  scegliera`  una;  dopo  di  che,  viene
visualizzato l'elenco  dei  campi  componenti  tale  chiave,  e  viene
richiesto un ESTREMO INFERIORE di chiave ed un ESTREMO SUPERIORE.  Una
volta completata l'operazione, si otterra` una lista ordinata  per  la
chiave selezionata, e comprendente SOLAMENTE  i  record  compresi  tra
gli estremi selezionati.
  Su  ESTREMO  INFERIORE  e  su  ESTREMO  SUPERIORE   e`'g   possibile
specificare  un  valore  fisso,  oppure  un  PARAMETRO  (vedi  oltre),
tramite il tasto F2.
  N.B.: se ci sono piu` campi che compongono la chiave,  essi  vengono
proposti ed  utilizzati  IN  ORDINE  DECRESCENTE  DI  PRIORITA`  SULLA
CHIAVE:
il range specificato  nei  campi  piu`  in  basso  nella  lista  viene
controllato solamente se i campi piu` in  alto  sono  all'estremo  del
proprio range (= al minimo o al massimo);
ad es., dato un archivio di cedolini paga con una chiave  composta  da
AZIENDA, NUMERO DIPENDENTE, MESE DI RETRIBUZIONE  si  potranno  vedere
tutti  i  cedolini  dell'azienda  X  (specificando  'da   AZIENDA   X,
DIPENDENTE 0, MESE 0, a AZIENDA x, DIPENDENTE 9999, MESE 99');
NON si vedranno i cedolini di tutti i dipendenti  dell'azienda  X  del
mese Y, se si specifica 'da AZIENDA X,DIPENDENTE 0, MESE Y, a  AZIENDA
x, DIPENDENTE 9999 MESE Y',  ma  si  vedranno  TUTTI  i  cedolini  dei
dipendenti il cui codice e`'g compreso tra 1 e 9998, di TUTTI i  mesi.
Per ottenere il risultato voluto, si deve utilizzare (se e'  presente)
una  chiave  composta  da  AZIENDA,   MESE,   DIPENDENTE   nell'ordine
indicato, oppure effettuare un SET INCLUSIONI (vedi oltre).

@@set inclusioni@@
      (selezionabile anche con F3 direttamente della lista)
  Permette di includere nella lista SOLAMENTE i record che  rispettano
la condizione  specificata.  Se  non  si  specificano  condizioni,  si
includono TUTTI i record.
  Viene presentata una maschera con le seguenti colonne:
* () AND OR NOT
  Su questa colonna va indicata la operazione  logica  da  effettuare,
nel caso di una condizione composta da piu` operazioni  di  confronto;
Visto che nella grande maggioranza dei casi si operano degli  AND  tra
piu`  confronti,  il  programma  lo  propone  su  ogni   riga   vuota.
Sull'ultima, e`'g necessario eliminare tale proposta MANUALMENTE.
  Si  possono  comunque  indicare  parentesi  per   raggruppare   piu`
operazioni in una unica sotto-condizione, AND,OR,NOT;  ovviamente,  la
condizione risultante dovra` rispettare le regole dell'algebra  logica
(bilanciamento delle parentesi, etc); gli  operatori,  in  assenza  di
parentesi, assumono la priorita` tradizionale: NOT,AND,OR
* CAMPO
  Su questa colonna va  specificato  il  nome  del  campo  su  cui  si
effettua il confronto; il programma propone la lista di tutti i  campi
disponibili, e se ne dovra` selezionare uno (per muoversi  all'interno
della lista, usare le frecce e pagina-su pagina-giu; per  selezionare,
ENTER o TAB; si puo` scegliere di vedere i nomi  dei  campi  piuttosto
che le loro descrizioni tramite il tasto  F2;  si  puo`  ricercare  un
nome o una descrizione, tramite  il  tasto  F3  e  poi  digitando  una
sottostringa del nome o della descrizione stessa ).
* COND
  Specificare  l'operatore  di  confronto  desiderato;  gli  operatori
possibili  sono:  =  (uguale),  >=(maggiore  o  uguale),  <=(minore  o
uguale), > (maggiore), <, (minore), !=  (diverso),  <>  (diverso),  LK
(like).
* VALORE DI CONFRONTO
  Specificare  il  valore  con  il  quale  va  confrontato  il   CAMPO
specificato: e`'g possibile indicare un valore fisso od  un  PARAMETRO
(vedi), tramite il tasto F2.
  In caso di COND = LK, si puo` specificare una stringa  che  contiene
caratteri  'normali',   oppure   il   metacarattere   '?',   indicante
'qualunque carattere', o '*', indicante  ' qualunque  carattere,  zero
o piu` volte'; i caratteri 'normali' vengono confrontati  considerando
uguali maiuscoli e minuscoli.

  N.B. Il SET INCLUSIONI opera SUCCESSIVAMENTE  al  SET  ESTREMI,  per
cui i record non  compresi  nel  range  specificato  in  SET  ESTREMI,
comunque  non  vengono  inclusi  nella  lista:  non  vengono   neppure
processati.   Se   possibile   in   virtu`   delle   chiavi   presenti
sull'archivio, e`'g da preferire di gran lunga una  selezione  tramite
il SET ESTREMI, perche' molto piu` veloce.

@@set ordinamento@@
  Permette di specificare un ordinamento dei record diverso da  quello
della chiave selezionata, nonche'  di  specificare  delle  rotture  di
gruppo.
  Per i files sequenziali, permette di specificare qual e`'g  l'ordine
in cui i record fisicamente si trovano nel  file  (per  poter  operare
dei selfjoin); in tal caso viene effettuata una richiesta di  conferma
apposita.
  Viene proposta una videata con l'ordinamento attualmente in uso;  E`
possibile selezionare i  campi  direttamente  dalla  lista  dei  campi
definiti; si puo` inserire un campo tra due gia` specificati,  tramite
il tasto F1; se ne puo` eliminare uno, con F2.
  Le righe sono in ordine di priorita` decrescente; la  maschera  e`'g
composta dalle seguenti colonne:

* NOME
  Contiene il nome del campo specificato

* DESCRIZIONE
  Contiene la descrizione utilizzata sulle testate e  sulle  righe  di
totali (se sono presenti rotture di gruppo), per  indicare  il  valore
caratteristico del singolo gruppo.

* ORDINE
  Indica se il campo deve essere ordinato in  modo  ascendente  (A)  o
discendente (D) (attualmente tale opzione non e`'g operativa, i  campi
sono sempre ordinati in modo ascendente).

* A CAMBIO ...
  Indica se questo e`'g un campo di rottura di gruppo.
 - Se vale 'N', questo non e`'g un campo di rottura di gruppo
 - Se vale 'S', e`'g un campo di rottura di gruppo
 - Se vale 'P', e`'g di rottura di gruppo,  ed  inoltre  si  avra`  un
salto pagina.
 - Se vale 'G', viene attivata la modalita` 'GROUP  BY':  non  vengono
visualizzate le righe  di  dettaglio,  e  quelle  che,  in  una  lista
uguale, ma in modalita` normale sarebbero state le  righe  del  totale
di livello piu` basso, vengono visualizzate come righe  di  dettaglio.
'G' puo` essere specificato SOLO sull'ultimo campo di ordinamento.  Il
risultato e`'g paragonabile a quello che con un SQL si  puo`  ottenere
tramite l'opzione GROUP BY. Le colonne visualizzate  sono  valorizzate
SOLAMENTE se sono  campi  di  totale  o  sono  campi  di  ordinamento.
(qualche prova vale piu` di tutta questa lunga spiegazione...)


 Per rottura di gruppo si intende che, quando  due  record  successivi
hanno valori uguali sul campo indicato, non succede nulla;  se  invece
hanno valori diversi, viene stampata una riga contenente i totali  del
gruppo di record che  hanno  tutti  il  primo  valore  sul  campo  (se
specificata la totalizzazione), e stampata una  testata  indicante  il
valore del campo nel nuovo gruppo di records.

 Tutti i campi contenenti 'N' su 'A CAMBIO ...',  fanno  tutt'uno  con
il successivo campo contenente 'S' o 'P'( se c'e'): se cambia il  loro
valore tra due records, si  comportano  come  il  campo  con  'S';  se
invece non ci sono altri campi con 'S',  (su  righe  successive),  non
e`'g gestita la rottura di gruppo sul campo.

* STAMPA
  Indica se il valore del campo va stampato sulla riga  dei  totali  e
sulla intestazione del gruppo (ad es, se si seleziona 'da AZIENDA 1  a
AZIENDA 1', probabilmente non si vorra` indicata l'azienda sul  cambio
di altri campi di totali).

@@set join@@

  Permette di 'vedere' i dati di piu` archivi legati tra di loro.

  Se, nel dizionario dati, sono specificati dei legami tra  l'archivio
selezionato ed altri, essi possono essere utilizzati per vedere  (come
se fosse un unico record) il contenuto di piu`  record  associati  tra
di loro.

  Ad.Es, se sul dizionario dati c'e' un archivio CEDOLINI,  contenente
AZIENDA, NUMERO DIPENDENTE, MESE DI RETRIBUZIONE, NETTO A  PAGARE,  un
archivio  DIPENDENTI   contenente   DIPENDENTE   NUMERO,      COGNOME,
QUALIFICA, ed e`'g specificato  un  join  tra  l'archivio  CEDOLINI  e
quello DIPENDENTI tramite il campo  NUMERO  DIPENDENTE  ->  DIPENDENTE
NUMERO, selezionando SET JOIN, verra` proposto questo  legame;  se  si
specifica 'S' sul campo  'S/N',  sulla  videata  dei  records  saranno
visibili anche i  campi  del  COGNOME  e  della  QUALIFICA,  per  ogni
cedolino.

  Per ogni join, e`'g necessario  assegnare  una  SIGLA  JOIN  univoca
composta da due caratteri, che serve  per  distinguere  gli  eventuali
campi che dovessero avere lo stesso nome.

  Se esiste un legame non completo, esso puo` essere completato  nella
formula di calcolo richiesta successivamente.

  E` possibile anche creare join manuali, se i legami tra gli  archivi
non sono stati specificati all'atto della definizione delle strutture.

  Per effettuare un join manuale, e`'g  necessario  digitare  F1,  sul
primo rigo della maschera  dei  joins.  Si  deve  poi  specificare  il
numero ed il tipo record del  file  che  si  desidera  agganciare,  la
chiave tramite la quale si vuole effettuare la  lettura  sul  file  di
join, e la sigla join, come per le join automatiche.

  Il legame cosi` creato e`'g  per  definizione  incompleto,  e  sara`
necessario valorizzare tutta la chiave  nella  successiva  formula  di
calcolo;  inoltre  tali  join  vengono   considerate   comunque   come
associate all'archivio principale, anche se cio` non corrisponde  alla
struttura del database. Questo fatto non costituisce un  problema,  in
quanto  questa  informazione  e'  utilizzata  solamente   dalle   join
automatiche.

  Le letture degli archivi agganciati avvengono  nello  stesso  ordine
indicato nella maschera del SET JOIN.

  E` necessario porre particolare  attenzione  all'ordine  in  cui  si
effettuano le join, sia manuali  che  automatiche:  se  si  utilizzano
campi che sono su un archivio agganciato  (ad  es.  archivio  A),  per
valorizzare parti di chiavi di altri archivi  da  collegare  (  ad  es
archivio B), e`'g necessario porre la join del file di cui servono  le
informazioni  PRIMA  della  join  su  cui  tali  informazioni  vengono
utilizzate: la join di A DEVE essere PRIMA della join di B.

  E` possibile indicare  un  archivio  anche  piu`  volte  nell'elenco
delle join (per intenderci, in una struttura del tipo  distinta  base,
posso collegare l'archivio articoli sia al componente che al  prodotto
finito; sara` la sigla join che  permettera`  la  distinzioni  ad  es.
delle descrizioni dei due articoli).

  Se si devono mettere a confronto dati dello stesso archivio (ad  es.
il fatturato per articolo/cliente di  un  anno  con  quello  dell'anno
precedente, ammesso di avere dei record  di  fatturato  suddivisi  per
anno), e non si e`'g in grado di stabilire un  join  normale,  perche'
non si sa quale set di record prevale sull'altro (se possono  esistere
alcuni record che hanno solo dati di un anno, ed altri che  anno  solo
dati dell'altro), si puo` definire un 'self-join'.

  Con questo meccanismo e`'g la lista stessa che provvede a  stabilire
un legame logico tra i vari records, ammesso che si  stia  utilizzando
una chiave tramite la quale si possa stabilire un  legame  gerarchico,
in cui i dati da mettere a confronto siano gli  ultimi  della  chiave:
nell'esempio   di   cui   sopra   si   dovra`   avere    una    chiave
'articolo-cliente-anno', non una del tipo 'anno-articolo-cliente'.  Se
cosi` fosse, e'  necessario  utilizzare  due  liste  collegate  da  un
sequenziale.

  Digitando F3 sulla maschera dei join, si  stabilisce  un  legame  di
tipo 'self-join'; viene inoltre richiesto  qual  e`'g  l'ultimo  campo
che distingue un raggruppamento  di  record  da  mettere  a  confronto
dall'altro.

  L'archivio agganciato e`'g per definizione lo  stesso  dell'archivio
principale, e sara` gestita la rottura di codice fino al  campo  sopra
specificato.

  Per stabilire la parte  restante  della  chiave  da  utilizzare,  si
dovra`   richiamare   successivamente   'SF1/set   selfjoin'   e    si
indicheranno i valori delle chiavi a confronto.

  Nell'esempio di cui sopra, si indichera` che  la  rottura  e`'g  sul
campo 'cliente', e su SF1/selfjoin si indicheranno quali  sono  i  due
anni da confrontare; a questo punto si selezioneranno i campi  che  si
vogliono vedere,  e  la  lista  evidenziera`  sulla  stessa  riga,  su
colonne separate, record  con  stesso  articolo-cliente,  selezionando
solamente quelli dei due anni indicati.

  Successivamente all'inserimento delle join da effettuare, si  ha  la
maschera per il caricamento della formula di calcolo  per  valorizzare
i campi non definiti nelle join  incomplete  e  manuali;  la  sintassi
e`'g la stessa della formula dei @campi  calcolati@  ;  la  differenza
tra le due formule e' che questa viene eseguita piu`  volte,  una  per
ogni join, e viene eseguita PRIMA che venga  effettuato  il  controllo
dei  campi  definito  in  @set  inclusioni@  ,  mentre  l'altra  viene
eseguita una volta sola per ogni record: in questa  vanno  valorizzati
i campi di join ed i  campi  di  selezione,  mentre  nell'altra  vanno
effettuate  le  operazioni  di  totalizzazione,  che  effettuate   qui
porterebbero a risultati errati.

@@richiedi parametri@@
  Se la lista prevede dei @parametri@  ,  tramite  questa  opzione  si
possono caricare nuovi valori sui parametri.

@@stampa@@
      (selezionabile anche con F10 direttamente della lista)
  Permette di produrre la lista su stampa.
  Qualora  si  desiderino  funzionalita`  di  stampa   diverse   dallo
standard (stampa su report,  con  stampa  intestazioni,  salti  pagina
ogni 66 righe, 10cpi ...), la modalita` di stampa  deve  essere  stata
selezionata precedentemente, tramite @set schermo@ .

@@export@@
  Permette di produrre  la  lista  su  stampa,  avendo  preselezionate
alcune  opzioni  tipiche  dell'esportazione  dei  dati   verso   altri
strumenti  di   elaborazione:   campi   alfanumerici   racchiusi   tra
virgolette, TAB tra un campo e l'altro, nessun salto pagina,  riga  di
stampa lunga 999 caratteri al massimo.
  All'atto della stampa si deve selezionare se si  desidera  avere  il
punto decimale invece che virgola decimale, e se si  vuole  una  prima
riga contenente i nomi dei campi, oppure le loro  descrizioni,  oppure
nulla.

@@visualizzazione verticale@@
  Permette la  selezione  della  modalita`  di  visualizzazione  della
lista:
  Orizzontale (default all'ingresso nelle  liste  stesse):  si  ha  la
visualizzazione di una riga per  ogni  record,  con  i  campi  che  si
svolgono orizzontalmente sullo schermo; ci si muove  tra  un  campo  e
l'altro all'interno dello stesso record con TAB, BACK-TAB,  le  frecce
a destra ed a sinistra; ci si muove tra i  record  con  le  frecce  in
alto ed in basso, PAGINA-SU e PAGINA-GIU.
  Verticale: si ha la visualizzazione di una pagina per  ogni  record,
con i campi che si svolgono verticalmente sullo schermo; ci  si  muove
tra un campo e  l'altro  all'interno  dello  stesso  record  con  TAB,
BACK-TAB, le frecce a in alto ed in basso, PAGINA-SU e PAGINA-GIU;  ci
si muove tra i  record  con  F4  (record  precedente)  ed  F5  (record
successivo).

@@set campi@@
  Permette  di  selezionare,  tra  i  campi  dell'archivio,  quali  si
vogliono vedere e quali no, e le modalita` di visualizzazione.

  Si puo` far scorrere  la  videata  direttamente  fino  ad  un  campo
desiderato, se se ne conosce  parte  del  nome  o  della  descrizione:
digitando F3, si ottiene una maschera nella quale si scegliera` se  si
vuole ricercare sul nome o sulla descrizione, e poi  si  digitera`  la
parte di nome/descrizione ricercata; se la ricerca va a buon fine,  la
videata si posizionera` sul prossimo campo che soddisfa la ricerca.
  Si puo` inoltre (con F1) selezionare  tutti  i  campi  della  lista,
oppure (con (F2) escluderli tutti.

  Questa videata ha le seguenti colonne:
* Sel
  Indicando 'S', il campo viene visualizzato nella lista; indicando  '
' o 'N', viene escluso; indicando 'R', il campo  viene  incluso  nella
lista, ma non potra` essere modificato (Read-only).
* NOME
  E` il nome del campo, come da dizionario; per i  campi  appartenenti
a record di  JOIN,  il  nome  e`'g  preceduto  da  'J'  e  dal  numero
progressivo del join; cio` per poterli distinguere  se  ci  sono  piu`
join sullo stesso archivio; se il  campo  e'  tabellare,  il  nome  e'
preceduto dall'indice nella tabella.
* DESCRIZIONE
 E` la descrizione  che  viene  presentata  sulla  intestazione  della
lista, sia a video che  su  stampa.  il  valore  qui  indicato,  viene
troncato alla lunghezza del campo; se pero` il  campo  successivo  non
ha descrizione, la descrizione prosegue anche sullo spazio  del  campo
successivo.
* TIPO
  Indica  il  modo  di  presentazione  del  campo;  sono  possibili  i
seguenti valori:
    - Per campi alfanumerici, X
    - Per campi numerici:
      9 il campo viene visualizzato cosi` come e`'g
      Z vengono soppressi gli zeri non significativi
      . come Z, e vengono messi i punti  di  migliaia  (se  lo  spazio
previsto e`'g sufficiente)
      B viene suddiviso il campo in 2 cifre, uno spazio, 2 cifre,  uno
spazio, 4 cifre
      M viene suddiviso in base  alla  codifica  specificata  per  gli
articoli di magazzino
    - per campi data, D
* LUNG
  Indica il numero di caratteri occupati dal campo.
* NDEC
  Indica il numero di decimali del campo
  N.B. LUNG = 10, NDEC = 2 NON corrisponde ad un PIC 9(10)V99,  ma  ad
un PIC 9(7),99.
* TOT
  Per i campi numerici, indica se il campo viene totalizzato (S) o  no
(N), oppure se e`'g un campo a gestione manuale: su  tali  campi,  non
viene effettuato  l'azzeramento  ad  ogni  record,  ma  soltanto  alla
rottura del gruppo di livello indicato (0-9); sono  da  usarsi  se  si
vogliono ottenere progressivi tra i righi, medie mobili o simili.

  Inoltre, si puo` vedere la lunghezza in  bytes  della  riga  che  si
e`'g cosi` costruita; sulle liste  a  video,  se  la  riga  e'  troppo
lunga, viene semplicemente troncata;  sulle  stampe,  la  riga  invece
puo` spezzarsi, con effetti indesiderati. (vedi @set stampa@ )

@@campi calcolati@@
  Permette di creare campi  non  definiti  nel  dizionario  dati,  che
potranno contenere risultati di calcoli (ad es. si  potra`  creare  un
campo 'SALDO' uguale a 'DARE' -  'AVERE');  non  e`'g  necessario  che
tali campi siano poi visualizzati; la definizione dei campi e'  simile
a quella di 'SET CAMPI'.
  Si puo`  sfruttare  il  meccanismo  di  costruzione  dinamica  delle
descrizioni dei campi, se  previsto  dall'interfaccia  verso  il  file
utilizzato,  specificando  'P'  sulla  scelta   se   il   campo   e`'g
visualizzato S/N/(P).

  Una volta creati i campi, viene proposta  una  videata  nella  quale
bisogna inserire le modalita` di calcolo di tali campi  (e'  possibile
anche ricalcolare campi diversi dai campi calcolati).

  Di seguito e`'g riportata la sintassi di tale formula di calcolo:
  istruzione:
              istruzione [ [;] istruzione .... ] ,
              istruzione_di_assegnamento ,
              istruzione_condizionale
  istruzione_di_assegnamento:
              LET campo = espressione
  istruzione_condizionale:
              IF espressione THEN istruzione ENDIF ,
              IF espressione THEN istruzione ELSE istruzione ENDIF
  espressione:
              campo ,
              ( espressione ) ,
              espressione * espressione ,
              espressione / espressione ,
              espressione + espressione ,
              espressione - espressione ,
              espressione AND espressione,
              espressione OR espressione,
              NOT espressione,
              espressione = espressione,
              espressione > espressione,
              espressione < espressione,
              espressione >= espressione,
              espressione <= espressione,
              espressione != espressione,
              espressione <> espressione,
              min(espressione, espressione),
                riporta il minimo tra le due espressioni;
                   queste devono essere dello stesso tipo
                   (o  tutte  e  due   numeriche   o   tutte   e   due
alfanumeriche)
              max(espressione, espressione),
                riporta il massimo tra le due espressioni;
              to_date(espressione),
                riporta la data numerica contenuta nella stringa
                ESPRESSIONE, in formato "MM/GGMAAAA"
              to_num(espressione_alfanumerica),
                riporta il numero contenuto nella stringa indicata
              to_char(espressione, interi),
                riporta  la  stringa  contenente  il  valore  numerico
specificato,
                  la cui lunghezza e`'g indicata in INTERI
              to_lower(espressione),
                riporta la stringa ESPRESSIONE convertendo i caratteri
                  maiuscoli in minuscoli
              to_upper(espressione),
                riporta la stringa ESPRESSIONE convertendo i caratteri
                  minuscoli in maiuscoli
              add_date(espressione_numerica, espressione_numerica),
                 aggiunge alla  prima  espressione  (considerata  come
data,
                    in formato aaaammgg), il numero di giorni indicato
                    nella seconda espressione, riportando
                    una data in formato aaaammgg
              sub_date(espressione_numerica, espressione_numerica),
                 sottrae dalla  prima  espressione  (considerata  come
data,
                    in formato aaaammgg), il numero di giorni indicato
                    nella seconda espressione, riportando
                    una data in formato aaaammgg
              diff_date(espressione_numerica, espressione_numerica),
                 calcola la differenza in giorni tra  la  prima  e  la
seconda
                    espressione, considerate  entrambe  come  date  in
formato
                    aaaammgg,  e   riporta   il   numero   di   giorni
intercorrenti
                    tra le due
              substr(espressione, pos_inizio, lunghezza),
                    estrae la porzione di stringa indicata
                    da POS_INIZIO per LUNGHEZZA caratteri
                     e ponendo n_spazi tra l'una e l'altra )
              strcat(espressione, espressione, n_spazi)
                    (aggancia 2 stringhe troncando spazi
                     e ponendo n_spazi tra l'una e l'altra )
  campo      :
              CAMPO_DA_ARCHIVIO ,
              CAMPO_CALCOLATO ,
              pseudo_variabile
  pseudo_variabile:
              PAGENO , (numero pagina x stampe)
              LINENO , (numero linea nella pagina)
              PROGNO , (numero record)
              PARAnn , (parametro NN alfanumerico)
              PARNnn , (parametro NN numerico)
              @GROUPLEVEL@ , (livello di rottura di gruppo attuale)
              @AFTERMODIFICA@ , (numero campo modificato (SF1/Z))
  Le priorita` di calcolo sono le usuali;

@@GROUPLEVEL@@
  La  formula  di  calcolo  specificata  su  @campi  calcolati@   e`'g
eseguita ad ogni record  che  viene  presentato  a  video,  anche  sui
record di totali: si pone quindi il problema di distinguere se si  sta
eseguendo il calcolo perche' siamo su un  record  di  dettaglio  o  di
totali, se ad es. si calcola un campo e lo si vuole  totalizzare,  non
bisogna ricalcolarlo sulla riga di  totali.  La  variabile  GROUPLEVEL
permette appunto tali distinzioni, essendo valorizzata a zero  per  le
righe di dettaglio, 1 per le righe di totali di livello piu`  basso  (
anche le righe di GROUP-BY sono di questo tipo) e cosi` via.

@@AFTERMODIFICA@@
  La formula di calcolo  specificata  in  @set  join@  viene  eseguita
anche dopo ogni modifica di  campi  tramite  @editazione  dati@  .  La
variabile AFTERMODIFICA specifica qual e`'g l'indice del campo  appena
accettato, oppure ZERO se non siamo dopo accettazione di campi.

@@set posizioni@@
  Permette  di  scegliere  l'ordine  di  visualizzazione   dei   campi
all'interno della riga; vengono presentati tutti i campi  selezionati,
accanto ad un progressivo; se si vuole  spostare  un  campo,  digitare
accanto la posizione in cui lo si desidera.
  N.B.  le  funzioni  SET  CAMPI,   CAMPI   CALCOLATI   e   SET   JOIN
riposizionano i campi secondo l'ordine naturale

@@set schermo@@
  Permette di stabilire le modalita` di presentazione della videata  (
@set video@ ) ed effettuare il settaggio delle stampe (  @set  stampa@
).

@@set video@@
   Le impostazioni possibili della videata sono:
     - Presenza del box intorno alla videata Si/No
     - riga di inizio della videata
     - colonna di inizio della videata
       (se c'e' il box, questo va FUORI dalla riga/colonna inizio
        a dalle righe/colonne occupate)
     - numero di righe occupate
     - numero di colonne occupate
     - deve comparire l'intestazione con i nomi dei campi Si/No
     - In fase di stampa, deve essere  stampata  una  pagina  iniziale
contenente
       l'elenco delle richieste effettuate al lancio S/N
     - In fase di stampa, ad  ogni  pagina  deve  essere  stampato  un
titolo:
       N = No
       T = viene stampato solamente il titolo della lista
       S = viene stampato il titolo, la data di stampa  ed  il  numero
pagina
       D = come sopra,  ma  la  data  viene  richiesta  all'operatore,
invece che
           essere quella di sistema.
     -  In  fase  di  stampa,  devono  essere   evidenziati   i   dati
dell'azienda di
       lavoro S/N  (la  stampa  avviene  all'interno  della  riga  del
titolo)
     - In fase di stampa, deve essere stampata la riga dei totali S/N
     - titolo della lista
     - Il nome del file  @testo  di  stampa@  ,  contenente  il  testo
'template',
       necessario per effettuare la stampa tramite testo;
       se si effettua una stampa tramite file di testo, ma il nome non
       e`'g stato specificato,  il  nome  del  file  di  testo  verra`
richiesto
       al momento della stampa effettiva.
     -   Il   tipo   periferica    associato    alla    lista    (vedi
@tipi periferiche@ )
     - Il nome della stampante,  se  si  desidera  stampare  sempre  e
comunque
       su di una stampante particolare
     - Il nome del file di stampa, se si desidera  stampare  sempre  e
comunque
       su di un file particolare (utilizzato anche  per  il  nome  del
file di
       import, se deve essere fissato)
     - Se evidenziare con un asterisco le note associate ai  record  o
no
     - Il carattere di separazione  della  parte  intera  dalla  parte
decimale
       sulle stampe (virgola o punto)

@@set stampa@@
   Le impostazioni possibili della stampa sono:

     - Predisposizione per stampa tipo Report, Export, stampa  tramite
testo, stampa binaria:

       Se report, la stampa viene  formattata  per  ogni  pagina,  con
intestazione  di  pagina,  titolo,  intestazione  dei  campi  e  viene
gestita la rottura di pagina; vengono inoltre stampate le sequenze  di
settaggio della stampante, per configurare il  numero  di  CPI  e  LPI
specificati;
       Se export, vengono stampati solamente i dati, senza rotture  di
pagina. Questa opzione viene utilizzata se si  devono  scambiare  dati
con altri programmi, come fogli elettronici, data-base etc.
       E` possibile non  generare  intestazioni,  oppure  generare  un
record di intestazione contenente le descrizioni dei vari campi  (tale
informazione sara` da utilizzarsi  in  procedure  esterne),  oppure  i
nomi degli stessi, in  un  formato  intelligibile  per  un  successivo
import su un'altra lista (formato interno).
       Se stampa tramite testo, la stampa  viene  formattata  in  base
alle  specifiche   contenute   nel   file   indicato   sul   campo   '
@testo di stampa@ '.
       Se stampa binaria, il record non subisce alcuna formattazione
       (funzione associata alla gestione del @log di procedura@ ).


     - Carattere separatore di campo, se si e`'g specificato  il  tipo
export:

       specificare il peso decimale del carattere di separazione:
       ad es. 9 = tab, 32 = spazio, etc.
       Tale  opzione  non  ha  significato,  se  si  e`'g  selezionato
'report'.

     - Stampa intestazione export:

       specificare:
                   N per non avere intestazioni;
                   D per intestare con le descrizioni;
                   E per intestare con i nomi dei  campi,  in  formato
valido
                     ad es. per excel o access.
                   S per intestare con i nomi del campi.
       Tale opzione non ha significato, se  non  si  e`'g  selezionato
'export'.

     - Delimitatore campi alfanumerici export

       indicare  il   carattere   che   deve   racchiudere   i   campi
alfanumerici:
       Indicare spazio, Virgolette oppure Apice.
       Tale opzione non ha significato, se  non  si  e`'g  selezionato
'export'.

     - Numero di caratteri per riga

       Tale  opzione  non  ha  significato,  se  si  e`'g  selezionato
'export'.

     - Numero di righe contenute in ogni pagina

         Se diverso da zero, invia alla stampante i relativi codici di
         controllo e termina ogni pagina con un FORM-FEED
         Se zero, effettua il cambio pagina con dei LINE-FEED
       Tale  opzione  non  ha  significato,  se  si  e`'g  selezionato
'export'.

     - Numero di caratteri per pollice (CPI)

         Invia alla stampante i relativi codici di controllo
       Tale  opzione  non  ha  significato,  se  si  e`'g  selezionato
'export'.

     - Numero di linee per pollice (LPI)

         Invia alla stampante i relativi codici di controllo
       Tale  opzione  non  ha  significato,  se  si  e`'g  selezionato
'export'.

     - Numero di righe di corpo contenute in ogni pagina

       Se non indicato,  viene  calcolato  dal  numeri  di  righe  per
pagina.
       Se sono tutti e due a zero, non viene effettuato cambio pagina.
       Tale  opzione  non  ha  significato,  se  si  e`'g  selezionato
'export'.

@@variabili testo@@
  Una parte di testo racchiusa tra due simboli '$' indica il  nome  di
una variabile, che deve essere definita sulla lista  che  ha  lanciato
la stampa.
  Ad es $ALOCAL$ verra` sostituita in fase di stampa  dal  valore  del
campo ALOCAL (se definito), presente nel record in stampa al momento.
  Il  valore  cosi`  ottenuto   viene   troncato   degli   spazi   non
significativi, e sostituito al testo $VARIABILE$.
  Pertanto, se  il  campo  ALOCAL,  che  nella  lista  e`'g  lungo  30
caratteri,
  vale "VIA ROMA, 106                  ", e si stampa
  IO ABITO IN    $ALOCAL$, E CI STO BENE
  si otterra`
  IO ABITO IN    VIA ROMA 106, E CI STO BENE

  Se si vuole  stampare  un  campo  con  lunghezza  fissa,  si  dovra`
indicare la lunghezza desiderata nel formato  $nn-NOMEVARIABILE$.  Con
i dati precedenti,
  IO ABITO IN    $15-ALOCAL$, E CI STO BENE
  diventa
  IO ABITO IN    VIA ROMA 106   , E CI STO BENE
  E`  possibile  richiamare  un'altra  lista  da  dentro   un   testo,
indicando:
  $CALL$ nome_lista eventuali_parametri_da_passare_alla_nuova_lista
  (i parametri possono essere a loro volta variabili)
  ad es.
  $CALL$ stasol1 $QCODCON$ $PARA03$
  esegue  la  stampa  indicata  nella  lista  stasol1,  passando  come
parametri i valori attuali dei campi QCODCON e PARA03.
  .

@@header paragrafo@@
  Se una riga di stampa testo comincia  per  ".IN",  e`'g  considerata
una riga di formattazione pagina e dovra contenere:
  .INmm-nn-oo
  in cui:
         mm indica la lunghezza della pagina di stampa
         nn il margine iniziale di pagina
         oo il margine a pie` di pagina
  Se una riga comincia per ".SL",  ".SC",  ".SR",  ".SN",  ".SJ"  e`'g
considerata una riga di formattazione paragrafo e dovra contenere:
  .xxmm-nn-oo
  in cui
         xx indica:
                   SL per allineamento a sinistra (non attivo)
                 o SC per allineamento centrato (non attivo)
                 o SR per allineamento a destra (non attivo)
                 o SN per nessun allineamento
                 o SJ per giustificazione con l'inserimento di spazi
                      fino all'allineamento sia destra che a sinistra
         mm indica la posizione del margine sinistro
         nn indica la posizione del margine destro
         oo indica il numero di interlinee tra due righe di stampa

@@testo di stampa@@
 E` possibile effettuare stampe formattate in base ad un testo:
 Tramite  un  editor,  si  deve  generare  un  testo,  che  la  stampa
utilizzera` per generare il report. Viene scandito il testo una  volta
per ogni record della lista,  e  vengono  messi  a  disposizioni  come
@variabili testo@ tutti i campi del record selezionati.  Le  parti  di
testo che  non  specificano  variabili  vengono  lasciate  inalterate,
salvo l'allineamento specificato nell' @header paragrafo@ .  Le  parti
specificanti variabili, verranno sostituiti con i valori  attuali  del
record.
 Un esempio:

.IN72-10-08
.SN040-090-1
                                          Spett.le
                                          $ARAGSO$
                                          $AINDIR$
                                          $ACAP$ $ALOCAL$

 OGGETTO: ESTRATTO CONTO V/S DARE AL $PARA04$
 ................

           Per le prime due righe, rimandiamo all' @header  paragrafo@
;
           Se i campi del record in stampa valgono
              ARAGSO = ROSSI MARIO
              AINDIR = VIA ROMA, 206
              ACAP   = 52100
              ALOCAL = AREZZO
              PARA04 = 31/12/1997

           Verra` stampato:
                                          Spett.le
                                          ROSSI MARIO
                                          VIA ROMA, 206
                                          52100 AREZZO

 OGGETTO: ESTRATTO CONTO V/S DARE AL 31/12/1997


@@memorizza lista@@
  Permette di memorizzare la personalizzazione della lista  effettuata
al  momento,  per  poterla  successivamente   riutilizzare   (modalita
'pre-definita').
  Viene richiesto il tipo di lista (Sistema/Utente),  ed  il  nome  da
assegnare;  le  liste-sistema  sono  quelle  standardizzate,   fornite
insieme all'applicativo; quelle utente sono  quelle  che  ogni  utente
puo` fare da se', se vi e`'g abilitato).
  Viene richiesta anche se la lista  dovra`  essere  ottimizzata  (una
lista ottimizzata e`'g precompilata, ed e' quindi  molto  piu`  veloce
in fase di caricamento della stessa,  ma  puo`  non  corrispondere  ad
eventuali   variazioni   della   struttura   del   database   avvenute
successivamente alla sua compilazione)

  Per le operazioni:
  - @set estremi@
  - @set campi@
  - @set posizioni@
  - @set schermo@
  - @set inclusioni@
  - @memorizza lista@
  - @modifica@
  - @cancellazione@
  - @stampa@
  - @editazione@
  - @set ordinamento@
  - @set join@

  si puo` specificare se, nelle successive utilizzazioni della  lista,
tali operazioni potranno essere effettuate oppure no; sara` utile,  ad
es, inibire la funzione di set estremi, set ordine e set join,  se  si
vuol costruire una lista 'rigida',  oppure  inibire  la  modifica,  la
cancellazione o la editazione dati, se  si  costruisce  una  lista  di
interrogazione di  uso  generalizzato,  alla  quale  accede  una  gran
quantita` di persone; sara` utile  invece  lasciare  aperte  tutte  le
possibilita`, se  si  costruisce  una  lista  utilizzata  soltanto  da
personale  adeguatamente  addestrato,  che  puo`   aver   bisogno   di
manipolarla in  base  a  bisogni  non  conoscibili  al  momento  della
preparazione della lista.
  Inoltre si puo` specificare se si  costruisce  una  lista  di  'solo
stampa', predisposta per generare report su carta (o export):  in  tal
caso, al  successivo  richiamo  della  lista,  verra`  automaticamente
generato un report, senza doverlo richiamare tramite la funzione F10.
  Il campo 'modifica batch', se assume il valore 'S',  indica  che  la
lista serve per effettuare variazioni automatiche al database:  quando
la lista sara` eseguita,  se  ci  sono  record  che  contengono  campi
modificati (tramite campi calcolati), le modifiche effettuate  vengono
memorizzate nell'archivio corrispondente (dopo richiesta  di  conferma
all'utente).
  Si puo` indicare anche il nome di un programma (COBOL),  predisposto
per la richiesta dei parametri relativi alla lista; se indicato,  tale
programma  verra`  lanciato  invece  della  richiesta   standard   dei
parametri.
  Il campo 'Sigla join risposta' permette di riportare  in  uscita  di
una lista (su LNK-DATI-REC) un record  agganciato  invece  del  record
primario relativo alla riga selezionata.
  Il campo 'Programma successivo' indica l'eventuale programma (con  i
relativi parametri) da lanciare dopo l'uscita  dalla  lista:  abbinato
al campo 'solo stampa' permette di lanciare una lista, che  genera  un
sequenziale in stampa, che serve come input per  un'altra  lista,  che
legge lo stesso sequenziale .. e cosi` di seguito;  cio`  per  evitare
lista di complessita` troppo elevata  (troppe  join,  o  troppi  campi
calcolati, o group-by con totalizzazioni  incompatibili  tra  di  loro
..).

  Si possono infine indicare fino  a  20  @parametri@  ,  che  saranno
richiesti al lancio  della  lista,  e  possono  essere  utilizzati  in
@set estremi@ , @set inclusioni@ e @campi calcolati@ .
  Se si  vogliono  passare  a  liste  chiamate  in  cascata  parametri
derivanti dalla lista attuale, li si dovra` specificare come '%nn'  in
cui nn indica il numero del parametro desiderato (indicare  nn  sempre
di due cifre !).
  Per quanto riguarda i campi di tipo DATA, il  valore  dei  parametri
corrispondenti devono essere espressi in formato AAAAMMGG

@@parametri@@
 Quando si memorizza la lista, per ogni parametro viene  richiesto  il
campo a cui  e`  associato.  Tale  associazione  serve  SOLAMENTE  per
stabilire il tipo del parametro, la  sua  lunghezza  etc.,  NON  viene
effettuata alcuna movimentazione su di esso.
 E` inoltre possibile stabilire un valore di default, che e`'g  quello
che viene proposto  all'atto  dell'esecuzione  della  lista;  si  puo`
specificare il valore della costante da proporre,  oppure  %D  per  la
data odierna, %A per l'anno della data odierna,  %PA  per  l'esercizio
attuale, %PP per l'esercizio precedente.

@@modifica@@
  Permette di variare con  un'unica  operazione  il  contenuto  di  un
campo, per  tutti  i  record  selezionati  (cioe`  che  sono  visibili
spostandosi avanti ed indietro nella lista).
  Viene richiesto il campo da  modificare,  ed  il  nuovo  valore  che
dovra` assumere; inoltre viene richiesto se il record  cosi`  ottenuto
sara` un record nuovo  (write)  oppure  dovra`  sostituire  un  record
preesistente (rewrite).
  Si DEVE scegliere write se si  modifica  la  chiave;  altrimenti  si
DEVE scegliere rewrite.
  Tale operazione richiede una certa  prudenza  nell'utilizzo:  se  la
selezione  che  si  e`'g  effettuata  non  e'  quella  desiderata,  si
modifica il valore su records che non  andavano  toccati,  e  da  tale
operazione non si puo`, in generale, tornare indietro.

@@cancellazione@@
  Permette  di  eliminare  con  un'unica  operazione  tutti  i  record
selezionati (cioe` che sono visibili spostandosi  avanti  ed  indietro
nella lista).
  Come per la modifica, tale operazione richiede  una  certa  prudenza
nell'utilizzo: se la selezione che si e`'g effettuata  non  e'  quella
desiderata, si cancellano records che non andavano toccati, e da  tale
operazione non si puo`, in generale, tornare indietro.

@@inserisco rigo@@
  Permette di inserire un nuovo  record  nell'archivio;  il  contenuto
del nuovo record e`'g nullo, oppure e' uguale al  contenuto  del  rigo
bufferizzato (vedi); E` ovviamente  necessario  modificare  almeno  il
valore  della  chiave,  per  evitare  la   segnalazione   di   'record
duplicato',  quando   il   record   verra`   effettivamente   inserito
nell'archivio.
  Tale funzione e`'g attiva solamente in modalita` 'editazione dati'.

@@bufferizzo rigo@@
  Permette  di  memorizzare  un   rigo,   cosicche',   al   successivo
'inserisco rigo',  il  nuovo  record  sara`  valorizzato  come  quello
memorizzato.
  Tale funzione e`'g attiva solamente in modalita` 'editazione dati'.

@@annullo rigo@@
  Permette  di  indicare  un  record  come  'cancellato'.  Il   record
cancellato viene evidenziato con una riga  di  '-'.  Il  record  sara`
cancellato realmente solamente all'uscita dalla  modalita`  editazione
o dal programma.
  Tale funzione e`'g attiva solamente in modalita` 'editazione dati'.

@@ripristino annullato@@
  Permette di ripristinare un  record  precedentemente  indicato  come
'cancellato', e riportarlo nello stato di record esistente.
  Tale funzione e`'g attiva solamente in modalita` 'editazione dati'.

@@import dati@@
  Permette di caricare su  un  archivio  dati  contenuti  su  un  file
sequenziale, generato da altre procedure o da un'altra lista.
  Viene  richiesto  il  nome  del  file  da  cui  fare   l'import,   e
l'eventuale delimitatore di  campo  utilizzato;  nel  file  di  import
devono esserci tutti i campi componenti la chiave primaria, e che  non
sono valorizzati dal calcolo dei join, ma non  e`'g  obbligatorio  che
ci siano tutti gli altri: se il record specificato non  esiste,  viene
inserito con i campi che ci  sono,  se  invece  esiste  gia`  i  campi
presenti nell'import  sostituiscono  quelli  del  record,  mentre  gli
altri rimangono inalterati.
  E`  possibile  valorizzare  campi  tramite  la  formula  di  calcolo
inserita dopo il @set join@ .


@@come richiamare una lista@@
  Se si e`'g costruita una lista, questa puo` essere richiamata da  un
qualunque  programma,  semplicemente  effettuando  una   chiamata   al
programma DIZLST passando l'area  di  LINKAGE  standard  LNK-DATI,  ad
avendo cura di valorizzare il campo LNK-DATI-STRINGA con il  nome  del
descrittore di lista precedentemente memorizzato.
  Si potranno, sempre su LNK-DATI-STRINGA, indicare  alcuni  parametri
standard:
  -S: permettera`, all'atto dell'esecuzione della lista, di  scegliere
un record da riportare al programma; Se l'utente  sceglie  un  record,
questo viene portato su LNK-DATI-REC, e il campo  LNK-DATI-RISP  viene
posto ad "S".
  La selezione/deselezione dei records si effettua tramite  INVIO;  si
puo` selezionare tutto/deselezionare  tutto  tramite  SF1  ed  opzione
relativa.
  -SB:  permettera`,  all'atto   dell'esecuzione   della   lista,   di
scegliere piu` record da riportare al programma; Se  l'utente  sceglie
uno o piu` record, questi vengono messi su un file temporaneo di  tipo
BINARY SEQUENTIAL, lunghezza 1024, con lo stesso 'tracciato' del  file
in lista, ed il nome del file temporaneo viene messo su  LNK-DATI-REC;
il  campo  LNK-DATI-RISP  viene  posto  ad  "S".  Sara`  compito   del
programma chiamante trattare tale file temporaneo (anche cancellarlo).
  -SBX: opera esattamente come  -SB,  ma  all'inizio  i  records  sono
tutti gia` selezionati.
  -RAW: la lista viene lanciata in modalita` RAW-MODE,  cosicche'  non
vengono effettuati i controlli automatici che operano nella  modalita`
standard: non viene controllato il campo NUMERO AZIENDA, ne' il  campo
TIPO  RECORD,  se  definiti  nell'archivio.  (Puo`  essere  utilizzato
qualora si abbia il sospetto che  ci  siano  record  'sporchi'  dentro
l'archivio).
  -P: la lista viene lanciata in  modalita`  SOLO-STAMPA:  sovrascrive
il campo 'solo stampa S/N' della opzione @memorizza lista@ .
  -PATHxxxxxx: si puo`  indicare  il  nome  del  file  (con  struttura
uguale al file originale) contenente  i  dati,  ad  es.  se  si  vuole
operare su un  archivio  temporaneo;  ovviamente  il  file  deve  gia`
esistere. xxxxxx indica il nome del file da utilizzare.
  -SEQ:  se  la  lista  riguarda  un  file  sequenziale,  permette  di
definirne il nome e le tipologie del suo contenuto: il  formato  e`'g:
-SEQnnnxNNNNNN.... in cui nnn indica il separatore tra  i  vari  campi
(ad es. 009 per TAB); x indica S se il primo  record  del  sequenziale
contiene i nomi dei campi, N altrimenti;  NNNNNN....  indica  il  nome
del sequenziale da trattare.
  -BSEQNNNNNN: permette di lanciare una lista che utilizza  come  file
il sequenziale  binario  specificato  in  NNNNNNN,  che  dovra`  avere
lunghezza 1024  caratteri  e  dovra`  contenere  dati  con  lo  stesso
tracciato dell'archivio 'reale' specificato come LFN sulla lista.
  Sempre su LNK-DATI-STRINGA, si potranno  specificare  di  seguito  i
parametri, come indicato nella lista,  separati  da  uno  spazio;  per
indicare  un  parametro  che  puo`  contenere  spazi,  includerlo  tra
virgolette (" o ').
  Ad es., se si e`'g generata una lista di nome  "DIPE",  di  tutti  i
dipendenti di una ditta, e si e' previsto  come  parametro  il  numero
della ditta, si potra` richiamare la lista dei dipendenti della  ditta
1 con il seguente frammento di codice:
           MOVE "DIPE -S 0001" TO LNK-DATI-STRINGA
           CALL "DIZLST" USING LNK-DATI
           IF LNK-DATI-RISP = "S"
              MOVE LNK-DATI-REC TO RECORD-DIPENDENTI
           .......
  Le ultime  due  righe  verificano  se  l'utente  ha  selezionato  un
record, e se lo ha fatto, recuperano l'informazione per un  successivo
utilizzo.
