ヘッダーをスキップ
Oracle Application Development Framework開発者ガイド
10g(10.1.3.0)
B40012-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

8 マスター/ディテール・データの表示

この章では、マスター/ディテール関係のデータを表示する、様々なタイプのページの作成方法について説明します。

この章の内容は次のとおりです。

関連するマスターまたはディテール・コレクションのキー値をコレクションに移入する選択リストの使用方法は、11.7項「データ・バインドされたドロップダウン・リストの作成」を参照してください。

8.1 マスター/ディテール・データの表示の概要

ADFでのマスター/ディテール関係とは、データ・コントロール階層内の2つのデータ・オブジェクトが論理的な関係にあり、自動的に一方のオブジェクトにもう一方のオブジェクトの関連インスタンスが含まれることを指します。たとえば、SRDemoアプリケーションでは、データ・コントロール・メソッドによってサービス・リクエストが戻されると、それぞれのサービス・リクエスト・オブジェクトに、関連するサービス履歴オブジェクトのリストが含まれます。サービス履歴オブジェクトは、データ・コントロール階層内で親メソッドの子であるアクセッサによって戻されます。通常、データ・コントロールでのマスター/ディテール関係は、両方のオブジェクトが共有する1つ以上の一意の属性、またはオブジェクト階層によって設定されます。たとえば、SRDemoアプリケーションのserviceRequestコレクションとserviceHistoryCollectionは、マスター/ディテール関係にあります。これは、両方のコレクションにsvrId属性(サービス・リクエスト番号)が含まれているためです。マスター/ディテール関係は、コレクションとシングル・オブジェクトの間にも設定できます。たとえば、サービス・リクエストのコレクションに含まれる各オブジェクトには、そのサービス・リクエストの割当て先である単一のユーザー・オブジェクトを含めることができます。


ヒント:

TopLinkおよび従来のリレーショナル・データベースでは、マスター/ディテール関係は外部キー関係と呼ばれます。

オブジェクトがマスター/ディテール関係にある場合は、両方のオブジェクトのデータを同時に表示するページを宣言的に作成できます。たとえば、SRDemoアプリケーションには、ページ最上部のフォームにサービス・リクエストを表示し、ページ最下部の表に関連するサービス履歴を表示するページが含まれています。

このような表示ができるのは、サービス・リクエストとサービス履歴のオブジェクトがマスター/ディテール関係にあるためです。この例の場合は、サービス・リクエストがマスター・オブジェクトで、サービス履歴がディテール・オブジェクトです。ADFイテレータは、選択されたマスター・データ・オブジェクトに対して表示されるディテール・データ・オブジェクトの同期化を自動的に管理します。

この章では次の内容について説明します。

8.2 データ・コントロール・パレットのマスター/ディテール・オブジェクトの識別

JDeveloperでは、データ・コントロール・パレットを使用して、宣言的にマスター/ディテール・ページを作成できます。データ・コントロール・パレットでは、マスター/ディテール関係のオブジェクトが階層的に表示されます。ディテール・オブジェクトは、マスター・オブジェクトの下に、アクセッサ戻りとして表示されます。データ・コントロールでは、アクセッサ戻りは常に、マスター/ディテール関係におけるディテール・オブジェクトになります。

図8-1は、SRDemoアプリケーションのデータ・コントロール・パレットを示しています。serviceHistoryオブジェクトとServiceRequestオブジェクトがマスター/ディテール関係にあるため、serviceHistoryCollectionServiceRequestメソッド戻りの下に表示されています。この場合、アクセッサ戻りは、サービス・リクエスト・オブジェクトに関連するサービス履歴オブジェクトのコレクションになります。メソッド戻りは、常にコレクションになりますが、アクセッサ戻りは、コレクションまたはシングル・オブジェクトになります。


ヒント:

デフォルトでは、データ・コントロールはTopLink POJO(またはPOJOに対するセッションBean)によって作成され、コレクションであるアクセッサ戻りの名前は、Collectionで終わります。たとえば、serviceHistoryCollectionのようになります。

図8-1 データ・コントロール・パレットのマスター/ディテール・オブジェクト

データ・コントロール・パレットのマスター/ディテール・コレクション

ヒント:

データ・コントロール・パレットに表示されるマスター/ディテール階層は、関連(1対多、1対1、多対多など)のカーディナリティとは無関係です。この階層は、単にどのコレクション(マスター)を使用して他のコレクション(ディテール)から1つ以上のオブジェクトを取得しているかということを示しています。

マスター/ディテール・オブジェクトを表示するページを作成する際には、目的にあわせて、マスターになるオブジェクトとディテールになるオブジェクトを正しく識別してください。これを怠ると、目的のデータをページに表示できません。

たとえば、1人のユーザーとそのユーザーが割り当てられているすべての関連専門技術領域を表示する場合は、Userをマスター・オブジェクトにします。逆に、1つの専門技術領域とその領域に割り当てられているすべてのユーザーを表示する場合は、expertiseAreaをマスター・オブジェクトにします。ページに表示されるディテール・オブジェクトは、どちらのオブジェクトがマスターかによって異なります。


ヒント:

データ・コントロール・パレットでは、マスター・オブジェクトとディテール・オブジェクトの両方が共有する属性は、一方のオブジェクトの下にのみ表示されます。たとえば、SRDemoアプリケーションのデータ・コントロール・パレットでは、srvId属性はServiceRequestマスター・モードの下には表示されますが、serviceHistoryCollectionディテール・モードの下には表示されません。

また、マスター・コレクションが、ディテール・コレクションの下にアクセッサ戻りとして表示される場合もあります。たとえば、図8-1では、マスター・コレクションServiceRequestが、ディテール・コレクションであるserviceHistoryCollectionノードの下にアクセッサ戻りとして表示されています。この場合、これらのコレクションが共有する共通の属性によって、データ・コントロール内で再帰的な関係が作成されます。ほとんどの場合、このような再帰の結果として表示されるアクセッサ戻りを使用して、UIコンポーネントを作成することはありません。


データ・コントロール・パレットに表示されるアイコンの詳細は、5.2.1項「データ・コントロール・パレットの各項目の理解」を参照してください。

8.3 表およびフォームを使用したマスター/ディテール・オブジェクトの表示

JDeveloperのデータ・コントロール・パレットを使用すると、マスター/ディテールの参照ページを単一の宣言的アクションで作成できます。追加のコードを記述する必要がなく、ナビゲーションも組み込まれます。データ・コントロール・パレットでは、事前作成済のマスター/ディテール・ウィジェットが提供されます。これにより、同じページ上でマスターとディテールの両オブジェクトを読取り専用の表およびフォームの任意の組合せとして表示できます。そのために必要な操作は、ディテール・コレクションをページ上にドロップして、使用するウィジェットのタイプを選択するのみです。

データ・コントロール・パレットで使用できる事前作成済のマスター/ディテール・ウィジェットには、コレクション内のデータ・オブジェクトをスクロールできるレンジ・ナビゲーションが含まれます。事前作成済のマスター/ディテール・ウィジェットにより提供される表には、選択ファセットと「発行」コマンド・ボタンが含まれます。デフォルトでは、マスター・オブジェクトとディテール・オブジェクトのすべての属性が、テキスト・フィールド(フォームの場合)または列(表の場合)としてマスター/ディテール・ウィジェットに含まれます。不要な属性を削除するには、ページからテキスト・フィールドまたは列を削除します。


