.. _tablehandler/ViewResource/advanced_methods/th_querybysample_method: Metodo th_queryBySample ======================= Come impostare criteri di ricerca predefiniti --------------------------------------------- La view grid di **Genropy** offre di default la possibilità di effettuare ricerche su una colonna specifica della tabella stessa come indicato nella sezione :ref:`Metodo th_query` . Molto spesso, però, in un'applicazione si ha la necessità di effettuare ricerche complesse incrociando criteri di ricerca che coinvolgono più colonne del modello relazionale; a supporto di questa esigenza si può ricorrere all'implementazione di *query* più complesse che consentono proprio di incrociare molteplici parametri per effettuare la selezione dei dati: le *queryBySample*. Questa nuova modalità di interrogazione dati non sostituisce ma si aggiunge alla funzione standard di ricerca, l'utente portà cambiare quindi in qualsiasi momento la modalità di ricerca. Quando attivata, la toolbar superiore della ricerca si presenta in questo modo: .. image:: /_static/images/ViewResource/advanced_methods/querybysample.png :width: 700px :align: center Questo tutorial ci mostra come utilizzare correttamente le queryBySample per filtrare i risultati di una query utilizzando menu a tendina o checkbox: .. raw:: html
Vediamo ora un esempio molto semplice di come si implementa questa nuova funzione di ricerca, in seguito verrà arricchito estendendone le funzionalità. :: #1. def th_queryBySample(self): #2. return dict(fields=[ #3. dict( field='ragione_sociale', lbl='Cliente', width='15em'), ], #4. cols=3, #5. isDefault=True) Esaminiamo il codice: #1. - Per implementare il nuovo metodo, si dovrà innanzitutto aggiungere al file risorsa una nuova funzione di hook chiamata ``th_queryBySample`` che non riceve acun parametro e ritorna solo dei valori. #2. La funzione deve ritornare un dizionario di ``fields``... #3. ... con nidificato un altro dizionario di attributi per ogni field, dove: - **field** è il nome della colonna dela database su cui effettuare la ricerca - **label** per rappresentare il campo sul form - **width** la sua larghezza #4. all'interno del primo dizionario andrà aggiunto il numero di colonne della form di ricerca **cols** #5. Il parametro **isDefault** (di default impostato a "False") determina se all'apertura della *view* debba essere preimpostata la ``query semplice`` o la ``queryBySample``. Il risultato sarà il seguente: .. image:: /_static/images/ViewResource/advanced_methods/query_bysample_01.png :width: 515px :align: center come possimao notare cambia l'aspetto e viene proposta come predefinita la nuova tipologia di ricerca. Vale la pena di sottolineare che, in questo caso, l'operazione eseguita effettua una ricerca di tipo "LIKE" anche con più valori come indicato in figura e questo, al di là della semplicità dell'esempio offre un grado di flessibilità in più. Questo tuttavia era solo un assaggio delle moleplici possibilità offerte dalla implementazione ed utilizzo di questo nuovo modo di selezionare i dati, che diventa molto interessante se si aggiunge la possibilità di selezionare valori da tabelle in relazione. Vediamo un esempio che aggiunge la possibilità di selezionare il tipo cliente: :: def th_queryBySample(self): return dict(fields=[ dict(field='ragione_sociale', lbl='Cliente', width='15em'), #6. dict(field='cliente_tipo_codice', lbl='Tipo Cliente', tag='dbselect', op='equal', table='fatt.cliente_tipo', popup=True, hasDownArrow=True, width='15em'), ], cols=3, isDefault=True) #6. È stata aggiunta un nuovo dict per effettuare la selezione di un determinato tipo di cliente con alcuni parametri aggiuntivi di cui esaminiamo il significato: - **tag** indica il tipo di operazione in questo caso una dbselect - **op** operazione, in questo caso *equal*, diversamente dal caso precedente in cui il criterio (di default) era *contains* - **table** indica la tabella da cui selezionare i valori - **popup** se True, visualizza la finestra di popup di selezione dei dati (di default "False") - **hasDownArrow** visualizza un pulsante per far apparire la finestra di selezione dei valori (di default "False") .. hint:: Esclusivamente nel caso della dbselect è possibile per il momento utilizzare ancora "dbtable" al posto di "table", ma questa possibilità è da considerarsi deprecata. È tuttavia possibile che in qualche esempio o tutorial sia ancora in uso la dizione precedente. .. image:: /_static/images/ViewResource/advanced_methods/query_bysample_02.png :width: 511px :align: center e cambiando solo qualche parametro è possibile cambiare il modo di selezionare i dati ed effettuare una selezione multipla: :: dict(field='cliente_tipo_codice', lbl='Tipo Cliente', #7. tag='checkboxtext', op='in', table='fatt.cliente_tipo', popup=True, width='15em'), .. image:: /_static/images/ViewResource/advanced_methods/query_bysample_03.png :width: 521px :align: center Naturalmente cambiando alcuni parametri si possono ottenere risultati diversi: .. image:: /_static/images/ViewResource/advanced_methods/query_bysample_04.png :width: 450px :align: center in questo caso: il primo checkboxtext senza con parametro **popup=False** e il secondo senza down arrow **hasDownArrow=False** .. È importante sottolineare che in questo caso, **op='in' consente di effettuare selezioni con valori multipli.** DAV Abbiamo visto che in realtà dal momento che la checkbox opera come se in una normale textbox i valori fossero separati da virgola, la ricerca equivale a una OR (... IN ...) e di conseguenza questo è inesatto. L'operatore quindi in questo caso può essere omesso senza conseguenze. .. raw:: html
**Parametri:** +------------------------+------+--------------------------------------------------+ | Nome parametro | Tipo | Descrizione | +========================+======+==================================================+ |tag |T |"checkboxtext" per elenco checkbox, "dbselect" per| | | |menu a tendina, "numbertextbox" "currencytextbox",| | | |"datetextbox". Di default: "textbox", ovvero campo| | | |testuale | +------------------------+------+--------------------------------------------------+ |op |T |"in", "greater than", "equal" per corrispondenza | | | |esatta. Di default: "contains" | +------------------------+------+--------------------------------------------------+ |table |T |Permette di indicare la table da cui reperire i | | | |dati, nel formato package.table | +------------------------+------+--------------------------------------------------+ |popup |T |Se impostato a True visualizza la selezione o le | | | |checkbox in un popup | +------------------------+------+--------------------------------------------------+ |hasDownArrow |T |Se impostato a True visualizza la freccia accanto | | | |alla tendina per la selezione. | +------------------------+------+--------------------------------------------------+ .. sectionauthor:: Valter Vettorello