今週のテクニカルTips : イベントパラメーターの渡し方

Aras Innovator 9.3 サービスパック6から、Aras サーバーイベント間でパラメーターの受け渡しができる仕組みがプログラムとして追加されました。

イベントパラメーターの受け渡しは以下のようなケースで役立ちます。

 

  • アイテムのバージョン情報
    アイテムにバージョン情報が付けられる前に既存のプロパティデータを保存しておき、値の変化を比較することでバージョン情報をデータベースにコミット。

 

  • アイテムの削除
    アイテムが削除される前にプロパティデータを要求し、アイテム削除後のオペレーションでその保存された値を使用。

 

  • 関連アイテム
    親アイテムに新しいリレーションが追加された際、使用されている親アイテムのプロパティ値を取得

 

RequestState (Aras.Server.Core.IContextStateの導入)という名の新しいクラスが全てのAras Innovatorサーバーイベントメソッドで利用できるようになりました。RequestStateクラスには、アイテムサーバーイベント間で一環したオブジェクトを保存する、セッションベースのハッシュテーブルが含まれています。

この例では全てC#の文法を使用しますが、VB.Netにも必要に応じて容易に変換する事ができます。

RequestStateへのデータ追加
RequestState.Add(オブジェクトキー、オブジェクト値)

RequestStateにデータを追加するには、Visual BasicやC#のオブジェクト型となるキーの名前と値を与えます。

例:
RequestState.Add(“city”, “Boston”);
RequestState.Add(“itemkey”, myItem);
RequestState.Add(“amount”, 350);

RequestStateからデータを取得
オブジェクト値 = RequestState[オブジェクトキー]

サーバーイベントメソッド内の値を取得するには、適切なハッシュテーブルキーを使用します。

例:
string city = (string)RequestState[“city”];
Item itm = (Item)RequestState[“itemkey”];
int total = RequestState[“amount”];

Request Stateの消去
RequestState.Clear();

RequestStateのハッシュテーブルから全てのデータを削除します。RequestStateオブジェクトはセッションベースのため、必要なくなった場合はRequestStateを一旦消去する事をお勧めします。

値の削除
RequestState.Remove(オブジェクトキー)

特定のキー/値のペアをRequestStateハッシュテーブルから削除します。

キーの確認
bool value =-RequestState.Contains(オブジェクトキー);

キーがハッシュテーブルに存在する場合はtrueを返します。

キーカウントの取得
int value = RequestState.Count;

ハッシュテーブルに保管されているキー/値ペアの数値を返します。

活用例: アイテム世代情報におけるイベントパラメーターの使用
以下のメソッドはアイテムタイプのonBeforeVersion及びonAfterVersionサーバーイベント用に作成されています。バージョンの特定のプロパティ(“name”) をユーザーが変更する事はできません。

OnBeforeVersion メソッド
string name = this.getProperty(“name”);
RequestState.Add(“docname”, name);
return null;
OnAfterVersion メソッド
string previous_name = (string)RequestState[“docname”];
if (previous_name != this.getProperty(“name”) ) {
return this.getInnovator().newError(“Version name changed!”);
}
RequestState.Clear();
return this;

活用例:アイテム削除におけるイベントパラメーターの使用
以下のメソッドはアイテムタイプのonBeforeDelete及びonAfterDeleteサーバーイベント用に作成されています。一度削除が完了したら、削除済みアイテムを使ってメールメッセージを作成する事はできません。

OnBeforeDelete
//アイテム消去前に、欲しいプロパティ値を取得
Item itm = this.newItem(this.getType(), “get”);
itm.setID(this.getID());
itm.setAttribute(“select”, “item_number,name”);
itm = itm.apply();

RequestState.Add(“itmKey”, itm);
return this;

OnAfterDelete

Item deleted_item = (Item)RequestState[“itmKey”];

Item identityItem = this.newItem(“Identity”, “get”);
identityItem.setProperty(“name”, “Innovator Admin”);
identityItem = identityItem.apply();

Item emailItem = this.newItem(“EMail Message”, “get”);
emailItem.setProperty(“name”, “EventDeleteItem”);
emailItem = emailItem.apply();

bool sent = deleted_item.email(emailItem, identityItem);

RequestState.Remove(“itemKey”);
return this;

活用例:関連アイテムにおけるイベントパラメーターの使用
以下のメソッドは関連アイテムのonBeforeUpdate及びonBeforeAddイベント用に作成されています。関連アイテムは親アイテムからの情報と共に追加する必要があります。

OnBeforeUpdate (Parent)

string part = this.getProperty(“item_number”);
RequestState.Add(“familyName”, part);
return this;

OnBeforeAdd (Related)

string family = (string)RequestState[“familyName”];
string partno = this.getProperty(“item_number”);
if (!String.IsNullOrEmpty(partno)) {
this.setProperty(“item_number”, family + “-” + partno);
}
RequestState.Remove(“familyName”);
return this;

ご不明点やご要望がございましたら、info@aras.jpまでご連絡ください。

Aras PLMの詳細・ダウンロードはこちらから
Aras_Logo_2013