ヒント:

事前作成済のマスター/ディテール・ウィジェットを使用しない場合、マスター・オブジェクトとディテール・オブジェクトを1つのページまたは個別の各ページに表およびフォームとして別々にドラッグ・アンド・ドロップできます。個別のフォームおよび表の作成方法は、第6章「基本的なページの作成」または第7章「表の追加」を参照してください。

マスター/ディテール・コンポーネントをページに追加する場合、ページ上のコンポーネントへのデータの公開はイテレータ・バインディングによって行われます。イテレータ・バインディングは、基礎となる行セット・イテレータにバインドされます。ディテール・オブジェクトの行セット・イテレータは、特定のマスター・オブジェクトがページで表示または選択されたときに適切なディテール・データを公開します。

図8-2は、事前作成済のマスター/ディテール・ウィジェットの例を示しています。これにより、ページ上部のフォームにサービス・リクエストが表示され、ページ下部の表に関連するすべてのサービス履歴が表示されます。ユーザーがマスター・データをスクロールすると、関連するディテール・データが自動的にページに表示されます。

図8-2 データ・コントロール・パレットの事前作成済のマスター/ディテール・ウィジェット

デフォルトのマスター/ディテール・ウィジェット

8.3.1 表およびフォームでのマスター/ディテール・オブジェクトの表示方法

データ・コントロール・パレットで事前作成済のマスター/ディテール・フォームおよび表を使用すると、単一の宣言的アクションで、マスター・ウィジェットとディテール・ウィジェットの両方を1つのページ上に作成できます。別々のページにマスター・データとディテール・データを表示する方法の詳細は、8.3.4項「個別ページでのマスター/ディテールについての考慮事項」を参照してください。

事前作成済のADFマスター/ディテール・フォームおよび表を使用したマスター/ディテール・ページの作成手順:

  1. データ・コントロール・パレットで、8.2項「データ・コントロール・パレットのマスター/ディテール・オブジェクトの識別」の説明を参考に、ディテール・オブジェクトを特定します。

  2. ディテール・オブジェクトをJSFページにドラッグ・アンド・ドロップします。

  3. ポップアップ・メニューから、次のマスター/ディテール・ウィジェットのいずれかを選択します。

    • ADFマスター表、ディテール・フォーム: 表にマスター・オブジェクトが表示され、表の下にある読取り専用フォームにディテール・オブジェクトが表示されます。

      マスター表で特定のデータ・オブジェクトを選択すると、その下にあるフォーム内に、関連する最初のディテール・データ・オブジェクトが表示されます。後続の各ディテール・データ・オブジェクトをスクロールするには、フォーム・ナビゲーションを使用する必要があります。

    • ADFマスター・フォーム、ディテール表: マスター・オブジェクトが読取り専用フォームに表示され、ディテール・オブジェクトがフォームの下にある読取り専用表に表示されます。

      フォームに特定のマスター・データ・オブジェクトを表示すると、その下にある表に、関連するディテール・データ・オブジェクトが表示されます。

      このウィジェットは、マスター・オブジェクトとディテール・オブジェクトの両方がコレクションの場合のみ使用できます。

    • ADFマスター・フォーム、ディテール・フォーム: マスター・オブジェクトとディテール・オブジェクトが別々のフォームに表示されます。

      上のフォームに特定のマスター・データ・オブジェクトを表示すると、その下にあるフォームに、関連する最初のディテール・オブジェクトが表示されます。後続の各ディテール・データ・オブジェクトをスクロールするには、フォーム・ナビゲーションを使用する必要があります。

    • ADFマスター表、ディテール表: マスター・オブジェクトとディテール・オブジェクトが別々の表に表示されます。

      上の表で特定のマスター・データ・オブジェクトを選択すると、その下にある表に、関連する最初のディテール・データ・オブジェクトのセットが表示されます。

      このウィジェットは、マスター・オブジェクトとディテール・オブジェクトの両方がコレクションの場合のみ使用できます。


    注意:

    オブジェクトがコレクションではなく、単一のデータ項目の場合、JDeveloperでは自動的にデフォルト・ウィジェットからレンジ・ナビゲーションが除外されます。

    アクセッサ戻りも、コレクションまたはシングル・オブジェクトのいずれかになります。シングル・オブジェクトは、フォームにしか表示されません。そのため、データ・コントロール・パレットのポップアップ・メニューから使用できるマスター/ディテール・ウィジェットは、アクセッサ戻りがコレクションかシングル・オブジェクトかによって異なります。


    デフォルトのフォームまたは表を変更する場合は、第6章「基本的なページの作成」または第7章「表の追加」を参照してください。

8.3.2 マスター/ディテール表およびフォームの作成時に行われる処理

データ・コントロール・パネルからドラッグ・アンド・ドロップを行うと、JDeveloperによって様々な処理が自動的に行われます。たとえば、JSFページにコードが追加され、ページ定義ファイルに対応するエントリが追加されます。データ・コントロール・パレットの使用時に実行される処理と作成される内容の詳細は、5.2.3項「データ・コントロール・パレットの使用時に行われる処理」を参照してください。

8.3.2.1 JSFページで生成されるコード

事前作成済のマスター/ディテール・ウィジェットに対して生成されるJSFコードは、基本的に、データ・コントロール・パレットを使用して基本的な読取り専用表またはフォームを作成する場合に生成されるJSFコードと同じです。詳細は、第6章「基本的なページの作成」および第7章「表の追加」を参照してください。独自のマスター/ディテール・ウィジェットを作成する場合、事前作成済のマスター/ディテール表およびフォームに自動的に含まれるものと同様のコンポーネントを含めることができます。

事前作成済のマスター/ディテール・ウィジェットの表およびフォームには、フォームまたは表に移入されるデータ・オブジェクトの完全修飾名を保持するpanelHeaderタグが含まれます。このラベルは、必要に応じて、リソース・バンドルにバインドされた文字列またはEL式を使用して変更できます。

1つのコレクション内に複数のデータ・オブジェクトが存在する場合、事前作成済のマスター/ディテール・ウィジェットのフォームには、FirstPreviousNextおよびLastというレンジ・ナビゲーション用の4つのcommandButtonタグが含まれます。ユーザーは、これらのレンジ・ナビゲーション・ボタンを使用して、コレクション内のデータ・オブジェクトをスクロールできます。各ボタンのactionListenerは、ナビゲーションを実行するデータ・コントロール操作にバインドされています。ボタンをクリックすると、actionListenerバインディングで使用されるexecuteプロパティによって、操作が起動します。(フォームに単一のデータ・オブジェクトが表示されている場合、レンジ・ナビゲーション・コンポーネントは自動的に表示されません。)レンジ・ナビゲーションの詳細は、6.4項「レンジ・ナビゲーションのフォームへの組入れ」を参照してください。

事前作成済のマスター/ディテール・ウィジェットの表には、tableSelectOne選択ファセット、およびコレクション内の特定のオブジェクトを選択できる「発行」ボタンがデフォルトで含まれます。デフォルトのボタンは、メソッドまたは操作に自動的にバインドされません。そのため、選択ファセットを機能させるには、アクション・バインディングをボタンに追加する必要があります。たとえば、SRDemoアプリケーションのSRMainページと同じように、選択したデータ・オブジェクトをユーザーが編集できるようにするためのメソッドにボタンをバインドできます。選択ファセットの詳細は、10.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください。


ヒント:

