こんにちは。Oracle NetSuiteパートナー EvangSolの湯浅です。
今回は、弊社エンジニアが直面した、ユーザーイベントスクリプト(User Event Script:以下UE)に関する事象について、発生原因と対応策をご紹介いたします。
事象 – NetSuiteの「UEからUE」の呼び出しができない?
「UEからUEを呼び出したいのに動かない…」
NetSuiteで開発を行う際に「UEから別のUEを呼び出したいが、想定通りに動作しない」と悩んだことはありませんか?弊社エンジニアもまさにこの仕組みを実現するために頭を悩ませました。
たとえば、以下のようなシナリオです。
- 請求書を保存するとき、カスタムフィールドに自動計算した値を設定するUEを実装
- 注文書が保存されたとき、自動で請求書を作成するUEを実装(afterSubmit)
- 2のUEを実行後に、1のUEが実行されることを想定していたが、①のUEが実行されず、結果的にデータの不整合が発生
実はNetSuiteの仕様上、UE同士を直接呼び出すことはできないため、どれだけコードを書いても「UE → UE」の動作を実現するのは不可能だったのです。いったいなぜなのでしょうか?
原因と対応策
なぜ呼び出せないのか?
NetSuiteでは、UE同士を直接呼び出せない仕様としている理由について、SuiteAnswerにいくつか挙げられています。
(参考文書:SuiteAnswers Answer ID:81081「User Event Script to Trigger Another User Event Script Using Suitelet With SuiteScript 2.0」)
- 無限ループの防止
スクリプト同士が相互に呼び出せると、無限ループが発生し、システム全体のパフォーマンスが深刻に低下する恐れがあるため。 - パフォーマンスへの影響
UEから別のUEを直接呼び出すと、処理負荷が増し、タイムアウトやパフォーマンス低下を招きやすくなるため。
どうすれば実現できるのか?
では「UEからUEを呼び出せないなら、どうすればいいの?」という課題に対して調べたところ、以下の対応策が有効であることがわかりました。
- 対応策1. スケジュールドスクリプトを使う(最も王道!)
- 対応策2. RESTletを活用する(即時性が必要ならコレ!)
- 対応策3. Suiteletを利用する(リアルタイム処理+ユーザーコンテキストの継承)
- 対応策4. ワークフローを活用する(ノーコードで解決!)
いかがだったでしょうか。今回はNetSuiteのUEからUEを呼び出せない事象の概要についてご紹介しました。次回は、より具体的な対応内容や処理方法などをご紹介させていただきます。ぜひ次回もご覧ください。
参考情報
NetSuite スクリプト(SuiteScript)は、NetSuite のカスタマイズと自動化のための JavaScript ベースのスクリプト開発環境です。SuiteScript には以下の種類があります。
SuiteScript の種類
- Client Script - ユーザーのブラウザ上で動作するスクリプト(例:フォームのバリデーション)
- User Event Script - レコードの作成・更新・削除時にトリガーされるスクリプト
- Suitelet - カスタム UI や API を作成するためのスクリプト
- Scheduled Script - 指定したスケジュールで実行されるバッチ処理スクリプト
- Map/Reduce Script - 大量データの処理に適したスクリプト
- RESTlet - REST API を作成するためのスクリプト
- Portlet Script - ダッシュボード用のカスタムポートレットを作成