tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apexコードによる承認プロセスのロック操作を試してみました

Winter'16からApexでロック操作とロック解除の操作ができるようになったみたいなので試してみました。

f:id:tyoshikawa1106:20151015003213p:plain

有効化

この機能を利用するには設定のプロセスの自動化で有効化する必要があります。
f:id:tyoshikawa1106:20151015003344p:plain

ロック解除操作

まずはレコードのロック解除から試してみました。
f:id:tyoshikawa1106:20151015003419p:plain


System.Approvalのunlockメソッドでロック解除ができるみたいです。
f:id:tyoshikawa1106:20151015004001p:plain


実行してみたところ、無事にロック解除が行われていました。その際に承認申請のステータスは変更ありませんでした。
f:id:tyoshikawa1106:20151015004420p:plain

ロック操作

続いてレコードのロックを試してみました。
f:id:tyoshikawa1106:20151015003738p:plain


実行後、無事にレコードがロックされていることを確認できました。
f:id:tyoshikawa1106:20151015004751p:plain

承認申請実行前のレコードとロック操作

承認申請が実行される前のレコードだった場合、ロック操作が実行できるかも確認してみました。
f:id:tyoshikawa1106:20151015004924p:plain


実行後、ログを見るとエラーにはなりませんでした。
f:id:tyoshikawa1106:20151015005058p:plain


レコードの詳細ページを確認したところ、問題なくロック操作が実行されていました。承認申請のステップ状況は関係なく実行できるみたいです。
f:id:tyoshikawa1106:20151015005201p:plain

承認プロセス開始条件を満たしていない場合

承認プロセスには開始条件を指定することができます。条件を満たしていない場合、承認申請を実行することはできないようになっています。
f:id:tyoshikawa1106:20151015005402p:plain


このときロック操作は実行できるのか確認してみました。やってみたところ、承認申請の開始条件に関係なくロック操作が実行できました。
f:id:tyoshikawa1106:20151015005539p:plain

承認プロセスの管理対象外オブジェクトのロック操作

承認プロセスは管理するオブジェクト毎にプロセスを有効化できますが、対象外のオブジェクトに対してロック操作ができるかも調べてみました。
f:id:tyoshikawa1106:20151015005816p:plain


次のように対象外オブジェクトの商談に対して処理を実行してみます。(実行結果の判定処理も追加してみました。)
f:id:tyoshikawa1106:20151015010339p:plain


デバッグログ的には成功していました。
f:id:tyoshikawa1106:20151015010436p:plain


ですが、詳細ページを見てみるとロックアイコンは表示されていませんでした。
f:id:tyoshikawa1106:20151015010555p:plain


念のため、代理ログインして編集できるか試してみたのですが、問題なく編集画面を表示できました。
f:id:tyoshikawa1106:20151015010928p:plain


ということで承認プロセスの管理対象外のオブジェクトはロック操作できないみたいです。

ロック済みレコードのロック操作

既にロック済みのレコードにロック操作を実行したときの結果を確認してみました。
f:id:tyoshikawa1106:20151015011546p:plain


Approval.LockResult的にエラーになるかなと思ったのですが、正常系として実行できるみたいです。
f:id:tyoshikawa1106:20151015011627p:plain

エラーになる条件について

Approval.LockResultでエラーになる条件も確認してみようと思いました。とりあえず保存時に入力規則エラーが発生する状態で試してみます。
f:id:tyoshikawa1106:20151015012003p:plain


レコードの更新ができない状態なのでロック操作も不可になると思ったのですが、ロック操作は入力規則判定に関係なく実行できるみたいです。(そもそもApexからではなく、詳細ページのロック解除ボタンからロック操作を行っても入力規則判定に関係なく実行できました。)
f:id:tyoshikawa1106:20151015012319p:plain


確認はしていませんが、Apexは基本システム管理者権限で実行されるので、他のユーザでも同様に入力規則エラーに関係無くロック操作が実行できるんじゃないかなと思います。


エラーを発生させる条件がちょっと思いつきませんでしたが、今回調べてみた結果はこんな感じとなっていました。

サンプルコード

サンプルです。一レコードずつ処理する方法で確認しましたが、リストで一括操作もできるようになっているみたいです。