function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
TylorTylor 

承認プロセスのレコードロック確認方法

お世話になっております。

 

承認プロセスにより、ロックされたレコードに対しApex Codeでレコードのロック状態を確認したいのですが、

どのように行えばよいのかご教示していただけますでしょうか?

TylorTylor

調査不足ですが、解ったことを記載しておきます・・・

 

英語版Force.com Discussion Boardsで検索したところ

 

以下の情報が掲載されていました!

 

①オブジェクトに「レコードロック有無」のチェックボックス項目を作成する

②承認プロセスの申請時のアクション、最終承認時のアクション時に、項目自動更新でチェックボックスをオンにする

③承認プロセスの最終却下時のアクション、取り消しアクション時に、項目自動更新でチェックボックスをオフにする

④対象レコードの「レコードロック有無」をSOQLで取得して、チェックボックスがロックされている(true)か確認する

と、言った方法でした。

 

参考URL:

 

・How to lock the Record?

 

・How to retain Approval Lock Record functionality even when EDIT is overriden with a VF Page?

 

 

正直、簡単に一発でレコードロック状態が取得できるAPIもしくは、SOQLが欲しいのですが、

提供されていないんですかね・・・

 

引き続き

 

皆様の返信、お待ちしております。

tajimatajima
承認プロセスで処理中のレコードの状態は
ProcessInstance
ProcessInstanceHistory
ProcessInstanceStep
ProcessInstanceWorkitem
これら4つのオブジェクトで管理されています。
これらのオブジェクトから、ロックの状態は取得できませんが
現在承認プロセスのどの状態にあるのかは取得できるので、
それで処理を振り分けるという方法が採れなくはないですね。
ロックの状態そのものを採る方法は残念ながら無いように思います。

pomu0325pomu0325

無理やりですが、ロックされたレコードをupdateしようとするとDmlExceptionでENTITY_IS_LOCKEDが発生するのを利用して、こんな感じで実装してみました。

 

 

isLocked = false;
SavePoint sp = DataBase.setSavepoint();
try {
    update targetRecord;
} catch (DmlException e) {
    if(e.getDmlType(0) == StatusCode.ENTITY_IS_LOCKED) {
        isLocked = true;
    }
} finally {
    DataBase.rollback(sp);
}

 

 

TylorTylor

さん、pomu0325 さん

返答、ありがとうございます。

 

私も最終的に、pomu0325 さんの

「updateを実行し、例外をキャッチする」

で落ちついてました。

現在、問題なく稼動しています。

 

でもやはり、ロックを確認するメソッドが欲しいですね・・・