2012-05-10 66 views
0

我從調用webservice的類接收到以下錯誤。Salesforce Webservice錯誤

"You have uncommitte​d work pending. Please commit or rollback before calling out" 

這裏是調用Web服務類:

global class myWS 
{ 

    WebService static string invokeExternalWs(string childValue, string parentValue) 
    { 
     HttpRequest req = new HttpRequest(); 
     req.setEndpoint('https://externalURL/Services'); 
     req.setMethod('POST'); 
     req.setHeader('Content-Type', 'text/xml; charset=utf-8'); 
     req.setHeader('SOAPAction', 'http://externalService/externalMethod'); 
     string b = '--soap request goes here--'; 
     req.setBody(b); 
     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:這是我正在執行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); 
       if(LLWSPatternMatched) 
       { 
        Opportunity oppt = [SELECT Id,Name 
             FROM Opportunity 
             WHERE Id = :current_build.Opportunity__c 
             LIMIT 1]; 
        oppt.LLURL__c = 'https://someService/' + myWSXMLResult; 
        update oppt; 
       } 
      } 
    } 

更新#2級 - 這裏是哪裏applyURLString( )被執行。這是DML在我的HTTP請求之前執行的唯一地方。但是我需要新的Builder記錄的ID。

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; 

applyURLString(insertBuild.Id); 

任何想法爲什麼會發生此錯誤?

+0

我們需要查看調用此類的類/觸發器 - 如果在更新數據庫之後進行調用,您將收到此消息。 – JCD

+0

好吧,我添加了上面的執行代碼。 – user891859

+0

再次更新(#2),我認爲這是導致問題的代碼。 – user891859

回答

0

@ JCD建議使用@future註解解決了我的問題。再次感謝!