.. _orm_genropy/orm_genropy/model/column: Definire una colonna ==================== .. toctree:: :maxdepth: 1 :hidden: :titlesonly: sysFields colgroup Una volta definita una :ref:`Table` è possibile procedere con la definizione di tutte le colonne. Oltre alle :ref:`Colonne di sistema` automatiche, non obbligatorie e per le quali rimandiamo a una sezione dedicata, è possibile inserire manualmente colonne "reali" con l'utilizzo di ``column``:: tbl.column('codice' ,size=':10',name_long='!![it]Codice') tbl.column('descrizione' ,size=':50',name_long='!![it]Descrizione') Alternativamente, è possibile inserire delle :ref:`Colonne virtuali` :: tbl.formulaColumn('n_fatture',select=dict(table='fatt.fattura', columns='COUNT(*)', where='$cliente_id=#THIS.id'), dtype='L',name_long='N.Fatture') tbl.aliasColumn('clientenome','@cliente_id.ragione_sociale',name_long='Cliente') Indipendentemente dal tipo di colonna, sarà sempre possibile specificare: - un ``name``, generalmente implicito - una ``size``, ovvero un numero di caratteri per il campo - un ``name_long``, un ``name_short`` o un ``name_plural``, ovvero nomi *friendly* lungo, corto e plurale - un ``dtype`` tra quelli disponibili (si veda la sezione seguente) - dei meccanismi di validazione con ``validate_`` seguito dalla condizione di validazione o da attributi addizionali - una serie di attributi accessori (si rimanda alla sezione *Parametri*) I dtype ------- Per ogni colonna è possibile specificare un ``dtype``, ovvero il tipo di campo (testuale, numerico, ecc), al fine di una corretta gestione dal parte dell'ORM. È possibile scegliere tra una serie di tipi predefiniti: - ``T`` per i campi testo, di default se non specificato - ``N``, ``I``, ``L``, per i campi numerici - ``X`` per i campi `Bag `_ - ``B`` per i campi Booleani con valori *True*, *False* o *Null* - ``D``, ``H``, ``DH`` per gli oggetti di tipo data, ora, data e ora - ``P`` per le immagini Si noti che il sistema cercherà in ogni momento di individuare automaticamente il tipo di campo inserito, tuttavia si consiglia di specificare manualmente il tipo di campo per aumentare il grado di controllo sull'esito di questo processo. Oltre a questi tipi predefiniti è comunque possibile specificare dei *dtype* personalizzati a livello di package. Ad esempio, all'interno del *main* del package *fatt* troviamo:: def custom_type_money(self): return dict(dtype='N',format='#,###.00') def custom_type_percent(self): return dict(dtype='N',format='##.00') Specificando quindi ``dtype='money'`` come attributo di una qualsiasi colonna di una tabella del package *fatt* verrà utilizzato il *dtype* personalizzato. Si noti che con ``format`` abbiamo affinato la visualizzazione del campo numerico come desideravamo. .. raw:: html
**Parametri:** +------------------------+------+--------------------------------------------------+ | Nome parametro | Tipo | Descrizione | +========================+======+==================================================+ |name |T |Generalmente implicito, definisce il nome della | | | |colonna (es: 'nome') | +------------------------+------+--------------------------------------------------+ |size |L |Permette di definire il numero dei caratteri del | | | |contenuto della colonna (es: size=':22') | +------------------------+------+--------------------------------------------------+ |dtype |T |Permette di indicare il datatype tra quelli | | | |disponibili di default ('T', 'B', 'X', 'I', 'L', | | | |'N', 'D', 'H', 'DH', 'P') o customizzati. Se | | | |omesso è sempre dtype='T' | +------------------------+------+--------------------------------------------------+ |name_long |T |Permette di definire il name_long ("friendly | | | |name") della colonna (es: name_long='Nome e | | | |Cognome') | +------------------------+------+--------------------------------------------------+ |name_plural |T |Permette di definire un friendly name al plurale | | | |(es: 'Numeri di telefono') | +------------------------+------+--------------------------------------------------+ |name_short |T |Permette di indicare un friendly name abbreviato | | | |(es: name_short='Pr.') | +------------------------+------+--------------------------------------------------+ |group |T |**Deprecato, sostituito dai colgroups** Permette | | | |di indicare un codice di raggruppamento, affinché | | | |le colonne siano raggruppate sotto un'unica voce | | | |nel selettore delle colonne di destra del | | | |tablehandler | +------------------------+------+--------------------------------------------------+ |unmodifiable |B |Se impostato a True, il campo non sarà più | | | |modificabile una volta che è stato salvato (sarà | | | |quindi possibile solo il primo inserimento alla | | | |creazione del record) | +------------------------+------+--------------------------------------------------+ |unique |B |Introduce un vincolo di unicità, corrispondente | | | |all'SQL UNIQUE. Di default la primary key è sempre| | | |unique=True, ma è possibile assegnare questo | | | |parametro anche ad altre colonne (per es. in caso | | | |di colonne con contatori) | +------------------------+------+--------------------------------------------------+ |values |T |Se sono presenti solo un limitato numero di valori| | | |predeterminati per la colonna, questi vanno | | | |indicati in questo campo (es: tbl.column('type', | | | |name_long='type', | | | |values='RESPONSE,UPDATE,MESSAGE_TAG,CONTACT')) | +------------------------+------+--------------------------------------------------+ |subfields |T |In caso di Bag contenente i dynamic fields di una | | | |tabella in relazione, permette di indicare la | | | |colonna con i campi da mostrare e che riempiranno | | | |la Bag (es: tbl.column('custom_fields', dtype='X',| | | |name_long='Custom Fields', subfields='type_id')) | +------------------------+------+--------------------------------------------------+ |indexed |B | | +------------------------+------+--------------------------------------------------+ |_sendback |B | | +------------------------+------+--------------------------------------------------+ |defaultFrom |T |Permette di indicare un valore da ereditare e | | | |mostrare come default nella Form, partendo da una | | | |relazione (es: | | | |defaultFrom='@parent_id.voce_fatturazione_id' in | | | |caso di figlio di una tabella gerarchica, o | | | |defaultFrom='@tipo_prodotto_id.tipo_iva' in caso | | | |di una relazione). | +------------------------+------+--------------------------------------------------+ |plugToForm |B |Se impostato a True, permette di mostrare | | | |direttamente il field nella Form della tabella, | | | |senza necessità di modificare la risorsa. | | | |Particolarmente utile in caso di customizzazioni | | | |di package. | +------------------------+------+--------------------------------------------------+ |sql_value |T |Permette di inserire una formula di calcolo del | | | |valore della colonna, a livello di sql (quindi | | | |ricalcolata a ogni operazione di insert/update, | | | |es: sql_value=":area_modulo_dflt||'/'||:codice_mod| | | |ulo_dflt") | +------------------------+------+--------------------------------------------------+ | *Validations Parameters* | +------------------------+------+--------------------------------------------------+ |validate\_ |T |Permette di definire i parametri di validazione | +------------------------+------+--------------------------------------------------+ |validate_notnull |B |Se impostato a True rende il riempimento della | | | |colonna obbligatorio | +------------------------+------+--------------------------------------------------+ |validate_len |L |Permette di indicare una lunghezza affinché il | | | |campo della colonna sia valido (es: | | | |validate_len='2:40') | +------------------------+------+--------------------------------------------------+ .. sectionauthor:: Davide Paci