「ADFマスター表、ディテール・フォーム」または「ADFマスター表、ディテール表」ウィジェットをページにドロップすると、ディテール・コンポーネントの親タグ(panelFormタグやtableタグなど)のpartialTriggers属性にマスター・コンポーネントのidが自動的に設定されます。実行時に、ユーザーがマスター・コンポーネントで項目を選択すると、partialTriggers属性によりディテール・コンポーネントのみが再レンダリングされます(部分レンダリング)。マスター・コンポーネントが表の場合、ADFでは部分レンダリングが使用されます。ユーザーがファセットで項目を選択した場合、表を再レンダリングする必要はなく、ディテール・コンポーネントのみを再レンダリングして新規データを表示すればよいためです。部分レンダリングの詳細は、11.4項「部分ページ・レンダリングの有効化」を参照してください。

8.3.2.2 ページ定義ファイルで定義されるバインディング・オブジェクト

例8-1は、ServiceRequestメソッド戻りの下にあるディテール・コレクションのserviceHistoryCollectionアクセッサ戻りを「ADFマスター・フォーム、ディテール表」としてページにドロップしたときに作成されるマスター/ディテール・ページのページ定義ファイルを示しています。

executables要素では、サービス・リクエストのメソッド・イテレータ(マスター・オブジェクト)およびサービス履歴のアクセッサ・イテレータ(ディテール・オブジェクト)が定義されます。アクセッサ・イテレータには、マスター・オブジェクトのメソッド・イテレータを参照するMasterBinding属性が含まれます。マスター・イテレータに対するこの参照により、ディテール・イテレータは、現在のマスター・オブジェクトの正しいディテール・データを公開できます(詳細は、8.3.3項「実行時に行われる処理」を参照してください)。

bindings要素では、マスター・コレクションのメソッド・イテレータを起動するmethodActionオブジェクト、およびフォームと表の値バインディングが定義されます。フォーム内のテキスト・フィールドに値を移入する属性バインディングは、attributeValues要素内で定義されます。attributeValues要素のid属性には、各データ属性の名前が含まれており、IterBinding属性によるイテレータ・バインディングの参照により、テキスト・フィールドにマスター・オブジェクトのデータが表示されます。

フォーム内のテキスト・フィールドに値を移入する属性バインディングは、attributeValues要素内で定義されます。attributeValues要素のid属性には、各データ属性の名前が含まれており、IterBinding属性によるイテレータ・バインディングの参照により、テキスト・フィールドにマスター・オブジェクトのデータが表示されます。

フォーム内のレンジ・ナビゲーション・ボタンは、action要素で定義されたアクション・バインディングにバインドされます。属性バインディングの場合と同様に、アクション・バインディングのIterBinding属性は、マスター・オブジェクトのイテレータ・バインディングを参照します。

ディテール・データを表示する表は、table要素で定義される表バインディング・オブジェクトにバインドされます。IterBinding属性は、ディテール・オブジェクトのイテレータ・バインディングを参照します。

ページ定義ファイルの要素および属性の詳細は、A.7項「<pageName>PageDef.xml」を参照してください。

例8-1 マスター/ディテール・ページ用にページ定義に定義されたバインディング・オブジェクト

<executables>
    <methodIterator id="findAllServiceRequestIter"
                    Binds="findAllServiceRequest.result"
                    DataControl="SRPublicFacade" RangeSize="10"
                    BeanClass="oracle.srdemo.model.ServiceRequest"/>
    <accessorIterator id="serviceHistoryCollectionIterator" RangeSize="10"
                      Binds="serviceHistoryCollection"
                      DataControl="SRPublicFacade"
                      BeanClass="oracle.srdemo.model.ServiceHistory"
                      MasterBinding="findAllServiceRequestIter"/>
</executables>
<bindings>
    <methodAction id="findAllServiceRequest"
                  InstanceName="SRPublicFacade.dataProvider"
                  DataControl="SRPublicFacade"
                  MethodName="findAllServiceRequest" RequiresUpdateModel="true"
                  Action="999"
                  ReturnName="SRPublicFacade.methodResults.SRPublicFacade_
                               dataProvider_findAllServiceRequest_result"/>
    ...
    <attributeValues id="assignedDate" IterBinding="findAllServiceRequestIter">
      <AttrNames>
        <Item Value="assignedDate"/>
      </AttrNames>
    </attributeValues>
    <attributeValues id="problemDescription"
                     IterBinding="findAllServiceRequestIter">
      <AttrNames>
        <Item Value="problemDescription"/>
      </AttrNames>
    </attributeValues>
    <action id="First" RequiresUpdateModel="true" Action="12"
            IterBinding="findAllServiceRequestIter"/>
    <action id="Previous" RequiresUpdateModel="true" Action="11"
            IterBinding="findAllServiceRequestIter"/>
    <action id="Next" RequiresUpdateModel="true" Action="10"
            IterBinding="findAllServiceRequestIter"/>
    <action id="Last" RequiresUpdateModel="true" Action="13"
            IterBinding="findAllServiceRequestIter"/>
    <table id="ServiceRequestserviceHistoryCollection"
           IterBinding="serviceHistoryCollectionIterator">
      <AttrNames>
        <Item Value="lineNo"/>
        <Item Value="nextLineItem"/>
        ...
      </AttrNames>
    </table>
</bindings>

8.3.3 実行時に行われる処理

5.5.2.2項「executables要素で定義されたバインディング・オブジェクト」で説明したように、ADFイテレータは、ページに現在表示されているデータ・オブジェクト(つまり行)がどれかを管理する、基礎となるRowSetIteratorオブジェクトに関連付けられています。実行時には、行セット・イテレータによって、マスター・コンポーネントとディテール・コンポーネントに表示されるデータが管理されます。

マスターおよびディテールの行セット・イテレータは、どちらも行セット・ナビゲーション・イベント(ユーザーによる、特定の行の選択やレンジ・ナビゲーション・ボタンのクリック)をリスニングし、適切な行をUIに表示します。デフォルトのマスター/ディテール・コンポーネントの場合は、行セット・ナビゲーション・イベントは、フォーム上のコマンド・ボタン(「先頭へ」、「前へ」、「次へ」、「最後へ」)または表上の選択ファセットおよび「発行」ボタンになります。

ディテール・コレクションの行セット・イテレータは、ディテール・データとマスター・データの同期化を管理します。また、マスター・コレクションとディテール・コレクションの両方の行ナビゲーション・イベントをリスニングします。ページ定義ファイル内のディテール・イテレータ定義にあるMasterBinding属性は、マスター・イテレータがリスニングするディテール行セット・イテレータを指定します。マスター・コレクションで行セット・ナビゲーション・イベントが発生すると、ディテール行セット・イテレータが自動的に実行され、現在のマスター行に関連するディテール行が戻されます。

8.3.4 個別ページでのマスター/ディテールについての考慮事項

デフォルトのマスター/ディテール・コンポーネントでは、マスター/ディテール・データは単一のページに表示されます。ただし、データ・コントロール・パレットでマスター・オブジェクトとディテール・オブジェクトを使用して、バインディング・イテレータにマスター・オブジェクトとディテール・オブジェクトの同期化を管理させたまま、コレクションを別々のページに表示することができます。

