Questa classe implementa una vista.

Consente, cioè, di eseguire delle interrogazioni su più tabelle.
Le tabelle che si vogliono utilizzare vengono specificate attraverso
il metodo @#Aggiungi. È possibile effettuare chiamate multiple al metodo
in questione oppure una sola chiamata con un vettore di stringhe
rappresentanti i nomi delle tabelle. <BR>
Mentre si aggiungono le tabelle queste vengono automaticamente collegate
tra loro sulla base delle chiavi esterne definite. La classe fa riferimento
ad una variabile globale definita in un sorgente generato automaticamente
dal programma genchest. Questa variabile è una matrice indicizzata su
stringhe; il secondo indice identifica la tabella da cui parte la relazione
(contenente la chiave esterna), il primo identifica la tabella
destinazione. Ogni elemento contiene un vettore di coppie di vettori la cui
semantica è identica a quella dei parametri $vCampiIni e $vCampiFin del
metodo @#Collega, a cui si rimanda.



classe bd_vista implementa Selezione
{
costruttore(&$bd);
Aggiorna(&$valori, $bUsaNomiHtml=FALSO, $bStampa=FALSO);
Aggiungi($tabella, $campi=NULL, $alias=NULL, $tabClg=NULL);
AggiungiCond($nCampo, &$cond);
AggiungiCondMultiTab($iTab1, &$vCampi1, $iTab2, &$vCampi2)
AggiungiSolo($sQuali);
Campo($i); &
Chiave($nCampo);
Chiavi();
Collega($iTabellaIni, $vCampiIni, $iTabellaFin, $vCampiFin, $bCambiaAManuale=VERO);
FormatoCondizione(); &
Formula($formula);
Elimina(&$condizione, $stampa=FALSO);
Esporta(); &
Espressione($id, &$nome, &$cond, ...);
EspressioneMultiTab($id, &$nome, &$cond, ...);
GestisciEventi(&$valoriAggiuntivi, $bStampa=FALSO);
Importa(&$bd, &$stringone); &
IndiceCampo($i);
Inserisci(&$vValori, $bStampa=FALSO);
NomiVarr(); &
NumCampi();
NumChiavi();
NumTabelle();
Ordine($nCampo=NULL, $bDec=FALSO); &
ImpCollegamentoMorbido($bAttivaClgMorbido=VERO);
ImpVisibile($nCampo, $bool=VERO);
PrendiFiltri(); &
PrendiTabella($iTab); &
Seleziona($indice=0, $azzera=VERO, $stampa=FALSO);
Sql(); &
Unisci($vista);
Validita($data);
VettCampi(); &
}

define('COLLEG_STRETTO', 1);
define('COLLEG_MORBIDO', 2);
define('COLLEG_DX', 3);
define('COLLEG_SX', 4);
define('ESPR_MULTI_TAB', -1);
define('FORMULA', -2);

costruttore(&$bd_tab)
Crea una nuova vista.
Se viene passata una bancadati come parametro la vista sarà vuota, altrimenti conterrà la tabella passata.

Aggiungi(&$tabella, $campi=NULL, $alias=NULL, $tabClg=NULL)
questo metodo specifica quali sono le tabelle che si vogliono includere nell'interrogazione. È possibile effettuare chiamate multiple a questo metodo, oppure una sola chiamata con un vettore. I parametri $tabella o, nel caso di tipo vettore, i suoi elementi possono essere, indistintamente, degli oggetti di tipo bd/tabella o delle stringhe che rappresentano i nomi delle tabelle.
Mentre si aggiungono le tabelle queste vengono automaticamente collegate tra loro sulla base delle chiavi esterne definite. La classe fa riferimento ad una variabile globale definita in un sorgente generato automaticamente dal programma genchest.
Se viene specificato anche $campi, solo nel caso in cui venga passato il nome della tabella e non l'oggetto, viene chiamato il metodo bd/tabella.iphp#AggiungiSolo al posto del metodo bd/tabella.iphp#AggiungiTutto passandogli come parametro $campi.
Se l'oggetto tabella ha un alias o se viene indicato il nome della tabella e $alias, allora viene creata una costante con il nome dell'alias che vale l'indice della tabella nella vista. È cura del programmatore mantenere tale alias univoco.
In caso di chiavi esterne multiple è possibile indicare tabClg, come indice di tabella nella vista per segnalare la tabella con la quale collegare questa che si sta aggiungendo.

protetta VerificaAggiungi($tabella)

privata GestisciUltimoAlias()

