La struttura della griglia¶
Il metodo gridStruct¶
Per definire la griglia della stampa occorre prima di tutto fornire la descrizione della sua struttura e questo avviene implementando il metodo gridStruct
, il quale serve definire molte informazioni sulla griglia che vogliamo stampare:
Quali colonne desidero rappresentare
La larghezza in millimetri di ciascuna colonna
Il titolo di ciascuna colonna, da mostrare nel grid_header
Se una colonna deve avere un calcolo di totali
Eventuali raggruppamenti di colonne
Questo metodo presenta fortissime analogie con il metodo th_struct che viene definito in una risorsa View di un tablehandler. L’unica differenza è che qui occorre specificare la larghezza con l’attributo mm_width
.
Il metodo riceve un oggetto struct
nel quale si definisce il modello per le righe, dopodiché si possono usare gli elementi cell
e fieldcell
per definire le colonne.
def gridStruct(self,struct):
r = struct.view().rows()
r.fieldcell('data_scrittura', mm_width=11, name='Data')
r.fieldcell('numero_esteso',mm_width=15, name='N.Op')
r.fieldcell('numero_riga',mm_width=6, format='000', name='R.', style='text-align:right;')
r.fieldcell('conto_codice_desc', mm_width=40, name='Conto', white_space='normal')
r.fieldcell('dare', mm_width=14, name='Dare')
r.fieldcell('avere', mm_width=14, name='Avere')
causale_width= 20 if self.page_orientation == 'V' else 30
r.fieldcell('causale_descrizione', mm_width=causale_width, name='Causale', white_space='normal')
r.fieldcell('descrizione_stampa', mm_width=0, name='Descrizione', white_space='pre-line' )
r.fieldcell('estremi_protocollo', mm_width=32, name='Protocollo')
Ricordiamo che fieldcell si usa per colonne che sono definite nel model di una table di database. Ovviamente il suo valore del parametro field
dovrà coincidere con il nome della colonna usato nel model. L’uso di fieldcell
permette di ottenere i metadati come il data type, name_long e name_short dal database model.
L’elemento cell invece viene usato se la colonna non esiste nel database ma solo nel datastore o se viene definita estemporaneamente come formula.
In questo esempio vediamo la definizione di gridStruct per rappresentare le righe della fattura nella stampa della fattura definita nel package fatt, all’interno del progetto Sandbox.
def gridStruct(self,struct):
r = struct.view().rows()
r.fieldcell('prodotto_id', mm_width=0, name='Prodotto')
r.fieldcell('quantita', mm_width=10)
r.fieldcell('prezzo_unitario', mm_width=20)
r.fieldcell('aliquota_iva', mm_width=20)
r.fieldcell('prezzo_totale', mm_width=20, name='Totale')
r.fieldcell('iva', mm_width=20)
Suggerimento
Si noti che nella struct sarà sempre disponibile l’intero record o gli interi record oggetto della stampa, comprensivi anche di tutte le colonne virtuali anche se non staticizzate.
I parametri principali delle colonne¶
Sia l’elemento cell
che fieldcell
hanno i seguenti parametri.
Il primo parametro è obbligatorio ed è l’identificativo della colonna. Se sto usando l’elemento fieldcell
deve essere una colonna appartenente ad una table del database ed il suo valore deve coincidere con il nome della colonna. Può anche essere una colonna in relazione rispetto a quella della table di riferimento e posso riferirmi ad essa usando il path di relazione con il carattere @ . Ad esempio @prodotto_id.peso. Inoltre ricordiamo che è possibile riferirsi direttamente ad una colonna foreign-key per vedere invece in stampa il corrispondente campo indicato come caption_field. Quindi posso indicando ad esempio cliente_id
vedere in stampa la ragione sociale del cliente, se questa era stata indicata come caption_field della table cliente.
Se invece sto usando l’elemento cell
il valore di field
altrimenti deve coincidere con la key usata nel datastore della stampa in modo tale che sia sempre rispettata la corrispondenza tra struct e datastore.
sqlcolumn¶
Se si vuole rappresentare in colonna il risultato di un’espressione SQL, senza definire una apposita formulaColumn nel model si può usare il parametro bisogna specificare tale espressione nel parametro sqlcolumn
prezzi.cell('tot_qt', sqlcolumn='SUM($quantita) AS tot_qt', name='Tot Qt', mm_width=20)
columnset¶
È possibile inoltre raggruppare le colonne della stampa in set di colonne definibili all’interno del metodo gridStruct
, esattamente come si farebbe nella definizione di una th_struct
di un Tablehandler
prodotto = r.columnset('prodotto', name='Dati prodotto',
background='rgba(38, 88, 32, 1.00)',
cell_background='rgba(38, 88, 32, 0.20)')
prodotto.fieldcell('@prodotto_id.codice',mm_width=25, name='Codice')
prodotto.fieldcell('prodotto_id', name='Nome')
prodotto.fieldcell('@prodotto_tipo_id.descrizione', name='Tipo')
Parametri:
Nome parametro |
Tipo |
Descrizione |
---|---|---|
mm_width |
T |
è la larghezza della colonna espressa in millimetri |
name |
T |
è il titolo della colonna che voglio mostrare nell’header, se sto usando fieldcell il suo valore di default è letto dagli attributi name_short e name_long della colonna corrispondente, nella definizione del model. |
format |
T |
è una stringa che rappresenta il pattern di formattazione che voglio dare ad un dato di tipo data o numerico. Ad esempio #,###.00 |
dtype |
T |
è il tipo di dato nella solita codifica. Se si usa fieldcell non serve perché il dtype è ricavato dal model |
totalize |
B |
è un valore booleano che si può attribuire ad una colonna numerica se si desidera che venga calcolato e visualizzato il suo totale nel grid_footer |
subtotal |
B |
è un valore booleano. Se True il sistema ordinerà le righe in base a questa colonna ed ogni spezzamento creerà una riga di subtotale |
subtotal_caption |
T |
indica l’etichetta che la riga di subtotali deve mostrare in stampa |
subtotal_order_by |
T |
Permette di indicare la colonna sulla base della quale ordine i subtotali |