【Salesforce】コレクションサイズ は、1,000 の最大サイズを超えています。

【Salesforce】コレクションサイズ は、1,000 の最大サイズを超えています。

Visualforceの開発をしていると、ページを開いた際にこのようなエラーが出ました。

コレクションサイズ 1,001 は、1,000 の最大サイズを超えています。 

コレクションサイズは1,000までだそうです。

コレクションサイズとは、「apex:repeat」タグなんかで設定するvalueのリストサイズのことですね。

つまり、「apex:repeat」に設定するリストのサイズが1,000件を超えていたということですね。

Visualforceページです。

<apex:repeat value="{!valueList}" var="value" >
  <apex:outputText value="{!value}" /><br/>
</apex:repeat>

こちらはコントローラです。

/**
 * 1001件のレコード
 */
public List<Integer> getValueList(){

    List<Integer> intList;    

    // リストを作成する
    intList = new List<Integer>();
    for(Integer i = 0; i < 1001; i++){

        intList .add(i);
    }
    
    return intList;
}

修正方法としてはいくつかあります。

リストをそのまま使いたい場合は、リスト内にリストを作ることで解決することができます。

<apex:repeat value="{!valueList}" var="innerList" >
  <apex:repeat value="{!innerList}" var="value" >
    <apex:outputText value="{!value}" /><br/>
  </apex:repeat>
</apex:repeat>
/**
 * 1001件のレコード
 */
public List<Integer> getValueList(){

    List<List<Integer>> wrapList;
    Integer index;

    // リストを作成する
    wrapList = new List<List<Integer>>();
    wrapList.add(new List<Integer>());
    index = 0;
    for(Integer i = 0; i < 1001; i++){
    
        List<Integer> intList;
        
        // 最後のリストを取得する
        intList = wrapList[index];
        // リストに値を追加する
        intList .add(i);
        
        // 1000件ごとにリストを追加する
        if(intList.size() >= 1000){

            wrapList.add(new List<Integer>());
            index++;
        }
    }
    
    return intList;
}

PageタグにreadOnly=”true”を追加することで、10,000件のリストまで表示可能になります。

しかし、この場合はレコードの更新等ができなくなるため、注意が必要ですね。


<apex:page readOnly="true" controller="ControllerName" >
  <apex:repeat value="{!valueList}" var="value" >
    <apex:outputText value="{!value}" /><br/>
  </apex:repeat>
</apex:page>

SObjectのリストであれば、StandardSetControllerを使用してページングを行うのも良いですね。

こちらはページング処理の実装がちょっと面倒ですが、便利な方法です。

Visualforceに合わせて適切な方法で実装したいですね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です