【SalesForce】検索画面

こんにちは。
わたちゃんと申します。

今日はですね、検索画面の基本的な作り方を記述していきます。
最近はAndroidばっかで健忘症になっていましてね、ここに書いておいてまた見直そうって思ってます。

ではまず基本のVF"SM_WataSearch_Page"を作っていきますよ。

```html
<apex:page controller="SM_WataSearch_Ctrl" sidebar="false" action="{!init}">
    <style type="text/css">
    </style>
    <script type="text/javascript">
    </script>

    <!-- レコード表示行数 -->
    <apex:variable var="rowNum" value="1" />

    <!-- メインページ -->
    <apex:outputpanel >
        <apex:form id="form1">
        <!-- タイトル -->
        <apex:sectionHeader title="検索画面"/>
            <apex:pageBlock >
            <apex:pageMessages id="messagearea" showDetail="false"/>
            <div style="text-align:right;">
                <!-- 閉じるボタン -->
                <apex:commandbutton value="閉じる" style="width:100px; height:30px;"/>
            </div>
                <!-- 検索条件セクション -->
                <apex:pageblockSection id="searchConditionSection" title="検索条件" columns="2" collapsible="true">

                    <apex:pageBlockSectionItem >
                        <apex:outputText value="条件1" />
                        <apex:outputText value="{!conditions1}" />
                    </apex:pageBlockSectionItem>

                    <apex:pageBlockSectionItem >
                        <apex:outputText value="条件2" />
                        <apex:outputText value="{!conditions2}" />
                    </apex:pageBlockSectionItem>

                </apex:pageblockSection>

                <!-- 検索ボタン -->
                <div style="text-align:center;">
                    <apex:commandButton id="searchButton"　style="width:100px; height:30px;" action="{!searchAction}" value="検索" rendered="{!}"/>
                </div>

                <!-- 検索結果セクション -->
                <apex:pageblockSection id="searchResultSection" title="検索結果" columns="1" collapsible="true">
                    <apex:pageblockTable id="resultTable" width="100%" value="{!resultDataList}" var="result" frame="box" >

                        <!-- No -->
                        <apex:column headerValue="No" width="3%">
                            <apex:outputText value="{!rowNum}" />
                            <apex:variable var="rowNum" value="{!VALUE(rowNum) + 1}" />
                        </apex:column>

                        <!-- 結果1 -->
                        <apex:column headerValue="結果1">
                            <apex:outputField value="{!result.columns1}"/>
                        </apex:column>

                        <!-- 結果2 -->
                        <apex:column headerValue="結果2">
                            <apex:outputField value="{!result.columns2}"/>
                        </apex:column>

                        <!-- 結果3 -->
                        <apex:column headerValue="結果3">
                            <apex:outputField value="{!result.columns3}"/>
                        </apex:column>

                        <!-- 結果4 -->
                        <apex:column headerValue="結果4">
                            <apex:outputField value="{!result.columns4}"/>
                        </apex:column>

                    </apex:pageblockTable>
                    <table style="margin-left: auto; margin-right: auto;">
                        <tr>
                            <!-- ページング -->
                            <apex:panelGrid columns="5" id="pagingBlock">
                                <apex:commandLink value="[最初のページ]" rendered="{!pageManager.HasPrevious}" action="{!pageManager.first}" />
                                <apex:commandLink value="[前のページ]" rendered="{!pageManager.HasPrevious}" action="{!pageManager.previous}" />
                                <apex:outputtext value="{!pageManager.pageNumber} / {!totalpage}"/>
                                <apex:commandLink value="[次のページ]" rendered="{!pageManager.HasNext}" action="{!pageManager.next}" />
                                <apex:commandLink value="[最後のページ]" rendered="{!pageManager.HasNext}" action="{!pageManager.last}" />
                            </apex:panelGrid>
                        </tr>
                    </table>
                </apex:pageblockSection>
            </apex:pageBlock>
        </apex:form>
    </apex:outputpanel>
</apex:page>
```

これが対となる"SM_WataSearch_Ctrl"クラスです。

```java
public with sharing class SM_WataSearch_Ctrl{
    // 検索条件１
    public String targetConditions1 {get; set;}
    // 検索条件２
    public String targetConditions2 {get; set;}
    // 検索結果
    public List<WataChans__c> resultList {get; set;}
    // 改ページ用PageManagerクラス
    public ApexPages.StandardSetController pageManager {get; set;}
    // 総ページ数
    public Integer totalpage {get; set;}

    // 最大表示件数
    private static final Integer PAGING_MAX_ROWS = 10;

    // コンストラクタ
    public SM_WataSearch_Ctrl(){}

    // 初期処理
    public PageReference init(){

        // 値の初期化
        this.targetConditions1 = '';
        this.targetConditions2 = '';
        this.totalpage = null;

        return null;
    }

    // 検索ボタン押下時処理
    public PageReference searchAction() {

        // 検索結果を取得
        this.resultList = searchWatachans(this.targetConditions1, this.targetConditions2);

        // pageManagerに検索結果をセット
        this.pageManager = new ApexPages.StandardSetController(this.resultList);

        // 1ページの最大表示件数をセット
        this.pageManager.setPageSize(PAGING_MAX_ROWS);

        // ページ数取得
        this.totalpage = getTotalPages(this.pageManager);

        // 現在のページ番号セット(件数が存在しない場合、1/0とかいう表示になっちゃうからその対応)
        if (this.totalpage == 0) {
            this.pageNumber = 0;

        } else {
            this.pageNumber = this.pageManager.getPageNumber();

        }

    }

    // 対象レコードを検索
    private List<WataChans__c> searchWatachans(String conditions1, String conditions2){

        // SOQL文を作成
        String createQuery = [SELECT columns1,columns2,columns3,columns4 FROM WataChans__c WHERE ];

        // クエリ発行
        List<WataChans__c> searchResultList = Database.query(createQuery);

        // 結果を返す
        return searchResultList;

    }

    // 総ページ数を取得
    private Integer getTotalPages(ApexPages.StandardSetController pageManager){

        Decimal pages = Decimal.valueOf(pageManager.getResultSize()) / Decimal.valueOf(pageManager.getPageSize());
        return Integer.valueOf(pages.round(System.RoundingMode.CEILING));

    }

}
```

以上です。