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.

Suggerimento

Questo è particolarmente evidente in presenza di 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 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)

Autore della sezione: Davide Paci