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

この章では、ADFデータ・コントロールおよびADF Facesコンポーネントを使用して、ADFビジネス・コンポーネントからデータがモデル化されたマスター/ディテール・オブジェクトを作成する方法について説明します。事前作成済のマスター/ディテール・ウィジェット、表、ツリーおよびツリー表を使用してマスター/ディテール・データを表示する方法と、選択イベントの操作方法について説明します。

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

選択リストを使用して、関連するマスター・コレクションまたはディテール・コレクションからのキー値をコレクションに移入する方法の詳細は、「データバインドされた選択リストおよびシャトルの作成」を参照してください。

マスター/ディテール・データの表示について

マスター/ディテール関係は、1対多タイプの関係です。Oracle ADFを使用したマスター/ディテール関係では、関連する表のデータを同時に表示できます。

データを階層形式で表現する必要がある場合が多くあります。マスター/ディテール関係では、ユーザーがマスター・データ・オブジェクト内でアイテムの選択を変更すると、これに合せ、ディテール・データ・オブジェクト内で表示されていたデータ・セットも変更されます。たとえば、マスター・オブジェクト内でテレビのカテゴリを選択すると、ディテール・オブジェクトにはすべてのテレビ・モデルが表示されます。

ADF Faces UIコンポーネントと組み合せてADFモデルを使用すると、複数のオブジェクトでマスター/ディテール関係が定義されている場合には、これらのオブジェクトから同時にデータを表示するマスター/ディテール・ページを宣言的に作成できます。ADFイテレータ・バインディングは、選択されたマスター・データ・オブジェクトに対して表示されるディテール・データ・オブジェクトの同期化を自動的に管理します。

ADFビジネス・コンポーネントにおけるマスター/ディテール関係は、ビュー・リンクが2つのビュー・オブジェクト・インスタンスを関連付けるように作成される場合に確立されます。「ビュー・オブジェクトについて」で説明しているように、ビュー・リンクは2つのビュー・オブジェクト間の関係を表します。通常は基礎となるデータ表間の外部キー関係に基づきますが、そうである必要はありません。ビュー・リンクは、1つのビュー・オブジェクト・インスタンス(マスター・オブジェクト)の行を別のビュー・オブジェクト・インスタンス(ディテール・オブジェクト)の1つ以上の行に関連付けます。

マスター/ディテールの表、フォームおよびツリーのユースケースと例

オブジェクトがマスター/ディテール関係にある場合は、両方のオブジェクトのデータを同時に表示するページを宣言的に作成できます。たとえば、図34-1に示すページでは、ページ上部のフォームには顧客の入力を表示し、ページ下部には顧客注文の表を示しています。このような表示ができるのは、オブジェクトがマスター/ディテール関係にあるためです。この例では、Customersビュー・オブジェクトがマスター・オブジェクトで、OrdersForCustomerがディテール・オブジェクトです。ADFイテレータは、選択されたマスター・データ・オブジェクトに対して表示されるディテール・データ・オブジェクトの同期化を自動的に管理します。イテレータ・バインディングにより、データ・コレクションのスクロール処理やページング、または概要情報から詳細情報へのドリルダウンを可能にするユーザー・インタフェースを簡単に作成できます。

図34-1 マスター・フォームとディテール表

この図は周囲のテキストで説明しています

マスター/ディテール・オブジェクトは、フォーム、表、ツリーおよびツリー表に表示します。これらのオブジェクトは同じページまたは別々のページに表示できます。たとえば、マスター・オブジェクトをあるページの表に表示し、ディテール・オブジェクトを別のページの読取り専用フォームに表示できます。

マスター・オブジェクトは多数のディテール・オブジェクトを保持でき、各ディテール・オブジェクトも自身のディテール・オブジェクトを多くのレベル(深さ)にわたって保持できます。この階層内のディテール・オブジェクトの1つを「アプリケーション」ウィンドウからマスター/ディテール・フォームとしてページにドロップすると、直接の親マスター・オブジェクトのみがページに表示されます。最上位の親オブジェクトまで、階層全体が表示されるわけではありません。

ディテール・オブジェクトをツリーまたはツリー表オブジェクトとして表示すると、深さのレベルが複数ある階層全体を、最上位のマスター・オブジェクトから始まり、各ノードのディテール子オブジェクトを横断して表示できます。

図34-1は、ディテール表を伴うマスター・フォームの例を示します。ユーザーがコマンド・ボタンを使用して顧客間を移動する場合、顧客が行った注文が表にリストされます。

図34-2は、2レベルのノードからなるツリーを示します。ツリーを使用して、階層情報を表示できます。この例では、ツリーを使用して、国別にグループ化された顧客が表示されています。ユーザーは各ノードを開いて、ツリーのブランチを下位に横断し、リーフ・レベルのアイテムにアクセスできます。

図34-2 複数レベルのツリー

この図は周囲のテキストで説明しています

図34-3は、国別だが、ツリーではなくツリー表を使用した、グループ化された同じ顧客を示しています。ツリー表では、階層ノード・レベルのツリーだけでなく、各ノードに対する列情報も表示できます。また、要素を開いたり閉じるだけでなく、サブツリーに焦点を当てることもできます。

図34-3 ツリー表

この図は周囲のテキストで説明しています

マスター/ディテール表、フォームおよびツリーの追加機能