たとえば、SRDemoアプリケーションでは、サービス・リクエストとサービス履歴が同じSRMainページに表示されます。ページには、サービス・リクエストのみを表示し、サービス履歴のかわりに「詳細」ボタンを表示することも可能です。ユーザーが「詳細」ボタンをクリックすると新しいページが表示され、そのページの表に、関連するすべてのサービス履歴が表示されます。ユーザーは、サービス履歴ページのボタンを使用して、サービス・リクエスト・ページに戻ることができます。

マスター/ディテール・オブジェクトを別々のページに表示するには、マスター・オブジェクトとディテール・オブジェクトに対応する2つのページを作成します。その際には、データ・コントロール・パレットから使用できる、個々の表またはフォームを使用します。(フォームまたは表の使用方法は、第6章「基本的なページの作成」または第7章「表の追加」を参照してください。)前述のように、ディテール・オブジェクト・イテレータは、マスターとディテールのデータの同期化を管理します。そのため、ディテール・データを表示するページを作成する際には、必ず、データ・コントロール・パレットから適切なディテール・オブジェクトをドラッグしてください(8.2項「データ・コントロール・パレットのマスター/ディテール・オブジェクトの識別」を参照してください)。

ページ・ナビゲーションを処理するには、各ページにコマンド・ボタンまたはリンクを追加するか、データ・コントロール・パレットを使用したフォームまたは表の作成時に使用できるデフォルトの「発行」ボタンを使用します。各ボタンについて、action属性内で、ナビゲーション・ルールの結果値を指定する必要があります。faces-config.xmlファイルで、マスター・データ・ページからディテール・データ・ページへのナビゲーション・ルール、およびディテール・データ・ページからマスター・データ・ページに戻るための別のルールを追加します。ナビゲーション・ルール内のfrom-outcomeの値は、ボタンのアクション属性で指定された結果値と一致する必要があります。ページ間のナビゲーションの追加に関する詳細は、第9章「ページ・ナビゲーションの追加」を参照してください。

8.4ツリーを使用したマスター/ディテール・オブジェクトの表示

表とフォーム以外に、階層ツリーでマスター/ディテール・データを表示することもできます。データ・コントロール・パレットから使用できるADF Faces treeコンポーネントにより、マスター・オブジェクトへのバインディングによって移入された複数のルート・ノードを表示できます。ツリー内の各ルート・ノードは、ディテール・オブジェクトのバインディングによって移入されるブランチを持つことが可能で、その数に制限はありません。ツリーには複数のレベルのノードがあり、各ノードは親ノードのディテール・オブジェクトを示します。ツリー内の各ノードは、階層でのノードのレベルを示します。

treeコンポーネントには、ツリー・ノードを開閉するメカニズムが含まれていますが、フォーカス機能はありません。フォーカス機能が必要な場合は、ADF FacesのTreeTableコンポーネントを使用する方法もあります(詳細は、8.5項「ツリー表を使用したマスター/ディテール・オブジェクトの表示」を参照してください)。デフォルトでは、ツリーの各ノードのアイコンはフォルダですが、独自のアイコンを階層内の各レベルのノードに使用できます。

図8-3は、SRDemoアプリケーションのSRManageページに含まれるツリーの例を示しています。ツリーには、2つのノード・レベル(スタッフ・メンバーと各メンバーに割り当てられたサービス・リクエスト)が表示されています。ルート・ノードには、スタッフ・メンバーが表示されています。ブランチ・ノードには、各スタッフ・メンバーに割り当てられた未処理または保留中のサービス・リクエストが表示されています。

図8-3 データ・バインドされたADF Facesツリー

ADFツリー・コンポーネント

8.4.1 ツリーでのマスター/ディテール・オブジェクトの表示方法

ツリーはノードの階層で構成され、各サブノードは、上位レベルのノードから分岐します。データ・バインドされたADF Faces treeの各ノード・レベルは、異なるデータ・コレクションによって移入されます。JDeveloperでは、ツリー・バインディング・エディタを使用してデータ・バインド・ツリーを定義します。これにより、ツリー内の各ノード・レベルに値を移入するための規則を定義できるようになります。階層内の各ノード・レベルに対して1つの規則が必要です。それぞれの規則は、次のノード・レベル・プロパティを定義します。

  • ノード・レベルに移入するデータ・コレクション。

  • そのノード・レベルで表示される、データ・コレクションからの属性。

  • 現在のノード・レベルのブランチとして表示されるディテール・オブジェクトを戻す、アクセッサ・メソッド。

ツリーでのマスター/ディテール・オブジェクトの表示手順:

  1. データ・コントロール・パレットからマスター・オブジェクトをドラッグし、ページ上にドロップします。これは、ツリーのルート・レベルを表すマスター・データである必要があります。


    注意:

    ルート・ノードは、メソッド戻りまたはアクセッサ戻りによって表されるコレクションであることが必要です。シングル・オブジェクトのアクセッサ戻りをツリーのルート・ノードとして使用することはできません。

  2. ポップアップ・メニューから、「ツリー」「ADFツリー」を選択します。

    JDeveloperによって、図8-4のようにツリー・バインディング・エディタが表示されます。

    図8-4 ツリー・バインディング・エディタの「規則の編集」タブ

    ツリー・バインディング・エディタの「規則の編集」タブ
  3. ツリー・バインディング・エディタの「規則の編集」ページで、ツリーに表示する各ノード・レベルの規則を定義します。規則を定義するには、次の項目を選択する必要があります。

    • データ・コレクション定義: 定義するノード・レベルに移入するデータ・コレクションを選択します。

      最初の規則はルート・ノード・レベルを定義します。そのため、最初の規則については、データ・コントロール・パレットからドラッグしたものと同じコレクション(マスター・コレクション)を選択して、ツリーを作成します。

      ブランチ・ノードを作成するには、適切なディテール・コレクションを選択します。たとえば、ユーザーのルート・ノードを作成するために、最初(ルート・ノード)の規則に対してUserコレクションを選択し、サービス・リクエストを表示するブランチを作成するために、ブランチ規則でServiceRequestコレクションを選択します。

    • 属性の表示: 各ノード・レベルで表示する1つ以上の属性を選択します。たとえば、ユーザーのノードに対して、FirstName属性およびLastName属性の両方を選択できます。

    • ブランチ規則アクセッサ: 定義するノード・レベルの下にブランチとして表示するディテール・コレクションを戻す、アクセッサ・メソッドを選択します。リストには、規則に対して選択したマスター・コレクションのディテール・コレクションを戻すアクセッサ・メソッドのみが表示されます。「<なし>」を選択した場合は、ノードが開かずディテール・コレクションは表示されないため、ブランチは分岐しません。たとえば、Userノード・レベルを定義する場合に各ユーザーのサービス・リクエストにブランチを追加するには、サービス・リクエスト・コレクションを戻すアクセッサ・メソッドを選択できます。その後、serviceRequestノード・レベルの新しい規則を定義する必要があります。

    • 多相制限: 必要に応じて、属性のノード移入規則を定義して、その属性の値を識別子にすることができます。それぞれの規則が一意の識別子値を指定しているかぎり、同じ属性に対して必要な数だけノード移入規則を定義できるため、規則は多相になります。ツリーには、多相規則ごとに別個のブランチが表示され、属性の識別子値と同じノードが使用されます。


      ヒント:

      それぞれの規則を定義した後は、必ず「新しい規則を追加」をクリックしてください。これをクリックせずに「OK」をクリックすると、最後に定義した規則は保存されません。「新しい規則を追加」をクリックすると、JDeveloperによってツリー・バインディング・エディタの「規則の表示」タブが表示され、作成した規則を確認できます。

  4. 図8-5に示すツリー・バインディング・エディタの「規則の表示」ページを使用して、次の処理を行います。

    • 規則の順序変更

      規則の順序は、ツリーで表示する階層を反映する必要があります。

    • 規則の削除


    注意:

    ADF FacesまたはJSFのツリー・コンポーネントに表示されるアイコンは変更できません。

    ツリー・バインディング・エディタの「規則の表示」ページに表示される最初の規則によって、ツリーのルート・ノード・レベルに値が移入されます。そのため、データ・モデルの構造に応じて、最初の規則によってツリーの論理的なルート・ノードに値が移入されることを確認してください。

    図8-3で示したツリーの例の場合、最初の規則は、ユーザー・ノードに値を移入する規則になります。残りの規則の順序は、ツリーに表示するノードの階層に従う必要があります。

