| # イベント処理 概要 イベント構造 イベントは、基本的に次の 2 つの部分で構成されます。 コントロール領域: イベントタイプまたはイベント処理を指定し、変更されたオブジェクトのクラスやエンティティ、イベント時刻、イベントを生成したアプリケーションなどの他の要素を含めることができます。標準イベントタイプは以下のとおりです。 Create: 新規オブジェクトインスタンスが追加されました。 Change: オブジェクトインスタンスが更新されました。 Delete: オブジェクトインスタンスが削除されました。 データ領域には、イベントの影響を受けた (ビジネス) オブジェクトのデータが含まれています。さらに、データ領域には構成要素と属性も含まれています。 必須ではないデータ領域がいっぱいになった場合、1 つの構成要素に必ず 1 つ以上の属性が付与されます。さらに、この構成要素には子構成要素が作成されます。一般的な例は、主要構成要素が販売オーダで、子構成要素がオーダラインになっている販売オーダオブジェクトです。 販売オーダ構成要素には、オーダ番号、オーダ日、販売先取引先 (顧客) などの属性が付与されます。オーダライン構成要素には、ライン番号、品目、数量、価格などの属性が付与されます。 属性には、旧値、新 (現行) 値、またはその両方を設定できます。create イベントには、通常旧値がありませんが、delete イベントには新値がありません。change イベントには、旧値または新値があります。 重要 イベントの論理構造は固定ですが、技術的な形式は変化することがあります。この章の XSD と XML は、論理構造を示すために導入されています。最良の結果を得るため、イベントの内容を使用するときは、この章で後述する ｢イベント処理用 API｣ で説明されているイベント処理 API を使用してください。これは、XML 構造が変化した場合でもそのインターフェイスがイベントを変更してはならないためです。 例 次の図は、｢change｣ に使用される (この場合は ｢Customer｣ オブジェクトで) イベントを示しています。構成要素名 ｢Customer｣ と属性はこのオブジェクト特有のものです。他のオブジェクトには他の値が設定され、子構成要素もある可能性があります。ただし、交換から生成されるイベントは常に、1 つの構成要素だけで構成される単純なイベントとなる点に注意してください。 change イベントの XSD この構造の XSD ファイルには、次のコードが含まれています。
    <?xml version="1.0"?>
    <xs:schema targetNamespace="http://www.baan.com" xmlns="http://www.baan.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" attributeFormDefault="unqualified">
    <xs:element name="EventMessage" type="EventMessageType"/>
    <xs:complexType name="EventMessageType">
    <xs:sequence>
    <xs:element name="ControlArea" type="ControlAreaType"/>
    <xs:element name="DataArea" type="DataAreaType"
    minOccurs="0"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ControlAreaType">
    <xs:sequence>
    <xs:element name="eventEntity" type="eventEntityDT"/>
    <xs:element name="eventAction" type="eventActionDT"/>
    <xs:element name="eventTimeStamp" type="eventTimeStampDT"
    minOccurs="0"/>
    </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="eventEntityDT">
    <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="eventActionDT">
    <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="eventTimeStampDT">
    <xs:restriction base="xs:dateTime"/>
    </xs:simpleType>
    <xs:complexType name="DataAreaType">
    <xs:sequence>
    <xs:element name="Customer" type="CustomerType"
    minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="CustomerType">
    <xs:sequence>
    <xs:choice>
    <xs:sequence>
    <xs:annotation>
    <xs:documentation>For create, delete, or
    other actions</xs:documentation>
    </xs:annotation>
    <xs:element name="PreviousValues"
    type="PreviousValuesEmpty" minOccurs="0"/>
    <xs:group ref="AVcustomer"/>
    </xs:sequence>
    <xs:sequence>
    <xs:annotation>
    <xs:documentation>For change actions
    </xs:documentation>
    </xs:annotation>
    <xs:element name="PreviousValues"
    type="customerPreviousValuesType"/>
    <xs:group ref="AVcustomer"/>
    </xs:sequence>
    </xs:choice>
    </xs:sequence>
    <xs:attribute name="actionType" type="eventActionDT"
    use="optional"/>
    </xs:complexType>
    <xs:complexType name="PreviousValuesEmpty"/>
    <xs:complexType name="customerPreviousValuesType">
    <xs:sequence>
    <xs:group ref="AVcustomer"/>
    </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="identifierDT">
    <xs:restriction base="xs:boolean"/>
    </xs:simpleType>
    <xs:group name="AVcustomer">
    <xs:sequence>
    <xs:element name="customer" type="customerType"/>
    <xs:element name="address" type="addressDT"
    minOccurs="0"/>
    <xs:element name="status" type="statusDT" minOccurs="0"/>
    </xs:sequence>
    </xs:group>
    <xs:complexType name="customerType">
    <xs:simpleContent>
    <xs:extension base="customerDT">
    <xs:attribute name="identifier" type="identifierDT"
    use="optional" fixed="true"/>
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    <xs:simpleType name="customerDT">
    <xs:restriction base="xs:long">
    <xs:totalDigits value="10"/>
    </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="addressDT">
    <xs:restriction base="xs:string">
    <xs:maxLength value="9"/>
    <xs:pattern value="\p{Lu}"/>
    </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="statusDT">
    <xs:restriction base="xs:string">
    <xs:enumeration value="active"/>
    <xs:enumeration value="inactive"/>
    <xs:enumeration value="historic"/>
    </xs:restriction>
    </xs:simpleType>
    </xs:schema>
