【salesforce】ノンプログラミングで参照関係の積み上げ集計を行う方法
salesforceの連携しているオブジェクトのレコード数を数えたりする積み上げ集計ですが、本来使えるのは主従関係だけで、参照関係の場合ではこれまでapexを書かないと行けなかったのです。下のリンクはコミュニティで質問があって、それをapexでやる方法が書いてあります。
今回フローとプロセスビルダーを使えば実現できるようになります。参考にしたのはここのブログなのでこっちを読んでいただいた方が早いです。 英語が苦手な方のために書いていこうと思います。
How To: Create Roll Up Summaries using Flow – Part 1
How To: Create Roll Up Summaries using Flow – Part 2
今回は取引先に参照関係のオブジェクトを作り、その数を数えようと思います。なので積み上げ集計でいうと、件数を数えるイメージです。
フローを作ります。完成図はこれ。
まず高速検索を設定します。検索は参照関係のオブジェクトを選択し、項目には参照元のカスタム項目を、値には変数を設定します。あとで説明しますが、この変数には取引先IDを割り当てます。
変数は適当な名前をつけて、データ型はテキスト、入力出力種別はなんでもいいと思うのですが、とりあえず、入力/出力にしておきます。
高速検索に話は戻って、必須の変数という項目があります。ここではSオブジェクトコレクション変数というものを新規作成します。
作成ルールは以下の画像のとおりです。入力出力種別は非公開にします。理由はちょっとわからないです。オブジェクト種別は参照関係のオブジェクトを選びます。
変数に保存するレコードの項目を指定します。というところで項目を選択します。合算を行う場合は、数字が入っているところを選びます。
次にループを設定します。ループ対象は先ほど作ったSオブジェクトコレクション変数を入れます。ループ変数は新しくSオブジェクト変数を作ります。
Sオブジェクト変数は以下のとおりに作ります。入力出力種別は非公開、オブジェクト種別は参照関係のオブジェクトですね。
次に割り当てを設定します。変数は新しく作ります。数を数える場合は演算子は追加で1とします。合計値を出す場合は値のところにSオブジェクト変数を入れます。
割り当てで作る変数は画像のとおりです。データ型は数値(金額の合計の場合は通貨)、スケール(小数点のことのようです)は適当、入力/出力種別は非公開、デフォルト値は0とします。このデフォルト値に0を入れないときちんと動かないケースがあるので気をつけてください。
最後の設定としてレコードの更新をします。更新には、積み上げ集計の結果を入れたいオブジェクトを選びます。検索条件としてはIdで、高速検索の時に使った変数(今回の場合取引先IDが入っている)を選びます。変数〜更新しますのところには、積み上げ集計した結果を入れたい項目を、値には先ほどの割り当てで使った変数を入れます。当然ですが、この項目と変数のデータ型が一致している必要があります。
最後に各設定を矢印で結びます。菱型から対象の設定までドラッグすると矢印が引けます。そして、特に注意する必要があるのがループと割り当てです。これは双方向で矢印を繋ぐ必要があります。これが一方向だとフローが動きません。
またループから割り当ての矢印を結ぶときに選択が出るのですが、「コレクションの各値」を選んでください。ループ→レコードの更新は「処理する値がなくなった場合」です。
最後に高速検索の右上の緑矢印をクリックして、これを開始の処理と決定して保存します。種別では自動起動フローを選んでください。また最後に有効化するのを忘れないで下さい。
次にプロセスビルダーの設定です。構造はこれです。
起動条件は参照関係オブジェクトが作成・編集された場合。
実行条件は設定しません。すべからくアクションを実行します。
ルール適用時のアクション種別はフローです。先ほど作ったフローを選びます。フローを有効化しておかないと、ここに表示されません。そしてフロー変数は前半で言いましたが高速検索の時につかった変数に、取引先IDを割り当てます。
変数に値を割り当てる時には参照関係オブジェクトの項目の中から選ぶのですが、参照項目はAPI参照名で表示されているので、それを選択します。今回の場合はaccount__cです。
あとは保存して有効化するとOKです。
ただし、ここまででは作成・編集には対応するのですが、削除には対応しません。故に削除までカバーする場合は、How To: Create Roll Up Summaries using Flow – Part 2に従って設定する必要があります。
フローをもう一つ作ります。
最初は画面です。でも、この画面は作るだけで中身は一切いじりません。
次にレコードの削除です。削除対象は参照関係オブジェクト、項目はIdで変数を一つ用意します。
変数は、IDなのでテキスト型、入力/出力種別は入力のみでOKです。
そして、パレットのフローから先ほど作った参照関係オブジェクトの積み上げ集計を行うフローを持ってきます。入力/出力変数割り当てで入力と出力をそれぞれ入れるのですが、どちらも対象は取引先IDで、ソースは新しく用意した変数(入力・出力で同じものを使う)を割り当てます。
変数はデータ型はテキスト型、入力/出力種別は入力のみです。
あとは矢印でつないで、画面をスタートとして保存します。もちろん有効化を忘れないこと。
次に設定画面に戻って開発者コンソールを起動します。名前をクリックすると、開発者コンソールが表示されます。
File→New→Visualforce Pageをクリックします。
そこに以下のコードを貼り付けます。
<apex:page standardController="account_relationships__c">
<flow:interview name="deletelookup"
finishLocation="/{!account_relationships__c.account__c}">
<apex:param name="varAccountId" value="{!account_relationships__c.account__c}"/>
<apex:param name="varLookupId" value="{!account_relationships__c.Id}"/> </flow:interview> </apex:page>
色をつけたところを置き換えてください。
緑色(1行目):参照関係オブジェクトのAPI参照名
紫色(2行目):削除のために作ったフロー名
赤色(3行目):削除後にどこのページに遷移したいかを選びます。今回の場合は、参照関係オブジェクトがつながっている取引先ページに戻るようにします。
青色(4、5行目):削除のフローで使っている変数を入れます。
赤色(4、5行目):変数に入れる項目をAPI参照名で記入します。
これをsaveします。
次に今作ったvisualforceを削除リンク(ボタン)に割り当てます。設定→作成→オブジェクト→参照関係オブジェクトをクリックします。ボタン、リンク、およびアクションにある表示ラベル「削除」の編集をクリックします。
上書き手段でVisualforceページを選択し、今作ったvisualforceページを選び保存します。
以上で、全て完了です。参照関係オブジェクトを作っても削除しても正しく数を数えてくれます。設定に手間はかかりますが、(一部プログラムが入ってしまいましたが)ノンプログラミングで目的を達成できます。