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 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:

../../_images/querybysample.png

Questo tutorial ci mostra come utilizzare correttamente le queryBySample per filtrare i risultati di una query utilizzando menu a tendina o checkbox:


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:

../../_images/query_bysample_01.png

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»)

Suggerimento

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.

../../_images/query_bysample_02.png

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'),
../../_images/query_bysample_03.png

Naturalmente cambiando alcuni parametri si possono ottenere risultati diversi:

../../_images/query_bysample_04.png

in questo caso:

il primo checkboxtext senza con parametro popup=False e il secondo senza down arrow hasDownArrow=False

Parameters:

Parameter name Type Description
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.

Autore della sezione: Valter Vettorello