この XSD の 構成要素名と属性名は、特定のトリガーに依存しています。この例では、構成要素は ｢Customer｣ で、属性は ｢Customer｣、｢Address｣、および ｢Status｣ です。他の部分は汎用的です。構造は、すべてのトリガーで同じになります。 注意: 実際には、構成要素クラスと属性名は ASCII ファイルおよび ASCII ファイルフィールドになります。 この構造にもとづく ｢change｣ イベントの例には、次のようなものがあります。
    <EventMessage>
    <ControlArea>
    <eventEntity>customer</eventEntity>
    <eventAction>create</eventAction>
    <eventTimeStamp>2004-12-17T09:17:28Z</eventTimeStamp>
    </ControlArea>
    <DataArea>
    <Customer actionType="create">
    <customer>2147483647</customer>
    <status>inactive</status>
    </Customer>
    </DataArea>
    </EventMessage>
    <EventMessage>
    <ControlArea>
    <eventEntity>customer</eventEntity>
    <eventAction>change</eventAction>
    <eventTimeStamp>2004-12-17T09:30:47Z</eventTimeStamp>
    </ControlArea>
    <DataArea>
    <Customer actionType="change">
    <PreviousValues>
    <customer>2147483647</customer>
    <status>inactive</status>
    </PreviousValues>
    <customer>2147483647</customer>
    <status>active</status>
    </Customer>
    </DataArea>
    </EventMessage>

    <EventMessage>
    <ControlArea>
    <eventEntity>customer</eventEntity>
    <eventAction>delete</eventAction>
    <eventTimeStamp>2004-12-23T14:40:18Z</eventTimeStamp>
    </ControlArea>
    <DataArea>
    <Customer actionType="delete">
    <PreviousValues>
    <customer>2147483647</customer>
    <status>active</status>
    </PreviousValues>
    </Customer>
    </DataArea>
    </EventMessage>
