フローで積み上げ集計をやってみた(2-1)

salesforceに積み上げ集計という便利な機能があります。

子レコードの合計や件数などを項目ひとつで作成できるので重宝してます。
でも制限があり、主従関係がないと使えないという点で困ったことがありました。

(積み上げ集計のヘルプ)https://help.salesforce.com/articleView?id=fields_about_roll_up_summary_fields.htm

主従関係がなんとなくわからなくて。とか、必須にすべきかわからなくてやむを得ず参照関係にすることもあったりするのかと。

そこで参照関係にあるオブジェクトでの積み上げ集計をフローで試してみました。

試したこと

親オブジェクト(Parent__c)子オブジェクト(Child__c) で子レコードの数値項目売上を親オブジェクトの項目子レコード合計に積み上げ集計してみました。子オブジェクトに参照関係で親オブジェクトを設定しています。

大まかな処理イメージ

  1. 子オブジェクトのレコードを作成する(親オブジェクトに関連付ける)
  2. プロセスビルダーでフローを呼び出す
  3. 親オブジェクトが同じ子オブジェクトのレコードを検索
  4. 検索した子オブジェクトをループ処理して、合計値を計算
  5. 親レコードに4の値を渡して更新

こんな感じです。
本来であれば更新時やほかの条件を検討する必要があります。

フローを作る

新規フローの作成

なにはともあれフローを作成。

設定画面を開き、設定 > プロセスの自動化 > フロー と選択し、画面が開いたら新規フローのボタンをクリック。

フロー種別の選択は自動起動フローを選択します。

f:id:sweaty:20191022154227p:plain
自動起動フロー

フローに必要な要素を作成する

新規フローを作成すると、フロービルダーが起動します。

左にツールボックスがあり、その中に要素マネージャというタブがあります。

要素では、フローが行う処理としてレコードの検索、作成、更新、削除や、条件、ループ、割り当てなどがあります。

f:id:sweaty:20191022154538p:plain
ツールボックス > 要素

マネージャでは、フローで使うリソースを作成します。リソースとは、値を格納する変数や数式、フェーズなどが利用できます。 新規では「新規リソース」のボタンしかないので画像は割愛します。

(▼リソースのヘルプページ)https://help.salesforce.com/articleView?id=flow_ref_resources_variable.htm&type=5

では、今回のフローで使うリソースを作りますが、先ほどの処理内容から以下のものを用意します。

  • プロセスビルダーを呼び出した子オブジェクトの親オブジェクトIDを受け取る変数
  • 親オブジェクトIDが同じ子オブジェクト(複数レコード)
  • 合計
  • ループ処理時に使用する子オブジェクト(単一レコード)

これらにフローで処理する際に必要な途中経過の値などを格納します。

では作ってみましょう。

プロセスビルダーを呼び出した子オブジェクトの親オブジェクトIDを受け取る変数

子オブジェクトのレコードが作成されたときに、プロセスビルダーを呼び出す想定です。
呼び出したときにフローへそのレコードの親オブジェクトIDを渡し、親オブジェクトが同じIDの子オブジェクトを取得します。

新規リソースをクリックして以下のような設定をします。

  • リソース種別 = 変数
  • API参照名 = varParentId(ここの設定は任意です。自分でわかりやすい名前にしとくといいと思います)
  • 説明 = 任意の内容を記載します(必須ではないので空欄でもOK)
  • データ型 = テキスト
  • フロー外部での可用性 = 入力で使用可能にチェック

あとはブランクでOK。
後でプロセスビルダーから親オブジェクトIDをフローへ渡すために、入力で使用可能にチェックを入れる必要があります。

f:id:sweaty:20191022153342g:plain
プロセスビルダーからの値を格納する

親オブジェクトIDが同じ子オブジェクト(複数レコード)

先に受け取った親オブジェクトIDが同じ子オブジェクトを取得します。
取得した結果を格納する変数です。ここではオブジェクトを指定する必要があります。

  • リソース種別 = 変数
  • API参照名 = listChildren
  • 説明 = 任意の内容を記載します(必須ではないので空欄でもOK)
  • データ型 = レコード / 複数の値を許可(コレクション)にチェック
  • オブジェクト = 子オブジェクト

f:id:sweaty:20191022160336g:plain
listChildren

合計

合計を求めるには子オブジェクトの値(ここでは売上とします)をループ処理で足す必要があり、それを格納するリソースを作成します。

  • リソース種別 = 変数
  • API参照名 = varTotal
  • 説明 = 任意の内容を記載します(必須ではないので空欄でもOK)
  • データ型 = 数値

小数点の値やデフォルト値は0としておきます。

f:id:sweaty:20191022162809g:plain
varTotal

ループ処理時に使用する子オブジェクト(単一レコード)

こちらは先程のオブジェクトと同様で子オブジェクトを指定して、複数の値を許可のチェックは不要です。
API参照名はchildとしておいてください。

ここまでできたら一旦保存しておきます。 エラーが表示されますが、フローの動作を設定しないため表示されますので無視して問題ありません。

まだ続きますので、以降の処理は次で記載したいと思います。