Unisci(&$vista)
questo metodo unisce alla vista attuale tutte le tabelle, le condizioni, le formule, i collegamenti e gli ordinamenti specificati nella vista passata come parametro.
la prima tabella della vista passata viene automaticamente collegata alle tabelle presenti sulla base delle chiavi esterne definite. La classe fa riferimento ad una variabile globale definita in un sorgente generato automaticamente dal programma genchest.

ImpCollegamentoMorbido($bAttivaClgMorbido=VERO)
Abilita o disabilita il collegamento morbido tra le tabelle.
Il collegamento morbido significa che vengono incluse nella selezione tutte le righe della tabella referente anche se non possiedono nessuna riga nella tabella riferita. I valori delle colonne nella tabella riferita, in questo caso, saranno nulli.
Il collegamento stretto, invece, include nella selezione solo le righe che hanno una corrispondenza nella tabella collegata.
Il valore predefinito è il collegamento stretto.

Collega($iTabellaIni, $vCampiIni, $iTabellaFin, $vCampiFin, $bCambiaAManuale=VERO)
Impone una condizione di uguaglianza sui campi indicati in modo da collegare due tabelle appartenenti alla vista.
$iTabellaIni è l'indice, con base 0, della prima tabella da collegare; l'indice è riferito all'ordine di inserimento della tabella nella vista.
$vCampiIni è un vettore di interi che indicano l'indice, con base 0, delle colonne all'interno della tabella da utilizzare nel collegamento. In caso di colonna singola può essere un valore scalare.
$iTabellaFin e $vCampiFin hanno lo stesso significato dei due parametri precedenti, solo che sono riferiti all'altra tabella che partecipa alla relazione.
Se prima della chiamata a questo metodo esistevano dei collegamenti creati in maniera automatica dal metodo #Aggiungi, questi vengono eliminati se il parametro $bCambiaAManuale è vero.

Seleziona($posizione=0, $azzera=VERO, $stampa=FALSO)

Sql() &
Ritorna un stringa che rappresenta l'sql che verrebbe eseguito in base allo stato corrente dell'oggetto.

Esporta() &
Ritorna un stringa che rappresenta lo stato interno dell'oggetto in modo che possa essere persistito tra due differenti sessioni.
Questa stringa può essere passata come parametro al metodo Importa

statica Importa(&$bd, &$stringone) &
Ripristina lo stato dell'oggetto come descritto dal parametro.
Il parametro dovrebbe essere un valore tornato dal metodo Esporta.

PrendiTabella($iTab) &
Ritorna la tabella contenuta nella vista indicata dal parametro $iTab.
Se il parametro è intero indica l'indice base zero della tabella; le tabelle vengono numerate secondo l'ordine di inserimento.
Se il parametro è una stringa torna la tabella che ha un alias uguale al parametro passato. Nel caso non esistesse nessuna tabella con l'alias specificato verrà restiuita la tabella con il nome indicato; se continua a non essere trovata il metodo torna NULL.

AggiungiSolo($sQuali)
$sQuali è un vettore di stringhe [SN ]* ognuna delle quali serve per impostare la visibilità dei campi delle tabelle.