ADFモデル・レイヤーを構成または使用する前に、他のOracle ADF機能を理解しておくと役立つ場合があります。また、モデル・レイヤーの構成によって可能になることについても、確認しておくことをお薦めします。次に、関連する他の機能へのリンクを示します。

  • ADFビュー・オブジェクトおよびビュー・リンク: フォーム内でのコンポーネントの表示方法および機能のほとんどは、対応するビュー・オブジェクトによって制御されます。ビュー・オブジェクトの作成方法およびビュー・リンクでのデータ・モデルのマスター/ディテール階層の確立の詳細は、「マスター/ディテール階層における複数表の使用」を参照してください。

  • ADFアプリケーション・モジュール: ページにデータバインドされたコンポーネントをドラッグする「データ・コントロール」パネルに、アプリケーション・モジュールに追加したビュー・オブジェクトの表示が移入されます。「アプリケーション・モジュールによるビジネス・サービスの実装」を参照してください。

  • アダプタベースのデータ・コントロール: EJBコンポーネントやWebサービスなど他のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』「EJBデータ・コントロールの作成および構成」で説明されるこれらのビジネス・サービス用データ・コントロールを作成できます。

  • ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。

  • ADF Faces: ADF Faces UIコンポーネントも使用します。ADF Facesを使用した開発の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「ADF Facesの概要」を参照してください。

  • ADFフォームおよび表: デフォルトのフォームまたは表を変更する場合は、「データ・コントロールのコレクションを使用した基本的なフォームの作成」または「基本表の作成」を参照してください。

  • タスク・フロー: トランザクションに携わるフォームの場合は、フォームのレンダリングの前または後に、ADFタスク・フローを使用して特定の操作を起動する必要がある場合があります。「ADFタスク・フローの作成」を参照してください。

  • イベント処理: クライアント側イベントを処理するためにリスナー・メソッドを記述することが必要な場合があります。『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「イベントの処理」を参照してください。

  • マネージドBean: イベントの処理および他のフロントエンド処理にマネージドBeanの作成が必要な場合があります。マネージドBeanの作成および使用の詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。

マスター/ディテール表、フォームおよびツリーの前提条件

マスター/ディテール関係は、2つのビュー・オブジェクト・インスタンスをビュー・リンクで関連付けます。ビュー・リンクは2つのビュー・オブジェクト間の関係を表します。通常は基礎となるデータ表、フォームおよびツリー間の外部キー関係に基づきますが、そうである必要はありません。

マスター/ディテール表、フォーム、ツリーおよびツリー表を使用するには、データ・モデル内でマスター/ディテール関係を確立する必要があります。マスター/ディテール関係は、「データ・コントロール」パネルに反映され、そこからマスター/ディテール・データを表示するページを宣言的に作成するオブジェクトをドラッグ・アンド・ドロップできます。

ADFビジネス・コンポーネント・アプリケーションでのマスター/ディテール関係は、2つのビュー・オブジェクト間のビュー・リンクを作成することによって示します。次に、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトの両インスタンスをアプリケーション・モジュールのデータ・モデルに追加します。詳細は、「データ・モデルでアクティブなマスター/ディテール調整を有効化する方法」を参照してください。

ノート:

WebサービスやEJBセッションBeanなど、他のビジネス・サービスに基づいたデータ・コントロールの場合、マスター/ディテール関係は通常、Webサービスの定義ファイルまたはJPAベースのBeanのJoinColumnアノテーションなど、これらのサービス内の標準メカニズムから推定されます。

たとえば、図34-4に示すように、Oracle ADFのSummitサンプル・アプリケーションにはCustomerId属性に基づくCustomerVOビュー・オブジェクトからOrdVOビュー・オブジェクトへのビュー・リンクがあり、どちらもアプリケーション・モジュールのデータ・モデルに含まれています。マスター・ビュー・オブジェクト・インスタンスの現在の行を変更すると、ディテール・ビュー・オブジェクト・インスタンスの行セットがリフレッシュされて現在のマスターの詳細が含まれるようになります。

図34-4 CustomerVOおよびOrdVOの両ビュー・オブジェクト間のビュー・リンク

図34-4の説明が続きます
「図34-4 CustomerVOおよびOrdVOの両ビュー・オブジェクト間のビュー・リンク」の説明

ノート:

Summit ADFサンプル・アプリケーションのCustomerVOビュー・オブジェクトとOrdVOビュー・オブジェクトの間のビュー・リンクは、一方向の関係です。ビュー・リンクが双方向で、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトの両セットがアプリケーション・モジュールのデータ・モデルに追加された場合、「データ・コントロール」パネルには、OrdersForCustomerコレクションもCustomersコレクションと同じノード・レベルで表示され、OrdersForCustomerコレクションのディテール・インスタンスもCustomersコレクションの子として表示されます。

「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別方法

マスター/ディテール・オブジェクトは「データ・コントロール」パネルの階層を調べることで識別できます。

始める前に:

マスター/ディテールの関係の基本を理解しておくと役立つ場合があります。詳細は、「マスター/ディテール表、フォームおよびツリーの前提条件」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

マスター/ディテール・オブジェクトを識別するには:

  • 「アプリケーション」ウィンドウで、「データ・コントロール」パネルを開いて、コレクション・ノードを開き、これらのコレクションのコレクション子ノード検索します。

コレクション・ノードの子コレクション・ノードは、親ノードとのマスター/ディテール関係のディテール部分を表しています。親コレクションは、複数の子コレクションとのマスター/ディテール関係の一部にできます。また、コレクションは複数のレイヤーでネストできます。これは、コレクションを1つのマスター/ディテール関係のディテール部分とし、別のマスター/ディテール関係のマスター部分にできることを意味しています。

図34-5は、Summit ADFサンプル・アプリケーションの「データ・コントロール」パネルに表示された2つのマスター/ディテール関連コレクションを示しています。CustomersコレクションはCustomerVOビュー・オブジェクトのインスタンスで、Customerコレクションの子として表示されているOrdersForCustomerコレクションはOrdVOビュー・オブジェクトのインスタンスです。

ノート:

「データ・コントロール」パネルに表示されるマスター/ディテール階層には、関係のカーディナリティ(1対多、1対1、多対多)は反映されません。階層には、別のコレクション(ディテール)から1つ以上のオブジェクトを取得するために使用されているコレクション(マスター)が簡潔に示されます。

図34-5 「データ・コントロール」パネルでのマスター/ディテール・オブジェクト

図34-5の説明が続きます
「図34-5 「データ・コントロール」パネルでのマスター/ディテール・オブジェクト」の説明

「データ・コントロール」パネル上のマスター/ディテール階層には、図34-4に示す、アプリケーション・モジュールのデータ・モデルに定義されている階層が反映されます。「データ・コントロール」パネルに表示されるアイコンの詳細は、「「データ・コントロール」パネルの使用方法」を参照してください。

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

