
Aras Innovatorサーバーイベント ”Version“ の詳しい動きをまとめてみた
こんにちは。クレスコ・デジタルテクノロジーズの神田です。
本記事では Aras Innovatorの開発者向けに、サーバーイベント “Version” に関する詳しい動作をまとめましたのでご紹介します。
※Aras Innovator®のサーバーメソッドについてまとめてみた の続編となります。
■あわせて読まれている資料:
設計~製造へフレキシブルに最新の設計情報を反映!
→製造BOMソリューション(SMB)
目次[非表示]
世代管理の設定について
本題に入る前に、世代管理について少し触れておきます。
Aras Innovatorでは、アイテムタイプの定義で バージョン管理の方法を設定できます。
バージョン管理の方法は「無効、手動、自動」の3種類に分けられます。
各アイテムの "config_id" をグループ単位とし、 "generation" で順序を管理しています。
例えば、Part アイテムでは初期設定が「バージョン管理:有効」なので、保存時に自動的に世代が上がります。
保存されたアイテムについて、「バージョン履歴参照」から 世代ごとに履歴を確認できます。
データベースのイメージで表現すると、下記のように “config_id” 単位で グループ化されている状態になります。
そして、この世代が上がるタイミングで、サーバーイベントの “onBeforeVersion”, “onAfterVersion” が動作します。
サーバーイベントの挙動を正しく理解して、安定した実装が行えるよう詳しく説明していきます。
世代が上がるタイミング
a. 概要
イベントの詳細に入る前に、世代が上がるタイミングを整理します。
b. 画面操作での例
アイテムタイプ定義で「バージョン:自動」を指定した場合、アイテムの世代が上がるタイミングを画面操作で例えると、 アイテムを「編集(Edit)」→「保存(Save) または 完了(Done)」したときの1回目 のときです。
保存(Save)を押した後、「完了(Done)、破棄(Discard)」せずに連続で保存(Save)しても、世代は上がらずに更新のみを行います。
c. AMLでの世代管理
AMLの場合は、lock→update (または edit や merge) を行った時点で、バージョン自動によって世代が上がります。
画面の動作と同じで、lock→update でバージョン自動によって世代が上がった後は、unlockするまでの間は連続で updateしても世代は上がりません。
また、AMLの場合は 意図的に世代を上げたくない場合 version="0" 属性を設定することで世代更新を抑制できます。
これらのルールや例に基づいて、具体的なイベントフローを以下で説明します。
フローチャートでイメージの理解
バージョンのサーバーイベント詳細を確認するため、3パターンに整理しました。
結果はサーバーログから独自に調査したもので、実装のポイントとなる部分を視覚化しました。
“onBeforeUpdate”イベントで action=“version” をスキップ判定する意味とは?
開発コードで下記のような判定を見たことはありますか?
初見だと「なぜ “onBeforeUpdate”イベントで this.getAction()==“version”の判定をしているのか?」と思うかもしれません。
先程のフローに書かれた内容の通り、最新世代を作成する action="version"が発行されるときも“onBeforeUpdate”イベントが発火する(表「3.世代が上がる更新を行うとき(バージョン自動)」の4行目)ので、バージョンアップに伴う“onBeforeUpdate”イベントをスキップするために上記の判定を行います。
これは通常のイベント実装で設定する必要はありませんが、前述の最新世代のアイテムではイベントを発火したくない場合、外部連携処理を実装する場合、ワークフローの担当者の変更(動的アサインメント)を実装する場合など、世代が上がる前後で複数回同じ処理を実行することが望ましくない場合に“onBeforeUpdate”イベントをスキップする実装をして期待する動作を実現します。
世代更新の抑制とサーバーイベントの抑制を使うときのポイント
世代更新の抑制 version="0" を行った場合、“onBeforeUpdate”のサーバーイベントは通常通り動作します。意図的に更新イベントも抑制する必要がある場合は、serverEvents="0" 属性も合わせて設定します。
ただし、なぜそれが必要なのか、コメントで理由を残したほうが良いです。後で問題が起きた場合に設定している理由を明確にするためです。
下記のような説明があると、保守の際に修正有無の判断が行いやすくなります。
※C#のコードは次のようなAMLが出来上がります。
まとめ
多くの開発者が実装や保守の際に混乱する部分をまとめてみました。サーバーイベントは、適切なイベントで処理することでトラブルの少ない安定した動作を実現できます。各イベントの動きをしっかりと把握して、品質の高い安定した実装を行っていきましょう。
■サービス資料一覧はこちら↓