はじめに
このブログの基となったのはこちらの投稿です。
この投稿を読んだ当時、仕事で行動のActivityDateを利用したプロセスビルダーを作成した頃だったため、
「『終日行動にチェックを入れない → ActivityDateTime に開始時刻が保存される』…?あれ、仕事で作ったプロセスビルダー、終日行動関係なしにActivityDateを条件に使用してたよマズいよ。」
…
「あれ、でも動作確認では期待通り動作したよな。あれ?」
ということで、詳しく調べてみることにしたのでした。
ActivityDate はいつ保存される?
まず、終日行動にチェックを入れた行動とチェックを入れていない行動を作成し、SOQLで内容を確認します。
すると以下表の通り、ActivityDateは終日行動の内容にかかわらず値が入っていることが分かります。
項目 | 終日行動=TRUE | 終日行動=FALSE |
---|---|---|
ActivityDate | 値あり | 値あり |
ActivityDateTime | 空白 | 値あり |
(なんだ、やっぱりActivityDateは必ず値が入るんじゃないか)と思いましたが、念のためActivityDateに関する入力規則を作成し、動作を見ることにしました。
すると…、
確かに、ActivityDateだけを見る入力規則では、終日行動のチェックがない行動をスルーしてしまいました。
何故だ、と思いデバッグログで入力規則の判定部分を見ると…、
- 終日行動のチェックあり
VALIDATION_FORMULA|ActivityDate + 2 <= TODAY()|ActivityDate=2020-08-25 00:00:00 VALIDATION_FAIL
- 終日行動のチェックなし
VALIDATION_FORMULA|ActivityDate + 2 <= TODAY()|ActivityDate=null VALIDATION_PASS
終日行動のチェックがない場合、入力規則時点でのActivityDateはnullになっていたため、入力規則がスルーされていました。
ちなみに入力規則に用いる項目がActivityDateTimeの場合、以下の通り終日行動のチェックがない場合のみ判定されます。
- 終日行動のチェックあり
VALIDATION_FORMULA|ActivityDateTime + 2 <= NOW()|ActivityDateTime=null VALIDATION_PASS
- 終日行動のチェックなし
VALIDATION_FORMULA|ActivityDateTime + 2 <= NOW()|ActivityDateTime=2020-08-25 07:00:00 VALIDATION_FAIL
終日行動のチェックがない行動レコードのActivityDateはいつ登録されているのか?
終日行動のチェックがない行動のActivityDateは入力規則判定時点では空でした。
一方、SOQLで検索した場合はActivityDateに値は入っているので、どこかのタイミングで値は入っているはずです。
そこで、フロー、ワークフロー、プロセスビルダーでActivityDateの内容を他項目にコピーするよう設定し、動作を確認してみます。
結果は以下のようになりました。
設定内容 | 結果 |
---|---|
フロー(保存前更新) | 空白 |
フロー(保存後更新) | 値が設定される |
ワークフロー | 値が設定される |
プロセスビルダー | 値が設定される |
これをトリガと実行の順序に当てはめてみると、おそらく「7. レコードはデータベースに保存されますが、まだ確定されません。」の時点でAcitivityDateが登録されているのではないか、という推測ができます。
終わりに
AcitivityDate はSalesforce側が登録する「システム項目」に近いものですが、その登録のタイミングは必ずしも想定と合わない、ということが分かりました。
この投稿が皆様の役に立てれば幸いです。
おまけ
本動作について、行動オブジェクトからのありがたいお言葉をどうぞ。
行動「ActivityDateに日付は入れる。入れるが…今回 まだその時と場所の指定まではしていない。そのことをどうか諸君らも思い出していただきたい。つまり…我々がその気になれば、入力規則判定後にActivityDateTimeからActivityDateへ日付をコピーすることも可能だろう…ということ…!」
— Mark Hammer (@Mar9Hammer) 2020年8月20日
ありがとうございました。