図8-5 ツリー・バインディング・エディタの「規則の表示」タブ

ツリー・バインディング・エディタの「規則の表示」タブ

8.4.2 ADFデータ・バインド・ツリーの作成時に行われる処理

データ・コントロール・パレットからドラッグ・アンド・ドロップを行うと、JDeveloperによって様々な処理が自動的に行われます。データ・コントロール・パレットの使用時に実行される処理と作成される内容の詳細は、5.2.3項「データ・コントロール・パレットの使用時に行われる処理」を参照してください。

データ・コントロール・パレットを使用してデータ・バインドされたツリーを作成すると、JDeveloperによって、ページ定義ファイルにバインディング・オブジェクトが追加され、JSFページにツリー・タグが追加されます。作成されたUIコンポーネントは、そのままで十分機能するため、変更する必要はありません。

8.4.2.1 JSFページで生成されるコード

例8-2は、データ・コントロール・パレットを使用してツリーを作成する際に、JSFページで生成されるコードを示しています。このツリーには、ユーザーおよびサービス・リクエストの2つのノード・レベルが表示されます。Userコレクションは、ルート・ノードであり、findAllStaffメソッドによって戻されます。

例8-2 データ・バインド・ツリー用にJSFページで生成されたコード

<h:form>
   <af:tree value="#{bindings.findAllStaff1.treeModel}" var="node">
      <f:facet name="nodeStamp">
         <af:outputText value="#{node}"/>
      </f:facet>
   </af:tree>
</h:form>

デフォルトで、フォームの中にaf:treeタグが作成されます。ツリー・タグのvalue属性には、ツリー・コンポーネントをページ定義ファイルのfindAllStaff1ツリー・バインディング・オブジェクトにバインドするEL式が含まれます。treeModelプロパティは、基礎となるデータ・モデルに基づいてツリー階層の表示方法を定義する、ADFクラスを参照します。var属性は、現在のノードへのアクセスを提供します。

f:facetタグに含まれるnodeStampファセットは、各ノードのデータを表示するために使用されます。ノードごとにコンポーネントを持つかわりに、ツリーでは、ADF Faces表コンポーネントに対して行がレンダリングされるのと同様の方法で、nodeStampファセットが繰返しレンダリングされます。

ADF Facesツリー・コンポーネントでは、oracle.adf.view.faces.model.PathSetクラスのインスタンスを使用して、開いた状態のノードが表示されます。このインスタンスは、コンポーネントのtreeState属性として格納されます。このインスタンスを使用して、階層での要素の開閉状態をプログラム的に管理できます。PathSetインスタンスに含まれるすべての要素は、開いた状態とみなされます。その他のすべての要素は閉じた状態です。

8.4.2.2 ページ定義ファイルで定義されるバインディング・オブジェクト

例8-3は、ADFデータ・バインド・ツリーに対してページ定義ファイルで定義されたバインディング・オブジェクトを示しています。

例8-3 データ・バインド・ツリー用にページ定義ファイルに定義されたバインディング・オブジェクト

<executables>
    <methodIterator id="findAllStaffIter" Binds="findAllStaff.result"
                    DataControl="SRPublicFacade" RangeSize="10"
                    BeanClass="oracle.srdemo.model.entities.User"/>
</executables>
<bindings>
    <methodAction id="findAllStaff" InstanceName="SRPublicFacade.dataProvider"
                  DataControl="SRPublicFacade" MethodName="findAllStaff"
                  RequiresUpdateModel="true" Action="999"
                  ReturnName="SRPublicFacade.methodResults.
                                SRPublicFacade_dataProvider_findAllStaff_result"/>
    <tree id="findAllStaff1" IterBinding="findAllStaffIter">
      <AttrNames>
        <Item Value="city"/>
        <Item Value="countryId"/>
        <Item Value="email"/>
        <Item Value="firstName"/>
        <Item Value="lastName"/>
        <Item Value="postalCode"/>
        <Item Value="stateProvince"/>
        <Item Value="streetAddress"/>
        <Item Value="userId"/>
        <Item Value="userRole"/>
      </AttrNames>
      <nodeDefinition DefName="oracle.srdemo.model.entities.User" id="UserNode">
        <AttrNames>
          <Item Value="firstName"/>
          <Item Value="lastName"/>
        </AttrNames>
        <Accessors>
          <Item Value="assignedToCollection"/>
        </Accessors>
      </nodeDefinition>
      <nodeDefinition DefName="oracle.srdemo.model.entities.ServiceRequest"
                      id="ServiceRequestNode">
        <AttrNames>
          <Item Value="problemDescription"/>
        </AttrNames>
      </nodeDefinition>
    </tree>
</bindings>

ページ定義ファイルには、ツリー・バインディング・エディタで定義された規則情報が含まれます。executables要素では、2つのノード・レベルがツリーに表示されているにもかかわらず、1つのイテレータ・バインディング・オブジェクトしか要求されません。このイテレータは、ツリーのルート・ノードに移入するマスター・コレクションを反復処理します。このノード規則で指定したアクセッサは、各ブランチ・ノードのディテール・データを戻します。

この例では、イテレータがメソッド・イテレータになっていますが、これは、データ・コントロール・パレットからメソッド戻りがドラッグされ、ADFツリーとしてページ上にドロップされたためです。データ・コントロール・パレットからアクセッサ戻りがドラッグされた場合は、メソッド・イテレータではなくアクセッサ・イテレータになります。この例では、メソッド・イテレータが使用されているため、対応するmethodActionbindings要素内で定義されます。methodActionは、データ・コレクションを戻すメソッドの起動方法の詳細をカプセル化します。

tree要素は、ツリーに表示されるすべての属性の値バインディングです。tree要素のiterBinding属性は、ツリーにデータを移入するイテレータ・バインディングを参照します。tree要素内のAttrNames要素は、マスター・コレクションのすべての属性のバインディング・オブジェクトを定義します。ただし、ツリーに表示するために選択する属性は、nodeDefinition要素内のAttrNames要素で定義します。

nodeDefinition要素は、ツリーのノードに値を移入するための規則を定義します。ノードごとに1つのnodeDefinition要素があり、それぞれに次の属性およびサブ要素が含まれます。

  • DefName: ノードの移入に使用されるデータ・コレクションの完全修飾名が含まれる属性。

  • id: ノードの名前を定義する属性。

  • AttrNames: 実行時にノードに表示される属性を定義するサブ要素。

  • Accessors: ツリーの次のブランチを戻すアクセッサ・メソッドを定義するサブ要素。

