Loading

Errore 'You have uncommitted work pending. Please commit or rollback before calling out." (Lavoro non confermato in sospeso. Confermare o abortire il lavoro prima di effettuare una chiamata).

Data pubblicazione: Apr 24, 2026
Descrizione

Le chiamate non sono consentite se è presente una transazione non confermata in sospeso. Se ad esempio viene impostato un punto di salvataggio prima di un'operazione DML, non è possibile effettuare una chiamata in base ai risultati di tale operazione per confermare o ritirare il punto di salvataggio

Scenario di esempio:
Quando si tenta di eseguire un punto di salvataggio, si inserisce un account per individuare i duplicati e ritirarli, quindi una chiamata a webservice per inviare i dati a un sistema esterno. Prima della chiamata a webservice, tuttavia, può essere visualizzato l'errore 'You have uncommitted work pending. Please commit or rollback before calling out." (Lavoro non confermato in sospeso. Confermare o abortire il lavoro prima di effettuare una chiamata).

 
Questo errore possono essere causati dai seguenti passaggi: 
  1. L'utente inserisce informazioni nell'interfaccia utente per creare un nuovo cliente e fa clic su Salva
  2. Il sistema crea un punto di salvataggio, quindi inserisce il record cliente. 
  3. Si attiva il trigger per la ricerca di duplicati.
  4. Se non sono presenti duplicati, si torna all'inserimento del record cliente in base al punto di salvataggio impostato al passaggio 2. 
  5. Il sistema chiama webservice per inviare i dati del nuovo cliente a un sistema esterno e ricevere un ID esterno.
  6. Il sistema archivia il nuovo cliente in SFDC con l'ID esterno.


 
Risoluzione

Non è possibile eseguire chiamate con transazioni in sospeso nel contesto della richiesta. Inoltre, non è possibile eseguire una conferma esplicita. Una soluzione temporanea, quindi, è l'esecuzione della chiamata in un contesto separato. 
Non è possibile eseguire un'operazione DML prima di una chiamata. Tutte le operazioni DML devono essere invocate solo dopo il completamento delle chiamate. Pertanto, eseguire prima una chiamata a webservice, quindi salvare la richiesta.
Se si devono eseguire più chiamate, salvare tutte le richieste in un elenco o in una mappa e pubblicare le chiamate man mano che vengono salvate.
L'esecuzione dei passaggi in questo ordine funziona correttamente 
query
chiamata
query
chiamata
inserimento
chiamata
chiamata 
chiamata
inserimento o aggiornamento

Il seguente scenario di passaggi genera un errore:
chiamata
inserimento
chiamata <---- qui si verifica l'errore
  1. È necessario confermare la transazione, eseguire la chiamata prima di qualsiasi modifica nel database o spostare la chiamata in un metodo @future (inserire l'annotazione @future nel metodo webservice).
  2. Suddivide la transazione in due processi Ajax separati. Il primo inserisce il record e il secondo effettua la chiamata ed è in grado di aggiornare il record appena inserito.
  3. È possibile salvare i record e quindi rispondere all'utente con una pagina temporanea con un messaggio di caricamento in corso mentre si esegue il callback per effettuare la chiamata. Per rendere l'operazione fluida, è anche possibile eseguire diverse chiamate AJAX successive per salvare i record ed effettuare una chiamata mentre viene visualizzato di messaggio di caricamento in corso dopo che l'utente ha fatto clic sul pulsante "Salva".
  4. Se non si desidera inserire annotazioni @future nel metodo webservice, è possibile eseguire un'azione per inserire l'oggetto, quindi eseguire la chiamata a webservice per l'evento oncomplete di un commandButton. Restituire quindi un PageReference, fornendo all'utente un feedback immediato. Se la chiamata a webservice restituisce un errore, eliminare l'oggetto e riportare l'utente nella stessa pagina.
Pagina VisualForce
<apex:actionFunction name="executeWS" action="{!executeWS}"></apex:actionFunction>  <apex:commandButton value="Save" action="{!save}" oncomplete="executeWS()" />
Controller
public PageReference save() {  insert obj; } public PageReference executeWS(){  obj = [SELECT ...];  try{ callout ws;  } catch(System.Exception ex){ delete obj; ApexPages.addMessages(e); return null;  }  return new PageReference('/' + id); }

Per maggiori informazioni, seguire il link correlato Error - 'Callout from triggers are currently not supported' (Errore: chiamate da trigger attualmente non supportate)
Numero articolo Knowledge

000385708

 
Caricamento
Salesforce Help | Article