他の例については、｢例｣ の章で示します。 交換から生成されるイベント 行イベント 交換モジュールから生成された行イベントは、常に標準イベントタイプ (create、change、delete) のいずれかです。さらに、データ領域の構成要素は 1 つだけです。これは、1 つのテーブルだけが関係するためです。 ASCII ファイル名は、イベント内の構成要素名にマッピングされます。ASCII フィールド名は、イベント内の属性名にマッピングされます。 この結果、この章で前述した ｢概要｣ の例は、構成要素名と属性名が最大 8 文字の小文字である点を除いて、交換から生成されるイベントに有効です。さらに、第 2 章 ｢トリガーを設定するには｣ の ｢トリガーソースを設定するには｣ で説明されているように交換スキームを生成した場合、ASCII ファイル名 (したがって、構成要素名) はテーブルコードと等しくなりますが、ASCII フィールド名 (したがって、属性名) はテーブルフィールドコードと等しくなります。 ｢End of Data Set｣ イベント エクスポートトリガーでバッチ行トリガーが定義されている場合、バッチ行の末尾で ｢End of Set｣ イベントが生成されます。 次の図は、エクスポートバッチ行の末尾で使用されるイベントを示しています。 ｢end of set｣ イベントの XSD この構造の XSD ファイルには、次のコードが含まれています。
    <?xml version="1.0"?>
    <xs:schema targetNamespace="http://www.baan.com" xmlns="http://www.baan.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" attributeFormDefault="unqualified">
    <xs:element name="EventMessage" type="EventMessageType"/>
    <xs:complexType name="EventMessageType">
    <xs:sequence>
    <xs:element name="ControlArea" type="ControlAreaType"/>
    <xs:element name="DataArea" type="DataAreaType" minOccurs="0"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ControlAreaType">
    <xs:sequence>
    <xs:element name="eventEntity" type="eventEntityDT"/>
    <xs:element name="eventAction" type="eventActionDT"/>
    <xs:element name="eventTimeStamp" type="eventTimeStampDT" minOccurs="0"/>
    </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="eventEntityDT">
    <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="eventActionDT">
    <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="eventTimeStampDT">
    <xs:restriction base="xs:dateTime"/>
    </xs:simpleType>
    <xs:complexType name="DataAreaType">
    <xs:sequence>
    <xs:element name="ExportBatchLine" type="ExportBatchLineType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ExportBatchLineType">
    <xs:sequence>
    <xs:group ref="AVprocess"/>
    </xs:sequence>
    <xs:attribute name="actionType" type="eventActionDT" use="optional"/>
    </xs:complexType>
    <xs:simpleType name="identifierDT">
    <xs:restriction base="xs:boolean"/>
    </xs:simpleType>
    <xs:group name="AVprocess">
    <xs:sequence>
    <xs:element name="exchangeScheme" type="exchangeSchemeType"/>
    <xs:element name="batch" type="batchType"/>
    <xs:element name="batchLine" type="batchLineType"/>
    <xs:element name="physicalAsciiFile" type="physicalAsciiFileDT" minOccurs="0"/>
    </xs:sequence>
    </xs:group>
    <xs:complexType name="exchangeSchemeType">
    <xs:simpleContent>
    <xs:extension base="exchangeSchemeDT">
    <xs:attribute name="identifier" type="identifierDT" use="optional" fixed="true"/>
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="batchType">
    <xs:simpleContent>
    <xs:extension base="batchDT">
    <xs:attribute name="identifier" type="identifierDT" use="optional" fixed="true"/>
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="batchLineType">
    <xs:simpleContent>
    <xs:extension base="batchLineDT">
    <xs:attribute name="identifier" type="identifierDT" use="optional" fixed="true"/>
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    <xs:simpleType name="exchangeSchemeDT">
    <xs:restriction base="xs:string">
    <xs:maxLength value="8"/>
    </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="batchDT">
    <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="batchLineDT">
    <xs:restriction base="xs:long"/>
    </xs:simpleType>
    <xs:simpleType name="physicalAsciiFileDT">
    <xs:restriction base="xs:string"/>
    </xs:simpleType>
    </xs:schema>
この構造にもとづく ｢end of set｣ イベントの例は、次のとおりです。
    <EventMessage>
    <ControlArea>
    <eventEntity>exportBatchLine</eventEntity>
    <eventAction>endOfDataSet</eventAction>
    </ControlArea>
    <DataArea>
    <ExportBatchLine actionType="endOfDataSet">
    <exchangeScheme>workflow</exchangeScheme>
    <batch>BATCH</batch>
    <batchLine>1</batchLine>
    <physicalAsciiFile>/home/workflow/export/customer.S
    </physicalAsciiFile>
    </ExportBatchLine>
    </DataArea>
    </EventMessage>
ASCII ファイルが作成されない場合、physicalAsciiFile は設定されません。 他の例については、第 4 章 ｢例｣ で示します。 イベント処理用 API イベント処理 API の実装は、datrgevent ライブラリに保存されます。 このライブラリには、次のタイプの関数が含まれています。 イベントを作成する関数。これらの関数は、アプリケーションのカスタマイズからだけでなく、交換モジュールからも使用できます。 イベントを読み取って (使用して) イベントを更新 (変更) する関数。トリガー実装 (条件と処理) は、必要に応じてこれらの関数を使用できます。さらに、wrapper 関数を使用して単一構成要素のイベントを簡単に読み取ったり、作成したりすることができます。 イベントを消去する関数 重要 イベントを読み取るには、datrgevent ライブラリ内の関数のみ使用する必要があります。実装は変更される可能性があります。 詳細は、datrgevent ライブラリの仕様を参照してください。 注意 ライブラリの仕様は、ライブラリオブジェクトから取得できます。オペレーティングシステムレベルでは、explode6.2 を使用してライブラリオブジェクトを検索してから、-eu オプション付きで bic_info6.2 を使用します。 例: `$ explode6.2 odatrgevent` `/mybse/application/myvrc/odatrg/otrgevent` `$ bic_info6.2 -eu /mybse/application/myvrc/odatrg/otrgevent` これにより、イベント処理関数のマニュアルが表示されます。 この方法により、以下のものを取得できます。 関数名とタイプ、パラメータとそのタイプが含まれる、ライブラリ内の関数のプロトタイプ 関数とその入力および出力の記述 事前条件と事後条件 |