Tali azioni vengono descritte secondo un’apposita sintassi all’interno della sezione [Action] del file <NomeArchivio>.ini.
La sintassi è la seguente:
<Tabella> . <Attributo> = <numero d’ordine> <comando> [ <parametri> ]
<numerod’ordine>: ordine di valutazione, nella presente tabella, delle azioni da compiere. Ha lo scopo di rendere fattibili senza errori quelle operazioni che dipendono dall'esito di altre. Azioni che abbiano lo stesso valore di valutazione verranno valutate secondo l'ordine degli attributi nella tabella corrente.
<comando>: identificativo dell'azione. Specifica che tipo di azione si richiede, ogni identificativo sarà caratterizzato da una seguente terza parte diversa per ogni azione.
<parametri>: parametri dell'operazione da compiere, ogni azione ha una sintassi propria.
Di seguito vengono discusse le modalità di compilazione dei parametri per ogni comando.
All'interno dei parametri i nomi degli attributi racchiusi tra i due caratteri "|" vengono sostituiti con il valore relativo nel documento corrente.
Se l'attributo specificato è di tipo "multi riga", viene riportato il valore contenuto nella prima riga e tutti gli altri vengono ignorati.
Un attributo Multi Istanza, nei casi previsti ed illustrati
in seguito, assume il valore corrispondente all’istanza attuale.
E’ il default, può essere omessa se non abbiamo ancora deciso come configurare l’azione di un attributo.
Permette di associare ad un attributo esterno per il quale si intende definire una azione un compito nullo poiché nella funzionalità dell'archivio non si è ancora deciso quale ruolo esatto dovrà assume l'attributo in esame. Ciò dicasi anche per quelle realtà in cui si intende inserire nell'archivio un attributo esterno in più per un possibile uso futuro, attributo che non figura neppure nelle viste dell'archivio. In questo modo il programma evita di valutare i compiti assegnati a questo attributo considerando nulla l'operazione da effettuare.
Esempio:
TABELLA.ATTR3=1 NULL
Permette di compiere una operazione di ricerca su un data base esterno collegato a HIGHWAY tramite la tecnologia ODBC. La stringa che segue deve essere composta da:
nome simbolico del data base così come è stato registrato dai moduli di configurazione per ODBC, a seguire deve esistere almeno uno spazio come separatore. Per il momento non sono gestiti spazi intermedi nel nome stesso;
stringa ODBC (Open DataBase Connectivity) SELECT del linguaggio SQL che produrrà una tabella di risultati composta da un numero imprecisato di righe per un numero predefinito di colonne.
L'azione riempie automaticamente l'attributo in oggetto con il contenuto della prima colonna selezionata dalla Select. Si prega di fare attenzione all'ordine di valutazione che viene dato alle azioni da compiere in particolare quando si fa uso delle chiamate ODBC_SELECT e ODBC_FILL.
Esempio:
TABELLA.ATTR1=1 ODBC_SELECT
odbctest select NUMBER, LAST_NAME, from DBSTEST
Permette di riempire l'attributo corrente con l'esito di una precedente azione di selezione, per compiere correttamente questa operazione è necessarie prestare molta attenzione all'ordine di valutazione delle operazioni di cui si è parlato anche nella sezione "Sintassi Essenziale".
Si ricorda, infatti, che anche indicando correttamente il Data Base dal quale compiere l'operazione di Fill è necessario che essa segua la select opportuna per evitare che si riempia l'attributo in esame con esiti di altre select.
Gli elementi che sono richiesti sono l'identificativo del Data Base da interrogare ed un valore numerico che indichi il numero della colonna selezionata (in base 1) su quelle selezionate dalla precedente ODBC_SELECT.
Dal momento che la ODBC_SELECT effettua già il riempimento dell'attributo collegato con la prima colonna selezionata, i numeri da associare a questo tipo di azione sono, tipicamente, superiori a 1. Nulla vieta, comunque, di associare a più attributi la stessa colonna esito di selezione.
Attenzione: Qualora le azioni che si intendono compiere su archivi esterni ai quali si accede tramite ODBC fossero in numero consistente si suggerisce vivamente di imporre un ordine di valutazione delle azioni che faccia seguire ad ogni ODBC_SELECT le sue azioni di FILL in quanto accedere a più Data Base richiede al programma di aprire nuove "connessioni" e, per fare ciò, il programma stesso potrebbe dover chiudere delle connessioni precedenti perdendo le colonne selezionate e facendo sì che l'operazione di Fill non possa essere compiuta correttamente.
Esempio:
TABELLA.ATTR2=2 ODBC_FILL
odbctest 2
Permettono di riempire l'attributo corrente con l'esito di una selezione effettuata direttamente su di un archivio nel formato HIGHWAY.
L'esito della selezione viene salvato in buffer temporanei e viene sfruttato come l'esito delle selezioni ODBC di cui si è parlato in precedenza. La sintassi richiesta prevede la presenza di un nome d'archivio HIGHWAY, con o senza estensione, che sia separato dalla restante parte del comando da una virgola (,). In caso si voglia interrogare l'archivio corrente si può indicare semplicemente la virgola e l'analizzatore della sintassi del comando interpreterà questo come accesso all'archivio dal quale si compiono le interrogazioni.
Dopo la virgola devono essere presenti i nomi degli attributi che si intendono selezionare, tali attributi possono essere assimilati alle colonne selezionate in una ODBC_SELECT.
Tali attributi, ovvero tali colonne, possono essere riempiti con il contenuto di più attributi alternativamente.
Si ipotizzi di avere un archivio nel quale l'azione che si compie su di un attributo (ad esempio derivato) possa attingere a più tabelle diverse nelle quali l'attributo di interesse può essere diverso. In tal caso si può dichiarare per ogni colonna una serie di attributi, ricercati in sequenza, alternativi l'uno all'altro. Il primo che viene riconosciuto sul documento selezionato verrà assunto come valore valido. La sintassi per tale dichiarazione prevede che si faccia seguire al nome attributi principale un asterisco ed il nome secondario che può a sua volta essere seguito da un ulteriore asterisco a nome attributo.
Non devono essere presenti spazi tra i nomi di attributo, questa dichiarazione deve essere una singola parola composta.
Esempio:
ATTR1*ATTR2*ATTR3.
Valgono, per il comando in oggetto ed il seguente, le raccomandazioni di cui ai comandi ODBC_SELECT e ODBC_FILL.
In aggiunta alla sintassi indicata si possono utilizzare alcuni parametri che permettono di dare un senso diverso alla funzione in oggetto.
Tali parametri sono CHOOSE, LINE, DISTINCT, NO_DEL, SUBST
e SAVELINES e possono essere usati sia singolarmente che in combinazione;
essi agiscono sulla prima "colonna" selezionata con una sola eccezione
di cui parleremo.
permette all'utente di selezionare, tra le potenzialmente
numerose righe selezionate, quelle di suo interesse per evitare di avere
mostrate a video un'insieme di dati potenzialmente poco utili. Nel caso
in cui, appunto, si verifichi una selezione di più righe, in presenza
del parametro CHOOSE viene presentato un Dialogo con un List Box che ci
permette di selezionare l'elemento o gli elementi di nostro interesse,
restringendo, di fatto, la precedente selezione. Questo si riflette, ovviamente,
su tutte le righe di tutte le colonne selezionate. Il presente parametro
ha a sua volta due sottoparametri: MORE e TITLE.
Le funzionalità di CHOOSE non appaiono qualora l'esito della FIND sia pari ad una sola riga di selezione e quindi, in un caso simile, vengono ignorate; per contro tali funzionalità vengono abilitate anche se non esplicitamente richieste quanto la natura dell'attributo esterno che dovrà contenere l'esito della FIND non gli permette di estendersi su più righe e quindi restringere la selezione ad una unica riga diviene d'obbligo. Per intenderci, si assume che sia stato impostato il comando CHOOSE senza parametro MORE (che non avrebbe senso) e senza parametro TITLE.
Si ricorda in questa occasione che l'opzione CHOOSE ed
i suoi sottoparametri vengono ignorati quando il caricamento del documento
è dovuto alle funzioni di generazione dei titoli.
filtra l'esito della FIND eliminando i doppioni. Per doppioni
intendiamo quei documenti nei quali il valore della prima colonna richiesta
risulta uguale ad altro documento selezionato. In casi simili il primo
documento avente tale valore rimane nella lista mentre tutti gli altri
vengono ignorati. Per ovvie ragioni, il parametro DISTINCT non ha senso
in presenza del sotto parametro TITLE del parametro CHOOSE di cui sopra,
per cui, anche se indicato, esso viene ignorato se TITLE è presente.
Appare evidente come il senso del presente parametro sia legato intimamente
al precedente o, per lo meno, trovi applicazione prevalente in tali casi.
Si può comunque indicare anche isolatamente per ottenere una distinzione
automatica su tutta la selezione e per sopperire al caso di attributi esterni
che si estendono su più righe che forza la condizione di CHOOSE.
è stato appositamente previsto per la gestione
di attributi multi istanza, in particolare se appartenenti ad un gruppo.
Esso permette di processare il contenuto di un attributo che scatena una
azione considerando le linee di tale attributo separatamente (es. Un attributo
multi istanza) e di causare tanti risultati separati quante sono le linee
dell'attributo originario. Tali risultati verranno uniti tra loro e disposti
sulle diverse righe degli attributi destinati a contenere l'esito della
selezione.
inibisce la cancellazione di quanto impostato precedentemente
nell'attributo derivato che non avesse più senso dopo il fallimento
della derivazione. In altri termini ci permette di impostare in un attributo
un valore anche se esso non soddisfa le condizioni della ricerca. La condizione
di default è infatti la rimozione del contenuto dell'attributo.
Per contro il parametro SUBST è inversamente stato creato al fine
di forzare in qualsivoglia condizione la sostituzione totale degli elementi
contenuti nell'attributo originario con quanto risultante dalle selezioni.
Il suddetto sottoparametro è disponibile anche per la funzione FILL.
La selezione ottenuta, quando espressa da un attributo mono riga, si attua essenzialmente sulla riga enumerata come riga 1. In questo modo anche i multi istanza sarebbero soggetti alla dichiarazione di riga e quindi subirebbero modifica solo ed esclusivamente per la riga in corso se sono di gruppo. In caso di multi istanza non di gruppo, per contro, le eventuali più righe selezionate verrebbero mantenute tali in assenza di parametro CHOOSE o DISTINCT.
Tali parametri, infatti, richiedono la trasformazione in righe singole di qualsiasi valore al fine di poter mostrare un dialogo ove ad ogni elemento corrisponda una riga in ogni colonna selezionata per poi poter isolare la riga stessa nel momento dell'avvenuta selezione.
Il parametro SAVELINES permette di mantenere le linee differenziate per quegli attributi i quali, a causa dei parametri CHOOSE o DISTINCT, subirebbero la concatenazione su una unica stringa.
Indicato in corrispondenza della FIND influenza anche le FILL che ne conseguono.
I parametri suddetti devono essere indicati tra la parola chiave FIND ed il nome dell'archivio sul quale compiere la selezione (ovvero la virgola se l'archivio è quello attuale) ed il loro ordine è ininfluente, tranne per le opzioni di CHOOSE che pur potendo avere tra loro un qualsiasi ordine, devono seguire obbligatoriamente il parametro CHOOSE stesso.
Per l'azione FIND è inoltre possibile dichiarare modalità particolari di riempimento degli attributi sui quali si compiono le azioni di FIND e FILL.
E' infatti possibile, all'atto della dichiarazione degli
attributi, indicare come colonna da selezionare una serie di attributi
da considerare alternativi tra loro (considerandoli nell'ordine in cui
essi vengono elencati). Tali nomi di attributi devono essere indicati come
unica sequenza di caratteri ove i singoli nomi sono separati dal carattere
asterisco (*). Qualora nel documento selezionato non venga trovato l'attributo
richiesto si procederà al caricamento del secondo attributo
indicato nella lista. Ciò rende più facile la stesura di
azioni che agiscano eventualmente su tabelle differenti aventi in esse
differenti attributi. Si può inoltre richiedere di selezionare,
come colonna esito della FIND, un titolo la cui composizione deve rispettare
le regole della "ComposizioneTitolo".
Per sfruttare questa funzionalità si deve indicare
tra i nomi di attributi che identificano le colonne da selezionare (eventualmente
sotto forma di liste di nomi di attributi in alternativa tra loro) un nome
simbolico preceduto dal carattere meno (-) e deve inoltre essere presente
nella sezione [Actions] una voce corrispondente a tale nome simbolico privo
del meno iniziale che sia sintatticamente paragonabile alla suddetta "ComposizioneTitolo".
Per lo sviluppo di simili azioni si faccia riferimento all'esempio seguente:
Esempio:
TIT=PVCL PVCC
EA_B.RSEO=1 FIND CHOOSE TITLE LINE NO_DEL , -TIT*PVCL*PVCC*OGTD!
[TABELLA]="EA_|RSET|" E ([NUM]=|RSEC|*)
In tale esempio il riempimento dell'attributo RSEO della tabella EA_B dell'archivio in esame viene riempito, in base al tipo di documento esito della selezione, con il Titolo denominato TIT. In assenza di attributi validi per il riempimento di tale titolo si passerà alla selezione del campo PVCL, poi PVCC ed in fine OGTD. Il punto esclamativo termina la dichiarazine degli attributi dai quali vengono estratti i valori di riempimento degli attributi esterni o derivati definiti e viene usato come separatore dalla frase di ricerca di seguito specificata.
Esaurito l'ultimo attributo senza ottenere esito RSEO verrà riempito con un valore vuoto poiché non risultano esistere valori validi.
Strutturalmente più semplice, anche se simile, la funzione FINDFAST permette di indicare un valore singolo (eventualmente racchiuso tra apici se appartenente ad un vocabolario mono valore o a doppia indicizzazione) sa ricercare su di un determinato attributo. Questa funzione può essere invocata con successo anche in sede di caricamento degli attributi esterni ai fini della catalogazione dell'archivio poiché si avvale di una differente tecnologia. La sintassi della prima parte rimane invariata mentre, a seguito del punto esclamativo che isola le colonne da selezionare dalla frase di ricerca, bisognerà indicare esclusivamente il nome dell'attributo ed il valore da ricercare, come già detto, con la possibilità di utilizzare i doppi apici. Il valore indicato dovrà essere esistente come chiave di ricerca nel vocabolario richiesto e non sarà ammesso l'uso di Wild Cards.
Sintassi :
FINDFAST <attributochiaveunivoca> "<valore>"
Esempio:
TABELLA.ATTR1 = 10 FINDFAST
, COL1 COL2 COL3 ! NRECORD "|NREC_PROV|"
Permette di riempire l'attributo corrente con l'esito di una selezione effettuata precedentemente direttamente su di un archivio nel formato HIGHWAY.
La sintassi richiesta prevede la presenza di un nome d'archivio HIGHWAY, con o senza estensione, che sia separato dalla restante parte del comando da una virgola (,). In caso si voglia interrogare l'archivio corrente si può indicare semplicemente la virgola e l'analizzatore della sintassi del comando interpreterà questo come accesso all'archivio dal quale compiamo le interrogazioni. Ovviamente il nome dell'archivio qui indicato serve solo a risalire alla selezione che deve essere già stata effettuata e che quindi deve avere un numero d'ordine di valutazione inferiore al numero attribuito al presente comando.
Dopo la virgola deve essere presente un numero che indichi quale colonna si intende associare all'attributo in esame. Ciò può essere equiparato al comando ODBC_FILL per le selezioni di tipo ODBC.
Per quanto concerne i sottoparametri è per ora disponibile in solo sottoparametro SUBST già discusso nella sezione concernente la funzione FIND.
Valgono, per il comando in oggetto ed il precedente, le raccomandazioni di cui ai comandi ODBC_SELECT e ODBC_FILL.
Esempio:
TABELLA.ATTR5=5 FILL v:\arcsfp\sferr,
2
Permettono di riempire l'attributo corrente con l'esito di un "LookUp" sul vocabolario di un campo di un qualsiasi archivio di tipo HIGHWAY, ovvero di determinare se il valore contenuto nell'attributo in oggetto esiste nel vocabolario dell'attributo indicato.
La sintassi richiesta prevede la presenza di un nome d'archivio HIGHWAY, con o senza estensione, che sia separato dalla restante parte del comando da una virgola (,). In caso si voglia interrogare l'archivio corrente si può indicare semplicemente la virgola e l'analizzatore della sintassi del comando interpreterà questo come accesso all'archivio dal quale compiamo le interrogazioni.
Dopo la virgola deve essere presente un nome di attributo sul quale compiere l'operazione di LookUp. L'attributo in oggetto deve avere proprietà di Chiave (di ricerca) o essere di tipo controllato.
Nel primo caso il valore a seguire deve essere presente una stringa, senza particolari separatori o delimitatori. Per il comando LOOKUP, tutta la restante parte, quindi, viene utilizzata per assumere dal vocabolario del campo richiesto i valori aventi pari radice.
Qualora il valore fosse uno solo esso viene preso senza richiedere alcuna conferma, in presenza di più valori, essi vengono presi in blocco e messi nell'attributo esterno se esso è multi istanza o multi riga, se, al contrario, esso è Mono riga, viene richiesto tramite un dialogo simile a quello citato nella spiegazione delle caratteristiche del comando FIND, di selezionare un unico elemento tra quelli trovati validi nel vocabolario del campo specificato.
Per il comando EXIST, si determina se la chiave indicata esiste esattamente nel vocabolario dell'attributo indicato o, se esso è controllato, se esiste pari Tabella.
Il riscontro rende valido il valore del campo, altrimenti tale valore non viene accettato.
Ricordiamo in questa occasione che, per gli attributi Controllati è sufficiente la presenza del Valore Controllato per rendere Valido l'attributo, mentre per la chiave si richiede che, oltre ad esistere, essa referenzi almeno un documento.
Quest'ultima funzionalità si applica, essenzialmente a campi che non siano esterni ma che siano derivati, che come vedremo più diffusamente con lo sviluppo di questa particolare capacità del server, vengono equiparati dal punto di vista esecutivo ai suddetti campi esterni.
Per tale applicazione l'attributo deve essere Derivato ed Obbligatorio.
In future implementazioni non si esclude che il procedimento possa essere assimilato alla funzione FIND e che quindi si permetta di subordinare la selezione degli elementi esito della FIND a specifici sottoparametri.
Esempio:
TABELLA.ATTR6=6 LOOKUP , PROGRAMMA Prog
TABELLA.ATTR7=7 EXIST , RELATORE
|ATTR7|
Permette l'inserimento in un attributo esterno o derivato, (tipicamente esterno) della lista dei titoli dei documenti che compongono la gerarchia del documento indicato. Per tale scopo è anche possibile indicare un titolo differente dallo standard nella sezione [Titoli] alla voce ComposizioneTitolo. La voce da introdurre nella sezione [Titoli] è ‘ComposizioneAzione’ per la quale si utilizzerà una sintassi equivalente a quella di ‘ComposizioneTitolo’.
La presenza di @NDOC@ è opzionale.
Esempio:
PEZZO.PATH=8 HIER
COMPLETO.ATTR12=12 HIER @NDOC@
Permettono di riempire l'attributo corrente con l'esito di una operazione di composizione di un titolo in base agli elementi presenti nella riga di comando. La sintassi che deve seguire deve essere la stessa che si prevede usualmente per i titoli.
La funzione SET prevede la composizione classica di un titolo, comprendente, ovviamente, tutti gli spazi tra i diversi elementi, eccezion fatta per le descrizioni che iniziano per accento circonflesso. La funzione CATENATE, al contrario, non necessita di simili indicazioni in quanto compone un titolo completo che non prevede la presenza di alcun spazio tra i diversi elementi.
Nota: Le due azioni non prevedono l'indicazione dell'archivio in esame in quanto non si prevede si possano compiere costruzioni di titoli in base al contenuto di campi di altro archivio. Se si intende ottenere un simile risultato bisogna operare con le funzionalità date a disposizione dall'azione FIND in cui si può indicare un differente archivio e si può richiedere l'inserimento in un nostro attributo dell'esito della composizione di un titolo.
Esempio:
PEZZO.CAT=9 CATENATE DATA "N." NUMERO SUBNUM
FONDO.ATTR10=10 SET ATTR4 ATTR5 "^-" ATTR6
PEZZO.COD=11 CATENATE "^@PARTOF@0@4@|NUMERO|@"
DATA
Permette di riempire l'attributo corrente con il valore indicato subito dopo l'identificatore di azione. Questa modalità può sostituire frequentemente le precedenti azioni SET e CATENATE e si presta particolarmente per quelle operazioni che prevedano l'esecuzione di una operazione interna come quelle indicate di seguito tra gli 'Elementi Sostituibili'. Il vantaggio principale sta nell'alleggerimento dei compiti del server il quale, non dovendo costituire dei titoli, compie un minor numero di operazioni e permette eventualmente di compiere generazioni di titoli in cascata (ove appunto uno di essi sia sostituito dalla funzione PUT).
Esempio:
COMPLETO.ATTR13=13 PUT @TITEXT@NRECORD,000006@
L’azione DLL consente di richiamare da parte del motore una o più funzioni incluse in una DLL esterna. Tale DLL può essere liberamente fornita da terza parti.
Il comando ha la sintassi :
DLL <nomescript> <funzionedaeseguire> [<parametri>]
Esempio:
ITEMS.TITLE=3 DLL c:\hwscript HWS_ExecuteScript %2 "|DOCN|"
ITEMS.AUTHORS=4 FILL , 2
ITEMS.PUBLISHER=5 FILL , 3
ITEMS?TITLE=DOCNUMBER
ITEMS?AUTHORS=DOCNUMBER
ITEMS?PUBLISHER=DOCNUMBER
In questo caso il motore per ricavare il valore dell’attributo TITLE chiama la funzione HWS_ExecuteScript con parametri %2 ed il valore corrente dell’attributo DOCN.
La funzione deve assumere in ingresso un array di pointer ai parametri di ingresso e ritornare un array di pointer a stringhe per i valori di ritorno. La prima stringa viene caricata nell’attributo esterno per il quale è definita l’azione, di seguito altri attributi possono ricevere le ulteriori stringhe di ritorno mediante l’azione FILL.
Una particolare DLL è la hwscript.dll. Essa è un esecutore di script che consentono di catturare dati da sessioni trasparenti di terminale VT 100 o TN3270. All’apertura dell’archivio è necessario chiamare gli script HWS_OpenScript per poter compilare e tradurre gli script in una forma interna. A runtime si dovrà chiamare la funzione HWS_ExecuteScript passando come primo parametro il valore ritornato dalla corrispondente HWS_OpenScript. Per far ciò è necessario inserire nella sezione [action] dell’archivio le specifiche :
StartDLL<nn>=<nomeDLL> HWS_OpenScript <nomescript>
StopDD<nn>=<nomeDLL> HWS_ExecuteScript <progressivoscript>
ove <nn> è un numero d’ordine di esecuzione.
Le specifiche STARTDLL<nn> vengono eseguite all’apertura dell’archivio ; le specifiche STOPDLL<nn> vengono eseguite alla chiusura dell’archivio.
Esempio:
[Action]
StartDLL1=c:\hwscript HWS_OpenScript c :\open.txt
StartDLL2=c:\\hwscript HWS_ExecuteScript %1
la precedente istruzione fa eseguire il primo script compilato cioè open.txt (rappresentato da %1)
StartDLL3=c:\hwscript HWS_OpenScript c:\find.txt
StartDLL4=c:\hwscript HWS_OpenScript c:\copy.txt
StopDLL1=c:\hwscript HWS_OpenScript c:\quit.txt
StopDLL2=c:\hwscript HWS_ExecuteScript %4
la precedente istruzione fa eseguire il primo script compilato cioè quit.txt (rappresentato da %4)
ITEM.AVAIL=2 DLL c:\hwscript
HWS_ExecuteScript %2 "|DOCN|"
I parametri delle azioni possono contenere direttive che vengono interpretate dal motore di HIGHWAY al momento della esecuzione delle azioni in modo da comporre l’intero comando nella forma definitiva. In sostanza i parametri possono contenere elementi formali che vengono sostituiti con opportuni valori.
Le direttive sono :
|<NomeCampo>|:
La zona che si presenta nel modo indicato viene sostituita dal contenuto del campo in esame. Ciò permette, ad esempio, di compiere una ricerca su colonne e tabelle diverse in base a quanto riportato in un attributo di HIGHWAY, ovvero di compiere una selezione su un campo di join in base al contenuto di un nostro attributo. Se l'attributo specificato è multi riga, viene riportato il valore contenuto nella prima riga e tutti gli altri vengono ignorati.
Nel caso di attributi Multi Istanza, il valore utilizzato per la sostituzione è quello inerente l’istanza in corso di processamento. Per indicare la completezza di un attributo Multi Istanza, infatti, la sintassi diviene
|*<NomeCampoMultiIstanza>|.
La zona che si presenta nel modo indicato viene sostituita dal valore di una particolare variabile di HIGHWAY o dall'esito dell'esecuzione di una operazione interna. Ciò dipende dalla versione e configurazione del programma, di Windows e di MS-DOS.
Le variabili ambientali riconosciute sono le seguenti:
Il numero fisico del documento è un riferimento
interno : esso può essere dedotto passando dalla visualizzazione
verticale generale alla visualizzazione in dettaglio di un documento :
il numero indicato sulla riga di stato rappresenta il numero fisico del
documento. Per posizionarsi ad un documento dato il numero fisico è
possibile in tale fase utilizzare il comando Vista - Vai al documento.
@PARTOF@<begin>@<MaxChars>@<Value>@:
viene sostituita con una parte di <Value>.
La voce <begin> specifica se si deve partire da un offset rispetto al primo carattere (0 o > 0) oppure dal fondo(-1), mentre la voce <MaxChars> identifica il numero massimo di caratteri da prendere per la sostituzione.
Nel caso in cui <begin> sia -1, ovvero si parta dal fondo del valore, il numero di caratteri da prendere si conta ovviamente all'indietro. Il contenuto di <Value> deriva tipicamente da una precedente sostituzione effettuata tramite un nome attributo racchiuso tra ‘|’. La presente funzionalità può essere sfruttata in azioni diverse anche più di una volta nella stessa azione.
Esempio:
Si assuma un campo di tipo data denominato DATA. Volendo valorizzare un attributo ANNO con il solo anno indicato in DATA l’azione sarà:
@PARTOF@0@4@|DATA|@
poiché il campo data
ha formato AAAAMMGG e con la sintassi indicata noi selezioniamo solo i
primi 4 caratteri (dal carattere 0 per 4 caratteri).
@TITEXT@<NomeCampo>,<Valore>@.
rappresenta il titolo esterno del documento. Per ‘esterno’ si intende che è stato salvato con l’apposito comando Rigenera Titoli di SFUTIL.
Esempio:
@TITEXT@NRECORD,|NREC_PADRE|@.
La compilazione delle azioni da associare agli attributi di uno specifico archivio deve tenere conto di alcune particolarità del programma che, se non ignorate, permetteranno di avere sempre esiti corretti.
Le azioni in oggetto sono tipicamente interrogazioni di tipo HIGHWAY (FIND, FILL) o ODBC (ODBC_SELECT, ODBC_FILL).
Gli accorgimenti in esame valgono per entrambi le tipologie di azioni.
Di seguito parleremo delle operazioni di Selezione riferendoci ad ODBC per non ripeterci inutilmente.
Quando si compila il file.ini di un archivio e si intende su di esso compiere due o più operazioni richiedenti il supporto delle funzionalità ODBC su due o più Data Base differenti è indispensabile concepire l'ordine di valutazione delle azioni stesse seguendo le regole qui riportate:
Per le versioni di HIGHWAY a un posto di lavoro o a più posti in rete con file server, cioè per le piattaforme nelle quali non si ha una architettura distribuita client server, il motore di HIGHWAY prevede una dimensione massima di 64KB, pari a 65536 caratteri, per salvare i valori di tutti gli attributi eccetto quelli definiti a ‘editor multifont’ cioè quelli contenenti testo formattato i quali hanno ciascuno una dimensione massima di 2GB.
Per le versioni del motore di HIGHWAY utilizzate in architettura client server quali la versione per Windows NT o per UNIX la dimensione massima dell’insieme di tutti gli attributi di un documento è di 2GB.
Anche se i valori degli attributi esterni non vengono salvati su disco il motore quando calcola gli attributi esterni carica il loro valore nel documento restituendolo quindi all’interfaccia che lo ha richiesto, tipicamente SFPLUS. Dal momento che quest’ultimo si aspetta una dimensione massima di 64KB per contenere tutti gli attributi eccetto quelli a editor multifont, il motore, nella versione a un posto di lavoro o per più posti in rete opera un troncamento se necessario dei valori degli attributi esterni se non sono stati dichiarati a editor multifont.
Per i campi esterni facenti parte di un gruppo si riducono gli elementi (righe) di ogni campo del gruppo al fine di mantenere allineati i campi tra di loro sino al raggiungimento di una dimensione complessiva accettabile;
Per tutti gli altri campi esterni si procede a troncare il valore sino a portarlo ad una dimensione sufficiente e, se esso è disposto su più righe, si elimina l'ultima riga residua poiché probabilmente essa viene troncata dando luogo ad un valore poco significativo.
Si suggerisce, qualora il programma segnalasse una condizione di perdita di dati, di strutturare il documento in oggetto in modo che dia un esito di dimensioni minori modificando le azioni che generano i dati più ingenti e creando un secondo documento che ne contenga una porzione.
I documenti, in seguito, possono essere posti in relazione
tra loro con le apposite funzionalità di navigazione relazionale
proprie di HIGHWAY.
Gli Attributi derivati sono particolari Attributi interni all'archivio in formato HIGHWAY ma il cui valore è da considerarsi "derivato" dal contenuto di altri attributi sui quali si impongono funzioni di validazione o formule.
Il risultante valore viene inserito nell'attributo e, all'atto del salvataggio, viene a far parte integrante dell'archivio. Il più comune degli utilizzi di tali attributi è l'ottenimento di Codifiche proprietarie di altre tabelle tramite descrizioni mnemonicamente più semplici.
Tali funzionalità, inoltre, possono essere sfruttate, in sede di salvataggio dei documenti e non solo, per imporre sui valori introdotti negli attributi del documento, delle particolari validazioni (es.: Rendo valido il contenuto dell'attributo 'X' solo se esiste già una chiave identica nel vocabolario del campo 'Y' o nelle descrizioni controllate dell'attributo 'K' entrambi presenti in altre tabelle). Per tali scopi, gli attributi devono essere indicati, oltre che derivati, anche Obbligatori.
Gli attributi multi istanza vengono processati osservando le singole istanze, ovvero linee dell'attributo, e quindi operazioni di tipo LOOKUP, EXIST, FIND e FILL, vengono compiute più volte, tante quante sono le righe dell'attributo. Ne consegue che il programma esplode le funzionalità richieste sugli attributi, in modo da processare, nell'ordine stabilito configurato l'archivio.ini, ogni singolo campo per la riga corrente.
Mentre la prima istanza di un 'attributo multi istanza
viene processata secondo il numero d’ordine specificato, le successive
istanze vengono processate dopo il processamento di tutte le altre eventuali
azioni presenti. In sintesi, se le azioni che seguono assumono dati dall'esito
delle operazioni sui multi istanza di gruppo o comunque esiste una dipendenza
di qualsiasi tipo, siamo condizionati alla presenza della sola prima linea,
le altre "appariranno" al termine delle operazioni.
Nella complessa logica dettata dalle regole di riempimento e validazione proprie degli attributi esterni e derivati si deve tenere presente che non tutte le combinazioni di operazioni possono essere effettuate.
In particolare occorre evitare l’esecuzione delle azioni che provocano una ricerca su archivi HIGHWAY che necessita la lettura di documenti i quali a loro volta contengono attributi esterni cui sono associate azioni di ricerca standard.
Una ricerca richiede la lettura di documenti se non è basata esclusivamente su valori contenuti all’interno di attributi chiave bensì contiene requisiti posti su campi non chiave.
Ad esempio mentre una ricerca quale :
[DESTINATARIO] = ROSSI
viene effettuata sulla sola base degli indici e quindi non richiede la lettura di alcun documento,
la ricerca :
[DESTINATARIO] = ROSSI e [DATA_SPED] > "19961001"
richiede la lettura dei documenti aventi destinatario ROSSI per verificarne la data di spedizione.
In quest’ultimo caso se il documento contiene degli attributi esterni che a loro volta richiedono una ricerca mediante il comando FIND su archivi HIGHWAY queste azioni NON vengono eseguite.
Soluzioni :
Definire DATA_SPED come chiave oppure utilizzare l’azione
FINDFAST nelle azioni delle tabelle che contengono i documenti di cui potrebbe
essere richiesta la lettura . Si noti che il comando FINDFAST esegue una
ricerca specifica basata sugli attributi univoci globali che non utilizza
le risorse dei comandi di ricerca di tipo generale.
Al fine di ottenere una corretta struttura delle azioni legate ad un particolare archivio di tipo HIGHWAY, potendo alcuni attributi esterni essere frutto di azioni compiute su altri attributi esterni o derivati, suggeriamo qui di seguito, la metodica per l'implementazione di azioni particolarmente complesse.
Discutiamo inoltre alcune particolarità necessarie
per la definizioni di applicazioni nelle quali esistono delle azioni su
attributi derivati multi istanza associati ad un gruppo.
Si ipotizzi di voler inserire in un attributo derivato di una tabella del vostro archivio un codice presente su un'altra tabella ed identificabile per una particolare descrizione. Potete organizzare due azioni "incatenate" tra l'attributo derivato ed un attributo esterno presente sulla stessa tabella per ottenere i valori richiesti.
Immaginiamo di avere un archivio avente una tabella "Regioni" contenente tra gli altri campi un campo descrittivo del nome della regione ed un campo per il codice ad essa associato ed immaginiamo che tali campi siano univoci, ed una seconda tabella "Codici" nella quale si ha la necessità di ripetere il codice della regione per identificare, come legate a tale regione, le informazioni ivi contenute.
Nella seconda tabella si può provvedere ad imporre le caratteristiche di obbligatorietà e derivazione all'attributo che accoglierà il codice e ad inserire un attributo esterno per completare l'azione. I due attributi saranno "CODICE_REG e NOME_REG.
La struttura della ricerca di cui all'azione CODICI.NOME_REG permette di ottenere un corretto esito qualsiasi sia il valore indicato nell'attributo Derivato. In tal modo si ha modo di permettere una ampia indipendenza all'utente che immette o ricerca i dati.
Esempio:
[Action]
CODICI.NOME_REG=1 FIND CHOOSE , REGIONI COD_REG! [TABELLA]="REGIONI" e ([REGIONI]=|CODICE_REG|* o [COD_REG]=|CODICE_REG|)
CODICI.CODICE_REG=2 FILL , 2
Inserimento e Modifica:
inserendo un valore nell'attributo CODICE_REG, si scatena l'esecuzione delle operazioni legate agli attributi "derivanti", tra i quali abbiamo appunto NOME_REG. Viene quindi compiuta una ricerca sulla tabella "Regioni" richiedendo che il valore degli attributi REGIONI o COD_REG corrispondano a quanto indicato.
Scrivendo "Emil" verrà ricercato "Emil*" sul campo REGIONI ed "Emil" sul campo COD_REG.
L'esito della ricerca servirà per riempire il valore del campo CODICE_REG (FILL, 2) facendovi apparire il codice della regione richiesta. Nell'attributo esterno NOME_REG, se visualizzato nella maschera prescelta, si potrà invece vedere la descrizione della Regione (es.: Emilia Romagna).
Visualizzazione:
All'atto del caricamento del documento in oggetto lo svolgimento
delle azioni porterà al compimento di una ricerca sulla tabella
"Regioni". Questa volta, però, il contenuto del campo derivato che
rappresenta l'elemento sostituibile nella ricerca sarà il codice
della regione in esame, ad esempio "125". Tale valore, venendo cercato
sia negli attributi COD_REG che REGIONI darà comunque il risultato
e la selezione delle colonne REGIONI e COD_REG appunto, permetterà
di riempire l’attributo esterno con la descrizione della regione mentre
l'attributo derivato risulta già riempito del corretto valore di
codice.
Il caso descritto nel punto precedente mostra come organizzare la derivazione di un valore tramite l'utilizzo di un valore presente in altra tabella.
Bisogna ora fare una considerazione: nell'esempio riportato la ricerca viene effettuata sull’attributo esterno e l'attributo derivato viene riempito con l'esito. In pratica, inserendo un nuovo documento, noi scriviamo nel campo del codice l'inizio della parola che vogliamo sia selezionata e vediamo, dopo la validazione in codice corrispondente ma non vediamo nell'attributo esterno (che sarebbe il nome della regione) alcun valore. Per fare ciò, infatti, si richiede che l'azione associata all'attributo derivato si di tipo FIND o ODBC_SELECT. In tal modo, il programma assume che dove c'è una find o una select ci deve essere molto probabilmente una o più operazioni di fill (FILL o ODBC_FILL). Per questo motivo vengono eseguite le istruzioni dei campi esterni. In sintesi, quindi, dovendo scegliere se assegnare l'operazione di FIND all'attributo Derivato o a quello Esterno, possiamo scegliere quello Derivato senza indugio.
Nell'esempio che segue riportiamo l'esempio di cui sopra e la "revisione" dello stesso comando con uguale esito che però conferisce la visibilità dell'esito della ricerca sui campi esterni anche in fase di inserimento.
Ricordiamo che il campo CODICE_REG è Derivato mentre il campo NOME_REG è Esterno.
Esempio:
[Action]
CODICI.NOME_REG=1 FIND CHOOSE , REGIONI COD_REG! [TABELLA]="REGIONI" e
([REGIONI]=|CODICE_REG|* o [COD_REG]=|CODICE_REG|)
CODICI.CODICE_REG=2 FILL , 2
Revisione dell’Esempio:
[Action]
CODICI.CODICE_REG=1 FIND CHOOSE , COD_REG REGIONI! [TABELLA]="REGIONI" e
([REGIONI]=|CODICE_REG|* o [COD_REG]=|CODICE_REG|)
CODICI.NOME_REG=2 FILL , 2
Si noti che le stesse azioni sono state invertire da un
campo all'altro e che l'ordine degli elementi da selezionare (COD_REG e
REGIONI) è stato anch'esso invertito per far sì che l'esito
delle azioni non cambi.
Sviluppando particolari applicazioni aventi attributi derivati multi istanza di gruppo sui quali si intendano effettuare azioni da considerarsi separate riga per riga (opzione LINE dell'azione FIND) accade, naturalmente, che all'atto della validazione degli attributi si abbia la ripetizione della azioni su ogni singola riga e quindi, esiti ambigui, vengono continuamente riproposti con spreco di tempo ed il rischio che si cambi involontariamente un valore già precedentemente consolidato.
Per evitare quanto detto l'Hyper Server può considerare le modifiche da apportare agli attributi oggetto o soggetto di azione in base a quale riga del multi istanza è stata modificata. Per rendere l'applicazione rapida nell'esecuzione di questi controlli supplementari è indispensabile indicare nella sezione [Actions] del <NomeArchivio>.ini delle voci composte come le voci che identificano le azioni ma caratterizzate dalla presenza del carattere "punto interrogativo" (?) al posto del carattere "punto" (.). Tale voce deve contenere una lista di nomi di attributi che condizionano l'esecuzione dell'azione sul campo per il quale si compie questa specificazione, in assenza della quale l'azione sul campo viene eseguita comunque.
E' necessario quindi compilare con molta attenzione la sezione [Actions] nel suddetto file.ini per rendere rapido e corretto il funzionamento delle azioni.
Quanto detto sin ora può essere applicato, per
velocizzare il processo, a qualsiasi attributo anche non multi istanza
o comunque anche non di gruppo.
Le funzionalità delle azioni permettono anche di configurare degli archivi nei quali possono convivere internamente allo stesso gruppo, degli attributi interni ed esterni.
Per permettere un corretto funzionamento del gruppo stesso, il server si preoccupa di compiere il dovuto allineamento delle righe dei singoli attributi. Si sconsiglia, comunque di compiere tali operazioni in quanto esulano dalle caratteristiche standard degli archivi di tipo HIGHWAY. Si fa inoltre notare che, in presenza di versioni precedenti dei programmi di HIGHWAY si ha incompatibilità di gestione degli archivi stessi con conseguente rischio di comportamento inesatto del software.