ブログ

2024/12/04
【プリザンター】 第276回)サーバスクリプトでcontext.UserData使用時の備忘録

サーバスクリプト内データ共有のためのcontext.UserData

こんにちは、CCS田中です。

みなさん、サーバスクリプトは使っていますでしょうか?
サーバスクリプトを使用していると、変数をスクリプト間で共有したいケースが出てきます。
特に「行表示の前」を条件にしたときに、1行ずつスクリプトが実行されるため、初期データを使いまわしたい場合などです。

スクリプトであればセッションにデータを保存して、それを呼び出して使うということもできますが、サーバスクリプトでは「context.UserData」というものがあり、これを使うことでデータを共有することができます。今回、この「context.UserData」の使い方の説明ではなく、私がハマった失敗から備忘録としてブログに記載したいと思います。

context.UserDataを使ってデータが共有できないトラブルの対処

通常、「context.UserData」は、以下のようにデータを保存することで、そのデータを後で使うことができます。


context.UserData.MyData = model.ClassA;
context.Log(context.UserData.MyData);


しかし、私が実際に設定したところ、アプリケーションエラーになってしまい動作しませんでした。
設定していた内容は以下の通りです。

条件を「行表示の前」にしておき、1行目を読み込んだときにだけ以下の処理を行います。

context.UserData.SlotCount = SlotCount;


SlotCountは、二次元配列を使用しており、このcontext.UserData.SlotCount を2行目以降の処理で使用しようとしたところ、アプリケーションエラーになりました。
システムログを確認したところ、以下のExceptionが発生していることがわかりました。

ScriptEngineException: Error: Cannot access a disposed object. Object name: 'Microsoft.ClearScript.V8.V8ScriptEngine'.

そのままではどうしようもないため、context.UserDataに入れたデータをJSON形式に変換して、その後変換したものをパースして戻すということにしたら、問題なく使えるようになりました。実際の変換は以下の通りです。

context.UserData.SlotCount = JSON.stringify(SlotCount);
let RowSlotCount = JSON.parse(context.UserData.SlotCount) ;


処理的には間違っていなくてもエラーになってしまうと、どのように対処してよいかわからない場合がありますよね。
他の方が今回と同様の事象が発生したときに、この内容で解決できれば幸いです。

まとめ

いかがでしたか?

今回、備忘録的な内容でしたが、同様のトラブルが発生した方には有用な情報になったかと思います。
トラブルが発生して解決方法が分からないときは困ってしまいますよね。そういったときに備えて、ぜひプリザンター年間サポートのご契約を検討いただければと思います。

弊社ではプリザンターをご使用中、または、これからご使用になられる方向けに、運用ノウハウ集、プリザンター逆引き辞典、スタイル・スクリプトサンプル集の販売を行っております。
また、 プリザンターからのExcel帳票出力・PDF帳票出力の支援パック販売 も行っております。
プリザンター導入の支援や、スクリプト開発などの支援も行っておりますので、まずは気軽にご相談ください。
※ご相談の内容によっては有料となる場合がございます。予めご了承ください。
☆☆☆
ブログ内容への質問や追加説明をご希望の方は【 問い合わせフォーム 】からお気軽にお問い合わせください
☆☆☆

PAGE TOP