【Salesforce】項目を変更した時間の差分を取得したい

# 動作確認
・フェーズを更新していない状態

<img width="523" alt="スクリーンショット 2020-05-04 13.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/e4d68ac6-59dc-6b2e-f70c-da893d72a7cf.png">

・フェーズを一回更新した状態

<img width="517" alt="スクリーンショット 2020-05-04 13.24.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/15f1456f-0f30-e4db-da3a-0ec20250b8f2.png">

・フェーズを二回更新した状態
※この状態で差分を出力

<img width="525" alt="スクリーンショット 2020-05-04 13.25.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/7fa7f893-9456-e527-ae37-e00f5b0a4106.png">

・フェーズを三回更新した状態
※更新前は二回目に更新した際の日時を設定、更新後は三回目に更新した際の日時を設定

<img width="514" alt="スクリーンショット 2020-05-04 13.25.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/6fafb9fa-766f-b2bb-081a-95d26c0e0e9e.png">

# 実現方法
## オブジェクトに項目を持たせるパターン

フェーズを更新した際に値を持たせる項目を作成
<img width="757" alt="スクリーンショット 2020-05-04 13.16.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/99f72cc9-1b60-b44b-9783-062e936b9fff.png">

更新後 - 更新前の数式を保持する項目を作成
<img width="356" alt="スクリーンショット 2020-05-04 13.15.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/76fc3496-5410-5409-14e0-aa1fa8f4c392.png">

Apexや項目自動更新でフェーズ更新前日時、更新後日時を設定
※省略

差分日時が取得可能
<img width="528" alt="スクリーンショット 2020-05-04 13.18.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/7aea9495-655a-46f3-7a14-91ceb9734b1c.png">

## Historyから取得するパターン(不可)
オブジェクトの項目履歴管理を設定

<img width="221" alt="スクリーンショット 2020-05-04 12.28.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/b4a5df25-aacb-e3ce-fb65-fd0d25aed9c6.png">

フェーズ項目の履歴を設定

<img width="1050" alt="スクリーンショット 2020-05-04 12.29.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/34127c9f-a397-6d12-a927-9d0da4b03a06.png">

TriggerHandlerで値を取得するように設定
※フェーズ項目を更新したらいつ(Before, After)Historyが作成されるのか確認

```Apex:TestTriggerHandler.cls

    public void onBeforeUpdate(Test__c[] newList, Map<Id, Test__c> newMap, Test__c[] oldList, Map<Id, Test__c> oldMap){
        System.Debug('★★★★ 関数を開始する ： onBeforeUpdate');
        System.Debug('★★ 変数 newList ： ' + newList);
        List<Test__History> tHisList = [SELECT Id, IsDeleted, ParentId, CreatedById, CreatedDate, Field, OldValue, NewValue FROM Test__History WHERE ParentId = :newList[0].Id AND Field = 'Field1__c' ORDER BY CreatedDate DESC LIMIT 2];
        System.Debug('★★ for文に渡すリスト tHisList ： ' + tHisList );
        System.Debug('★★ for文に渡すリストのサイズ tHisList ： ' + tHisList.size());
        for(Test__History th : tHisList){
            System.Debug('★★ for文の現在値 th ： ' + th);
            System.Debug('★★ for文の現在値 th.CreatedDate ： ' + th.CreatedDate);
            System.Debug('★★ for文の現在値 th.OldValue ： ' + th.OldValue);
            System.Debug('★★ for文の現在値 th.NewValue ： ' + th.NewValue);
        }
        System.Debug('★★★★ 関数を終了する ： onBeforeUpdate');
    }

    public void onAfterUpdate(Test__c[] newList, Map<Id, Test__c> newMap, Test__c[] oldList, Map<Id, Test__c> oldMap){
        System.Debug('★★★★ 関数を開始する ： onAfterUpdate');
        System.Debug('★★ 変数 newList ： ' + newList);
        List<Test__History> tHisList = [SELECT Id, IsDeleted, ParentId, CreatedById, CreatedDate, Field, OldValue, NewValue FROM Test__History WHERE ParentId = :newList[0].Id AND Field = 'Field1__c' ORDER BY CreatedDate DESC LIMIT 2];
        System.Debug('★★ for文に渡すリスト tHisList ： ' + tHisList );
        System.Debug('★★ for文に渡すリストのサイズ tHisList ： ' + tHisList.size());
        for(Test__History th : tHisList){
            System.Debug('★★ for文の現在値 th ： ' + th);
            System.Debug('★★ for文の現在値 th.CreatedDate ： ' + th.CreatedDate);
            System.Debug('★★ for文の現在値 th.OldValue ： ' + th.OldValue);
            System.Debug('★★ for文の現在値 th.NewValue ： ' + th.NewValue);
        }
        System.Debug('★★★★ 関数を終了する ： onAfterUpdate');
    }

```

フェーズを更新

<img width="1662" alt="スクリーンショット 2020-05-04 12.30.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/609ce413-ab71-0151-3549-7e078fe00fe9.png">

BeforeUpdateでもAfterUpdateでもHistoryが作成されていないことを確認
※両方とも同じHistoryを取得している

<img width="587" alt="スクリーンショット 2020-05-04 12.36.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/377b0dfa-2ddd-b27a-1ff0-f108f1638636.png">

開発者コンソールで取得できることを確認
※フェーズ項目更新時、作成されたHistoryを元に差分取得は不可と確認

<img width="1679" alt="スクリーンショット 2020-05-04 12.37.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/b33370b9-6e52-ff5d-6983-de6861f32f66.png">

# 参考リンク
無し