結論
画面フローだけで「親子レコードの複製」を実現する最短手順は、
- 割当 で元レコードを丸ごとコピー & Id を Null 化
- レコードの作成要素 の“レコード変数から”で 作成
- 返ってきた CloneContact.Id を子レコードの 上司Id に流し込む
これにより、新フィールドが追加されてもフロー改修ゼロが実現。子レコードはループ+レコードコレクション変数で一括作成すれば OK。
コードも拡張パッケージも不要で、組織フィールドが増えても自動追従するため、保守コストを最小化できる。
背景
「どの取引先責任者をコピーしますか?」と聞かれ、1人の取引先責任者Aを選択。
「取引先責任者Aには取引先責任者a1、a2、a3が紐づいています。併せてコピーしますか?」
と聞かれ、「はい」を選ぶと、コピー開始。A’及びA’に紐づいたa1’a2’a3’というレコードが作成。
という画面フローを実現したいというご相談がありました。
恐らく通常はコードを書いている優秀な方なのかと思いますが、フロー内で作成したレコードのIdを取得することに困っていたようです。
この手順は確かに分かりづらいので、良い記事があれば教えて差し上げたいと探してみましたが、なかなか見当たりません。
何故だろうか?と考えたところ、確かに私もメンバーに対して説明するときには口頭だと伝わらないので毎回webMTGしていたことに気が付きました。
そこでパッケージを用意し、ご自身で触っていただくのがよいかと考えてこの記事とパッケージを作成しました。
↓未管理パッケージURL
https://login.salesforce.com/packaging/installPackage.apexp?p0=04tWU0000008COz
構築内容
フロー全景
事前準備
使用するオブジェクトと項目
- 取引先
- Id
- 取引先責任者
- Id
- 氏名
- 上司Id
- 説明
標準項目だけにしています。
また、項目が増えてもキーにする項目が変わらなければメンテナンス不要にすることを目指しています。
フローで最初に作成しておく変数
- レコード単一変数
- recordId
- レコード型(Account)
- var_CloneContact
- レコード型(Contact)
- var_CloneChildContact
- レコード型(Contact)
- recordId
- レコードコレクション変数
- vars_CloneChildContacts
- レコード型(Contact)
- vars_CloneChildContacts
フロー内容解説
-
get_OriginContats
-
sc01
-
set_CloneContact
-
create_CloneContact
-
sc02
-
get_OriginChildContacts
-
sc03
-
loop_originChildContacts
-
set_CloneChildContact
-
add_CloneChildContacts
-
create_CloneChildContacts
-
sc04
別案
極力作らないことを正しいと考えています。
優秀なAppExchangeがあるので通常はこちらを推奨します。
https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000G12chUAB
まとめ
- 割当要素 の項目指定無しでの「=」演算子は“全フィールドコピー”を意味する。ここで Id = Null を忘れない。
- レコードの作成要素 で「レコード変数からすべての値を取得」を選ぶと、ReadOnly フィールドを自動除外して Insert。
- レコードの作成 後は同じレコード変数に 新しい Id が返る。この Id を子レコードの外部参照に流用できる。
- 子レコードは Loop → 1 件ずつ 割当 → コレクションに追加 → 一括 レコードさくせ が最もシンプル。
- フィールド追加やレイアウト変更があっても、フロー側はメンテ不要。大規模オブジェクトでも安全に運用できる。
※あくまで構築のヒントの為のサンプルです。自己責任でお願いします。