こんにちは。クレスコ・デジタルテクノロジーズの神田です。
本記事ではAras Innovator®というPLMパッケージ製品を使った開発において、サーバーメソッドがどんな動きをしているのかわからない方を対象に、イベントの動きをまとめてみましたので紹介したいと思います。

 

目次

1. Aras Innovator®とは?

Aras Innovator®とはPLM製品で自由度の高いカスタマイズができるパッケージ製品です。自由度が高いため、複雑な業務ロジックをプログラムに落とし込んで表現することができます。開発言語は「クライアント向けのJavaScript」と「サーバー向けのC#(またはVB)」を使います。

2. サーバーイベントとは

サーバーイベントとは、サーバー側で処理されるイベントのことで、Aras Innovator®のサービスの中で、あらかじめ用意されたイベントを使ってカスタムメソッドを動かすことができます。
イベントは様々な箇所に存在し、アイテムタイプ、ライフサイクル、ワークフローなど様々です。その中でも最も利用頻度の高い「アイテムタイプのサーバーイベント」について詳しく見ていきます。

3. アイテムタイプのサーバーイベントの動作について

(1)イベントの種類

    • サーバーイベントは、保存時や検索時など、データベースにアクセスするとき、何らかのイベントが呼び出されます。
    • メソッド(C#で書けるコード)では Item.apply() をしたときにイベントが動作します。

現在、アイテムタイプのサーバーイベントは32種類ありますが、
実際によく使うものは数種類です。

■イベントの種類

        • onBeforeXXX … DBに入る前 (入力チェックなどで利用)
        • onAfterXXX … DBに登録された後 (異なるアイテムの更新やデータ整合など)
        • onXXX … カスタムで結果を返すとき(外部DBを参照する等)

※Sync系は異なるInnovatorインスタンス間の同期で利用するイベントですが、通常の開発では利用しません。

 

基本は 「onBeforeXXXとonAfterXXX」を利用します
onXXX系は外部連携や異なるデータベースを扱う場合を想定したイベントのため、連携や同期が必要な場面以外では利用頻度が低くなります。

■イベントを処理したときのデータの中身について

      • Arasではデータのやり取りをAMLで行います。AML自体はXMLタグの構造です。C#でプログラミングして登録処理を行った場合も、AMLに変換されます。
      • C#で書いたコードが登録されるケースでは、「onBeforeAdd→onAfterAdd」の順序で、サーバーイベントが処理されます。

(2)イベントの処理順序

    • 単一のアイテムであれば、先程の順序になりますが、リレーションシップがある場合、イベントの順序は次のとおりです。
    •   1.onBeforeXXXは 「親→リレーション→子」
    •   2.onAfterXXXは「子→リレーション→親」
    • (階段を降りて、また上がっていくような) V字の順序です。

(3)トランザクションについて

    • イベント処理で重要なトランザクションについて説明します。
    サーバーメソッドが呼ばれてから処理が終わるまでの間、トランザクション処理として扱われます。トランザクションの処理中にエラーが起きると、ロールバックされ、正常終了すればコミットされるようになっています。

(4)セッションについて

    • 順番にイベントを処理する中で、前のイベントで処理したデータを参照したい場合があります。
    • 例えば次のユースケースでは、セッションを使うことで解決できます。
ユースケース 理由 対応例
親アイテムの情報を子アイテムにも設定したい 登録するタイミングでは親情報を識別できないため 親アイテムのonBeforeAddイベント
➡RequestStateにキャッシュ
子アイテムのonBeforeAddイベント
➡RequestStateから使う
削除したアイテムの情報をメールで通知したい onAfterDelete時点では データが削除済みで情報がわからないため 対象アイテムのonBeforeDeleteイベント
➡RequestStateにキャッシュ
対象アイテムのonAfterDeleteイベント
➡RequestStateから使う
再帰的なデータ構造で登録前に親子関係を判定したい 保存前で親子の関係がわからないため リレーションシップ(Part BOMなど)のonBeforeAddイベント
➡RequestStateにrelated_id(子)情報をキャッシュ
再帰アイテム(Partなど)のonAfterAddイベント
➡RequestStateに同じIDがあるか特定

セッションは「トランザクションが終了するまでの間」有効です。
サーバーメソッドの中では、RequestStateという変数を使って、データをやり取りすることができます。RequestStateには「Contains, Add, Remove」などのAPIが用意されています。

なお、Innovator クラスの関数で inn.applyAML() を利用した場合、
タグで囲まれた処理の全てが終わるまでを 1トランザクションとして扱います。

(5)主要イベントの種類とthisの設定値について

    • サーバーメソッドの「this」アイテムについて、どんなデータが設定されるのか、詳しい情報がなかなか見つからないため、独自に調べた情報を紹介します。表1をご覧ください。

    • onBefore系は基本的にリクエスト時に発行したAMLが処理されます。
      ただし、Promote系は挙動が異なります。
    • onAfter系は結果のアイテムと、そうでない場合があります。
  • 表1

    ※onAddなどのフェデレート系のイベントは普段は利用しないため今回は割愛しました。

     

    上記のようにアクションにはそれぞれイベントが用意されています。
    もう少しだけ踏み込んでみます。
    アクションにはaddやupdateの他に、editやmergeなども用意されています。どのように動いているのか見てみます。表2をご覧ください。

    表2

    「動くイベント順序」の列は、action=“add”を行っただけでも、内部的には複数のイベントが関連していることを表しています。通常は意識しなくて良いですが、トラブルが起きたときに利用することがあります。

    例えば、「onBeforeGetイベントを設定したら突然更新でエラーが出るようになった」、といった開発時トラブルが起きたとき、この情報を知っていると調査する材料になります。onBeforeGetやonAfterGetは値がない場合を考慮するため、少し気を遣います。(addなどのアクションで doGetItem(デフォルト:1)が指定されていると、getアクションが動きます。doGetItem=”0”を指定すると検索を行わなくなります。)

    4. さいごに

    今回はサーバーイベントの動きについてご紹介しました。
    どんな順序で処理されているのか、図のイメージだけでもインプットしていただけると、今後の開発で役立てると思います。

    開発者が仕組みを理解して、より品質の高いコードを作れるようになれば幸いです。最後までお読みいただき、ありがとうございました。

    ■クレスコ・デジタルテクノロジーズについて/お問い合わせ先

    当社は2015年4月のPLM事業開始以来、図面/BOM/CAD連携システム、部品管理システム、承認ワークフローなどAras Innovator®の様々なカスタマイズに携わってまいりました。
    導入時の技術コンサルティングから要件定義~設計・開発~保守運用における全てのフェーズでAras Innovator®に特化したソリューションをご提供いたします。

        • ソリューションの詳細
        • お問い合わせ先