Winter'16で承認プロセスのロック操作がApexから実行できるようになりました。これで承認プロセス周りでより幅広い対応ができるようになったと思います。その中の1つで承認申請時に自動でロックされるのをApexトリガで解除したいという話があったのでDeveloper環境で試してみました。
まず通常の申請時の挙動ですが、確かに承認申請時にレコードロックが強制的に実行されます。(解除不可だと思います。)
今回、トリガ実行の条件になるようにIsUnlockチェックボックスを用意しました。申請時に項目自動更新でTrueに更新します。
続いてApexトリガを用意します。検証用なので雑につくってありますがこんな感じです。
これで実行してみると次のエラーが発生しました。
こういう方法はダメなのかなーと思ってエラーメッセージを見ると、APIが有効になっていません。・・とのこと。
Apex approval lock/unlock api preference not enabled.:
Apexのロック操作は設定で有効化する必要があるのを忘れてました。(プロセスの自動化設定から有効化します。)
きちんと有効化して再度実行した結果がこちら。・・・ロック解除はされませんでした。
Debug Logを確認してみるとApexトリガ自体は正しく動作していそうです。
申請時のアクションで実行される項目自動更新を条件にすればAfterトリガ処理が最後に実行されてロック解除ができるかなと考えたのですが、申請時のレコードロック処理はApexのAfterトリガより後に実行されるみたいでした。
そもそも標準の承認申請でロックされたレコードは解除できないルールがあったりしないかと思い、レコードロック後に開発者コンソールからロック解除を実行してみました。
この場合は、問題なくロック解除が実行されました。
ということで、申請時のレコードロックをApexトリガから解除することはできないと思われ・・・と最後に1つ思いついたのが、非同期処理によるロック解除操作です。これならもしかしていけるかもしれないと試してみました。
やってみた結果...無事にロック解除が実行されました。
ひとつ問題点をあげると、非同期による処理なので反映までに時間がかかることがあります。(一度画面を更新しないと反映されません。)それでもVFページやスケジュールバッチ、WebServiceなどで対応するよりは簡単に実行できると思います。
最後にトリガをつかったレコードロック解除はできることがわかりましたが、特別な理由がない場合は申請中のレコードロック解除は行わないほうがいいと思います。解除する場合は承認者が変更に気付かずに承認してしまわないように対策を検討した方が良さそうです。
サンプルコード
検証用のサンプルコードです。IsUnlock__cはチェックボックス型のカスタム項目になります。