「データ・コントロール」パネルで事前作成済のマスター/ディテール・フォームおよび表を使用すると、単一の宣言的アクションで、マスター・ウィジェットとディテール・ウィジェットの両方を1つのページ上に作成できます。事前作成済のマスター/ディテール・ウィジェットを使用しない場合、マスター・オブジェクトとディテール・オブジェクトを表やフォームとして、「データ・コントロール」パネルから1つずつドラッグ・アンド・ドロップできます。

フォームと表コンポーネントを使用してページにマスター/ディテール機能を作成できます。作成するには、個々のフォームおよび表コンポーネントを作成するか、マスター/ディテール・コンポーネント両方を含む事前作成済ウィジェットを使用します。

事前作成済のウィジェットにより、「データ・コントロール」パネルを使用して単一の宣言的アクションで、読取り専用マスター/ディテール・ブラウザ・ページを作成できます。そのために必要な操作は、ディテール・コレクションをページにドロップして、使用するウィジェットのタイプを選択することのみです。生成されたコンポーネントには、エンド・ユーザーがコレクション内のデータ・オブジェクトをスクロールできるレンジ・ナビゲーションが含まれます。テキスト・フィールドまたは列をページから削除すると、不要な属性を削除できます。

図34-6に示す事前作成済のマスター/ディテール・ウィジェットの例では、ページ上部のフォームに一般的な注文情報が表示され、ページ下部の表に注文詳細が表示されています。ユーザーが「次へ」ボタンをクリックし、ページ上部のマスター・データのレコードをスクロールすると、ページが自動的に更新され、現在表示されているマスター・レコードのディテール・データが表示されます。

図34-6 「データ・コントロール」パネルの事前作成済のマスター/ディテール・ウィジェット

この図は周囲のテキストで説明しています

JDeveloperで提供される事前作成済マスター/ディテールUIコンポーネントでは必要な機能を発揮できない場合があります。たとえば、マスター/ディテールUIコンポーネントを使用するかわりに、コンポーネントを編集可能にしたり、コンポーネントをプログラム的にバインドすることが必要な場合があります。このような場合には、フォームと表を別々に作成することにより、マスター/ディテール・ページを作成できます。コンポーネントがコレクションおよびネストされたコレクションから作成される場合は、ネストされたコレクションのイテレータ・バインディングはマスターおよびディテール・コンポーネント間の調整を自動的に管理します。 「個別のコンポーネントからマスター/ディテール・フォームを作成する方法」および「個別のページにマスター/ディテール・コンポーネントを表示する方法」を参照してください。

ノート:

また、マスター表のdetailStampファセットを使用して、選択した行のディテールを表示することもできます。動的コンポーネントを使用してこれを行う方法の詳細は、「detailStampファセットを使用した動的表の作成方法」を参照してください。

マスター/ディテール・ウィジェットを使用して表およびフォームにマスター/ディテール・オブジェクトを表示する方法

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

始める前に:

マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「表およびフォームを使用したマスター/ディテール・オブジェクトの表示」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

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

  1. 「「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別方法」の説明に従って、「データ・コントロール」パネルでディテール・オブジェクトを特定します。
  2. ディテール・オブジェクトをJSFページにドラッグ・アンド・ドロップします。
  3. ポップアップ・メニューの「マスター/ディテール」サブメニューから、次のコンポーネントのいずれかを選択します。
    • ADFマスター表、ディテール・フォーム: 読取り専用表にマスター・オブジェクトが表示され、表の下にある読取り専用フォームにディテール・オブジェクトが表示されます。

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

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

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

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

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

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

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

    デフォルトのフォームまたは表を変更する場合は、「フォーム上のUIコンポーネントおよびバインディングの変更」および「表に表示される属性の変更」を参照してください。

個別のコンポーネントからマスター/ディテール・フォームを作成する方法

事前作成済のマスター/ディテール・ウィジェットを使用してマスター/ディテール・フォームを作成するかわりに、マスター/ディテール関係を持つデータ・コントロール・オブジェクトから表およびフォーム・コンポーネントを別々に作成して、マスター/ディテール調整を提供するディテール・オブジェクトのイテレータ・バインディングを利用できます。別々のコンポーネントからマスター/ディテール・フォームを作成することにより、コンポーネントとそのバインディングの生成方法により柔軟性がもたらされます。

始める前に:

マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「表およびフォームを使用したマスター/ディテール・オブジェクトの表示」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

個々のコンポーネントを使用してマスター/ディテール・フォームを作成するには:

  1. ディテール・ウィジェットは、「データ・コントロール」パネルから子コレクションをドラッグして、それを表またはフォームとしてJSFページまたはディテール・ビュー・アクティビティに対応するフラグメント上にドロップして作成します。詳細は、「「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別方法」を参照してください。

    個々のコンポーネントの作成方法の詳細は、「データ・コントロールのコレクションを使用した基本的なフォームの作成」および「基本表の作成」を参照してください。

  2. マスター・ウィジェットは、ステップ1でコレクションの親であるコレクションをドラッグして、それを表またはフォームとしてJSFページまたはマスター・ビュー・アクティビティに対応するフラグメント上にドロップして作成します。

マスター/ディテール表およびフォームの作成時の処理

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

マスター/ディテールJSFページで生成されるコード

事前作成済のマスター/ディテール・ウィジェット用に生成されたJSFコードは、「データ・コントロール」パネルを使用して読取り専用のフォームまたは表を作成したときに生成されるJSFコードとほぼ同じです。独自のマスター/ディテール・ウィジェットを作成する場合、事前作成済のマスター/ディテール表およびフォームに自動的に組み込まれるものと同様のコンポーネントを組み込むことを検討してください。

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

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

ヒント:

