S.B.S. Salesforce技術ブログ

教えて921さん!

複数登録画面を作成しよう

こんにちは!mkです!
今回はレコードをまとめて登録したい時にはどうしたらいいの?
というところについて話していきたいと思います。

レコードを一つ一つ入力するのって大変!


Salesforceでオブジェクトにレコード登録をしよう!ということは日常茶飯事だと思います。
しかし一度に一つだけ…なんてことはめったにないのではないでしょうか。おそらくまとめて複数のレコードを入力することが多いですよね。
レコード登録の度に新規ボタン押して、内容をあれこれ入力して、登録して、新規ボタン押して...大変ですよね!
そこで今回はまとめてレコードを登録できる画面作成をしていきましょう!

f:id:sbsSF:20200812152533p:plain
今回作る複数登録ページ

画面の作成をしてみよう


まずは画面を作ってしまいましょう!
今回利用するのはSalesforceにあるvisualforceというユーザーインターフェースを作成できる機能になります。このvisualforceを使うにはSalesforceの右上にある歯車を押すと出てくる開発者コンソールを選択すると利用可能になります!
そして今回はvisualforceで書いたものを見てみましょう!
今回サンプルとして作成したのはOpportunity(商談)オブジェクトにデータを追加するものになります!

<apex:page standardController="Opportunity" extensions="Ctrl_Action" showHeader="false" sidebar="false" lightningStylesheets="true">
    <apex:pageBlock title="商談">
        <apex:form id="form">
            <!-- 行追加ボタン -->
            <!-- immediate デフォルト値はfalse trueにすると必須項目が空の時にもエラーを出さずに実行する -->
            <apex:commandButton value="追加" immediate="true" action="{!addRow}" />     
            
            <!-- 保存ボタン -->
            <apex:commandButton action="{!save}" value="保存" />
            
            <!-- 行番号取得用の変数 -->
            <!-- value="{!0}"は0から始まる数字の変数 -->
            <apex:variable value="{!0}" var="count"/>
            <!-- pageBlockTableは1行あたり一つのデータ項目に関する情報を表示する(PageBlock内でないと使えない) -->
            <apex:pageBlockTable value="{!itemList}" var="item">
                
                <!-- 行削除ボタン -->
                <apex:column headerValue="">
                    <apex:commandButton value="削除" immediate="true" action="{!deleteRow}" reRender="form" >
                        <!-- 行のインデックスを送信する -->
                        <apex:param name="number" value="{!count}" />
                    </apex:commandButton>
                    <!-- 行のカウントが+1 -->
                    <apex:variable value="{!count + 1}" var="count"/>
                </apex:column>
                
                <!-- 行番号の表示 -->
                <apex:column value="{!count}"/>
                <!-- 商談商品の行の表示 -->
                <apex:column headerValue="商談商品">
                    <apex:inputField value="{!item.Name}"/>
                </apex:column>
                <!-- 数量の行の表示 -->
                <apex:column headerValue="数量">
                    <apex:inputField value="{!item.count__c}"/>
                </apex:column>
                <!-- 値引きの行の表示 -->
                <apex:column headerValue="値引き">
                    <apex:inputField value="{!item.discount__c}"/>
                </apex:column>
                <!-- 商品の行の表示 -->
                <apex:column headerValue="商品">
                    <apex:inputField value="{!item.Item__c}"/>
                </apex:column>
            </apex:pageBlockTable>
        </apex:form>
    </apex:pageBlock>
</apex:page>

コントローラーの作成をしてみよう


続いてコントローラーを作成して上記で作成したページでレコードの登録などが動作するようにクラスを作成しましょう!

public class Ctrl_Action {
    private final Opportunity opp;  //商談の情報の取得
    public List<BusinessProduct__c> itemList {get;set;}   //変数宣言
    public Integer rowNumber {get;set;} //変数宣言
    
    // コンストラクタ
    public Ctrl_Action(ApexPages.StandardController stdController){
        this.opp = (Opportunity)stdController.getRecord();
        itemList = new List<BusinessProduct__c>();    //itemのリスト、これを最後にinsertする
        BusinessProduct__c item = new BusinessProduct__c(   //入力した項目の保存場所
            talk__c = opp.Id    //商談商品と商談の商談名の対応付け
        );
        itemList.add(item); //itemListの最初の行の作成
    }

    // 行追加
    public void addRow(){
        BusinessProduct__c item = new BusinessProduct__c(
            talk__c = opp.Id
        );
        itemList.add(item); //行の追加
    }
    
    // 行削除
    public void deleteRow(){
        // 行番号取得 //今いるページのvfから送られてきたnumber(行番号)の値を取得する
        rowNumber = Integer.ValueOf(System.currentPageReference().getParameters().get('number'));

        // 2行以上の時に削除可能
        if(itemList.size() > 1){ //2行以上の場合
            itemList.remove(rowNumber); //行を削除
        }
    }
    public PageReference save() {
        //商談商品データベースへ情報登録
        insert itemList;
        //新規登録した商談ページへ移動
        PageReference changePage = new ApexPages.StandardController(opp).view();    //商談ページの情報取得
        changePage.setRedirect(true);
        return changePage;  //商談ページへ移動
    }
}

まとめ


今回は商談にデータを作成するvisualforceのページ、クラスを作成しましたがもちろん他のオブジェクトにデータを作成したり、見積書などのページを作成することも可能です!
扱いが慣れないと難しいですが出来ることの幅は広いのでぜひ利用してみましょう!