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_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 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.