ページに「ADFマスター表、ディテール・フォーム」ウィジェットまたは「ADFマスター表、ディテール表」ウィジェットをドロップすると、ディテール・コンポーネントの親タグ(panelHeaderタグやtableタグなど)のpartialTriggers属性はマスター・コンポーネントのidに自動的に設定されます(部分トリガーの詳細は、「入力表の作成方法」を参照)。実行時に、ユーザーがマスター・コンポーネントで選択を行うと、partialTriggers属性によりディテール・コンポーネントのみが再度レンダリングされます。これは、部分ページ・レンダリングと呼ばれます。部分ページ・レンダリングが使用されるのは、ディテール・コンポーネントのみ新しいデータを表示するために再度レンダリングする必要があるためです。ユーザーがファセット内で選択のみを行う場合、表を再度レンダリングする必要はありません。

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

次の例は、マスター/ディテール・ページ用に作成されたページ定義ファイルを示しています。このページは、Customersオブジェクトの下位のディテール・オブジェクトであるOrdersFromCustomerコレクションを、「ADFマスター・フォーム、ディテール表」としてページにドロップして作成したものです。

このexecutables要素では2つのイテレータが定義されており、1つはマスター・オブジェクトに対するもの、もう1つはディテール・オブジェクトに対するものです。実行時には、ディテール・ビュー・オブジェクト・インスタンスのデータ・モデルおよび行セット・イテレータにより、現在の行が変更されたときに、ディテール・ビュー・オブジェクトの行セットが現在のマスター行の正しい行セットになるようにリフレッシュされます。詳細は、「実行時に行われる処理: マスター/ディテール表およびフォームのADFイテレータ」を参照してください。

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

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

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

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

<executables>
  <variableIterator id="variables"/>
  <iterator Binds="Customers" RangeSize="25" DataControl="BackOfficeAppModuleDataControl" id="CustomersIterator"
            ChangeEventPolicy="ppr"/>
  <iterator Binds="OrdersForCustomer" RangeSize="25" DataControl="BackOfficeAppModuleDataControl"
            id="OrdersForCustomerIterator" ChangeEventPolicy="ppr"/>
</executables>
<bindings>
  <action IterBinding="CustomersIterator" id="First" RequiresUpdateModel="true" Action="first"/>
  <action IterBinding="CustomersIterator" id="Previous" RequiresUpdateModel="true" Action="previous"/>
  <action IterBinding="CustomersIterator" id="Next" RequiresUpdateModel="true" Action="next"/>
  <action IterBinding="CustomersIterator" id="Last" RequiresUpdateModel="true" Action="last"/>
  <attributeValues IterBinding="CustomersIterator" id="Id">
    <AttrNames>
      <Item Value="Id"/>
    </AttrNames>
  </attributeValues>
  <attributeValues IterBinding="CustomersIterator" id="Name">
    <AttrNames>
      <Item Value="Name"/>
    </AttrNames>
  </attributeValues>
  <attributeValues IterBinding="CustomersIterator" id="Phone">
    <AttrNames>
      <Item Value="Phone"/>
    </AttrNames>
  </attributeValues>
. . .
  <tree IterBinding="OrdersForCustomerIterator" id="OrdersForCustomer">
    <nodeDefinition DefName="oracle.summit.model.views.OrdVO"
                    Name="OrdersForCustomer0">
      <AttrNames>
        <Item Value="Id"/>
        <Item Value="CustomerId"/>
        <Item Value="DateOrdered"/>
...
      </AttrNames>
    </nodeDefinition>
  </tree>
</bindings>

ノート:

EJBセッションBeanなど、ビジネス・サービスの他のタイプに基づくデータ・コントロールの場合、イテレータ・バインディングの処理にiterator要素のかわりにaccessorIterator要素が使用されます。

実行時に行われる処理: マスター/ディテール表およびフォームのADFイテレータ

実行時に、ADFイテレータは、マスター表オブジェクトのどの行をマスター/ディテール・フォームに表示するかを決定します。フォームが最初に表示されるときは、マスター表オブジェクトの1行目がフォームのマスター・セクションに強調表示されます。マスター行に関連付けられているディテール表の行は、フォームのディテール・セクションに表示されます。

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

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

ディテール・コレクションの行セット・イテレータは、 ディテール・データとマスター・データの同期化を管理します。マスター・ビュー・オブジェクトからディテール・ビュー・オブジェクトへの基礎となるビュー・リンクにより、ディテール行セット・イテレータは、マスター・コレクションとディテール・コレクションの両方で行ナビゲーション・イベントをリスニングします。マスター・コレクションで行セット・ナビゲーション・イベントが発生すると、ディテール行セット・イテレータが自動的に実行され、現在のマスター行に関連するディテール行が戻されます。

個別のページにマスター/ディテール・コンポーネントを表示する方法

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

始める前に:

マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「表およびフォームを使用したマスター/ディテール・オブジェクトの表示」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

マスター・オブジェクトとディテール・オブジェクトを個別のページに作成するには:

  1. 「タスク・フローの作成方法」に従って、ADFタスク・フローを作成します。

    ページ・フラグメントを使用して、マスター/ディテール・コンポーネントを保持する予定がある場合は、このステップの「ページ・フラグメントを使用して作成」チェック・ボックスを選択します。

  2. 「タスク・フローにアクティビティを追加する方法」の説明に従い、タスク・フローに2つのビュー・アクティビティ(マスター・ビュー用に1つ、ディテール・ビュー用に1つ)を追加します。
  3. タスク・フロー定義ファイルで、マスター・ビューからディテール・ビューに制御フロー・ケースを追加し、ディテール・ビューからマスター・ビューに戻る制御フロー・ケースを追加します。詳細は、「タスク・フローに制御フロー・ルールを追加する方法」を参照してください。
  4. マスター/ディテール・コンポーネントを保持する場合は2つのJSFページまたは2つのJSFフラグメントを作成します。

    ビュー・アクティビティのページまたはフラグメントは、タスク・フローの概要エディタのビュー・アクティビティをクリックして作成できます。

    ビュー・アクティビティにマップするページまたはフラグメントがすでにある場合は、タスク・フローの概要エディタでビュー・アクティビティを選択し、「プロパティ」ウィンドウに移動して、PageプロパティでJSFページまたはフラグメントを指定して、これを行うことができます。

  5. ディテール・コンポーネントは、「データ・コントロール」パネルから子コレクションをドラッグして、それを表またはフォームとしてJSFページまたはディテール・ビュー・アクティビティに対応するフラグメント上にドロップして作成します。詳細は、「「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別方法」を参照してください。

    フォームと表の作成方法の詳細は、「データ・コントロールのコレクションを使用した基本的なフォームの作成」および「基本表の作成」を参照してください。

  6. マスター・コンポーネントは、ステップ5でコレクションの親であるコレクションをドラッグして、それを表またはフォームとしてJSFページまたはマスター・ビュー・アクティビティに対応するフラグメント上にドロップして作成します。
  7. コマンド・ボタンまたはリンクを各ページに追加します。
  8. 各ボタンのaction属性で、他のページに移動するために使用される制御フロー・ケースを指定します。この値は対応する制御フロー・ケースのfrom-outcomeプロパティから取得できます。

