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


動作確認

・フェーズを更新していない状態

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

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

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

実現方法

オブジェクトに項目を持たせるパターン

フェーズを更新した際に値を持たせる項目を作成

更新後 - 更新前の数式を保持する項目を作成

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

差分日時が取得可能

Historyから取得するパターン(不可)

オブジェクトの項目履歴管理を設定

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

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

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');
    }

フェーズを更新

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

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

参考リンク

無し