Cloud Software Group, Inc. EBX®
ドキュメント>開発者ガイド>データモデル
ナビゲーションモードドキュメント>開発者ガイド>データモデル

トリガーと関数

EBX®データモデルでは、トリガーと計算フィールドを定義できます。また、自動インクリメントされたフィールドを提供します。

計算値

デフォルトでは、データはXMLリポジトリで読み取られ、永続化されます。それにもかかわらず、データは、計算および/または外部データベースアクセス、たとえばRDBMSまたは中央システムの結果である可能性があります。

EBX®では、現在のデータセットコンテキストの他のデータを考慮に入れることができます。

これは、計算ルールを定義することで可能になります。

計算ルールは、osd:function エレメントを使用してデータモデルで指定されます(以下の例を参照)。

例:

<xs:element name="computedValue">
	<xs:annotation>
		<xs:appinfo>
			<osd:function class="com.foo.ComputeValue">
				<param1>...</param1>
				<param...n>...</param...n>
			</osd:function>
		</xs:appinfo>
	</xs:annotation>
	...
</xs:element>

検証の無効化

関数の実行に時間がかかる場合は、計算値の検証を無効にすると便利な場合があります。実際、関数がNレコードのテーブルにアタッチされている場合、このテーブルを検証するときにN回呼び出されます。データモデルで指定されたプロパティ osd:disableValidation= "true"を使用すると、計算値の検証を無効にできます(以下の例を参照)。

例:

<xs:element name="computedValue" osd:disableValidation="true">
	<xs:annotation>
		<xs:appinfo>
			<osd:function class="com.foo.ComputeValue">
				...
			</osd:function>
		</xs:appinfo>
	</xs:annotation>
	...
</xs:element>

トリガー

データセットまたはテーブルレコードは、作成、更新、削除などの一部の操作が実行されたときに自動的に実行されるメソッドに関連付けることができます。

データモデルでは、これらのトリガーは、osd:triggerエレメントを使用してannotation/appinfoエレメントの下で宣言する必要があります。

データセットでのトリガー

データセットトリガーの場合、抽象クラスInstanceTriggerを拡張するJavaクラスをエレメント osd:trigger内で宣言する必要があります。

データセットトリガーの場合、データモデルの rootエレメントのすぐ下に annotation/appinfo/osd:triggerタグを定義することをお勧めします。

例:

<xs:element name="root" osd:access="--">
   ...
   <xs:annotation>
		<xs:appinfo>
			<osd:trigger class="com.foo.MyInstanceTrigger">
				<param1>...</param1>
				<param...n>...</param...n>
			</osd:trigger>
		</xs:appinfo>
	</xs:annotation>
	...
</xs:element>

テーブルでのトリガー

テーブルレコードのトリガーを定義するためには、抽象クラス TableTriggerを継承したJavaクラスを osd:trigger内に定義する必要があります。annotation/appinfo/osd:trigger エレメントは、関連するテーブルまたはテーブルタイプを記述するエレメントのすぐ下に定義することをお勧めします。

例:

テーブルエレメント:

<xs:element name="myTable" type="MyTableType" minOccurs="0" maxOccurs="unbounded">
	<xs:annotation>
		<xs:appinfo>
			<osd:table>
				<primaryKeys>/key</primaryKeys>
			</osd:table>
			<osd:trigger class="com.foo.MyTableTrigger" />
		</xs:appinfo>
	</xs:annotation>
</xs:element>

テーブルタイプエレメントの場合:

<xs:complexType name="MyTableType">
   ...
   <xs:annotation>
	   <xs:appinfo>
		  <osd:trigger class="com.foo.MyTableTrigger">	
			 <param1>...</param1> 
			 <param...n>...</param...n> 
		  </osd:trigger>	
	   </xs:appinfo>
   </xs:annotation>
   ...
</xs:complexType>

追加のパラメーターを定義できるため、実装されるJavaクラスはJavaBeanプロトコルに準拠している必要があります。上記の例では、Javaクラスでメソッドを定義する必要があります:getParam1()setParam1(String)getParamX()setParamX(String)など。

自動インクリメントされた値

自動インクリメントされた値を定義することが可能です。自動インクリメントされた値はテーブル内でのみ許可され、タイプは xs:intまたは xs:integerである必要があります。

自動インクリメントは、エレメント annotation/appinfoの下のエレメント osd:autoIncrementを使用してデータモデルで指定されます。

例:

<xs:element name="autoIncrementedValue" type="xs:int">
	<xs:annotation>
		<xs:appinfo>
			<osd:autoIncrement />
		</xs:appinfo>
	</xs:annotation>
</xs:element>

また、startstepの2つのオプションエレメントがあります。

例:

<xs:element name="autoIncrementedValue" type="xs:int">
	<xs:annotation>
		<xs:appinfo>
			<osd:autoIncrement>
				<start>100</start>
				<step>5</step>
			</osd:autoIncrement>
		</xs:appinfo>
	</xs:annotation>
</xs:element>

osd:autoIncrementを指定するフィールドの動作は、次のとおりです。

内部的には、自動インクリメント値はリポジトリの「自動インクリメント」テーブルに格納されます。ユーザーインターフェイスでは、管理者が[管理]領域からアクセスできます。このフィールドは自動的に更新されるため、リポジトリ内の任意のインスタンスまたはデータスペースで、関連する osd:autoIncrementフィールドに設定された最大の値が定義されます。この値は、更新されるテーブルで見つかった最大値を考慮して計算されます。

場合によっては、たとえば、それぞれが異なる自動インクリメント範囲を持つ複数の環境(開発、テスト、実稼働)を管理する必要がある場合、この「最大値」チェックを回避する必要がある場合があります。この特定の動作は、disableMaxTableCheckプロパティを使用して実現できます。どうしても必要な場合を除いて、このプロパティを有効にすることは通常お勧めしません。これにより、自動インクリメント値に競合が発生する可能性があります。ただし、このプロパティは次の方法で設定できます。

注意

このオプションをグローバルに有効にすると、たとえばXMLまたはCSVからインポートすることにより、自動インクリメントのテーブルにレコードを作成できるようになります。このオプションが選択されていない場合、リポジトリの整合性を確保するために、自動インクリメントのテーブルにレコードを作成することは禁止されています。

ドキュメント>開発者ガイド>データモデル