.. _tablehandler/ViewResource/advanced_methods/th_sections_method: Metodo th_sections ================== .. toctree:: :maxdepth: 1 :hidden: :titlesonly: th_struct_sections_variable remote_sections th_monthlySections Come partizionare i dati con delle bottoniere ed azioni predefinite ------------------------------------------------------------------- Nella normale gestione di una tabella possono nascere esigenze funzionali per cui l'utente abbia la necessità di effettuare **selezioni con condizioni preimpostate** in modo da rendere veloce partizionare i dati in base a determinati criteri. Per esempio la tabella cliente di :ref:`Sandbox` , contiene un toolbar superiore con dei pulsanti: .. image:: /_static/images/ViewResource/advanced_methods/th_sections_method/th_sections_cliente_01.png :width: 500px :align: center e sul lato destro della stessa toolbar companiono altri pulsanti .. image:: /_static/images/ViewResource/advanced_methods/th_sections_method/th_sections_cliente_02.png :width: 222px :align: center Il funzionamento dei pulsanti è abbastanza esplicito. Nel primo caso è possibile selezionare i clienti in base a tre criteri: - tutti i clienti (senza alcuna restrizione) - solo i clienti che abbiano almeno una fattura - solo i clienti senza alcuna fattura registrata Nel secondo caso è possibile visualizzare i clienti per tipologia: - tutti - i clienti definiti "importanti" - i clienti "normali" Vediamo ora come si realizza tutto questo. Prerequisiti ------------ Come si può facilmente notare dalla prima immagine, è stata aggiunta una barra per ospitare i pulsanti nella nuova toolbar, per fare ciò consultare la sezione :ref:`Metodo th_top definizione toolbar aggiuntive` Sections manuali e sections automatiche --------------------------------------- Una volta creata la toolbar (superiore o inferiore) per ospitare i pulsanti per partizionare la tabella, vediamo ora come riepire la toolbar creata, iniziando con una **section manuale** Riprendiamo il codice della *view* cliente: :: def th_sections_acquisti(self): return [dict(code='tutti',caption='Tutti'), dict(code='con_acquisti',caption='Con Acquisti', condition='$n_fatture>0'), dict(code='senza_acquisti',caption='Senza Acquisti',condition='$n_fatture=0')] :: def th_top_toolbarsuperiore(self,top): top.slotToolbar('5,sections@acquisti,10,sections@volumeacquisti,*,sections@cliente_tipo_codice,5', childname='superiore',_position='` , concentriamoci sugli altri elementi che legano le due funzioni: .. image:: /_static/images/ViewResource/advanced_methods/th_sections_method/th_sections_cliente_03.png :width: 725px :align: center 1) tramite il nome si lega la funzione ``th_section_acquisti`` con uno dei pulsanti definiti nella toolbar. 2) il pulsante prenderà dalla sections il nome (``code``) e l'etichetta visualizzata (``caption``) 3) anche la condition ovvero la condizione che filtrerà i dati verrà presa dalla *section* specificando una colonna fisica della tabella ed una condizione che deve essere soddisfatta, in questo caso "$n_fatture > 0" ovvero che il cliente abbia almeno una fattura. Per il dettaglio della colonna vedere il model cliente del progetto :ref:`Sandbox` . 4) definizione del contenuto dei bottoni: 5 pixel a sx, disegna una prima pulsantiera in base alla definizione della sections_acquisti, "*" indica uno spazio "elastico", disegna una seconda pulsantiera "automatica", vedi prossimo paragrafo, e infine lascia 5 px sul lato destro 5) si tratta di una section "automatica" trattata nel prossimo paragrafo. Sections automatiche -------------------- Oltre a poter definire delle sections nel modo appena descritto, che partizionano i dati con delle sezioni create ad hoc, esiste la possibilità di "selezionare" i dati in base al contenuto di una colonna della tabella. Nel precedente esempio, non esiste una *section* ``cliente_tipo_codice`` in questo caso "magicamente", dato che non esiste una section specifica, ma che la section si riferisce ad una colonna della tabella, viene eseguita una ``select distinct`` che prendendo il codice e la descrizione della tabella cliente_tipo (in relazione con la tabella cliente) costruisce i pulsanti che consentono di poter filtrare i clienti in base al tipo: .. image:: /_static/images/ViewResource/advanced_methods/th_sections_method/th_sections_cliente_02.png :width: 222px :align: center **Questo si ottiene in modo "automatico"; ovviamente dovrà essere analizzata con attenzione la colonna su cui fare questa operazione dato che i pulsanti vengono creati dal sistema.** Naturalmente esistono anche altri modi di creare dei "sezionatori" dei dati in base ai criteri limitati solo dalla fantasia. Vediamo un esempio di codice che crea una bottom bar con le lettere dell'alfabeto che selezionano i clienti in base alla lettera scelta: :: @metadata(multivalue=True) def th_sections_iniziali(self): result = [dict(code='tutti',caption='Tutti')] for c in 'ABCDEFGHILMNOPQRSTUVZ': result.append(dict(code=f'inizio_{c}',caption=c, condition="$ragione_sociale ILIKE :inizio || '%%'", condition_inizio=c)) return result def th_bottom_bottoniera(self,bottom): bar = bottom.slotToolbar('*,sections@iniziali,*') con questo risultato .. image:: /_static/images/ViewResource/advanced_methods/th_sections_method/th_bottom_cliente_01.png :width: 450px :align: center la direttiva @medatata(multivalue=True) consente di poter fare in modo che i pulsanti non siano mutamente esclusivi, ma che se premuti con shift, la lettera selezionata andrà ad aggiungersi all'eventuale selezione già presente; per fare questo andrà inoltre importato il relativo decoratore dalla libreria: :: from gnr.core.gnrdecorator import metadata Le sections sono anche protagoniste di un nostro Tutorial sul Blog: `Come arricchire le viste con le Sections `_ Il codice sorgente usato per gli esempi è scaricabile da questa pagina. .. raw:: html
**Parametri:** +------------------------+------+--------------------------------------------------+ | Nome parametro | Tipo | Descrizione | +========================+======+==================================================+ |multivalue |B |Se impostato a True consente di poter effettuare | | | |selezioni multiple di valori di partizionamento | | | |dei dati | +------------------------+------+--------------------------------------------------+ |multiButton |L |Permette di indicare un numero di bottoni oltre il| | | |quale la bottoniera si convertirà in tendina (es: | | | |multiButton=5) | +------------------------+------+--------------------------------------------------+ |variable_struct |B |Se impostato a True permette di selezionare nelle | | | |sections una determinata th_struct precedentemente| | | |definita (es: struct="clienti con_acquisti") | +------------------------+------+--------------------------------------------------+ .. raw:: html
**Allegati:** - `th_cliente `_ .. sectionauthor:: Valter Vettorello