やりたいことはこんな感じ。
とあるオブジェクトの詳細レコードから、参照関係にあるオブジェクトのレコードを関連リストとして表示する。
リストの各レコード左側にチェックボックスが表示されて、チェックを入れたレコードについて一括処理をする。
今調べてわかっているだけで、このような一括処理を実現するには3通りぐらい方法があるみたい。
- javascriptだけで実装する
- Apex + Visualforce で実装する
- Apex Web Serviceを使って実装する
全部のやり方を載せようと思ったけど、2、3はまだ調べきれていないのでちょっとずつまとめていきます。
ただ、1 ~ 3のやり方のいずれにするにせよ、「カスタムボタン」を作成することになる。
というわけで今回は「1. javascriptだけで実装する」方法。
関連リストのレコードにチェックボックスを表示するには
カスタムオブジェクトの場合、
ボタン、リンク、およびアクション > 新規ボタンまたはリンク
をクリック。
そして、「表示の種類」から「リストボタン」を選択した時に表示される
チェックボックスの表示 (複数レコード選択用)
にチェックを入れる。
これだけ。
このカスタムボタンが1つでもあれば、関連リストにチェックボックスが表示されるようになる。
一括処理のjavascript
カスタムボタンの「動作」を「Javascriptを実行」にし、
下のテキストエリアに次のコードを記述する。
例1:一括削除
{!REQUIRESCRIPT('/soap/ajax/30.0/connection.js')} var records = {!GETRECORDIDS($ObjectType.MyObj__c)}; if (records[0] === null) { alert('1つ以上選択してください'); } else { sforce.connection.deleteIds(records); window.location.reload(); }
例2:特定の項目を一括更新
{!REQUIRESCRIPT('/soap/ajax/30.0/connection.js')} var records = {!GETRECORDIDS($ObjectType.MyObj__c)}; if (records.length === 0) { alert('1つ以上選択してください'); } else { var objs = []; for (var i = 0; i < records.length; i++) { var obj = new sforce.SObject('MyObj__c'); obj.id = records[i]; obj.text__c = true; objs.push(obj); } var results = sforce.connection.update(objs); window.location.reload(); }
ポイント
connection.js
というファイルを利用する(これ、The AJAX Toolkitっていうそう)- 選択したレコードは
{!GETRECORDIDS($ObjectType.[オブジェクトのAPI参照名])}
を使うと、レコードのIDが取得できる - レコードのdeleteは
deleteIds
- レコードのupdateは
sforce.SObject('[オブジェクトのAPI参照名]')
でSObjectとして取得し、IDをセットする
カスタムボタンをページレイアウトに追加する
やり方が分からなければ、こちらの記事に。
(3. ページレイアウトに表示させる、のところ)
[Salesforce]「メールを送信」画面をポップアップウィンドウで開く方法 - dackdive's blog
おしまい
というわけで、javascriptだけでの実装はこのような形。
さくっと書けていいけど、更新はレコードIDを元にオブジェクト取得して...とやや手順が煩雑な気がするし
カスタムボタンのjavascriptとしてロジックいろいろ書きすぎると保守もしんどそう。
(追記)
方法2, 3 についても書きました。
[Salesforce]関連リストのレコードを一括更新する方法〜その2〜 - dackdive's blog
[Salesforce]関連リストのレコードを一括更新する方法〜その3〜 - dackdive's blog