Activity › Forums › Salesforce® Discussions › In Salesforce, can i make callout after Dml insert or any dml operation?
Tagged: Apex Callouts, DML Operation, DML Statement, Salesforce Apex, Salesforce Development, Salesforce SOQL
-
In Salesforce, can i make callout after Dml insert or any dml operation?
Posted by Suraj on April 28, 2017 at 1:49 PMI am facing problem in making callout after performing dml operation.Is this Possible?
Saurabh replied 9 years ago 2 Members · 1 Reply -
1 Reply
-
Hi Suraj
Sometimes a developer needs to create a record and then update it with information provided by a Web Service. However, a Web Service Callout may not occur after a DML statement within the same transaction. To achieve the required action, the transaction must be separated into two parts so that the DML transaction is completed before the Web Service Callout occurs.
Resolution
This workaround splits the transaction into two separate Ajax processes. The first inserts the record and the second performs the callout and is able to update the newly inserted record.
TestWsCallout.page
<apex:page controller=”TestWsCallout” tabstyle=”Account”>
<apex:form >
<apex:actionFunction action=”{!InsertRecord}” name=”InsertRecord_JS” Rerender=”statuses” status=”Status1″ oncomplete=”CallWebService_JS();”/>
<apex:actionFunction action=”{!CallWebService}” name=”CallWebService_JS” status=”Status2″ reRender=”statuses, msg”/>
<apex:outputPanel id=”statuses”>
<apex:actionStatus id=”Status1″ startText=”…Inserting Record Into DB…” />
<apex:actionStatus id=”Status2″ startText=”…Calling Web Service…” />
</apex:outputPanel>
<apex:outputPanel id=”msg”>
<apex:pageMessages />
</apex:outputPanel>
<div><input name=”DoAction” class=”btn” type=”button” value=”Do Action” onclick=”InsertRecord_JS();return false;”/></div>
</apex:form>
</apex:page>TestWsCallout.cls
public class TestWsCallout{
Account myAccount;
public PageReference InsertRecord() {
myAccount = new Account(name = ‘Test Account’);
insert myAccount;
// Calling a Web Service here would throw an exception
return null;
}public PageReference CallWebService() {
// Execute a call to a Web Service
HttpRequest req = new HttpRequest();
req.setEndpoint(‘http://MyWebService12345678790.com?id=’ + myAccount.Id);
req.setMethod(‘GET’);
HttpResponse response = new Http().send(req);// Simulate an update
myAccount.Name = ‘Test Account 2’;
update myAccount;
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, ‘WebService Called on New Account: ‘ + myAccount.Name));
return null;
}
}Hope it may help
Log In to reply.