Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20190731ルーキー会 × TERAKOYAFORCE

ルーキー会、TERAKOYAFORCEコラボ会
Apexトリガー編

  • Be the first to comment

  • Be the first to like this

20190731ルーキー会 × TERAKOYAFORCE

  1. 1. Salesforce Developer Group Rookies × TERAKOYAFORCE 2019/7/31(⽔)@株式会社テラスカイ ハッシュタグ #sfdgr ハッシュタグ #terakoyaforce
  2. 2. 本⽇のメニュー 2 • 10分くらい Apex基礎の説明 • 10分くらい ApexTrigger基礎の説明 • 40分くらい ハンズオン
  3. 3. 今⽇の進⾏役 名前︓⼩林 亮理(リョウスケ) 所属︓株式会社フレクト ︓@ryosuke921186 SF歴︓7、8年くらい 最近︓デザイナー資格やっと1つ取りました 趣味︓運動(ソフトテニス、ゴルフ、ジムでトレーニング)、寝る 3
  4. 4. 「Apex」の基本
  5. 5. Apexとは 5 • Salesforceのサーバーサイドで動作するJavaに似た言語 • ロジックの記述やデータの処理に利用 クライアント サーバー API Trigger バッチ処理 ApexVisualforce (HTML/JS/CSS) LightningCmp (HTML/JS/CSS) 標準UI
  6. 6. 今⽇のお題である 「Apexトリガー」の基本
  7. 7. 概要 Apexトリガーではレコードの登録・更新・削除・復元を契機に独⾃の 処理を実⾏することができます。 7 例えば、 ・登録・更新対象レコードの編集 ・⼊⼒チェック ・関連レコードの作成 ・Webサービスの呼び出し 、、などなど
  8. 8. Beforeトリガー Afterトリガー レコードの登録・更新前に実⾏ レコード登録・更新後に実⾏ ⼊⼒規則 ワークフロー プロセスビルダー エスカレーションルール 割当ルール エンタイトルメントルール などなど Salesforceの標準機能で例えると(※イメージです)
  9. 9. そんなのプロセスビルダーとフローでできちゃうよ︕ ① コミット前のレコードにアクセスする ② 削除、復元に対する処理記述 ③ 処理順を意識した記述※ 9 多くのことは、プロセスビルダー、フロー、⼊⼒規則でも 実現可能です。 そんな中、トリガーでしかできないことは、 トリガーでしかできないこと、標準機能でもできることを覚え、 適切な設計ができるようになりましょう
  10. 10. Apexトランザクションの処理順 10 1. 古いレコードをデータベースからロード(または、新しい挿⼊の初期化) 2. 新しいレコードの値で古い値を上書き(Trigger.Newの上書き) 3. システムの⼊⼒規則の実⾏(例︓数値項⽬に英字等が⼊っていないかのチェック) 4. すべての before トリガを実⾏ 5. カスタム⼊⼒規則(作成した⼊⼒規則) 6. レコードをデータベースに保存(コミットはされていないがSFIDが発⾏される) 7. レコードをデータベースから再ロード 8. すべての after トリガを実⾏ 9. 割り当てルール 10. ⾃動応答ルール 11. ワークフロー ルールプロセス 12. エスカレーション ルール 13. 積み上げ集計数式の値の更新(存在する場合) 14. データベースのコミット 15. コミット後のロジック(メールの送信) 参考︓https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm
  11. 11. トリガーに関するお約束や⼼得について 11 ⼤体の場合、オブジェクト名+「Trigger」というものが多い名称 イベント判定をトリガーで⾏い、実処理をハンドラークラスに記述する のが⼀般的。 またトリガーはテストクラスから直接呼び出せないため、テストクラス 作成も考慮するとハンドラークラスの利⽤が望ましい トリガーハンドラーの利⽤ トリガーでのみ(⼀部例外あり)利⽤できる変数。更新対象のレコード へのアクセスやイベント判定に利⽤する コンテキスト変数の活⽤ ビューやDataloaderで⼀括更新された際に、複数レコードが同時に処理 されるため、それに対応できるようコードを記述する 複数件処理を前提に 1オブジェクトに対して、複数トリガーを作成できますが、処理順は保 証されないため、なるべく1つにしましょう 1つのオブジェクトに対して、 トリガーは(なるべく)1つ
  12. 12. トリガーの例 12 trigger OpportunityTrigger on Opportunity (before insert, before update) { OpportunityTriggerHandler handler = new OpportunityTriggerHandler(); if (Trigger.isBefore) { if(Trigger.isInsert){ handler.isBeforeInsert(Trigger.New); }else if (Trigger.isUpdate) { handler.isBeforeUpdate(Trigger.newMap,Trigger.oldMap); } } } トリガー public class OpportunityTriggerHandler { public void isBeforeInsert(List<Opportunity> oppList){ method1(oppList); } public void isBeforeUpdate(Map<Id,Opportunity> oppNewMap,Map<Id,Opportunity> oppOldMap){ method2 (oppNewMap,oppOldMap); } private void method (List<Opportunity> oppList){ for(Opportunity opp:oppList){ opp.xxxxx__c = ʻtestʼ; } } } トリガーハンドラー
  13. 13. コンテキスト変数 参考 https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_triggers_context_variables.htm 13 変数 利用方法 Trigger.isInsert 挿入操作により、トリガが実行された場合に、true を返します。 Trigger.isBefore レコードが保存される前にこのトリガが実行された場合に、 true を返します。 Trigger.New 更新後の sObject レコードリストを返します。 (List<sObject>が返される) Trigger.NewMap 更新前の sObject レコードMapを返します (Map<ID,sObject>が返される) トリガーのイベント判定や、更新対象レコードにアクセスするために コンテキスト変数を利⽤します
  14. 14. データ ベース データ登録 (Insert) ID︓IDなし 商談名︓テスト商談 完了予定⽇︓2019/07/31 Before Afterトリガー ID︓0062v00001CGivgAAD 商談名︓テスト商談 完了予定⽇︓2019/07/31 データ ベース コンテキスト変数のイメージ Trigger.Newはこ の集合体
  15. 15. データ ベース データ更新 (Update) ID︓ 0062v00001CGivgAAD 商談名︓テスト商談 完了予定⽇︓2019/07/31 Before コンテキスト変数のイメージ Trigger.Oldはこの 集合体 ID︓ 0062v00001CGivgAAD 商談名︓テスト商談Upd 完了予定⽇︓2019/07/31 更新前データ After
  16. 16. Letʻs ハンズオン n わからなければすぐに⼿を上げてください︕ サポーターが駆けつけます。 あたなの悩みはみんなの悩みです︕ 16
  17. 17. 今⽇のお題︓Apexトリガー 17https://drive.google.com/drive/folders/17yi6ubE9SysIKQIppKnXpvOoHRlCJloh?usp=sharing お題のクラスファイル ステップ やること 0. 開発者コンソールの使い方 1. トリガーを動かそう 2. Beforeトリガーで入力規則を追加しよう 3. Beforeトリガーで登録レコードの更新をしよう 4. AfterトリガーでTodoを登録しよう
  18. 18. 開発者コンソールの起動 18
  19. 19. 開発者コンソールの起動 19 起動
  20. 20. 開発者コンソールの起動 20 新規作成は こちらから
  21. 21. お題① トリガーを動かそう 取引先に対してトリガーを設定し、動作を確認しましょう。 業種が空⽩の状態で登録・更新をするとエラーが発⽣します。 ※コピペするソースコードはconnpassにURLを貼ってあります 21
  22. 22. お題② ⼊⼒チェックを追加しよう 取引先の登録・更新時に、電話(Phone)が 空⽩の場合はエラーとしましょう。 エラーメッセージは以下とする。 「電話番号は必須です。」 22
  23. 23. お題③ 更新データの操作 取引先の登録・更新時、FAX(Fax)が空⽩の場合、 電話(Phone)の値をコピーしなさい ※ちょっと意味がわからない仕様ですがお気になさらず、、、 23
  24. 24. お題④ 関連レコードの作成 取引先の登録時、紐づくTodoを⾃動的に作成しない。 Todo(Task)の内容は以下とする。 件名(Subject) ︓再訪問 任命先(WhoId) ︓取引先所有者(OwnerId); 期⽇( ActivityDate )︓7⽇後 優先度( Priority ) ︓High 状況( Status ) ︓Not Started ※優先度、状況については、各⾃環境のものに置き換えて問題ありません。 ※参考Trail︓https://trailhead.salesforce.com/ja/content/learn/modules/apex_database?trail_id=force_com_dev_beginner https://trailhead.salesforce.com/ja/content/learn/modules/apex_triggers?trail_id=force_com_dev_beginner 24

×