Winter'16からApexでロック操作とロック解除の操作ができるようになったみたいなので試してみました。
有効化
この機能を利用するには設定のプロセスの自動化で有効化する必要があります。
ロック解除操作
まずはレコードのロック解除から試してみました。
System.Approvalのunlockメソッドでロック解除ができるみたいです。
実行してみたところ、無事にロック解除が行われていました。その際に承認申請のステータスは変更ありませんでした。
ロック操作
続いてレコードのロックを試してみました。
実行後、無事にレコードがロックされていることを確認できました。
承認申請実行前のレコードとロック操作
承認申請が実行される前のレコードだった場合、ロック操作が実行できるかも確認してみました。
実行後、ログを見るとエラーにはなりませんでした。
レコードの詳細ページを確認したところ、問題なくロック操作が実行されていました。承認申請のステップ状況は関係なく実行できるみたいです。
承認プロセス開始条件を満たしていない場合
承認プロセスには開始条件を指定することができます。条件を満たしていない場合、承認申請を実行することはできないようになっています。
このときロック操作は実行できるのか確認してみました。やってみたところ、承認申請の開始条件に関係なくロック操作が実行できました。
承認プロセスの管理対象外オブジェクトのロック操作
承認プロセスは管理するオブジェクト毎にプロセスを有効化できますが、対象外のオブジェクトに対してロック操作ができるかも調べてみました。
次のように対象外オブジェクトの商談に対して処理を実行してみます。(実行結果の判定処理も追加してみました。)
デバッグログ的には成功していました。
ですが、詳細ページを見てみるとロックアイコンは表示されていませんでした。
念のため、代理ログインして編集できるか試してみたのですが、問題なく編集画面を表示できました。
ということで承認プロセスの管理対象外のオブジェクトはロック操作できないみたいです。
ロック済みレコードのロック操作
既にロック済みのレコードにロック操作を実行したときの結果を確認してみました。
Approval.LockResult的にエラーになるかなと思ったのですが、正常系として実行できるみたいです。
エラーになる条件について
Approval.LockResultでエラーになる条件も確認してみようと思いました。とりあえず保存時に入力規則エラーが発生する状態で試してみます。
レコードの更新ができない状態なのでロック操作も不可になると思ったのですが、ロック操作は入力規則判定に関係なく実行できるみたいです。(そもそもApexからではなく、詳細ページのロック解除ボタンからロック操作を行っても入力規則判定に関係なく実行できました。)
確認はしていませんが、Apexは基本システム管理者権限で実行されるので、他のユーザでも同様に入力規則エラーに関係無くロック操作が実行できるんじゃないかなと思います。
エラーを発生させる条件がちょっと思いつきませんでしたが、今回調べてみた結果はこんな感じとなっていました。
サンプルコード
サンプルです。一レコードずつ処理する方法で確認しましたが、リストで一括操作もできるようになっているみたいです。