+ Start a Discussion

Webservice Error: You have uncommitted work pending. Please commit or rollback before calling out




Im all of a sudden getting the following error from my class that invokes a webservice:

ERROR:System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out


Webservice Class


global class myWS   
   WebService static string invokeExternalWs(string childValue, string parentValue)   
        HttpRequest req = new HttpRequest();   
        req.setHeader('Content-Type', 'text/xml; charset=utf-8');   
        req.setHeader('SOAPAction', 'http://externalService/externalMethod');  
        string b = '--soap request goes here--';   
        Http http = new Http();   
        try {   
          //Execute web service call here 
          String xObjectID ='';   
          HTTPResponse res = http.send(req);
          Dom.Document doc = res.getBodyDocument();
          String soapNS = 'http://schemas.xmlsoap.org/soap/envelope/'; 
          Dom.XmlNode root = doc.getRootElement();
          for(dom.XmlNode node1 : root.getChildElements()) {
               for(dom.XmlNode node2 : node1.getChildElements()) {
                   for(dom.XmlNode node3 : node2.getChildElements()) {
                      for(dom.XmlNode node4 : node3.getChildElements()) {
                          xObjectID = node4.getText();
         return xObjectID;
       } catch(System.CalloutException e){   
          return 'ERROR:' + e;   

 UPDATE: Here is my class that is executing myWS

public void applyURLString(ID ArgBuildID) {

    Builder__c current_build = [SELECT id, name, LLURL__c, column1, column2, Opportunity__c
                FROM Builder__c
                WHERE id = :ArgBuildID];

        if(current_build.LLURL__c == null || current_build.LLURL__c.trim().length() == 0)

                String tmpFolderName = current_build.column1 + ' - ' + current_build.column2;

                String LLWSResultPattern = '[0-9]{2,}';

                String myWSXMLResult = myWS.invokeExternalWs(tmpFolderName,'test');

                Boolean LLWSPatternMatched = pattern.matches(LLWSResultPattern,myWSXMLResult);
                    Opportunity oppt = [SELECT Id,Name 
                                        FROM Opportunity 
                                        WHERE Id = :current_build.Opportunity__c
                                        LIMIT 1];   
                    oppt.LLURL__c = 'https://someService/' + myWSXMLResult;
                    update oppt;



UPDATE #2 - Here is the code that executes applyURLString()



Builder__c insertBuild = new Builder__c();      
insertBuild.Opportunity__c = opportunityId;
insertBuild.Product_Group__c = selectedBuild.Product_Group__c;
insertBuild.Manual_Build_Product__c = selectedBuild.Manual_Build_Product__c;

insert insertBuild;





Thank you for your time!


Ive updated my original post with additional code. See "UPDATE".


Just wanted to pass along the solution that was suggested to me on stackoverflow. An @future annotation was added to the applyURLString() method. For my specific case it has worked perfectly.


@future (callout=true)
public static void applyURLString(ID ArgBuildID) {

 Hope this helps someone in the future.