自動化プロセスの実行順序

自動化プロセスの実行順序 - Qiita

★は同一オブジェクトに対して再度Apexトリガが実行される可能性のあるもの。

  1. 項目の必須・型・長さの検証。
  2. 保存前更新を実行するフローの実行(Spring '20)。
  3. Beforeトリガの実行。
  4. システム入力規則・カスタム入力規則の検証。
  5. 重複ルールの実行。
  6. レコードのデータベースへの保存(コミットはされない)。1
  7. Afterトリガの実行。
  8. 割り当てルールの実行。
  9. 自動レスポンスルールの実行。
  10. ワークフロールールの評価。
  11. ワークフロー項目自動更新の実行。★
  12. プロセスビルダーの実行。★
  13. エスカレーションルールの実行。
  14. エンタイトルメントルールの実行。
  15. 主オブジェクトの更新(積み上げ集計項目、クロスオブジェクトの項目自動更新)
  16. 条件に基づく共有ルールの実行。
  17. DML操作のコミット。
  18. コミット後のロジック(ワークフローメール送信・TODO・アウトバウンドメッセージなど)が実行。

留意事項

トランザクション

  • 一連の処理の流れは1トランザクションとしてみなされます。そのためガバナ制限に注意する必要があります(CPU使用時間など)。
  • 静的変数はトランザクションの範囲内で維持されます。そのため、同一トランザクションで複数回トリガが実行されるようなときに、静的変数を使用することで初回のみ処理を行うというようなことができます。(Apexでは、静的変数はトランザクションをまたいで使用することができず、トランザクション終了後に破棄されます)。
    • たとえば、「従オブジェクトを保存→従オブジェクトのApexトリガ(1)→主オブジェクトの積み上げ集計項目が更新→主オブジェクトのApexトリガ(2)」の処理が行われたとき、(1)の静的変数は(2)でも維持されます。

静的変数は、Apex トランザクションの範囲内でのみ静的です。サーバ全体または組織全体で静的なわけではありません。静的変数の値は、1 回のトランザクションのコンテキスト内で保持され、トランザクションの境界を超えたときにリセットされます。たとえば、Apex DML 要求によってトリガが何回も起動される場合、これらのトリガ呼び出しを通して静的変数は保持されます。(Apex 開発者ガイド)

数式項目

  • 数式項目は任意の方法で項目にアクセスするたびにその結果を計算しリアルタイムに表示します。
    • ワークフロールールがその条件や式に数式項目を使用している場合、ワークフロールールの条件がチェックされたときに、その数式項目は計算されます。
    • トリガのTrigger.oldはデータベースから元のレコードが読み込まれたとき、Trigger.newは要求から新しいレコード項目の値が読み込まれ、古い値を上書きされた時に計算されます。

保存前更新を実行するフロー

  • 保存前更新を実行するフローが複数存在する場合、実行順序は制御できません。
  • レコード所有者のみの変更では、レコードトリガフローは起動されません。

トリガ

  • 同一オブジェクトに複数のトリガがある場合、実行順序は制御できません。
  • 複数のトリガがあっても、triggerファイル単位で「Beforeトリガ処理→Afterトリガ処理」が行われるわけでなく、上記手順5.ですべてのBeforeトリガが実施され、上記手順9.ですべてのAfterトリガが実施されます。
  • 項目自動更新やプロセスビルダーの項目更新、Afterトリガでのアップデートなどを行うと、再度トリガが実行されます。
    • 同一トランザクションで、初回の実行時のみに処理を行いたい場合は、静的変数を利用します。
    • BeforeInsert・AfterInsertのあとに再度トリガが実行された場合はBeforeUpdate・AfterUpdateが実施されます。
    • 2回目以降のトリガ実行であっても、Trigger.oldはトランザクションの直前の値が使用されます(注:Insertトリガのあとに実施されるUpdateトリガでもTrigger.old、Trigger.oldMapにオブジェクトは格納されています)。
  • BeforeトリガはDBに保存される前なので、BeforeInsert時は、作成日・作成者・最終更新日・最終更新者・自動採番項目・IDがnullとなります。BeforeUpdate時は、Trigger.newでも最終更新日・最終更新者の値が古いままとなります(ただし項目自動更新などで再度トリガが実施される場合のTrigger.newは最新の値)。
  • Beforeトリガ・Afterトリガともに親の積上げ集計項目の計算より先に実行されます。なので、トリガの中で親の積上げ集計項目を参照するときは古い値になります。

入力規則

  • Insert時は、自動採番項目・ID項目・作成者・最終更新者はnull扱いとなります。
  • Insert時は、作成日・最終更新日を使用した式は無視されます。2
    • なので、特定の日付以降に作成されたレコードのみ入力規則を実施したい場合は&& (DATEVALUE(CreatedDate) >= DATE(2020,05,06) || ISNEW())のようにISNEW()を併用する必要があります。
  • カスタム入力規則は、入力値ではなくbeforeトリガ後の値で評価されます。
  • 入力規則は親の積上げ集計項目の計算より先に実行されます。なので、入力規則のなかで親の積上げ集計項目を参照するのは避けるべきです。主オブジェクトの入力規則で積上げ集計項目を使用するとつねに更新後の値で判定されます(従オブジェクトの更新で主オブジェクトの積上げ集計項目が更新されると主オブジェクトの入力規則が判定されます)。

積み上げ集計項目

  • 親レコードに対する編集アクセス権限がない場合でも、親レコードが更新されます。
  • 主オブジェクトの積み上げ集計項目が変更されるような従オブジェクトの更新は、主オブジェクトに対して上述の全処理フローが実施されます。

ワークフロー項目自動更新

  • 同一オブジェクトに複数のワークフロー項目自動更新がある場合、実行順序は制御できません。
  • ワークフロー項目自動更新でレコードが更新された場合、下記が実行されます(カスタム入力規則、重複ルール、ワークフロー、プロセスビルダーおよびエスカレーションルールは再実行されません)。
    • 標準の入力規則
    • BeforeUpdate トリガ
    • AfterUpdate トリガ
  • 時間依存のアクションに基づくワークフロー項目更新は、いかなるルールもトリガしません。
  • 「項目変更後にワークフロールールを再評価する」にチェックをすると、更新が起きたレコードに対し、すべてのワークフロールールが検証され、条件を満たしているワークフローが実施されます。
  • 変更前と変更後の値が一致しているときは項目自動更新が実施されないため、Apexトリガを再実行しません。
  • 項目レベルセキュリティの影響を受けません。

クロスオブジェクトの項目自動更新

  • 親レコードに対する編集アクセス権限がない場合でも、親レコードが更新されます。
  • 主オブジェクトの積み上げ集計項目が変更されるような従オブジェクトの更新は、主オブジェクトに対して上述の全処理フローが実施されます。

プロセスビルダー

  • 同一オブジェクトに複数のプロセスビルダーがある場合、実行順序は制御できません。
  • 処理中に呼ばれたプロセスビルダーでレコードの更新が行われると、再度Apexトリガ、カスタム入力規則、重複ルール、エスカレーションルールが実行されます
  • 「この条件を評価した後の操作を指定」で「次の条件を評価」を選び、次のアクションで再度レコードを更新すると再度Apexトリガが実行されます。
  • アクション「レコードの更新」は、項目レベルセキュリティの影響を受けません。

その他

リードの取引開始について

  • リード設定 [取引開始済みのリードに入力規則が必須] を有効化しない限り、リードの取引開始時に上述の処理フローは実施されません。

承認プロセスについて

  • 承認プロセスではクロスオブジェクトの項目自動更新を含めることはできません。
  • 「項目変更後にワークフロールールを再評価する」の項目自動更新によって、ワークフロールールの判定が行われたとき、クロスオブジェクトの項目自動更新は実施されません。
  • 承認プロセスによる項目自動更新ではカスタム入力規則は実施されません(idea)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值