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.
Nota
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 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_namecondition
: il frammento di SQL che rappresenti la condizione da applicare per ottenere la WHERE della query. Tutte le variabili usate dall’espressionecondition
devono essere passate come parametri aggiuntivi preceduti dal prefissocondition_
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 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 stampe di sole righe possiamo avere nei dati della griglia i record provenienti dalla selezione_corrente.