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.

20181030 sfdc tokyo_dg_lt_pb_and_flowdaycalc

228 views

Published on

2018/10/30 Salesforce Developers Meetup #19
のLT資料です。
当日の過度な演出を省いたシンプルVerになります。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

20181030 sfdc tokyo_dg_lt_pb_and_flowdaycalc

  1. 1. 営業日ベースで日付を計算してみよう - プロセスビルダー&フローでこんなことも出来るんだシリーズ - 2018/10/30 Salesforce Developers Meetup #19
  2. 2. 石井 智 Satoshi Ishii サンアンドサンズコンサルティング株式会社 @tasuku_papa0109 Profile
  3. 3. こんなことはありませんか?
  4. 4. ToDoの期日まで余裕がある!・・と思ったら、 期限日が祝日になっていたことに直前で気がついた・・ タイムトリガーでの時間差メール等、年末年始や長期休暇中 にメールが送られ、確認・対応できず・・ 土日は数式で対応できるけど、祝日や会社独自のお休み等に も対応して、日付を計算したい・・
  5. 5. 独自のカレンダーを使って 正確な期限を設定したい!
  6. 6. でも・・お高いんでしょう?? (開発しないとダメなんでしょう?)
  7. 7. どっちでもいけます! (答えになっていない)
  8. 8. 全体イメージ データ作成依頼 (カレンダー計算付) ToDo 基準日 :2018/10/30 任命先 :鈴木 一郎 件名 :受注後フォローコール依頼(5営業日後) 計算日数:5 期日 : 基準日 :2018/10/30 任命先 :鈴木 一郎 件名 :受注後フォローコール依頼(5営業日後) 計算日数:5 期日 :2018/11/06 任命先 :鈴木 一郎 件名 :受注後フォローコール依頼(5営業日後) 期日 :2018/11/06 状況 :未着手 カスタム カレンダー Apexトリガ or プロセスビルダー & フロー プロセスビルダーのみで実装 起動条件:期日が登録されたら 商談 カスタム オブジェクト もちろん、応用すれば 他のオブジェクトも可能 例えば・・ 商談の受注をトリガーに レコードを作成 日付 休日フラグ データ作成依頼 (カレンダー計算付) 今日、お伝えしたい 部分はここ!
  9. 9. 必要な材料とスキル (1)カスタムオブジェクト 2つ 『カスタムカレンダー』 ・・・1日1レコード登録する想定 日付、休日フラグ (例:日付:2018/10/28 休日フラグ:True) ※なので、メンテナンスが必要 『データ作成依頼(カレンダー計算付)』 基準日、計算日数、対象Obj、任命先、件名・・・ (2)プロセスビルダーの知識 条件合致から『データ作成依頼』のレコードを作成 ・・・・・・あとは・・ カスタム カレンダー データ作成依頼 (カレンダー計算付)
  10. 10. あなたはどちらでしょうか? Admin or Developer ?
  11. 11. Adminの方
  12. 12. Adminの方は プロセスビルダーとVisual Workflowで 華麗に解決しちゃいましょう (3)プロセスビルダーとVisual Workflowの知識 「高速検索」「Sオブジェクト変数」「Sオブジェクトコレクション変数」 「ループ」から「割り当て」
  13. 13. Developerの方
  14. 14. Developerの方はApexトリガ でゴリゴリと書いちゃいましょう (3)Apexトリガー開発スキル before insertトリガ、SELECT文、List型、Map型
  15. 15. Apexトリガーで書くと・・ // カスタムカレンダーから稼働日を取得(前後1年分のみ(計算結果が前後1年間で収まることが前提)) List<Date> businessDateMasterList = new List<Date>(); List<CustomCalendar__c> cc_List; Date before = (Date.today()) -365; Date after = (Date.today()) +365; String sql = ' SELECT Day__c FROM CustomCalendar__c'; sql += ' WHERE WorkingDayFlg__c = True'; sql += ' AND Day__c >=: before'; sql += ' AND Day__c <=: after'; sql += ' ORDER BY Day__c'; cc_List = Database.query(sql); for(CustomCalendar__c cc : cc_List){ businessDateMasterList.add(cc.Day__c); } // 基準値(baseDay)を元に稼働日の日数差と実際の日付を照合するマップの準備 Map<Integer, Date> businessDayMap = new Map<Integer, Date>(); List<Date> pastList = new List<Date>(); Integer futureDateCnt = 1; for (Date bdate : businessDateMasterList) { if (bdate < baseDay) pastList.add(bdate); //過去分を一旦リストに退避 else if (bdate > baseDay) businessDayMap.put(futureDateCnt++, bdate); // 未来日はカウント値と合わせてマップに格納 } // 基準日を0として登録 businessDayMap.put(0, baseDay); // 過去分をマイナス値と紐づけてマップに格納 Integer pastDateCnt = pastList.size(); for (Integer d = 0; d < pastDateCnt; d++) { Date pastDate = pastList.get(d); businessDayMap.put(d - pastDateCnt, pastDate); } あとは、作成したMapから、基準日からXX日前 or XX日後の営業日を取得し、処理す るだけ! 処理レコード毎に、基準日毎のマップ作成が必要 (Trigger new から、1レコードずつ取得した後に処理) トリガー処理内の初回1回のみ実行 基準日が2018/10/30の場合のMap値 : [ 5 , 2018/11/06] [ 4 , 2018/11/05] [ 3 , 2018/11/02] [ 2 , 2018/11/01] [ 1 , 2018/10/31] [ 0 , 2018/10/30] [ -1 , 2018/10/29] [ -2 , 2018/10/26] [ -3 , 2018/10/25] :
  16. 16. こんな複雑そうなロジック Visual Workflowで実装出来るのか?
  17. 17. できます!
  18. 18. Adminの方
  19. 19. Visual Workflowで作ると・・ あくまで例ですので、よりエレガントなロジックもあるかと思います 指定日数が マイナス? 基準日から過去分のカスタムカレンダー のレコードを取得・リストに格納(降順) 基準日から過去分の カスタムカレンダーを取得 Sオブジェクトコレクション変 数に格納 カウント値を+1 (インクリメント) 指定日数をプラスに 結果日付に格納 カウント値 = 指定日数? 基準日から未来分のカスタムカレンダー のレコードを取得・リストに格納(昇順) 基準日から未来分の カスタムカレンダーを取得 Sオブジェクトコレクション変 数に格納 カウント値を+1 (インクリメント) 結果日付に格納 カウント値 = 指定日数? 『計算基準日となる日付』 『指定日数』 の二つを変数としてプロセスビルダー から受け取ります
  20. 20. 応用すると・・・ 翌月の第2営業日までに請求書を送るToDo作成 (基準日を翌月の1日にセットして計算させ、ToDoを発行) コールセンター業務などで、1次回答期限日、2次回答期限日などを 営業日を考慮した期限を設定する (エンタイトルメント・マイルストンの時間単位とまでいかないんだけど・・) Pardotと連携している「キャンペーン」の「キャンペーンメンバー」への追加を調 整し、メール配信タイミングを調整する。 → Pardotでも平日配信調整は出来るが・・ 夏休みや年末年始等、会社独自の長期休暇期間等の配信をさける ・・・等々
  21. 21. 補足事項 メリット :Adminさんメンテ可能! コード書かないからスピード早い(個人差有り) デメリット:一括大量処理時のガバナーが心配・・(経験上) DataLoader使う場合はバッチサイズ小さめが安心か メリット :一括大量処理対策もチューニングの可能 デメリット:コード書く・テストコード・デプロイ・・ どうしてもフローが嫌いな方は、 プロセスビルダー+Apexクラスという実装もあり!? プロセスビルダー & Visual Workflow Apexトリガー
  22. 22. 伝えたかった事 実現方法はスキルに合わせて選択しましょう! ロジックの開発(バッチ処理を除く)であれば、 プロセスビルダー&フローで結構複雑な処理までカバーできる! 数式やプロセスビルダーでは収まり切れない複雑な計算ロジック だが、パターン化は出来る場合、 条件&結果の1セットを「マスタ化」しておき、必要に応じて条 件で検索して、結果を引っ張ってくる・・ような事も可能。
  23. 23. ありがとうございました

×