たとえば、Summit ADFサンプル・アプリケーションのCustomers.jsffフラグメントには、OrdersFromCustomerコレクションから作成される表が含まれます。その表は、顧客注文のディテール・ビューとItemsFromOrderコレクションから作成される注文品目表のマスター・ビューの両方として機能し、 Orders.jsffにあります(「Order」タブに表示されます)。図34-7は、顧客のディテール・ビューとして注文表を示し、図34-8は、その表で選択される注文とその注文のディテールを示しています。OrdersFromCustomerコレクションは、Customers.jsffおよびOrders.jsffフラグメントの両方で使用されますが、マスター/ディテール調整を保持するために両方の場所で使用される必要はありません。ItemsFromOrderのイテレータ・バインディングでは、ページ・フラグメントでさえも、マスター/ディテール調整が維持されます。

図34-7 1ページ・フラグメントでのマスター・ビュー

図34-7の説明が続きます
「図34-7 1ページ・フラグメントでのマスター・ビュー」の説明

図34-8 1 個別のページ・フラグメントでのディテール・ビュー

図34-8の説明が続きます
「図34-8 1 個別のページ・フラグメントでのディテール・ビュー」の説明

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

ADF Faces treeコンポーネントを使用して、モデルドリブン・マスター/ディテール・データ関係を階層形式で表示できます。この場合、ツリーの親ノードはマスター・オブジェクトを示し、ツリーの子ノードはディテール・オブジェクトを示します。

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

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

図34-9に、Summit ADFサンプル・アプリケーションのCustomers.jsffフラグメントにあるツリーの例を示します。このツリーには、ルートおよびブランチの2つのノード・レベルが表示されます。ルート・ノードには、国が表示されます。ブランチ・ノードには、顧客が表示されます。

図34-9 データバインドされたADF Facesツリー

この図は周囲のテキストで説明しています

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

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

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

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

図34-9で示すように、Summit ADFサンプル・アプリケーションで顧客ツリーの作成を有効にするには、ビュー・オブジェクトCountryVOを最初に作成して、国のリストを戻します。もう1つのビュー・オブジェクトCustomerVOも作成して、顧客を戻します。また、マスター/ディテール関係を確立するために、CountryVOからCustomerVOにビュー・リンクが作成されます。

この場合、CustomerVOがビュー・オブジェクトOrdVOへのビュー・リンクを持ち、OrdVOItemVOへのビュー・リンクを持つため、第3レベルと第4レベルのノードも追加できます。

ツリーのブランチが再帰的な場合、自己参照型のビュー・リンクを伴う単一のビュー・オブジェクトをデータ・モデル・プロジェクトで定義する必要があります。たとえば、EmployeesViewで定義されたコレクションで、各ブランチのルート・ノードがManagerId属性で指定され、同じブランチの子ノードがManagerIdに関連する従業員(直属の部下とも呼ぶ)になります。自己参照型のビュー・リンクによって名前が付けられるリンク元とリンク先の両方のビュー・オブジェクトは、どちらもEmployeesViewとして定義されますが、わかりやすくするためにリンク先の名前がDirectReportsに変更されます。自己参照型のビュー・リンクの作成の詳細は、「エンティティ・ベースのビュー・オブジェクトに対する再帰的マスター/ディテール階層の作成方法」を参照してください。

ノート:

ビジネス・サービスがADFビジネス・コンポーネントに基づいている場合、マスター・ビュー・オブジェトのビュー・リンク・アクセッサ属性にプログラム的にアクセスし、現在のノード・レベルのブランチとして表示するディテール・オブジェクトを戻すことができます。ビュー・リンク・アクセッサの詳細は、「ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法」を参照してください。

始める前に:

マスター/ディテール表およびフォームの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ツリーを使用したマスター/ディテール・オブジェクトの表示」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

ツリーでのマスター/ディテール・オブジェクトを表示するには:

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

    図34-10に示す「ツリー・バインディングの編集」ダイアログが表示されます。バインディング・エディタを使用し、ツリーに表示する各レベルのルールを定義します。

    最初にダイアログが表示されたら、ドラッグしたコレクションが「ルート・データソース」ドロップダウン・リストに表示され、対応するビュー・オブジェクトが「ツリー・レベル・ルール」リストに表示されます。これは、マスター・データ・コレクションを表します。

    ヒント:

    「ルート・データ・ソース」リストに使用するデータ・コレクションが見つからない場合、「追加」ボタンをクリックします。「データ・ソースの追加」ダイアログで、データ・コントロールとイテレータ名を選択して新しいデータ・ソースを作成します。次に「ルールの追加」アイコンをクリックして、「ルールの追加」を選択し、マスター・ルールを追加します。

    図34-10 「ツリー・バインディングの編集」ダイアログ

    図34-10の説明が続きます
    「図34-10 「ツリー・バインディングの編集」ダイアログ」の説明
  3. 「ルールの追加」アイコンをクリックして、「ツリー・レベル・ルール」リストに追加するディテール・コレクションを選択します。

    図34-11に示すように、マスター・データソースの下にディテール・データソースが表示されます。

    図34-11 マスター/ディテール・ツリー・レベル・ルール

    図34-11の説明が続きます
    「図34-11 マスター/ディテール・ツリー・レベル・ルール」の説明

    再帰的なマスター/ディテール階層を持つツリーを作成する場合は、データソースとセルフ・アクセッサを指定したルールを定義するだけで済みます。再帰的なツリーには、単一のコレクションに基づいてルート・ノードが表示されるとともに、そのコレクションからデータを再帰的にフェッチするセルフ・アクセッサの属性から、子ノードが表示されます。再帰的なツリーは、ツリーのブランチを定義するためのルールが1つしか必要ないため、通常のマスター/ディテール・ツリーとは異なります。再帰的なデータソースは、図34-12に示すように、データソースの後にセルフ・アクセッサ名をカッコで囲んで指定した形で表示されます。

    ツリーに追加する追加ノード(または階層のさらに上位レベル)に対してこのステップを繰り返します。

    図34-12 再帰的なツリー・レベル・ルール

    図34-12の説明が続きます
    「図34-12 再帰的なツリー・レベル・ルール」の説明
  4. 「ツリー・レベル・ルール」リストでルールのいずれかを選択します。
  5. ダイアログの下部で、「属性の表示」リストに属性を移動することによって、ノードの表示に使用する属性を設定します。
  6. 残りの各ルールにステップ4から5を繰り返します。
  7. 「OK」をクリックします。

