.. _orm_genropy/orm_genropy/scrittura/valori_predefiniti: Valori predefiniti ================== pkeyValue ~~~~~~~~~ Come abbiamo visto in fase di :ref:`Definizione di una table` , in Genropy è possibile utilizzare qualsiasi campo della tabella come *primary key*. Di default questa corrisponde alla colonna di sistema *id* di Genropy, ovvero una serie di 22 caratteri casuali. Al momento della :ref:`insert` viene invocato il metodo di *Table* ``pkeyValue``:: new_pkey = tbl_prodotto.pkeyValue() print (new_pkey) gW6zRisfP6iKjwpD6DM2qg Se si desidera usare un **proprio algoritmo** o un **metodo alternativo per assegnare i valori alla primary key**, scavalcando quindi quello di sistema di Genropy, è possibile ridefinire nella :ref:`Tabella` il metodo ``pkeyValue`` per fargli fare l'autoassegnazione ad una colonna specifica secondo un criterio a piacere (es: valori che vengono ad esempio compilati in form o ricevuti da un processo di importazione da sistemi esistenti) .. hint:: In caso di *primary key* di tipo numerico, la ``pkeyValue`` è in grado di riconoscere la *serialità* e provvederà a restituire l'ultimo valore incrementato di 1. .. md5=True, dovrebbe creare un campo __rec_md5 con la data di aggiornamento ma non lo fa perché il trigger è vuoto invalidFields=True / invalidRelations=True / hdepth, non usati da nessuna parte hierarchical_root_id / hierarchical_virtual_roots defaultValues ~~~~~~~~~~~~~ Con il metodo *defaultValues* è possibile proporre un valore di default durante la compilazione di una Form per creare un record. Il metodo può essere utilizzato all'interno della classe ``Table`` del nostro model per "far risparmiare" all'utente tempo nella compilazione o alternativamente per precompilare un campo di sistema non visibile all'utente. Per esempio, si potrebbe andare a precompilare la colonna ``data`` della table con la ``data di lavoro`` inserita durante il login:: def defaultValues(self): return dict(data=self.db.workdate) sysRecord ~~~~~~~~~~ Con il metodo *sysRecord* è possibile innescare la generazione automatica di un record al lancio della ``gnrdbsetup -u`` (o ``-U``). L'unico prerequisito è che la tabella utilizzi i *sysFields*. Affinché il metodo funzioni correttamente, è necessario utilizzare il decoratore ``@metadata``. Vediamo ad esempio come popolare la tabella *progetto_evento_tipo* con un record di nome *start*, uno di nome *end* e uno per gli eventi generici di *log*:: from gnr.core.gnrdecorator import metadata class Table(object): def config_db(self,pkg): tbl = pkg.table('progetto_evento_tipo',pkey='codice',name_long='Tipo evento', name_plural='Tipi evento',caption_field='descrizione', defaultDataset=True, lookup=True) tbl.column('codice',size=':8',name_long='Codice',name_short='Codice',unique=True,indexed=True) tbl.column('descrizione',name_long='Descrizione',name_short='Descrizione') self.sysFields(tbl, id=False) @metadata(mandatory=True) def sysRecord_START(self): return self.newrecord(codice='START', descrizione='Partenza progetto') @metadata(mandatory=True) def sysRecord_END(self): return self.newrecord(codice='END', descrizione='Conclusione progetto') .. sectionauthor:: Davide Paci