Metodi condizionali per th_struct e th_sections

Definire toolbar aggiuntive e struct condizionate

Tra le opzioni disponibili e le possibilità di utilizzo delle sections e struct multiple, esiste la possibilità di condizionarne il funzionamento a seconda del verificarsi di determinate condizioni sui dati.

Data la complessità dell’argomento non possiamo non avvalerci di esempi pratici per dare l’idea di utilizzo e dei risultati che si possono ottenere.

Ci avvarremo come esempi della tabella cliente di Sandbox opportunamente modificata allo scopo.

Prerequisiti

Prima di analizzare il codice di esempio vediamo quali sono i requisiti richiesti e quale sarà il risultato finale.

  1. creare un toolbar superiore per ospitare nuovi pulsanti per selezionare i clienti in base al fatturato (tutti, con fatture, senza fatture)

  2. creare una bottoniera che condizionata dalla scelta della tipologia del cliente consenta di visualizzare una ulteriore bottoniera per la selezione dei clienti con fatturato basso, medio, alto e che dovrà essere visibile solo per i clienti con almeno una fattura

  3. nel caso di selezione dei clienti con fatture, venga utilizzata anzichè la struct di default del cliente, una struct modificata che mostri anche il totale fatturato.

Vediamo ora il risultato finale, prima di vedere la sua implementazione:

../../../_images/th_sect_struct_cond_01.png

Nell’immagine A) se selezioniamo «tutti» o «senza acquisti», la view rimane la stessa e mostra i dati del cliente…

../../../_images/th_sect_struct_cond_02.png

tuttavia, non appena si seleziona «con acquisti» appare una nuova bottoniera che consente di filtrare i clienti in base al fatturato «basso», «medio» o «alto» ed inoltre la grid mostra una diversa struttura che comprende anche i dati del fatturato del cliente.

Vediamo ora come tutto ciò si reaìlizzi in appena qualche decina di righe di codice dove ci concentreremo in particol modo per quanto riguarda il cambio di struct condizionato e la visualizzazione condizionata della seconda bottoniera.

Per i dettagli relativi alla costruzione delle sections si faccia riferimento alla specifica sezione Metodo th_sections mentre per la realizzaizone della toolbar vedere Metodo th_top

class View(BaseComponent):

  # 1.
  def th_struct(self,struct):
      r = struct.view().rows()
      r.fieldcell('ragione_sociale')
      r.fieldcell('indirizzo')
      r.fieldcell('comune_id')
      r.fieldcell('provincia')

  # 2.
  def th_struct_contotali(self,struct):
      "Vista con totali fattura"
      r = struct.view().rows()
      r.fieldcell('ragione_sociale')
      r.fieldcell('indirizzo')
      r.fieldcell('n_fatture')
      r.fieldcell('tot_fatturato',format='#,###.00')

  # 3.
  def th_top_toolbarsuperiore(self,top):
      top.slotToolbar('5,sections@acquisti,10,sections@volumeacquisti,*,sections@cliente_tipo_codice,5',
                      childname='superiore',_position='<bar',
                      gradient_from='#999',gradient_to='#666')
  # 4.
  @metadata(variable_struct=True)
  def th_sections_acquisti(self):
      return [dict(code='tutti',caption='Tutti'),
              dict(code='con_acquisti',caption='Con Acquisti',
              # 5.
              condition='$n_fatture>0',struct='contotali'),
              dict(code='senza_acquisti',caption='Senza Acquisti',condition='$n_fatture=0')]

  # 6.
  @metadata(_if='acq=="con_acquisti"',_if_acq='^.acquisti.current')
  def th_sections_volumeacquisti(self):
      #7.
      return [
          dict(code='basso',condition='$tot_fatturato<:tot',caption='Basso',
                  condition_tot=5000),
          dict(code='medio',condition='$tot_fatturato>=:mintot AND $tot_fatturato<:maxtot',
                  caption='Medio',
                  condition_mintot=5000,condition_maxtot=100000),
          dict(code='grande',condition='$tot_fatturato>:maxtot',
                  caption='Alto',
                  condition_maxtot=100000)
      ]

Esaminiamo i dettagli significativi:

#1. Definizione della struct di default della view del cliente

#2. Viene definita una struct alternativa che mostrerà anche il numero di fatture ed il fatturato. La descrizione «Vista con totali fattura» sarà visualizzata nel menù delle viste disponibili (vedi nota a fine sezione)

#3. Viene definita una toolbar superiore con tre bottoniere: a sx una sections acquisti che prende regole e caption dei pulsanti dalla th_sections_acquisti, una a dx sections cliente tipo codice (le etichette vengono create automaticamente in base alla tabella cliente_tipo e al centro una bottoniera sections volumeacquisti che prende le definizioni dalla function th_sections_volumeacquisti (#6.)

#4. Viene definita la sections_acquisti che utilizza il decoratore variable_struct per poter utilizzare struct diverse

#5. Per la sezione «con_acquisti» viene impostata una struct diversa da quella di default, in particolare la struct «contotali» definita al (#2.)

#6. Questo blocco di codice è la parte più complessa.
  • viene utilizzato un decoratore _if che testa la condizione…

  • “acq==»con_acquisti» dove:

  • il parametro _if_acq preso al datapath «^.acquisti.current» (ovvero il valore attuale della th_sections_acquisti indicato dal «code» del pulsante selezionato) sia uguale a «con_acquisti»

  • Riepilogando:

  • se nella sezione th_sections_acquisti è selezionato il secondo pulsante il cui code è uguale al valore “con_acquisti”, allora la condizione è vera e la bottoniera viene visualizzata, altrimenti non compare.

#7. Il resto della funzione ha una logica simile alla th_sections_acquisti con queste specificità:
  • nella th_sections_acquisti viene impostata una condizione che verifica la presenza di fatture (condition=”$n_fatture>0” o condition=”$n_fatture=0”)

  • th_sections_volumeacquisti viene impostata una condizione che verifica il volume del fatturato con tre livelli:

  • basso: minore di 5000

  • medio: compreso tra 5000 e 10000

  • alto: superiore a 10000

  • quindi quando i vari pulsanti vengono selezionati, la grid viene ripopolata con i record che soddisfano la nuova condizione.

La nuova struct definita al punto #2.) compare comunque, con la descrizione assegnata (nel nostro esempio «Vista con totali fattura») nel menù delle viste disponibili che possono essere selezionate dall’utente.

../../../_images/th_vista_struct_menu.png

Parametri:

Nome parametro

Tipo

Descrizione

multivalue

B

Se impostato a True consente di poter effettuare selezioni multiple di valori di partizionamento dei dati

multiButton

L

Permette di indicare un numero di bottoni oltre il quale la bottoniera si convertirà in tendina (es: multiButton=5)

variable_struct

B

Se impostato a True permette di selezionare nelle sections una determinata th_struct precedentemente definita (es: struct=»clienti con_acquisti»)

_if

T

Utilizzando il parametro «_if» seguito da una variabile javascript all’interno del decoratore metadata, è possibile rendere sensibile la struct o la section al verificarsi di una determinata condizione

Autore della sezione: Valter Vettorello