ADFデータバインド・ツリーの作成時の処理

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

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

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

次の例は、「データ・コントロール」パネルを使用してツリーを作成したときにJSFページで生成されるコードを示しています。このサンプル・ツリーには、国と顧客の2レベルのノードが表示されます。ルート・ノードを移入するために、Countriesコレクションが使用されています。

<af:tree value="#{bindings.Countries.treeModel}"
          var="node"
          selectionListener="#{bindings.Countries.treeModel.makeCurrent}"
          rowSelection="single" id="t1"
   <f:facet name="nodeStamp">
      <af:outputText value="#{node}" id="ot1"/>
   </f:facet>
</af:tree>

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

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

ADF Facesのtreeコンポーネントは、oracle.adf.view.faces.model.PathSetクラスのインスタンスを使用して、開いた状態のノードを表示します。このインスタンスは、コンポーネントのtreeState属性として格納されます。このインスタンスを使用して、階層での要素の開閉状態をプログラム的に管理できます。PathSetインスタンスに含まれるすべての要素は、開いた状態とみなされます。その他のすべての要素は閉じた状態です。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』プログラムを使用したノードの開閉に関する必知事項に関する項を参照してください。

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

次の例は、Summit ADFサンプル・アプリケーションのCountries ADFデータバインド・ツリーに関するページ定義ファイルで定義されるバインディング・オブジェクトを示しています。

<executables>
...
      <iterator Binds="Countries" RangeSize="25"
                DataControl="BackOfficeAppModuleDataControl"
                id="CountriesIterator"/>
</executables>
<bindings>
...
   <tree IterBinding="CountriesIterator" id="Countries">
      <nodeDefinition DefName="oracle.summit.model.views.CountryVO"
                      Name="Countries0">
         <AttrNames>
            <Item Value="Country"/>
         </AttrNames>
         <Accessors>
            <Item Value="CustomerVO"/>
         </Accessors>
      </nodeDefinition>
      <nodeDefinition DefName="oracle.summit.model.views.CustomerVO"
                      Name="Countries1"
                      TargetIterator="${bindings.CustomersIterator}">
         <AttrNames>
            <Item Value="Id"/>
            <Item Value="Name"/>
         </AttrNames>
      </nodeDefinition>
   </tree>
</bindings>

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

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

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

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

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

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

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

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

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

実行時に行われる処理: ADFデータバインド・ツリーの表示方法

treeコンポーネントは、org.apache.myfaces.trinidad.model.TreeModelを使用してデータにアクセスします。このクラスは、ADF Facesのtableコンポーネントがデータへのアクセスに使用するCollectionModelを拡張します。TreeModelクラスの詳細は、ADF Faces Javadocを参照してください。

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

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

ページの他の部分をツリーの選択と同期する方法

ディテール・ビューをマスター・ビューと同期させるほか、ページの他の部分をツリーの選択と同期させることができます。各ノード定義(ルール)に対して、オプションのTargetIteratorプロパティを指定して、それを現在のバインディング・コンテナのイテレータ・バインディングのEL式に設定できます。その式は、ユーザーがツリーで行を選択すると、実行時に評価されます。イテレータ・バインディングのビュー行キーの属性は、ツリー用にnodeDefinitionタイプの行が取得されるイテレータのビュー行キーと(順序、数およびデータ型が)一致します。実行時に、ツリー・コントロールはselectionChangedイベントを受け取ると、ツリーのレベルごとにキーのリストを渡します。これらのキーは選択されたノードを一意に識別します。

ノート:

ページ定義エディタでノード・バインディングを開くことで、ページのnodeDefinition要素を表示できます。これらは、ツリー・バインディング・ダイアログで構成できる同じツリー・バインディング・ルールです。

ツリー・バインディングは、ツリーの最上位から始まります。Currently Selected Tree Node Keysリストにキーが存在するツリー・レベルごとに、そのnodeDefinitionについて構成されているTargetIteratorプロパティがある場合、ツリー・バインディングは選択されたターゲット・イテレータに対してsetCurrentRowWithKey()操作を実行します。Currently Selected Tree Node Keysリストの適切なレベルからキーを使用します。

たとえば、Summit ADFサンプル・アプリケーションには、第1ノードで顧客を表示し、第2ノードで顧客を表示するツリーが含まれています。ユーザーがツリーで顧客を選択すると、図34-13で示すように、顧客情報を表示するフォームがページの「Summit Customer Management」パネルに表示されます。この機能は、Countriesデータ・コントロール・オブジェクト、Customersオブジェクトから作成されるフォームおよびOrdersFromCustomerオブジェクトから作成されるディテール表(「データ・コントロール」パネルのCustomersの下にネストされます)から作成されたツリーで構成されます。

