.. _orm_genropy/virtual_columns/formulaColumn/formulaColumn_dinamiche: formulaColumn dinamiche ======================= Supponiamo di voler calcolare, nella tabella *prodotto* di `Sandbox `_ il totale fatturato per ogni regione. Ciò richiederebbe la creazione di *n* formulaColumn, una per ogni regione, così costruite:: tbl.formulaColumn('fatt_LOM', select=dict(table='fatt.fattura_riga', columns='SUM($prezzo_totale)', where='$prodotto_id=#THIS.id AND @fattura_id.@cliente_id.@provincia.regione=:reg', reg='LOM', dtype='N', name_long='Fatturato LOM', group='fatt_reg') Non avendo però la tabella delle regioni a disposizione, in fase di definizione del model, l'unica opzione sarebbe quella di inserire manualmente la lista delle regioni e inserire la generazione delle formulaColumn all'interno di un ciclo, soluzione però poco pratica e poco versatile, dal momento che richiede da parte nostra la conoscenza e l'elencazione degli elementi (in questo caso le regioni) sui quali innescare il ciclo. In alternativa, Genropy mette a disposizione le formulaColumn dinamiche, ovvero dei metodi di hook ``formulaColumn_``, che permettono al loro interno di eseguire le :ref:`operazioni di lettura` necessarie e innescare cicli che restituiscono al termine una lista di dizionari che descrivono le nostre formulaColumn :: def formulaColumn_dati_regionali(self): regioni = self.db.table('glbl.regione').query().fetch() result = [] for r in regioni: result.append( dict(name=f'fatturato_{r["sigla"]}', select=dict(table='fatt.fattura_riga', columns='SUM($prezzo_totale)', where='$prodotto_id=#THIS.id AND @fattura_id.@cliente_id.@provincia.regione=:reg', reg=r['sigla']), dtype='N', name_long=f'Fatturato {r["sigla"]}', group='fatt_reg')) return result Si noti l'utilizzo di ``group``, che permette, se preventivamente :ref:`definito un gruppo nella table` , di raggruppare tutte le formulaColumn così generate sotto un unico gruppo nell'albero delle viste e delle query. .. raw:: html
**Parametri:** +------------------------+------+--------------------------------------------------+ | Nome parametro | Tipo | Descrizione | +========================+======+==================================================+ |value |T |Generalmente implicito, permette di calcolare un | | | |valore secondo una regola definita come una | | | |stringa di SQL | +------------------------+------+--------------------------------------------------+ |static |B | | +------------------------+------+--------------------------------------------------+ |select |T |Alternativamente al value calcolato, la | | | |formulaColumn può restituire un valore originato | | | |da una query, i cui parametri possono essere | | | |indicati con un dizionario all'interno di questo | | | |parametro. Può contenere tutti i parametri di una | | | |query ("table", "where", "columns", "condition", | | | |"order_by", "limit") | +------------------------+------+--------------------------------------------------+ |var\_ |T |È possibile passare tutte le variabili che si | | | |vuole alla formulaColumn precedute da var_ (es: | | | |var_data_rif='2015-01-01'), in questo modo non | | | |andranno a mischiarsi agli altri parametri. | +------------------------+------+--------------------------------------------------+ |ask |T |Permette di identificare in un dizionario i | | | |parametri da richiedere all’utente al | | | |trascinamento della colonna nella vista, che | | | |verranno poi utilizzati dalla colonna (es. ask=dic| | | |t(title='Regione',fields=[dict(name='regione', | | | |tag='dbSelect', table='glbl.regione', | | | |lbl='Regione')])) | +------------------------+------+--------------------------------------------------+ |fieldname |T |In caso di formulaColumn parametriche permette di | | | |pre-impostare un template per la generazione del | | | |nome della colonna, così da non richiederlo | | | |all'utente (es: fieldname='tot_fatt_$data_rif') | +------------------------+------+--------------------------------------------------+ |header |T |In caso di formulaColumn parametriche permette di | | | |pre-impostare un template per la generazione | | | |dell'etichetta della colonna, così da non | | | |richiederla all'utente (es: header='Tot.Fatt. al | | | |$data_rif') | +------------------------+------+--------------------------------------------------+ .. sectionauthor:: Davide Paci