.. _orm_genropy/triggers/defer_to_commit: deferToCommit ============= In caso di inserimenti o modifiche multiple, ad esempio l'aggiunta o la rimozione simultanea di molte righe di un documento di tipo testata/righe (un ordine, una fattura, un documento di trasporto), può essere utile **posticipare un evento** al momento del *commit*, al fine di ridurre il numero di scritture al minimo indispensabile. .. hint:: Questo è particolarmente evidente in presenza di :ref:`Trigger` che intervengono all'inserimento o alla modifica di un record: se per esempio viene usato un *trigger_onInserted* per effettuare un (ri)calcolo dei totali dell'ordine, questo processo verrebbe ripetuto a *ogni* inserimento di nuova riga. Genropy mette a disposizione il metodo ``deferToCommit``, che permette di rinviare la chiamata a un altro metodo sino al momento del *commit*. Ad esempio in `Sandbox `_, nel :ref:`model` di ``fattura_riga`` troviamo:: def aggiornaFattura(self,record): fattura_id = record['fattura_id'] self.db.deferToCommit(self.db.table('fatt.fattura').ricalcolaTotali, fattura_id=fattura_id, _deferredId=fattura_id) La chiamata a *ricalcolaTotali* (effettuata tramite i *trigger* a ogni inserimento, modifica o eliminazione di una riga) viene così posticipata al momento del *commit*, evitando di ripetere l'operazione a *ogni singola* modifica. Si noti che il metodo *deferToCommit* riceve: - il **metodo** la cui chiamata si vuole **posticipare** (in questo caso *ricalcolaTotali*) - i **parametri** richiesti dal metodo (in questo caso *fattura_id*) - un altro parametro facoltativo ``_deferredId``, che indica la **pkey della testata**, al variare della quale verrà comunque eseguito il metodo da posticipare (in questo caso, il ricalcolo non verrà effettuato al commit di tutte le operazioni, ma al termine delle operazioni relative alle righe della *stessa* fattura) .. sectionauthor:: Davide Paci