図34-13 ツリーの選択と同期されるフォーム

図34-13の説明が続きます
「図34-13 ツリーの選択と同期されるフォーム」の説明

始める前に:

ツリーの作成で使用可能な各オプションを理解しておくと役立ちます。詳細は、「ツリーを使用したマスター/ディテール・オブジェクトの表示」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

ページの他の部分をツリーの選択と同期するには:

  1. 「データ・コントロール」パネルから、レコードがツリーのユーザー選択に基づいて表示されるディテール・コレクションをドラッグして、フォームまたは別のデータバインドされたコンポーネントとしてそれをドロップします。
  2. 「データ・コントロール」パネルから、ドロップした親ディテール・コレクションをドラッグして、「作成」「ツリー」「ADFツリー」(または「ADFツリー表」)の順に選択します。
  3. 「ツリー・バインディングの編集」ダイアログで、「ツリーでのマスター/ディテール・オブジェクトの表示方法」で説明するように、ツリー階層のレベルのすべてに対してツリー・バインディング・ルールを構成し、ダイアログを開いたままにします。
  4. ステップ1で使用される同じコレクションに対応するディテール・ツリーレベル・ルールを選択します。
  5. 「ターゲット・データソース」ノードを開いて、「ELピッカー」ボタンをクリックします。
  6. 「変数」ダイアログで、「ADFバインディング」「バインディング」の順に開き、ステップ1で作成したコンポーネントのイテレータ・バインディングを選択します。

    「式」テキスト・エリアに式が表示されます。式は${bindings.CustomersIterator}のようになります。この式は、ユーザーがディテール・ノードをクリックするときに、ターゲット・イテレータを設定するために使用されます。

  7. 「OK」をクリックして「変数」ダイアログを終了し、「OK」をクリックして「ツリー・バインディングの編集」ダイアログを終了します。

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

ADF Faces treeTableコンポーネントを使用して、マスター/ディテール・データ関係を階層形式で表示します。このコンポーネントは、表に似たUIで階層を表示するもので、treeコンポーネントよりも複雑です。

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

たとえば、各ルート・ノードが個々の国を表す国および顧客のノード・レベルを表示するツリー表を作成できます。各ルート・ノードが分岐して、その国の顧客が表示されます。ツリーの場合と同様、このようなツリー表を作成するには、階層内のコレクション間でマスター/ディテール関係を持つ必要があります。

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

「プロパティ」ウィンドウで、次のtreeTableコンポーネント・プロパティを編集できます。

  • レンジ・ナビゲーション: ユーザーは、「前へ」および「次へ」のナビゲーション・ボタンをクリックして、ルート・ノードをスクロールできます。

  • リスト・ナビゲーション: 「前へ」ボタンと「次へ」ボタンの間にあるリスト・ナビゲーションにより、ユーザーは、選択リストを使用してデータ・コレクション内の特定のルート・ノードに移動できます。

  • ノードを開閉するためのメカニズム: ユーザーは、それぞれのノードを個別に開閉するか、「すべて開く」または「すべて閉じる」のコマンド・リンクを使用できます。デフォルトでは、個々のノードを開閉するためのアイコンは、プラス記号またはマイナス記号が表示された矢印です。カスタム・アイコンを選択して使用することもできます。

  • フォーカス・メカニズム: ユーザーがノードの横(左端の列)のフォーカス・アイコンをクリックすると、ページが再表示され、ノードとそのブランチのみが表示されます。親ノードに戻るためのナビゲーション・リンクも表示されます。

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

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

データバインド・ツリー表の作成時の処理

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

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

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

次の例は、「データ・コントロール」パネルを使用してツリー表を作成したときにJSFページで生成されるコードを示しています。このサンプル・ツリーには、国と顧客の2レベルのノードが表示されます。

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

<af:treeTable value="#{bindings.Countries.treeModel}" var="node"
              selectionListener="#{bindings.Countries.treeModel.makeCurrent}"
              rowSelection="single"
              id="tt1">
    <f:facet name="nodeStamp">
        <af:column id="c1">
            <af:outputText value="#{node}" id="ot1"/>
        </af:column>
    </f:facet>
    <f:facet name="pathStamp">
        <af:outputText value="#{node}" id="ot2"/>
    </f:facet>
</af:treeTable>

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

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

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

実行時に行われる処理: ツリー表のイベント

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

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

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

ADF Faces listViewコンポーネントを使用して、マスター/ディテール・コレクション・モデルに基づいてアイテムのリストを表示します。listViewコンポーネントは、モデルを使用して、基になるリストのデータにアクセスします。

ADF FacesのlistViewコンポーネントを使用すると、マスター/ディテール・コレクションの階層を単純なツリー表に表示できます。各オブジェクトの属性は、グループまたは単一行および単一列内のグリッドに表示されます。

たとえば、図34-14に示すように、注文を表示して、それらを顧客別にグループ化するlistViewを作成できます。

図34-14 listViewコンポーネントがあるマスター/ディテール

図34-14の説明が続きます
「図34-14 listViewコンポーネントがあるマスター/ディテール」の説明

データバインドされたリスト・ビューの使用の詳細は、「コレクションのリスト・ビューの作成」を参照してください。

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

「リスト・ビューの作成」ウィザードを使用して、リストを作成します。ウィザードでは、panelGroupLayoutまたはpanelGridLayoutコンポーネントを選択して、リスト・アイテムのコンポーネントを配置できます。

始める前に:

マスター/ディテール・リスト・ビューの作成で使用可能な各オプションを理解しておくと役立つことがあります。詳細は、「リスト・ビューを使用したマスター/ディテール・オブジェクトの表示」を参照してください。

また、マスター/ディテール表およびフォームに使用可能な追加機能についても理解しておくと役立ちます。詳細は、「マスター/ディテール表、フォームおよびツリーの追加機能」を参照してください。

次のタスクを完了する必要があります。

