Activity Forums Salesforce® Discussions In Salesforce, can i make callout after Dml insert or any dml operation?

  • Saurabh

    Member
    May 15, 2017 at 11:30 am

    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.

Popular Salesforce Blogs

Popular Salesforce Videos