ページ定義ファイルでのnodeDefintion要素の順序は、ツリーでのノードの順序とレベルを定義します。最初のnodeDefinition要素は、ルート・ノードを定義します。後続の各nodeDefinition要素は、先行するノードのサブノードを定義します。

ページ定義ファイルの要素および属性の詳細は、A.7項「<pageName>PageDef.xml」を参照してください。

8.4.3 実行時に行われる処理

ツリー・コンポーネントは、oracle.adf.view.faces.model.TreeModelを使用してデータにアクセスします。このクラスは、ADF Faces tableコンポーネントがデータへのアクセスに使用するCollectionModelを拡張します。TreeModelクラスの詳細は、ADF Faces Javadocを参照してください。

ツリーを含むページが表示されると、ツリー上のイテレータ・バインディングによって、ルート・ノードに値が移入されます。ユーザーがノードを開いてブランチを表示したり、閉じて非表示にすると、DisclosureEventイベントが送信されます。このイベントのisExpandedメソッドは、ユーザーがノードを開いたか閉じたかを判断します。DisclosureEventイベントには、リスナーが関連付けられています。

ツリー上のDisclosureListener属性は、ページ定義ファイルで定義済のノード規則で指定されたアクセッサ・メソッドにバインドされます。このアクセッサ・メソッドは、DisclosureEventイベントに反応して起動します。つまり、ユーザーがノードを開くたびに、アクセッサ・メソッドによってブランチ・ノードに値が移入されます。

8.5 ツリー表を使用したマスター/ディテール・オブジェクトの表示

ADF FacesのtreeTableコンポーネントを使用すると、マスター/ディテール・コレクションの階層を表に表示できます。treeコンポーネントのかわりにtreeTableコンポーネントを使用することの利点は、treeTableコンポーネントにより、ツリー内の特定のノードにフォーカスして表示するメカニズムを使用できることです。

図8-6は、ユーザー、サービス・リクエストおよびサービス履歴という3つのノード・レベルを表示するツリー表の例を示しています。各ルート・ノードは、個別のユーザーを表します。ルート・ノードから分岐したブランチに、そのユーザーに関連付けられているサービス・リクエストが表示されます。また、各サービス・リクエスト・ノードが分岐して、各サービス・リクエストのサービス履歴が表示されます。

図8-6 データ・バインドされたADF Facesツリー表

ADF Facesツリー表

データ・バインドされたADF FacesのtreeTableには、一度に1つのルート・ノードしか表示されませんが、様々なルート・ノードをスクロールするためのナビゲーションが用意されています。各ルート・ノードには、任意の数のブランチ・ノードを表示できます。各ノードは表の個別の行として表示され、各行の左端の列にはフォーカス・メカニズムが付属します。

ADF FacesのtreeTableコンポーネントには、次の組込み機能が含まれます。

8.5.1 ツリー表でのマスター/ディテール・オブジェクトの表示方法

ADF Facesデータ・バインド・ツリー表の作成手順は、ADF Facesデータ・バインド・ツリーの作成手順とほぼ同じですが、データ・コレクションをドロップする際に、ADFツリーとしてではなくADFツリー表としてドロップします。詳細は、8.4.1項「ツリーでのマスター/ディテール・オブジェクトの表示方法」を参照してください。

8.5.2 データ・バインド・ツリー表の作成時に行われる処理

データ・コントロール・パレットからドラッグ・アンド・ドロップを行うと、JDeveloperによって様々な処理が自動的に行われます。データ・コントロール・パレットの使用時に実行される処理と作成される内容の詳細は、5.2.3項「データ・コントロール・パレットの使用時に行われる処理」を参照してください。

データ・コントロール・パレットを使用してデータ・バインド・ツリー表を作成すると、JDeveloperによって、ページ定義ファイルにバインディング・オブジェクトが追加され、JSFページにtreeTableタグが追加されます。作成されたUIコンポーネントは、そのままで十分機能するため、変更する必要はありません。

8.5.2.1 JSFページで生成されるコード

例8-4は、データ・コントロール・パレットを使用してツリー表を作成する際に、JSFページで生成されるコードを示しています。このツリー表には、ユーザー、サービス・リクエストおよびサービス履歴の3つのノード・レベルが表示されます。

デフォルトで、フォームの中にtreeTableタグが作成されます。ツリー表タグのvalue属性には、ツリー・コンポーネントをそのデータを移入するバインディング・オブジェクト(この例ではfindAllStaff1ツリー・バインディング・オブジェクト)にバインドするEL式が含まれます。treeModelプロパティは、基礎となるデータ・モデルに基づいてツリー階層の表示方法を定義する、ADFクラスを参照します。var属性は、現在のノードへのアクセスを提供します。

例8-4 データ・バインドされたADF Facesツリー表用にJSFページで生成されたコード

<h:form>
  <af:treeTable value="#{bindings.findAllStaff1.treeModel}" var="node">
    <f:facet name="nodeStamp">
      <af:column>
        <af:outputText value="#{node}"/>
      </af:column>
    </f:facet>
    <f:facet name="pathStamp">
      <af:outputText value="#{node}"/>
    </f:facet>
  </af:treeTable>
</h:form>

facetタグに含まれるnodeStampファセットは、各ノードのデータを表示するために使用されます。ノードごとにコンポーネントを持つかわりに、ツリーでは、ADF Faces表コンポーネントに対して行がレンダリングされるのと同様の方法で、nodeStampファセットが繰返しレンダリングされます。pathStampファセットは、ユーザーがディテール・ノードにフォーカスした後で親ノードに戻れるように、表の上に列およびパスのリンクをレンダリングします。

8.5.2.2 ページ定義ファイルで定義されるバインディング・オブジェクト

ツリー表に対してページ定義ファイルで作成されるバインディング・オブジェクトは、ツリーに対して作成されるものとまったく同じです。ツリー・バインディング・オブジェクトの詳細は、8.4.2.2項「ページ定義ファイルに定義されるバインディング・オブジェクト」を参照してください。

8.5.3 実行時に行われる処理

ツリー・コンポーネントは、oracle.adf.view.faces.model.TreeModelを使用してデータにアクセスします。このクラスは、ADF Faces tableコンポーネントがデータへのアクセスに使用するCollectionModelを拡張します。TreeModelクラスの詳細は、ADF Faces Javadocを参照してください。

ツリー表を含むページが表示されると、treeTableコンポーネントのイテレータ・バインディングは、ルート・ノードに値を移入し、行ナビゲーション・イベント(ユーザーによる「次へ」ボタンまたは「前へ」ボタンのクリック、もしくはレンジ・ナビゲータからの行の選択)をリスニングします。ユーザーが行ナビゲーション・イベントを開始すると、イテレータによって適切な行が表示されます。

ユーザーがコンポーネントのフォーカス・アイコンをクリックして表示のフォーカスを変更すると、treeTableコンポーネントによってフォーカス・イベント(FocusEvent)が生成されます。フォーカス変更後のノードが現在のノードになった後で、イベントが配信されます。その後、treeTableコンポーネントによってfocusPathプロパティが適切に変更されます。ツリー上のFocusListener属性をマネージドBean上のメソッドにバインドできます。バインドされたメソッドは、フォーカス・イベントに反応して起動します。

