Info*Engine によるグループの管理と操作
基本照会より高度な照会を行い、これらの照会を表示する際の Info*Engine の動作を理解すると、Info*Engine を使用してサイトでソリューションを開発する方法について理解を深めることができます。以下のシナリオを使用すると、Info*Engine によるデータ操作方法をより明確に理解できます。
いくつかのグループの操作と結果として生成されるグループの表示
このシナリオでは、前述の従業員の例を展開して、2 つの異なる部門に属する従業員の 1 つのリストを取得する方法を示します。以下の例は、社内の営業部員と開発部員を結合します。各部門は社内でデータベース内の別々の場所に従業員リストを保管していると想定します。このシナリオでは、両方の場所から従業員の情報を取得し、1 つの従業員リストに見えるように結合します。
まず、従業員の情報をデータベースに照会する JSP ページを作成します。最初に、前述の
基本グループの作成と表示のシナリオで示したような Task Webject をこのページに追加できます。この Task Webject は salesemp テーブル内に定義されている従業員を検索します。ここで、devemp テーブルの情報を照会する別の Webject を追加できます。たとえば、以下のような Query-Objects Webject をページに追加できます。
<ie:webject name="Query-Objects" type="OBJ">
<ie:param name="INSTANCE" data="com.myHost.Adapter"/>
<ie:param name="CLASS" data="salesemp"/>
<ie:param name="WHERE" data="()"/>
<ie:param name="GROUP_OUT" data="sales"/>
</ie:webject>
<ie:webject name="Query-Objects" type="OBJ">
<ie:param name="INSTANCE" data="com.myHost.Adapter"/>
<ie:param name="CLASS" data="devemp"/>
<ie:param name="WHERE" data="()"/>
<ie:param name="GROUP_OUT" data="development"/>
</ie:webject>
最初の Query-Objects Webject では、CLASS パラメータ内で salesemp テーブル名を使用して営業部員のデータベーステーブルから従業員の情報を要求します。明確に言うと、営業部のすべての従業員に関する情報を要求します。照会の結果は、sales というグループとして VDB に保存されます。sales グループは以下の表のように考えることができます。
ename
|
phone
|
department
|
title
|
Burton, Jack
|
873-2302
|
営業
|
Sales Representative
|
Law, Gracie
|
873-2200
|
営業
|
Sales Manager
|
LoPan, David
|
873-3313
|
営業
|
Administrative Assistant
|
2 番目の Query-Objects Webject もデータベースから情報を要求しますが、この場合は、CLASS パラメータ内で devemp テーブル名を使用して開発部員のテーブルから情報を取得します。この 2 番目の照会の結果は、development というグループとして VDB に保存されます。development グループは以下の表のように考えることができます。
ename
|
phone
|
department
|
title
|
Anderson, Pat
|
873-2428
|
Development
|
エンジニア
|
Stein, Chris
|
873-2608
|
Development
|
Manager
|
Wong, May
|
873-2741
|
Development
|
エンジニア
|
これで、VDB 内に sales および development という 2 つのグループが作成されました。2 つのグループを 1 つの従業員リストに結合するまで、シナリオは完了しません。グループを結合するには、以下の Merge-Groups Webject を JSP ページに追加します。
<ie:webject name="Merge-Groups" type="GRP">
<ie:param name="GROUP_IN" data="sales"/>
<ie:param name="GROUP_IN" data="development"/>
<ie:param name="SORTED" data="ASC"/>
<ie:param name="SORTBY" data="ename"/>
<ie:param name="GROUP_OUT" data="employees"/>
</ie:webject>
この Webject は sales および development グループを読み込み、情報をマージして、ename 属性の従業員名に基づいた 1 つの大きなグループを作成します。すべての情報は従業員名に基づいて昇順に並べ替えられます。マージされた情報の結果は、employees という 3 つ目のグループ内に置かれます。この最後のグループは後で利用できるように VDB 内に置かれます。
employees グループ内で保存されている従業員情報を表示するには、
基本グループの作成と表示で使用されているような Display Webject を使用します。
<ie:webject name="Display-Table" type="DSP">
<ie:param name="GROUP_IN" data="employees"/>
<ie:param name="BORDER" data="1"/>
<ie:param name="ATTRIBUTE"
data="ename,department,phone,title" delim=","/>
<ie:param name="HEADER"
data="Name,Department,Telephone,Title" delim=","/>
</ie:webject>
生成される表示は、営業部と開発部の両方の従業員が含まれている以下のテーブルのようになります。この表示には、前のシナリオで含まれなかった部門属性が含まれています。
VDB 内の複数のグループの操作と表示
Info*Engine は、データベースおよびデータリポジトリに照会すると、照会の結果を VDB 内に置きます。ほとんどの場合、VDB 内の最後のグループは、Web ブラウザで表示するときに必要なグループです。ただし、JSP ページによって生成されたすべてのグループは、ユーザーが設定した範囲に従って、ページ上のほかの Webject やセッション内のほかのページ上で呼び出されたほかの Webject でも使用できます。それには、JSP エンジンによって実行されるスタンドアロンタスクも含まれます。
スタンドアロンタスクの場合、Info*Engine は常に、タスクによって作成されたこの最後のグループを操作できる状態にします。最後のグループの前にタスクによって読み込まれたほかのグループが VDB 内に存在しますが、Return-Groups Webject を使用しないかぎり、これらのグループにはアクセスできません。
<ie:webject name="Return-Groups" type="GRP">
<ie:param name="GROUP_IN" data="group_names"/>
</ie:webject>
前述の従業員の例に似た例を使用して、以下のシナリオでは、社内の営業部と開発部から個別の従業員リストを取得する方法を示しますが、前の例とは異なり、結合した従業員リストではなく各従業員リストを表示します。
この作業を行うには、営業部員と開発部員に関する情報をデータベースに照会する listseparate という名前の Info*Engine タスクを作成します。これらの 2 つのリストを読み込むために必要な 2 つの Query-Objects Webject は、前の例で使用した Webject と同じです。
<ie:webject name="Query-Objects" type="OBJ">
<ie:param name="INSTANCE" data="com.myHost.Adapter"/>
<ie:param name="CLASS" data="salesemp"/>
<ie:param name="WHERE" data="()"/>
<ie:param name="GROUP_OUT" data="sales"/>
</ie:webject>
<ie:webject name="Query-Objects" type="OBJ">
<ie:param name="INSTANCE" data="com.myHost.Adapter"/>
<ie:param name="CLASS" data="devemp"/>
<ie:param name="WHERE" data="()"/>
<ie:param name="GROUP_OUT" data="development"/>
</ie:webject>
前の例と同様に、最初の Query-Objects Webject は営業部員テーブルから従業員に関する情報を要求し、2 番目の Query-Objects Webject は開発部員テーブルから情報を要求します。照会の結果は sales グループと development グループ内に保存されます。
listseparate タスクを実行し、sales および development グループ内に保存されている 2 つの従業員リストを表示するには、JSP ページを作成します。ページ上で Info*Engine カスタム task タグを使用してタスクを実行し、グループを表示する 2 つの Display Webject を追加します。デフォルトでは、タスクは JSP ページを処理する JSP エンジンと同じ JVM 内で実行されます。したがって、タスクを使用して作成されたすべてのグループは、タスクの実行後に実行される Webject で使用できます。
両方のグループを表示するように設計されている task タグと Display Webject は以下のようになります。
<ie:task uri="listseparate.xml"/>
<ie:webject name="Display-Table" type="DSP">
<ie:param name="GROUP_IN" data="sales"/>
<ie:param name="BORDER" data="1"/>
<ie:param name="ATTRIBUTE"
data="ename,department,phone,title" delim=","/>
<ie:param name="HEADER"
data="Name,Department,Telephone,Title" delim=","/>
</ie:webject>
<ie:webject name="Display-Table" type="DSP">
<ie:param name="GROUP_IN" data="development"/>
<ie:param name="BORDER" data="1"/>
<ie:param name="ATTRIBUTE"
data="ename,department,phone,title" delim=","/>
<ie:param name="HEADER"
data="Name,Department,Telephone,Title" delim=","/>
</ie:webject>
task タグは listseparate タスクを実行することに注目してください。タスクが完了すると、両方のグループが使用可能になります。最初の Display-Table Webject は、GROUP_IN パラメータ内に指定されている sales グループを表示します。2 番目の Display-Table Webject は、GROUP_IN パラメータ内に指定されている development グループを表示します。生成されるテーブルは以下のようになります。
タスク内に 2 つの Query-Objects Webject を置くと、コードに関する限り Query Webject と Display Webject が分離されますが、この場合は、Query-Objects Webject が Display Webject と同じ JSP ページ上にあるかのように生成されたタスクが実行されます。
JSP エンジンが常駐する JVM の外で listseparate タスクを実行する場合、タスクによって生成されたすべてのグループが自動的に JSP ページで使用できるとはかぎりません。生成された最後のグループだけは自動的に使用できます。2 つの Query Webject の後に Return-Groups Webject を追加することによって、最後のグループのほかにグループを返すように listseparate タスクを展開できます。listseparate タスクを Return-Groups Webject で終了させて、呼び出し側タスクまたは JSP で両方のグループを使用できるようにする必要があります。Return-Groups Webject は以下のようになります。
<ie:webject name="Return-Groups" type="GRP">
<ie:param name="GROUP_IN" data="sales"/>
<ie:param name="GROUP_IN" data="development"/>
</ie:webject>
Return-Groups Webject には複数の GROUP_IN パラメータを指定できます。これらの各パラメータは、VDB 内に返された特定のグループを追加処理するように定義します。パラメータ値にアスタリスク (*) を指定すると、タスクの VDB 内のすべてのグループが返されます。
JSP エンジンが常駐する JVM の外で listseparate タスクを実行するには、JSP ページ内の task タグにプロセッサの属性を指定します。たとえば、タスクプロセッサのデフォルト名が "com.myCompany.server.taskProcessor" の場合、以下のように task タグ内にプロセッサの属性を指定できます。
<ie:task uri="listseparate.xml" processor="com.myCompany.server.
taskProcessor"/>
パフォーマンス上の理由やその他の理由により、JSP エンジンが常駐する JVM の外でタスクを実行するように選択できます。プロセッサを指定する場合は、指定したタスクが、JSP ページ上のほかの Webject が必要とするすべてのグループを返すことを確認する必要があります。
アダプタとの間でのデータグループの送信と取得
情報システムのターゲットとなるデータを操作する場合は、使用する Adapter Webject 上で GROUP_IN パラメータを指定することによって、情報システムとインタフェースをとるアダプタにデータを渡します。GROUP_IN パラメータに指定したグループだけがアダプタに渡されます。VDB 内のほかのすべてのグループはアダプタで使用できません。
情報システムから取得されたデータを操作する場合は、使用する Adapter Webject 上で GROUP_OUT パラメータを指定することによって、データを返すグループを指定します。何らかの理由でグループ全体を返すことができない場合、アダプタはそのことを Info*Engine に通知し、Info*Engine は例外を発生させます。情報システムからデータを引き出す Adapter Webject を実行した後、例外が発生していないかどうかを必ず確認してください。