Loading

Fehlermeldung "Bei Ihnen ist noch ausstehende Arbeit vorhanden. Führen Sie einen Commit- oder Rollback-Vorgang aus, bevor Sie ein Callout erstellen."

Veröffentlichungsdatum: Apr 24, 2026
Beschreibung
Callouts sind nicht erlaubt, wenn eine noch ausstehende Arbeit vorhanden ist. Wenn z.B. vor einer DML-Operation ein Speicherpunkt gesetzt wird, kann auf der Grundlage der Ergebnisse dieser Operation kein Callout durchgeführt werden, um den Speicherpunkt  festzulegen oder zurückzusetzen.

Beispiel:
Wenn Sie versuchen, einen Speicherpunkt zu setzen, fügen Sie ein Konto ein, um Duplikate zu finden und ein Rollback durchzuführen, und dann einen Webservice-Callout, um die Kontodaten an ein externes System zu senden. Aber bevor der Webservice ausgeführt wird, sehen Sie möglicherweise den Fehler "Bei Ihnen ist noch ausstehende Arbeit vorhanden. Führen Sie einen Commit- oder Rollback-Vorgang aus, bevor Sie ein Callout erstellen."

 
Die folgenden Handlungen können zu diesem Fehler führen: 
  1. Sie geben Informationen über die Benutzeroberfläche ein, um einen neuen Kunden anzulegen, und klicken auf Speichern
  2. Das System erstellt einen Speicherpunkt und fügt dann den Kundensatz ein. 
  3. Trigger werden durchgeführt, um Duplikate zu finden.
  4. Wenn keine Duplikate vorhanden sind, wird das Einfügen des Kundendatensatzes basierend auf dem in Schritt 2 festgelegten Speicherpunkt rückgängig gemacht. 
  5. Das System startet einen Webservice, um die neuen Kundendaten an ein externes System zu senden und eine ExternalID zurück zu erhalten.
  6. Das System speichert den neuen Kunden im SFDC zusammen mit der externen ID.
Lösung
Callouts mit ausstehender Arbeit im Request-Kontext können nicht ausgeführt werden. Außerdem ist es nicht möglich, einen expliziten Commit durchzuführen. Eine Zwischenlösung besteht also darin, den Callout in einem separaten Kontext durchzuführen. 
Es ist nicht möglich, vor einem Callout eine DML-Operation auszuführen. Alle DML-Operationen sollten erst aufgerufen werden, nachdem die Callouts abgeschlossen sind. Erstellen Sie also zuerst einen Webservice-Callout und speichern Sie dann die Anfrage. 
Wenn Sie mehrere Callouts durchführen, speichern Sie alle Anforderungen in einer Liste oder einer Map und speichern Sie die Callouts nach dem Callout.
Die Ausführung der folgenden Schritte wird zum gewünschten Ergebnis führen
Anfrage
Callout
Anfrage
Callout
einfügen
Callout
Callout
Callout
einfügen oder aktualisieren

Die folgenden Schritte werden fehlschlagen :-
Callout
einfügen
Anruf <---- schlägt hier fehl
1. Sie müssen entweder die Transaktion festschreiben, den Callout vor jeglichen Datenbankänderungen ausführen oder Ihr Callout in eine @future-Methode übertragen (@future-Annotation in die Webservice-Methode einfügen).
2. Teilen Sie die Transaktion in zwei separate AJAX-Prozesse auf. Der erste fügt den Datensatz ein und der zweite führt den Callout aus und kann den neu eingefügten Datensatz aktualisieren.
3. Sie können die Datensätze speichern und dann dem Benutzer mit einer temporären "Laden"-Meldung antworten, während Sie den zweiten Aufruf zur Durchführung des Callout durchführen. Um es nahtlos aussehen zu lassen, können Sie auch aufeinanderfolgende AJAX-Anrufe tätigen, um Datensätze zu speichern und den Callout zu erstellen, wenn der Benutzer beim Klicken auf die Schaltfläche "Speichern" die Nachricht "Laden" sieht.
4. Wenn Sie keine @future-Annotation in die Webservice-Methode einfügen möchten, können Sie eine Aktion zum Einfügen des Objekts ausführen und dann den Webservice-Callout bei dem ausstehenden Ereignis ausführen. Geben Sie dann eine Seitenverweis mit sofortiger Rückmeldung an den Benutzer zurück. Wenn der Webservice-Callout irgendeinen Fehler zurückgibt, löschen Sie das Objekt und bringen Sie den Benutzer zur gleichen Seite zurück.

VisualForce-Seite
 
<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);
}
Nummer des Knowledge-Artikels

000385708

 
Laden
Salesforce Help | Article