2011-07-15

Force.com : 取引先(Account)のレコードを 200 件以上取得したい


取引先(Account)のレコードを 200 件以上取得したい



ここ] 見れば解決。
でも、試してみる。



○ 取引先(Account)のレコードを 200 件以上取得したい

@isTest
private class Test {
    static testMethod void test() {

        String log = '\n********** ********** ********** ********** ********** ';

        Integer accountCount1 = [SELECT COUNT() FROM Account];
        log += '\naccount count 1: ' + accountCount1.format();

        for(Integer i=0; i<5; i++) {
            List<account> iaccounts = new List<account>();
            for(Integer j=0; j<200; j++) {
                iaccounts.add(new Account(Name=(i * j).format()));
            }
            insert iaccounts;
        }
        Integer accountCount2 = [SELECT COUNT() FROM Account];
        log += '\naccount count 2: ' + accountCount2.format();

        Integer countA = 0;
        Integer countB = 0;
        for(List<account> accounts : [SELECT Id, Name FROM Account]) {
            countA++;
            for(Account account : accounts) {
                countB++;
            }
        }
        log += '\ncount A: ' + countA.format();
        log += '\ncount B: ' + countB.format();
        log += '\n********** ********** ********** ********** ********** ';

        System.debug(log);
    }
}
デバッグログ
22.0 APEX_CODE,FINE;APEX_PROFILING,FINE;DB,INFO;VALIDATION,INFO;WORKFLOW,FINEST
18:27:24.062 (62635000)|EXECUTION_STARTED
18:27:24.062 (62764000)|CODE_UNIT_STARTED|[EXTERNAL]|01pA0000002xdKd|Test.test
18:27:24.062 (62881000)|METHOD_ENTRY|[2]|01pA0000002xdKd|Test.Test()
18:27:24.062 (62955000)|METHOD_EXIT|[2]|Test
18:27:24.063 (63095000)|SOQL_EXECUTE_BEGIN|[7]|Aggregations:0|SELECT COUNT() FROM Account
18:27:24.081 (81325000)|SOQL_EXECUTE_END|[7]|Rows:22
18:27:24.130 (130766000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:25.124 (1124205000)|DML_END|[15]
18:27:25.180 (1180964000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:26.274 (2274698000)|DML_END|[15]
18:27:26.319 (2319497000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:27.406 (3406968000)|DML_END|[15]
18:27:27.451 (3451056000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:28.853 (4853143000)|DML_END|[15]
18:27:28.896 (4896512000)|DML_BEGIN|[15]|Op:Insert|Type:Account|Rows:200
18:27:30.000 (6000677000)|DML_END|[15]
18:27:30.001 (6001131000)|SOQL_EXECUTE_BEGIN|[17]|Aggregations:0|SELECT COUNT() FROM Account
18:27:30.020 (6020864000)|SOQL_EXECUTE_END|[17]|Rows:1022
18:27:30.021 (6021130000)|SOQL_EXECUTE_BEGIN|[22]|Aggregations:0|SELECT Id, Name FROM Account
18:27:30.144 (6144360000)|SOQL_EXECUTE_END|[22]|Rows:1022
18:27:30.303 (6303727000)|USER_DEBUG|[32]|DEBUG|
********** ********** ********** ********** **********
account count 1: 22
account count 2: 1,022
count A: 6
count B: 1,022
********** ********** ********** ********** **********
18:27:30.808 (6303844000)|CUMULATIVE_LIMIT_USAGE
18:27:30.808|LIMIT_USAGE_FOR_NS|(default)|
Number of SOQL queries: 3 out of 100
Number of query rows: 2066 out of 50000
Number of SOSL queries: 0 out of 20
Number of DML statements: 5 out of 150
Number of DML rows: 1000 out of 10000
Number of script statements: 2055 out of 200000
Maximum heap size: 0 out of 3000000
Number of callouts: 0 out of 10
Number of Email Invocations: 0 out of 10
Number of fields describes: 0 out of 100
Number of record type describes: 0 out of 100
Number of child relationships describes: 0 out of 100
Number of picklist describes: 0 out of 100
Number of future calls: 0 out of 10

18:27:30.808|TOTAL_EMAIL_RECIPIENTS_QUEUED|0
18:27:30.808 (6303844000)|CUMULATIVE_LIMIT_USAGE_END

18:27:30.303 (6303947000)|CODE_UNIT_FINISHED|Test.test
18:27:30.303 (6303976000)|EXECUTION_FINISHED
18:27:32.455|CUMULATIVE_PROFILING_BEGIN
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for SOQL operations
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for SOSL operations
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for DML operations
18:27:32.455|CUMULATIVE_PROFILING|No profiling information for method invocations
18:27:32.455|CUMULATIVE_PROFILING_END



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考


Force.com : Visualforce ページのレコード一覧表示をした際に、ページング機能が欲しい


@途中
2011.07.25 追記



Visualforce ページのレコード一覧表示をした際に、ページング機能が欲しい



ここ ]見れば解決。



○ ページング機能が欲しい
Ex.
  • 表示されているページに対して前のページがある場合は[Prev]を表示して、前頁へ戻れるようにする
  • 表示されているページに対して次ぎのページがある場合は[Next]を表示して、次頁へ進めるようにする
  • ページの最大表示件数は 20 件とする
  • 表示されているページに全件数に対して何件目から何件目までのレコードが表示されているかを示す

■ Visualforce ページ
<apex:page standardController="Foo__c" extensions="FooPagination" tabStyle="Foo__c" action="{!view}">
    <apex:sectionHeader title="Foo" />
    <apex:pageBlock title="Viewing Foos" rendered="{!(dtos.size > 0)}">
        <apex:form id="theForm">
            <apex:pageBlockTable value="{!dtos}" var="d">
                <apex:column style="width:30px;text-align:center;">
                    <apex:facet name="header"><apex:outputText value="No." /></apex:facet>
                    <apex:outputText value="{!d.lineNo}" />
                </apex:column>                
                <apex:column style="width:120px">
                    <apex:facet name="header"><apex:outputText value="Name" /></apex:facet>
                    <apex:outputField value="{!d.foo.Name}" />
                </apex:column>                
            </apex:pageBlockTable>
            <apex:panelGrid columns="3">
                <apex:outputText value="{!page}" />
                <apex:commandLink action="{!first}" rendered="{!ssc.HasPrevious}" value="[First]" />
                <apex:commandLink action="{!previous}" rendered="{!ssc.HasPrevious}" value="[Prev]" />
                <apex:commandLink action="{!next}" rendered="{!ssc.HasNext}" value="[Next]" />
                <apex:commandLink action="{!last}" rendered="{!ssc.HasNext}" value="[Last]" />
            </apex:panelGrid>
        </apex:form> 
    </apex:pageBlock>
</apex:page>

■ FooPagination クラス
public with sharing class FooPagination {

    /**
     * 画面表示クラス
     */
    public class DTO {
        /** 行番号  */
        public Integer lineNo { get; set; }
        /** [Foo]オブジェクト */
        public Foo__c foo { get; set; }
        /**
         * コンストラクタ
         */
        public DTO() {
            lineNo = 0;
            foo = new Foo__c();
        }
    }

    /**
     * コンストラクタ
     * @param controller
     */
    public FooPagination(ApexPages.StandardController controller) {
        // レコード一覧の設定
        ssc = new ApexPages.StandardSetController (Database.getQueryLocator([SELECT Id, Name FROM Foo__c ORDER BY Name]));
        // 一頁最大表示件数の設定(default:20)
        ssc.setPageSize(20);
    }

    /** 画面一覧 */
    public List<DTO> dtos { get; set; }
    /** ページ情報 */
    public String page { get; set; }
    /** StandardSetController */
    public ApexPages.StandardSetController ssc { get; set; }

    /**
     * 表示
     */
    public void view() {
        Integer firstLineNo = ((ssc.getPageNumber() - 1) * ssc.getPageSize()) + 1;

        // ページ情報設定
        page = '';
        page += firstLineNo;
        page += ' - ';
        page += firstLineNo + ssc.getPageSize() - 1;
        page += ' / ';
        page += ssc.getResultSize();

        // 画面一覧設定
        dtos = new List<DTO>();
        List<Foo__c> fs = ssc.getRecords();
        for(Integer i=0; i<fs.size(); i++) {
            DTO d = new DTO();
            d.lineNo = (firstLineNo + i);
            d.foo = fs.get(i);
            dtos.add(d);
        }
    }
    /**
     * 最初のページへ
     */
    public void first() {
        ssc.first();
        view();
    }
    /**
     * 最後のページへ
     */
    public void last() {
        ssc.last();
        view();
    }
    /**
     * 次へ
     */
    public void next() {
        ssc.next();
        view();
    }
    /**
     * 前へ
     */
    public void previous() {
        ssc.previous();
        view();
    }
}



◆ メモ
public void previous() {
    try {
        ssc.previous();
    } catch (System.VisualforceException e) {
        System.debug(e);
        init(ssc.getPageNumber() - 2);
    }
    view();
}
private void init(Integer pageNumber) {
    ssc = new ApexPages.StandardSetController (Database.getQueryLocator([SELECT Id, Name FROM Foo__c ORDER BY Name]));
    for(Integer i=0; i<pageNumber; i++) {
        ssc.next();
    }
}



◆ メモ (注意)
  • 「このページは QueryLocator を使用しますが、これは無効です。QueryLocator はユーザあたり 5 個という制限があります。」のメッセージが表示される場合:
    Edit: This only happens after 15 minutes of idle usage. If after that point someone tries to call a method on the StandardSetController it throws an uncatchable exception.

    Community - Working around "This page uses a QueryLocator that... - Force.com Discussion Boards
    ... 15 分以上放置してページ遷移しようとしたら、catch できない例外が発生するらしい ;-(。



◆ StandardSetController クラス
@TODO



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考