Espressione($id, &$nome, $cond)
Aggiunge all'insieme dei campi dell'ultima tabella aggiunta un'espressione SQL.
Essa viene identificata tramite una costante identificativa ed un alias. Ad essa possono essere passati un numero variabile di argomenti.
Se il parametro $cond è non nullo allora all'espressione indicata verrà applicato il filtro opportuno.
$nome rappresenta l'alias dell'espressione. È importante notare che il metodo html/protoh::PrendiVisCampo torna un controllo il cui nome è quello del campo (od alias dell'espressione) preceduto da un _ (underscore). Questo per evitare sovrapposizioni non volute con i parametri interni di navigami. Se, invece, si volesse effettuare questa sovrapposizione utilizzare le costanti TAB_NOME_* per valorizzare il parametro $nome.
Se il nome non inizia con - dopo l'inserimento dell'espressione verrà creata una costante chiamata $nome che vale l'indice dell'espressione nella tabella se il nome inizia per _, nella vista altrimenti.
Se $nome inizia per _ l'espressione non sarà inclusa nella selezione, ma potrà solo essere usata per costruire espressioni più complesse.
Questo metodo, a differenza del meno efficiente EspressioneMultiTab, consente di inserire espressioni riguardanti una sola tabella.

EspressioneMultiTab($id, &$nome, $cond)
Aggiunge all'insieme dei campi corrente un'espressione SQL
Essa viene identificata tramite una costante identificativa ed un alias. Ad essa possono essere passati un numero variabile di argomenti.
Se il parametro $cond è non nullo allora all'espressione indicata verrà applicato il filtro opportuno.
$nome rappresenta l'alias dell'espressione. È importante notare che il metodo html/protoh::PrendiVisCampo torna un controllo il cui nome è quello del campo (od alias dell'espressione) preceduto da un _ (underscore). Questo per evitare sovrapposizioni non volute con i parametri interni di navigami. Se, invece, si volesse effettuare questa sovrapposizione utilizzare le costanti TAB_NOME_* per valorizzare il parametro $nome.
Se il nome non inizia con - dopo l'inserimento dell'espressione verrà creata una costante chiamata $nome che vale l'indice dell'espressione nella vista.
Se $nome inizia per _ l'espressione non sarà inclusa nella selezione, ma potrà solo essere usata per costruire espressioni più complesse.
Se $nome inizia per _ l'espressione non sarà inclusa nella selezione, ma potrà solo essere usata per costruire espressioni più complesse o aggiungere condizioni.

Formula($formula, $tipo)
aggiunge una formula o una variabile il cui valore viene calcolato dinamicamente sulla base degli altri valori risultato della selezione.
Consultare dati/variabili per maggiori dettagli sulle formule già implementate. Le variabili hanno un valore cumulativo, mentre le formule hanno un valore calcolato dipendente solo riga corrente.

NomiVarr() &
torna un vettore contenente i nomi di tutte le variabili associate alla vista

privata CampoFormula($pos) &

NumTabelle()
Ritorna il numero di tabelle facenti parte della vista. Lavora in tempo lineare

NumCampi()

NumChiavi()

Campo($nCampo) &
Se $nCampo è un vettore coppia:
- la prima cella deve contenere l'indice della tabella di cui si vuole recuperare il campo, usare le costanti generate da Aggiungi o la costante ESPR_MULTI_TAB
- la seconda cella deve contenere l'indice del campo nella tabella, usare le costanti definite dentro chest.iphp o quelle generate da tabella::Espressione
Se $nCampo è un intero deve valere l'indice progressivo base 0 come se tutti i campi e le espressioni fossero una di seguito all'altra, le espressioni multi tabella sono in fondo. (caso deprecato)

locale PrendiBD() &

IndiceCampo($nCampo)
prende $nCampo con lo stesso formato supportato da Campo e lo trasforma in un indice sequenziale base 0 del campo indicato

VettCampi() &

Chiave($nCampo)

Chiavi($base=0)
Torna un vettore composto da tanti elementi quanti sono i campi chiave, ad ogni elemento è presente l'indice del relativo campo chiave nella tabella.
Il parametro $base è per solo uso interno.

ImpVisibile($posCampo, $bool=VERO)

AggiungiCond($campo, $cond)
Aggiunge all'insieme delle condizioni correnti la condizione indicata, sul campo indicato. $campo è l'indice del campo nella vista con base 0 oppure nella notazione (tab, nCampo).
se la tabella oggetto della condizione è collegata in modo morbido alle altre allora la condizione viene aggiunta nel collegamento in vece che nella sezione WHERE.

Validita($data)
Aggiunge all'insieme delle condizioni correnti una condizione sulla validità delle righe selezionata.
Tale condizione assicura che per tutte le tabelle nella vista, collegate in modo rigido, la data passata sia compresa tra i campi configurati nella variabile globale $__validita che deve essere definita manualmente come un vettore associativo nomeTabella--(campoDataIn,campoDataFine)
La data può essere espressa come valore fisso in formato AAAA-MM-GG, come indice di campo della vista, come coppia (tabella,campo) o come oggetto Campo (appartenente ad una tabella presente nella vista) da cui pescare i valori da confrontare.

PrendiFiltri() &
Ritorna un vettore associativo indiceCampo=>Filtro applicato.
Attualmente ritorna solo i filtri associati alla prima tabella.

FormatoCondizione($base=0) &

GestisciEventi(&$valoriAggiuntivi, $bStampa=FALSO) /*---- Gestisce gli eventi che si sono verificati.
Questo metodo verifica che in GET od in POST sia stata passata una variabile denominata elimina, inserisci o modifica; In questo caso intraprende l'azione opportuna fondendo il parametro $valoriAggiuntivi con le variabili generate dall'utente. In caso contrario non fa nulla.
Ritorna FALSO se nessuna azione viene intrapresa o se questa fallisce, VERO in caso di successo. -

privata UnificaVarGlob()

privata UnificaVarGlobCollegamento($iTab1, $iCampo1, $iTab2, $iCampo2)

Elimina(&$condizione, $stampa=FALSO)
Elimina le righe indicate da $condizione appartenenti all'utente navigami autenticato.
$condizione è una stringa contenente i valori di tutte le chiavi di tutte le tabelle appartenenti alla vista. Per separare i valori vengono usati i seguenti caratteri speciali:

Una stringa siffatta viene costruita usando vsprintf sul metodo FormatoCondizione e Chiavi e dallo script calcCondizione; in caso di necessità, ovviamente, è possibile costruirla manualmente, ma è indicato usare le costanti
SEP_CHIAVI_RIGA
SEP_CHIAVI_TABELLA
SEP_CHIAVI_VALORE
Se il parametro $stampa è impostato a VERO, invece di eseguire il comando esso viene stampato.

privata SpacchettaCondizione(&$condizione) &

Inserisci(&$vValori, $bStampa=FALSO)
inserisce una riga con i valori indicati in $vValori in ogni tabella compresa nella vista. Il parametro deve essere un vettore associativo nomeControlloHtmlNavigami=>valore.
Se una cella non esiste od è vuota nel campo corrispondente verrà inserito il valore di default stabilito dalla basedati.
Se i valori della chiave primaria (o di una parte di essa) non sono stati specificati si cercherà di sostituirli col valore della chiave esterna o con la generazione di un nuovo progressivo.

Aggiorna(&$valori, $bUsaNomiHtml=FALSO, $bStampa=FALSO) /*---- Da un vettore nomecampo => valore aggiorna le righe indicate dalla cella $valori['condizione'] questa è una stringa contenente i valori di tutte le chiavi di tutte le tabelle appartenenti alla vista. Per separare i valori vengono usati i seguenti caratteri speciali:

Una stringa siffatta viene costruita usando vsprintf sul metodo FormatoCondizione e Chiavi e dallo script calcCondizione; in caso di necessità, ovviamente, è possibile costruirla manualmente, ma è indicato usare le costanti
SEP_CHIAVI_RIGA
SEP_CHIAVI_TABELLA
SEP_CHIAVI_VALORE
Se il parametro $stampa è impostato a VERO, invece di eseguire il comando esso viene stampato. -

privata NodoSenzaFigli($indice, &$condizione)

privata CreaCondizione($indice) &

PrendiRiga($vValChiavi) &
Esegue un'interrogazione sulla vista e ritorna la riga da essa restituita.
$vValChiavi è un vettore od un singolo valore dei primi campi della prima tabella.
Se la riga non esiste la funzione torna NULL.

privata PrendiValChiave($indice) &

privata CampiVis() &

privata NomeTabb() &

locale CondizioneSelezione() &

locale CondizioneSelezioneMT() &

locale CondizioneGruppo() &

privata CondizioneSQL($bGruppo) &

privata CalcolaVettCampi()

locale Gruppo() &

privata DaRaggruppare()

Ordine($nCampo=NULL, $bDec=FALSO) &
Se $nCampo viene specificato esso viene aggiunto all'elenco dei campi utilizzati per l'ordinamento; altrimenti viene ritornata la clausola da mettere dopo la parola chiave ORDER BY in una interrogazione SQL.

privata CollegaAutomatico($tabClg)

privata CollegaAutomaticoSingolo(&$chiavi, $iTab1, $iTab2)

privata AllocaCollegamento($iTab1, &$vCampi1, $iTab2, &$vCampi2)

AggiungiCondMultiTab($iTab1, &$vCampi1, $iTab2, &$vCampi2)

locale


costruttore($valore)

Valore()

ValoreBD()

locale, astratta


costruttore($iTabSorg, &$colTabSorg, $iTabDest, &$colTabDest)

ClonaSposta($base)

SqlCollegamento(&$vTab) &

NomeCampo($tab, $col)

Esporta() &

statica Importa(&$str)

astratto Formato() &

astratto Operatore() &

AggiungiCampi($iColSorg, $iColDest)


costruttore($iTabSorg, &$colTabSorg, $iTabDest, &$colTabDest)

Formato() &

Operatore() &


costruttore($iTabSorg, &$colTabSorg, $iTabDest, &$colTabDest)

Operatore() &


costruttore($iTabSorg, &$colTabSorg, $iTabDest, &$colTabDest)

Operatore() &


costruttore($iTabSorg, &$colTabSorg, $iTabDest, &$colTabDest)

Formato() &

Operatore() &