読者です 読者をやめる 読者になる 読者になる

dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

follow us in feedly

[Salesforce]関連リストのレコードを一括更新する方法〜その3〜

Salesforce apex

第1回第2回に引き続いて、第3弾。

  1. javascriptだけで実装する
  2. Apex + Visualforce で実装する
  3. Apex Web Serviceを使って実装する

のうちの、「3. Apex Web Serviceを使って実装する」です。
今回でラスト。

実装してみる

必要なものはカスタムボタンと、ボタンから実行されるApex。
実装する機能は前回までと同じく、「選択されたレコードの一括削除」です。

Apex(MultiRecordProcessWebService.cls)

global class MultiRecordProcessWebService {

    webService static boolean deleteByIds(List<ID> idList) {
        List<MyObj__c> recordList = [SELECT Id FROM MyObj__c WHERE Id IN :idList];
        delete recordList;
        return true;
    }
}

カスタムボタンのjavascript

{!REQUIRESCRIPT("/soap/ajax/30.0/connection.js")}
{!REQUIRESCRIPT("/soap/ajax/30.0/apex.js")}

// 選択したレコードのID
var ids = {!GETRECORDIDS($ObjectType.Myobj__c)};

if (ids.length) {
    var result = sforce.apex.execute(
        'MultiRecordProcessWebService', // class
        'deleteByIds', // method
        {idList : ids} // method arguments
    );
    alert('succeeded : ' + result);
    window.location.reload();
} else {
    alert('レコードを選択して下さい');
}

というわけで、非常にシンプル。

よい点

  • サーバサイドはApexだけでよい
  • 引数や処理したい内容の自由度が高い

悪い点

  • テストを書くのが面倒?
    webServiceを利用したコードはテストの時にちょっと注意しないといけないので、後で書く。

※※2014/06/24追記※※
どうやら、テストは普通のメソッドのテストと同じように書けますね。。。
このページ見て、モックが必要とかなんとか書いてるからそういうことなのかと思ってましたが。

Testing Web Service Callouts | Force.com Apex Code Developer's Guide | Salesforce Developers

↑ が何を指してるのかは時間があれば調べてみたい。

リファレンス

Apex in AJAX | Force.com Apex コード開発者ガイド | Salesforce Developers

WebService メソッド | Force.com Apex コード開発者ガイド | Salesforce Developers