ユーザーがノードを開閉するたびに、公開イベント(DisclosureEvent)が送信されます。公開イベントのisExpandedメソッドは、ユーザーの操作に基づいてノードを開くか閉じるかを判断します。公開イベントには、リスナー(DisclosureListener)が関連付けられます。ツリー表上のDisclosureListener属性は、ページ定義ファイルで定義済のノード規則で指定されたアクセッサ・メソッドにバインドされます。このアクセッサ・メソッドは、公開イベント(ユーザーがノードを開くなど)に反応して起動し、そのノードに移入されるコレクションを戻します。

treeTableコンポーネントには、すべて展開リンクおよび「すべて閉じる」リンクも含まれます。ユーザーがどちらかのリンクをクリックすると、treeTableによってDisclosureAllEventイベントが送信されます。このイベントのisExpandedメソッドは、ユーザーの操作に基づいてすべてのノードを開くか閉じるかを判断します。その後、現在フォーカスしているルート・ノードの子ノードが、開くか閉じます。大規模なツリーの場合は、すべて展開コマンドを使用しても、直下の子より下にあるノードは開きません。ADF FacesのtreeTableコンポーネントでは、oracle.adf.view.faces.model.PathSetクラスのインスタンスを使用して、開いたノードが判別されます。このインスタンスは、コンポーネントのtreeState属性として格納されます。このインスタンスを使用して、階層でのノードの開閉状態をプログラム的に管理できます。PathSetインスタンスに含まれるすべてのノードは、開いているとみなされます。その他のすべてのノードは閉じた状態になります。このクラスでは、addAll()removeAll()のような操作もサポートされます。

ADF Facesのtableコンポーネントと同様に、treeTableコンポーネントでは、レンジ・ナビゲーションを使用できます。ただし、treeTableコンポーネントでは、rows属性のかわりにrowsByDepth属性が使用されます。この属性の値は、空白で区切られた正数のリストです。それぞれの数字は、ツリー上のノード・レベルのレンジ・サイズを定義します。最初の数字はツリーのルート・ノードで、最後の数字はブランチ・ノードに対応します。ツリーのブランチの数がrowsByDepth属性に含まれる数字より多い場合は、残りのブランチに対して、リストの最後の数字が使用されます。各数字は、各ブランチに一度に表示される項目数の制限を定義します。ブランチにすべての項目を表示するには、リストの対応する位置で0を指定します。

たとえば、rowsByDepth属性が0 0 3に設定されている場合は、ルート・ノードおよびその直下にある子はすべて表示されますが、それより下は、ブランチごとに3つのノードしか表示されません。ただし、treeTableコンポーネントには追加のノードに移動するためのリンクが含まれるため、ユーザーは追加のノードを表示できます。

ADF FacesのtreeTableコンポーネントの詳細は、ADF Faces Javadocでoracle.adf.view.faces.component.core.data.CoreTreeTableクラスを参照してください。

8.6 インライン表を使用したマスター表でのディテール・データの表示

7.5項「表への非表示機能の追加」で説明したように、表のdetailStampファセットを使用すると、表に含まれる特定のデータ・オブジェクトに関する追加情報を表示したり、非表示にすることができます。このファセットにコンポーネントを追加すると、表に「詳細」ラベルが付いた追加の列が表示され、この列に追加情報が表示されます。この列には切替えのメカニズムが組み込まれており、ユーザーは、ADF FacesのtreeまたはtreeTableコンポーネントと同様の方法で、「詳細」列に表示される情報を非表示にしたり表示することができます。7.5項「表への非表示機能の追加」で説明した内容では、追加の情報は、表に移入するものと同じデータ・コレクションからの単一の属性でした。

データ・コントロール・パレットでマスター/ディテール・コレクションを使用すると、ディテール・コレクションからの追加情報を表示するdetailStampファセットに、宣言的にインライン表を追加できます。マスター・コレクションはメイン表の移入に使用され、ディテール・コレクションはインライン表の移入に使用されます。

図8-7は、サービス・リクエストのインライン表がサービス・リクエスト・スタッフの表にどのように埋め込まれるかを示しています。ユーザーが表ファセットに組み込まれた「詳細」列の「表示」リンクをクリックすると、表の選択した行の下に、サービス・リクエストのインライン表が表示されます。ユーザーのマスター・コレクションがメイン表に移入され、ユーザーの姓名が表示されます。サービス・リクエストのディテール・コレクションがインライン表に移入され、サービス・リクエスト問題の説明とステータスが表示されます。

図8-7 ディテール・コレクションからの情報を表示するインライン表

マスター表、インライン・ディテール表

8.6.1 インライン表を使用したディテール・データの表示方法

データ・コントロール・パレットを使用して、メイン表とインライン表を単一の宣言的アクションで作成できます。インライン表はツリー表と類似しているため、ツリー・バインディング・エディタを使用して、メイン表およびインライン・ディテール表への移入の規則を定義できます。メイン表とインライン・ディテール表には、それぞれ1つの規則が必要になります。各規則によって、次のプロパティが定義されます。

  • 表に移入するデータ・コレクション

  • 表に表示されるデータ・コレクションの属性

メイン表の規則では、インライン表に移入するディテール・コレクションを戻すアクセッサ・メソッドも指定される必要があります。

インライン・ディテール表を伴うマスター表の作成手順:

  1. データ・コントロール・パレットからマスター・データ・オブジェクトをドラッグし、ページ上にドロップします。これは、メイン表に移入するマスター・オブジェクトであることが必要です。


    注意:

    表の作成には、シングル・オブジェクトのアクセッサ戻りは使用できません。

  2. ポップアップ・メニューから「表」「ADFマスター表、インライン・ディテール表」を選択します。

    JDeveloperによって、前の図8-4のように、ツリー・バインディング・エディタが表示されます。

  3. ツリー・バインディング・エディタの「規則の編集」ページで、メイン表への移入規則およびインライン表への移入規則を定義します。規則を定義するには、次の項目を選択する必要があります。

    • データ・コレクション定義: 定義する表に移入するデータ・コレクションを選択します。最初の規則によってメイン表が定義されます。そのため、最初の規則については、データ・コントロール・パレットからドラッグしたものと同じデータ・コレクション(マスター・コレクション)を選択します。インライン表の規則を定義する際には、適切なディテール・コレクションを選択します。たとえば、ユーザーのメイン表を作成するために、最初の規則に対してUserコレクションを選択し、ユーザーに関連するサービス・リクエストを表示するインライン表を作成するために、ブランチ規則でServiceRequestコレクションを選択します。

    • 属性の表示: 定義する表に表示する1つ以上の属性を選択します。各属性は、表の1つの列になります。たとえば、メイン表にユーザーを表示する場合は、firstName属性およびlastName属性の両方を選択できます。

    • ブランチ規則アクセッサ: メイン表の規則を定義する場合は、インライン・ディテール表に表示するディテール・コレクションを戻すアクセッサ・メソッドを選択します。リストには、規則に対して選択したマスター・コレクションのディテール・コレクションを戻すアクセッサ・メソッドのみが表示されます。インライン表の規則を定義する場合は、「<なし>」を選択します。これは、インライン表内部には表を埋め込めないためです。


      ヒント:

      それぞれの規則を定義した後は、必ず「新しい規則を追加」ボタンをクリックしてください。これをクリックせずに「OK」ボタンをクリックすると、最後に定義した規則は保存されません。「新しい規則を追加」をクリックすると、JDeveloperによってツリー・バインディング・エディタの「規則の表示」タブが表示され、作成した規則を確認できます。

  4. 図8-5に示すツリー・バインディング・エディタの「規則の表示」ページを使用して、次の処理を行います。

    • 規則の順序変更

      メイン表の移入の規則は、リストの最初に配置する必要があります。

    • 開閉のメカニズムに使用するアイコンの識別

      これらのアイコンはメイン表でのみ使用されるため、デフォルト以外のアイコンを使用する場合は、メイン表の規則で指定します。

      デフォルトのオープン・アイコンは、マイナス記号付きの、塗りつぶされた下向き矢印で、デフォルトのクローズ・アイコンは、プラス記号付きの、塗りつぶされた右向き矢印です。

    • 規則の削除

