.. _package/adm/counter: I counter ========= Genropy offre un sistema predefinito di gestione contatori per la tabella, definibile con il metodo ``counter_nomecolonna``, dove *nomecolonna* è la colonna per la quale vogliamo che Genropy generi automaticamente il progressivo secondo le regole stabilite:: def counter_protocollo(self,record=None): #F14/000001 return dict(format='$K$YY/$NNNNNN', code='F', period='YY', date_field='data', showOnLoad=True, recycle=True) .. showOnLoad finisce nei kwargs? Serve dirlo? .. Quali altri parametri ci sono? Il metodo ritorna un dizionario con un formato secondo quanto definito nel parametro ``format``: in questo caso un codice ('F') seguito dall'anno e da un numero progressivo di 6 cifre. Si noti che è prevista di default la presenza di: - un ``code``, serie di caratteri che verranno sostituiti nella *K* del *format* - un ``date_field``, la colonna della tabella che individua una data - un ``period``, la codificazione del *date_field* per anno, mese, data completa, ecc È possibile poi utilizzare una serie di altri attributi. Ad esempio, ``showOnLoad=True`` permetterà di visualizzare il *counter* già in fase di inserimento del record e non solo dopo il salvataggio, mentre ``recycle=True`` permetterà di rigenerare automaticamente i contatori riempiendo i "buchi" in caso di eliminazione dei record (se non presente, i contatori andranno riallineati manualmente nel'apposita voce di menu di sistema). .. hint:: È buona norma assegnare alla colonna che conterrà il contatore il parametro ``unique=True``, garantendosi automaticamente in questo modo l'unicità del valore in caso di :ref:`duplicazione` . Vediamo un altro esempio con alcuni attributi accessori:: def counter_protocollo(self, record=None): pars = dict(format='$K$YY.$NNNNN', period='YY', code=record['categoria'], date_field='data', recycle=False, date_tolerant=True, message_dateError="Impossibile creare riga in data corrente. Ultima riga in data %(last_used)s", message_failed='La riga ha ricevuto un protocollo differente da quello in precedenza allocato: %(sequence)s') return pars .. hint:: Oltre alla definizione del proprio metodo "counter", è necessario comunicare alla tabella che questa farà uso di un contatore, indicando nei :ref:`sysFields` :: self.sysFields(tbl, counter=True) .. sectionauthor:: Davide Paci