.. _le_stampe/stampe_genropy/stampe_risorsa/tipi_stampa/multipagina_con_griglia/gridStruct: 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 :ref:`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) .. hint:: 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') .. raw:: html
**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 | +------------------------+------+--------------------------------------------------+