8.6.2 インライン・ディテール表の作成時に行われる処理

データ・コントロール・パレットからドラッグ・アンド・ドロップを行うと、JDeveloperによって様々な処理が自動的に行われます。データ・コントロール・パレットの使用時に実行される処理と作成される内容の詳細は、5.2.3項「データ・コントロール・パレットの使用時に行われる処理」を参照してください。

8.6.2.1 JSFページで生成されるコード

データ・コントロール・パレットを使用してマスター表およびインライン・ディテール表を作成すると、JDeveloperによって、ページ定義ファイルにバインディング・オブジェクトが追加され、JSFページに表およびファセットが追加されます。作成されたUIコンポーネントは、そのままで十分機能するため、変更する必要はありません。

例8-5は、JSFページで生成されたコードを示しています。この例では、メイン表にユーザーが表示され、インライン・ディテール表にサービス・リクエストが表示されます。Userコレクションは、findAllStaffメソッドによって戻されます。メイン表は、その他のADFデータ・バインド表と同様に定義されます。メイン表は、ページ定義ファイルに含まれるツリー・バインディング・オブジェクトである、findAllStaff1バインディング・オブジェクトにバインドされます。メイン表の列には、ユーザーの姓名が表示されます。表には、ディテール表が定義されるdetailStampファセットが含まれます。ディテール表は、findAllStaff1ツリー・バインディング・オブジェクトにもバインドされ、列はサービス・リクエスト・コレクションからのデータを表示するように設定されます。ツリー・コンポーネントの場合と同様に、ページ定義ファイルは、ディテール・コレクションを戻すアクセッサ・メソッドを定義します。

例8-5 インライン・ディテール表を伴うマスター表に対して作成されるJSFコード

<af:table rows="#{bindings.findAllStaff1.rangeSize}"
          emptyText="#{bindings.findAllStaff1.viewable ? \'No rows yet.\' :
                         \'Access Denied.\'}"
          var="row" value="#{bindings.findAllStaff1.treeModel}">
  <af:column headerText="#{bindings.findAllStaff1.labels.firstName}"
             sortable="false" sortProperty="firstName">
    <af:outputText value="#{row.firstName}"/>
  </af:column>
  <af:column headerText="#{bindings.findAllStaff1.labels.lastName}"
               sortable="false" sortProperty="lastName">
    <af:outputText value="#{row.lastName}"/>
  </af:column>
  <f:facet name="detailStamp">
    <af:table rows="#{bindings.findAllStaff1.rangeSize}"
              emptyText="No rows yet." var="detailRow"
              value="#{row.children}">
      <af:column headerText="#{row.children[0].labels.problemDescription}"
                 sortable="false" sortProperty="problemDescription">
        <af:outputText value="#{detailRow.problemDescription}"/>
      </af:column>
      <af:column headerText="#{row.children[0].labels.status}"
                 sortable="false" sortProperty="status">
        <af:outputText value="#{detailRow.status}"/>
      </af:column>
    </af:table>
  </f:facet>
</af:table>

8.6.2.2 ページ定義ファイルで定義されるバインディング・オブジェクト

例8-6は、インライン・ディテール表を含むマスター表用にページ定義ファイルに追加されたバインディング・オブジェクトを示しています。executables要素は、findAllStaffIterイテレータ・バインディング・オブジェクトを定義します。このオブジェクトは、メイン表に移入されるUserコレクションを反復処理します。ディテール・コレクションにはイテレータは不要です。これは、ツリー・バインディング・オブジェクト内で参照されるアクセッサ・メソッドによって、現在選択されているマスター・データに関連するディテール・データが戻されるためです。

bindings要素内では、methodActionバインディング・オブジェクトによって、Userコレクションを戻すメソッドが起動されます。ツリー・バインディング・オブジェクトは、マスター表およびディテール表にデータを移入します。nodeDefintion要素は、マスター表およびディテール表の列に表示される属性を定義します。最初のnodeDefinition要素はマスター表のデータを定義し、2番目の要素はインライン・ディテール表のデータを定義します。ツリー・バインディング・オブジェクトの詳細は、8.4.2項「ADFデータ・バインド・ツリーの作成時に行われる処理」を参照してください。

例8-6 インライン・ディテール表を伴うマスター表に対してページ定義ファイルに追加されるバインディング・オブジェクト

<executables>
  <methodIterator id="findAllStaffIter" Binds="findAllStaff.result"
                    DataControl="SRPublicFacade" RangeSize="10"
                    BeanClass="oracle.srdemo.model.entities.User"/>
</executables>
<bindings>
  <methodAction id="findAllStaff" InstanceName="SRPublicFacade.dataProvider"
                DataControl="SRPublicFacade" MethodName="findAllStaff"
                RequiresUpdateModel="true" Action="999"
                ReturnName="SRPublicFacade.methodResults.
                            SRPublicFacade_dataProvider_findAllStaff_result"/>
  <tree id="findAllStaff1" IterBinding="findAllStaffIter">
    <AttrNames>
      <Item Value="city"/>
      <Item Value="countryId"/>
      <Item Value="email"/>
      <Item Value="firstName"/>
      <Item Value="lastName"/>
      <Item Value="postalCode"/>
      <Item Value="stateProvince"/>
      <Item Value="streetAddress"/>
      <Item Value="userId"/>
      <Item Value="userRole"/>
    </AttrNames>
    <nodeDefinition DefName="oracle.srdemo.model.entities.User" id="UserNode">
      <AttrNames>
        <Item Value="firstName"/>
        <Item Value="lastName"/>
      </AttrNames>
      <Accessors>
        <Item Value="assignedToCollection"/>
      </Accessors>
    </nodeDefinition>
    <nodeDefinition DefName="oracle.srdemo.model.entities.ServiceRequest"
                    id="ServiceRequestNode">
      <AttrNames>
        <Item Value="problemDescription"/>
        <Item Value="status"/>
      </AttrNames>
    </nodeDefinition>
  </tree>
</bindings>

8.6.3 実行時に行われる処理

ユーザーが「非表示」リンクまたは「表示」リンクをクリックして行の詳細を非表示にしたり表示したりするたびに、表によって、インライン・ディテール表を開閉するDisclosureEventイベントが生成されます。このイベントのisExpandedメソッドは、ユーザーの操作に基づいてディテール表を開くか閉じるかを判別します。

DisclosureEventイベントには、リスナーが関連付けられています。表にあるDisclosureListener属性は、ページ定義ファイルで定義済のノード規則で指定されたアクセッサ・メソッドに暗黙的にバインドされます。このアクセッサ・メソッドは、DisclosureEventイベントに反応して起動します。たとえば、ユーザーが「表示」リンクをクリックすると、アクセッサ・メソッドが起動してインライン表にデータが移入されます。