リスト・ビューを作成するには:

  1. 「「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別方法」の説明に従って、「データ・コントロール」パネルでディテール・オブジェクトを特定します。
  2. 「データ・コントロール」パネルから、詳細コレクションをページにドラッグし、「表/リスト・ビュー」→「ADFリスト・ビュー」を選択します。
  3. 「リスト・ビューの作成」ウィザードの最初のページで、レイアウト・コンポーネントを選択し、親コレクションを使用してヘッダーを含めるを選択します。
  4. ウィザードの最初のページで「パネル・グリッド・レイアウト」オプションを選択した場合は、ウィザードの次の2ページを使用して、グリッド・セルのサイズと配置を整理します。

    これらのウィザード・ページの使用の詳細は、[F1]キーを押すか、「ヘルプ」をクリックします。

  5. 「リスト・アイテム・データ」ページで、バインディングを設定し、対応するコンポーネントでfor eachを使用するように設定することにより、詳細データについて表示するフィールドを決定します。
  6. 同じページで、「グループ・ヘッダー・データ」タブをクリックし、マスター・データのバインディングとコンポーネントを設定します。
  7. 「終了」をクリックします。
  8. 「プロパティ」ウィンドウを使用して、レイアウト・コンポーネントをさらに構成します。

    panelGridLayoutコンポーネントの使用の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』グリッドでのコンテンツの配置に関する項を参照してください。panelGroupLayoutコンポーネントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』関連アイテムのグループ化に関する項を参照してください。

マスター/ディテール・リスト・ビューの作成時の処理

ウィザードを使用してグループ・ヘッダー付きのlistViewコンポーネントを作成する場合、JDeveloperでは、listViewlistItemおよびレイアウト・コンポーネントが作成および構成されます。listViewには、詳細アイテムのlistItemと、グループ・ヘッダー・スタンプのfacetが含まれます。グループ・ヘッダー・スタンプには、マスター・アイテムのlistItemが含まれます。

バインディングは、表の場合と同じです。listViewコンポーネントは、「データ・コントロール」パネルから削除されたコレクションの親にバインドされています。このコンポーネントのvar属性の値は、表の場合と同じ方法で、データにアクセスするためにoutputFormattedコンポーネントによって使用されます。コレクションのページ定義コードとJSPコードの詳細は、「表の作成時の処理」を参照してください。

次の例は、図34-14に示した単純な表のページ・コードを示しています。

<af:form id="f1">
  <af:panelGridLayout id="pgl1">
    <af:gridRow height="100%" id="gr1">
      <af:gridCell width="100%" halign="stretch" valign="stretch" id="gc1">
        <!-- Content -->
        <af:listView value="#{bindings.Customers.treeModel}" var="item"
                     emptyText="#{bindings.Customers.viewable ? 'No data to
                                  display.' : 'Access Denied.'}"
                     fetchSize="#{bindings.Customers.rangeSize}" id="lv1">
          <af:listItem id="li1">
            <af:panelGroupLayout layout="horizontal" id="pgl2">
              <f:facet name="separator">
                <af:spacer width="10" id="s1"/>
              </f:facet>
              <af:outputFormatted 
                    value="#{item.bindings.DateOrdered.inputValue}" id="of1">
                <af:convertDateTime
                    pattern="#{bindings.Customers.hints.DateOrdered.format}"/>
              </af:outputFormatted>
              <af:outputFormatted value="#{item.bindings.Total.inputValue}"
                                  id="of2">
                <af:convertNumber groupingUsed="false"
                           pattern="#{bindings.Customers.hints.Total.format}"/>
              </af:outputFormatted>
            </af:panelGroupLayout>
          </af:listItem>
          <f:facet name="groupHeaderStamp">
            <af:listItem id="li2" inlineStyle="font-size:medium;">
              <af:panelGroupLayout layout="horizontal" id="pgl3">
                <f:facet name="separator">
                  <af:spacer width="10" id="s2"/>
                </f:facet>
                <af:outputFormatted value="#{item.bindings.Name.inputValue}"
                                    id="of3"/>
              </af:panelGroupLayout>
            </af:listItem>
          </f:facet>
        </af:listView>
      </af:gridCell>
    </af:gridRow>
  </af:panelGridLayout>
</af:form>

ツリーおよびツリー表での選択イベントについて

ツリーのノードと表の行のどちらを選択するかにかかわらず、サーバーがイベントを処理し、マネージドBeanで定義された選択リスナーを実行することを示すselectionEventをサーバーがクライアントから受信すると、選択リスナーが起動されます。

アプリケーションでなんらかの処理を行うために、ツリーまたはツリー表で選択されているノードを判別する必要が生じることがあります。たとえば、アプリケーションで、ユーザーによって選択される製品カテゴリ・ノードに一致する製品を決定するための処理が必要になる場合があります。

ユーザーがツリーのノード(または表の行)を選択するたびに、コンポーネントは選択イベントを起動します。selectionEventイベントは、選択解除された行と選択された行をレポートします。現在の選択内容、つまり選択済の行は、RowKeySetオブジェクトによって管理され、このオブジェクトは、行の関連キーをキー・セットに追加、またはキー・セットから削除することで、現在選択されているすべてのノードを追跡します。ユーザーが新しいノードを選択したときに、ツリーまたは表が単一選択用に構成されている場合、それまで選択されていたキーは破棄され、新たに選択されたキーが追加されます。ツリーまたは表が複数選択用に構成されている場合は、新たに選択されたキーがセットに追加されます。それまで選択されていたキーを破棄するかどうかは、ノードの選択方法によって決まります。たとえば、ユーザーが[Ctrl]キーを押した場合、新たに選択されたノードは現在のセットに追加されます。

選択イベントの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』表の選択された行でのアクションの実行に関する必知事項に関する項を参照してください。

ノート:

選択したノードおよびページ上の他のUIコンポーネント間の行の現在位置を同期させる必要がある場合、各ノード定義に対してTargetIteratorプロパティを使用して宣言的に実行できます。詳細は、「ページの他の部分をツリーの選択と同期する方法」を参照してください。

ツリーまたは表内で選択項目を変更すると、ページ内のリージョン間の通信を実行するコンテキスト・イベントもトリガーされます。「コンテキスト・イベントの使用」を参照してください。