.. _le_stampe/stampe_genropy/stampe_risorsa/tipi_stampa/multipagina_con_griglia/dati_righe: Dati righe griglia ================== Il metodo gridData ~~~~~~~~~~~~~~~~~~~~ Dell'oggetto stampa viene sempre chiamato il metodo ``gridData``, il quale ha lo scopo di prendere i dati delle righe. Questo metodo ha un'implementazione di default che consiste nel fare una query e restituire una bag piatta in cui ogni nodo rappresenta un record, i cui campi sono salvati negli attributi. .. note :: Questo tipo di Bag è l'output di un oggetto SqlSelection in modalità **grid**, ovvero lo stesso formato che si usa come datastore delle griglie dei tablehandler. Perché il metodo ``gridData``, nella sua implementazione di default, funzioni correttamente, è necessario che lo sviluppatore implementi il metodo di hook ``gridQueryParameters``, il quale ha lo scopo di definire i parametri di query necessari per ottenere i dati di griglia. Inoltre è necessario che sia implementato il metodo :ref:`gridStruct` che invece fornisce la descrizione delle colonne della griglia. Quali sono e i loro metadati (larghezza ed etichetta in intestazione). gridQueryParameters ~~~~~~~~~~~~~~~~~~~~ Questo metodo deve restituire sempre un dizionario di parametri, i quali verranno usati dal metodo ``gridData``, per interrogare il database e prendere le righe da rappresentare nella griglia. Nell'ipotesi più semplice questi dati provengono da una relazione **one-many** tra il record primario e le sue righe, come nel caso di una fattura o di un ordine. Per questi casi, se alla relazione è stato dato un **relation_name**, posso specificare solamente il parametro ``relation``. :: def gridQueryParameters(self): return dict(relation='@righe') Nel caso riportato nell'esempio ``righe`` è proprio il **relation_name** assegnato alla relazione che sussiste tra la tabella primaria e quella delle righe. Si può notare come tutto questo sia analogo a quanto già facciano nella dichiarazione di un `tablehandler `_. :: pane.plainTableHandler(relation='@righe') Tuttavia, esattamente come accade quando definisco un `tablehandler `_ posso aver bisogno di dover essere più specifico ed esplicito, fornendo altri parametri quali: - ``table`` : il nome della tabella con la consueta sintassi *package_name.table_name* - ``condition`` : il frammento di SQL che rappresenti la condizione da applicare per ottenere la WHERE della query. Tutte le variabili usate dall'espressione ``condition`` devono essere passate come parametri aggiuntivi preceduti dal prefisso ``condition_`` - ``hidden_columns``: eventuali altre colonne aggiuntive Inoltre possono essere passati altri canonici parametri di query come ``order_by``, ``group_by``, ``limit``, che verranno direttamente passati in modo trasparente. Nell'esempio seguente abbiamo una stampa della scheda cliente con una gli ultimi ordini a partire da una data di riferimento, presentati a partire dal più recente. :: def gridQueryParameters(self): return dict(table='mypackage.ordine', condition='$cliente_id = :cid AND $data_ordine > :drif', condition_cid = self.record['id'], condition_drif = self.getData('batch_options.data_riferimento', order_by='data_ordine:DESC')) Avrete forse notato che tra i parametri restituiti da questo metodo non è stato menzionato ``columns``, infatti i campi letti dalla query saranno quelli specificati nel :ref:`metodo gridStruct` . Pertanto nel metodo specifico solo eventuali colonne aggiuntive vengono indicandole nel parametro ``hidden_columns``. Override di gridData ~~~~~~~~~~~~~~~~~~~~ Se si ha l'esigenza di mostrare righe che sono il risultato di un calcolo o dell'aggregazione di dati provenienti da diverse table può essere necessario ridefinire completamente il metodo ``gridData`` e avere così tutta la flessibilità necessaria per creare i dati di riga che ci occorrono. Il risultato restituito dal metodo ``gridData`` può essere: - Una Bag piatta con i dati del record negli attributi - Una lista di dizionari - Un iteratore che restituisce dizionari o oggetti simili a dizionari (come il risultato di una fetch). Righe senza testata ~~~~~~~~~~~~~~~~~~~ Nel caso delle :ref:`stampe di sole righe` possiamo avere nei dati della griglia i record provenienti dalla selezione_corrente.