Una Griglia Multiselect serve per rendere selezionabili più di una Riga alla volta.
E' possibile però che capiti di avere una Griglia con molte righe e che ciò renda i tempi di creazione/aggiornamento della tabella molto lunghi.
Il problema può essere risolto utilizzando una Multiselect con più Pagine, ma dato che non è ancra implementato un sistema di cattura delle righe precedentemete selezionate dovremo utilizzare la funzione MultiSelezionePost
Con questa funzione potremo:
Per poter utilizzare questa funzione avremo bisogno prima di tutto di una variabile in Session che conterrà tutte le righe precedentemente selezionate, e il nome della griglia:
Le dichiariamo:
.. public $gridLicenze = "gfmConLicenze_gridLicenze"; public $SelezioneTab = array(); ..
Nel construct:
function __construct() { parent::__construct(); try { $this->GAFIERE_DB = ItaDB::DBOpen('GAFIERE'); $this->SelezioneTab = App::$utente->getKey($this->nameForm . '_SelezioneTab'); ...
Nel destruct:
function __destruct() { parent::__destruct(); if ($this->close != true) { App::$utente->setKey($this->nameForm . '_SelezioneTab', $this->SelezioneTab); ...
Nel close:
public function close() { App::$utente->removeKey($this->nameForm . '_SelezioneTab'); Out::closeDialog($this->nameForm); }
Dopo di che chiamiamo la funzione nel onClickTablePager :
... $sql = $this->CreaSql(); $this->SelezioneTab=$this->gfmLib->MultiSelezionePost($this->SelezioneTab,$this->gridLicenze,$sql); ...
Notiamo:
La funzione:
public function MultiSelezionePost($SelezioneTab,$Griglia,$sql){ $Riga='jqg_'.$Griglia.'_'; // PRIMA PARTE foreach ($SelezioneTab as $key => $Result_rec) { if($_POST[$Riga.$key] == '0'){ $_POST[$Riga.$key] = '0'; $SelezioneTab[$key ] = '0'; }else{ if(!Out::valore($Riga.$key,'1')){ $_POST[$Riga.$key]='1'; } } } // SECONDA PARTE $Griglia_tab=ItaDB::DBSQLSelect($this->getGAFIEREDB(),$sql, true);//<- Cambiare il DB foreach ($Griglia_tab as $Griglia_rec) { if( $_POST[$Riga.$Griglia_rec['ROWID']] == '1'){ $NuovaSelezione[$Griglia_rec['ROWID']]='1'; Out::valore($Riga.$Griglia_rec['ROWID'],'1'); }else { if($SelezioneTab[$Griglia_rec['ROWID']] == '1'){ $NuovaSelezione[$Griglia_rec['ROWID']]='0'; } } } return $NuovaSelezione; }
La prima parte della funzione invia in POST anche le row selezionate nella pagina precedente (ovviamente se è la prima pagina non verrà eseguita)
Notiamo:
Nella seconda parte della funzione:
Nel nostro programma avremo quindi la variabile in session $this→SelezioneTab costantemente aggiornato ad ogni evento legato alla tabella.
Nota
Con questa funzione è possibile selezionare oltre 2000 righe, ma nel caso in cui ce ne siano di più è opportuno inserire un bottone che permetta di stamparle direttamente tutte e inserire dei filtri nella ricerca( in modo da smaltire le righe in più).
Per l'output delle righe selezionate, possiamo utilizzare un semplice ciclo:
foreach ($SelezioneTab as $key => $Result_rec) { $SelezioneGrid[]=$key; } $sql=" SELECT * FROM DITTELIC WHERE 1"; $sql.=" AND("; for ($index = 0; $index < count($SelezioneGrid); $index++) { $sql.=" ROWID = $SelezioneGrid[$index] OR"; } $sql=substr($sql,0,-3); $sql.=" )";
$SelezioneTab è l'Array che contiene le righe selezionate.
Ovviamente, se vogliamo passare una $SelezioneTab aggiornata, prima del ciclo, dovremo richiamare nuovamente la funzione MultiSelectPost, in modo che se nell'ultima pagina visualizzata sono state selezionate una o più righe, vengano aggiunte anch'esse all'array:
... $sql = $this->CreaSql(); $this->SelezioneTab=$this->gfmLib->MultiSelezionePost($this->SelezioneTab,$this->gridLicenze,$sql); ...
Con il ciclo, rielaboriamo l'array in modo da ottenere le varie $key,che sono l'indice(ROWID), in sequenza.
Dopo di che, in questo esempio, all'sql aggiungiamo la condizione ROWID = N OR per ogni elemento dell'array, in modo da selezionare tutti gli indici(ROWID) che corrispondono a quelli selezionati.
Avremo un risultato del genere:
SELECT * FROM DITTELIC WHERE 1 AND( ROWID = 2 OR ROWID = 3 OR ROWID = 35 )
7 visualizzazioni.