Loading

Erreur « Vous avez des travaux non engagés en attente. Engagez-les ou annulez-les avant l'appel externe »

Date de publication: Apr 24, 2026
Description

Les appels externes ne sont pas autorisés lorsqu’il y a une transaction non engagée en attente. Par exemple, si un point d’enregistrement est défini avant une opération DML, aucun appel externe ne peut être effectué sur la base des résultats de cette opération pour engager ou annuler le point d’enregistrement

Exemple de scénario :
Lorsque vous tentez de définir un point d’enregistrement, insérez un compte pour rechercher les doublons et les annulations puis un appel externe webservice pour envoyer les données de compte vers un système externe. Mais avant l’appel webservice, l’erreur « Vous avez des travaux non engagés en attente. Engagez-les ou annulez-les avant l'appel. » peut s’afficher.

 
Les étapes suivantes peuvent être à l’origine de cette erreur : 
  1. Vous saisissez des informations sur l’IU pour créer un client et cliquez sur Enregistrer
  2. Le système crée un point d’enregistrement puis insère l’enregistrement du client. 
  3. Activation des déclencheurs pour rechercher les doublons.
  4. S’il n'y a pas de doublon, l’insertion de l’enregistrement du client est annulé en fonction du point d’enregistrement défini à l’étape 2. 
  5. Le système appelle un webservice pour envoyer les nouvelles données client au système externe et obtenir un ID externe en échange.
  6. Le système enregistre le nouveau client dans SFDC avec l’ID externe.


 
Résolution

Vous ne pouvez pas effectuer d’appels externes avec des transactions en attente dans le contexte de la requête. De même, il n’est pas possible d’effectuer un engagement explicite. Par conséquent, pour résoudre le problème, vous pouvez effectuer l’appel externe dans un contexte distinct. 
Vous ne pouvez pas effectuer une opération DML avant un appel externe. Toutes les opérations DML doivent être invoquées une fois que les appels externes sont terminés. Par conséquent, effectuez d’abord un appel webservice puis enregistrez la requête.
Si vous effectuez plusieurs appels externes, enregistrez toutes les requêtes dans une liste ou mappez et publiez les appels externes lorsque vous les enregistrez.
Suivez les étapes dans l’ordre suivant 
requête
appel externe
requête
appel externe
insertion
appel externe
appel externe 
appel externe
insertion ou mise à jour

Le scénario d’étapes suivant échoue :-
appel
insertion
appel externe <---- échoue ici
  1. Vous devez soit engager la transaction, effectuer l’appel externe avant d’effectuer des changements de base de données, soit déplacer votre appel externe vers une méthode @future (place l’annotation @future sur la méthode webservice).
  2. Divisez la transaction en deux processus Ajax séparés. Le premier processus insère l'enregistrement, et le deuxième exécute l'appel et peut mettre à jour le nouvel enregistrement inséré.
  3. Vous pouvez enregistrer les enregistrements puis répondre à l’utilisateur avec une page temporaire et un message « En cours de chargement » lors du deuxième rappel pour effectuer l’appel externe. À des fins de transparence, vous pouvez aussi effectuer des appels AJAX successifs pour enregistrer les enregistrements et effectuer un appel externe lorsque l’utilisateur voit le message « En cours de chargement » lorsqu’il clique sur le bouton « Enregistrer ».
  4. Si vous ne souhaitez pas placer l’annotation @future sur la méthode webservice, vous pouvez exécuter une action pour insérer l’objet puis exécuter l’appel externe webservice sur l’événement oncomplete d’un commandButton. Ensuite, réexécutez une PageReference en publiant un commentaire immédiat à l’utilisateur. Si l’appel externe webservice renvoie une erreur, supprimez l’objet et renvoyez l’utilisateur à la même page.
Page Visualforce
<apex:actionFunction name="executeWS" action="{!executeWS}"></apex:actionFunction>  <apex:commandButton value="Save" action="{!save}" oncomplete="executeWS()" />
Contrôleur
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); }

Pour plus d’informations, voici un lien associé sur Erreur - « Les appels externes des déclencheurs ne sont actuellement pas pris en charge »
Numéro d’article de la base de connaissances

000385708

 
Chargement
Salesforce Help | Article