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