2012-02-23 23 views
4

add()関数が呼び出されるたびに次のエラーが発生します。私はあなたがあなたの後、すべてのDML操作を行う必要があるためですWebサービスapiへの呼び出し中にSalesforceエラーが発生しました

public PageReference add() { 
       insert technology; 
       return null; 
      } 

public List<SelectOption> getItems() { 
    List<SelectOption> options = new List<SelectOption>(); 
    List<Technology__c> AddedT=[SELECT Name FROM Technology__c]; 
    HttpRequest req = new HttpRequest(); 
    req.setMethod('GET'); 
    req.setEndpoint('http://submit.toolsberry.com/sfdc/technologies'); 
    Http http = new Http(); 
    HTTPResponse res = http.send(req); 
    String response=res.getBody(); 
    XmlStreamReader reader = new XmlStreamReader(response); 
    List<String> AllTech = new List<String>(); 
    while(reader.hasNext()) {  
    if (reader.getEventType() == XmlTag.START_ELEMENT) { 
     if ('string' == reader.getLocalName()) { 
    while(reader.hasNext()) { 
    if (reader.getEventType() == XmlTag.END_ELEMENT) { 
     break; 
    } else if (reader.getEventType() == XmlTag.CHARACTERS) { 
     String tname = reader.getText(); 
     AllTech.add(tname); 
    } 
    reader.next(); 
} 
     } 
    } 
    reader.next(); 
} 
} 

答えて

7

ドロップダウンから選択した項目を挿入するには、追加機能、その後、ドロップダウンを移入するために)(のgetItems呼び出し、 You have uncommitted work pending. Please commit or rollback before calling out

前にではなく、任意の吹き出しで行われます。したがって、挿入/更新/アップサートまたは削除のステートメントは、に従う必要があります。には、http.send(req);の呼び出しがあります。

**あなたがadd()メソッドを呼び出した後、あなたのリストには、getterメソッドに存在するので、あなたのリストには、再作成なっているように見えます**

これは、スレッド固有であり、与えられた任意のあたりの順序で発生しなければなりません糸。したがって、たとえば、ユーザーがアクション・メソッドでボタンをクリックすると、そのコール内のすべてのDML文は、同じスレッド内で発生するコールアウトの後に続かなければなりません。トリガまたはバッチApexにも同じです。

データを更新しているどこかにゲッター/セッターがあると、何らかの原因でこの問題が発生する可能性があります。例:

public String someProperty 
{ 
    get 
    { 
     return [SELECT Name FROM CustomObject__c WHERE Id = :this.someId]; 
    } 

    set(String s) 
    { 
     CustomObject__c c = [SELECT Name FROM CustomObject__C WHERE Id = :this.someId] 
     c.Name = s; 
     update c; 
    } 
} 

また、ゲッターに吹き出しを入れないでください。常に吹き出しを明示的に行うのは、その吹き出しを1回だけ行う方法です。ゲッターズは複数回解雇され、コールアウトはApexでは厳しい制限があります。

関連する問題