ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発
12c (12.1.2)
E48099-02
  目次へ移動
目次

前
 
次
 

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

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

この章には次の項が含まれます:

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

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

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

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

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

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

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

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

顧客フォームと注文ディテール表

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

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

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

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

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

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

第1レベルのノードは国で、第2レベルのノードは顧客です

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

図31-3 ツリー表

ツリー表で国別にグループ化された顧客

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

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

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

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

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

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

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

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

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

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

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

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

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

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


注意:

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


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

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

ビュー・リンクを表示するアプリケーション・モジュール概要エディタ

注意:

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


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

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

始める前に:

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

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

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

  • 13.2項「アプリケーション・モジュールの作成と変更」の手順に従い、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。または『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の手順に従い、ビジネス・サービスのデータ・コントロールを作成します。

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

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

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

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


注意:

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


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

Ordersコレクション内でネストされたOrdersForCustomerコレクション

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

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

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

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

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

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

顧客フォームと顧客注文表

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


注意:

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


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

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

始める前に:

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

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

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

  • 13.2項「アプリケーション・モジュールの作成と変更」の手順に従い、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。または『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の手順に従い、ビジネス・サービスのデータ・コントロールを作成します。

  • 26.3項「Webページの作成」の説明に従って、JSFページを作成します。

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

  1. 31.2.1項「「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別方法」の説明に従って、「データ・コントロール」パネルでディテール・オブジェクトを特定します。

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

  3. ポップアップ・メニューの「マスター/ディテール」サブメニューから、次のコンポーネントのいずれかを選択します。

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

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

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

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

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

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

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

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

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

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

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

始める前に:

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

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

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

  • 6.2.2項「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」の手順に従い、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。または別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従いそのビジネス・サービスのデータ・コントロールを作成します。

  • 26.3項「Webページの作成」の説明に従って、JSFページを作成します。

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

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

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

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

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

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

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

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

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

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


ヒント:

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


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

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

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

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

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

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

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

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

<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要素が使用されます。


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

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

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

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

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

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

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

始める前に:

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

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

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

  • 6.2.2項「ビュー・オブジェクトのみに基づくマスター/ディテール階層の作成方法」の手順に従い、必要なマスター/ディテール階層を確立するビュー・オブジェクトとビュー・リンクのインスタンスを含むアプリケーション・モジュールを作成します。または別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従いそのビジネス・サービスのデータ・コントロールを作成します。

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

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

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

  2. 20.3.1項「タスク・フローにアクティビティを追加する方法」に従って、タスク・フローに2つのビュー・アクティビティ(マスター・ビュー用に1つ、ディテール・ビュー用に1つ)を追加します。

  3. タスク・フロー定義ファイルで、マスター・ビューからディテール・ビューに制御フロー・ケースを追加し、ディテール・ビューからマスター・ビューに戻る制御フロー・ケースを追加します。詳細は、20.4.1項「タスク・フローに制御フロー・ルールを追加する方法」を参照してください。

  4. マスター/ディテール・コンポーネントを保持する場合は2つのJSFページまたは2つのJSFフラグメントを作成します。

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

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

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

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

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

  7. コマンド・ボタンまたはリンクを各ページに追加します。

  8. 各ボタンのaction属性で、他のページに移動するために使用される制御フロー・ケースを指定します。この値は対応する制御フロー・ケースのfrom-outcomeプロパティから取得できます。

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

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

顧客のマスター・ビューのスクリーンショット

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

顧客注文のディテール・ビューのスクリーンショット

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

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

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

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

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

ルートとしてのツリー国ノードとリーフとしての顧客

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

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

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

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

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

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

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


注意:

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


始める前に:

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

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

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

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

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

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

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

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


    ヒント:

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


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

    CustomerVOおよびOrdVOのノードの表示
  3. 「ルールの追加」アイコンをクリックして、「ツリー・レベル・ルール」リストに追加するディテール・コレクションを選択します。

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

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

    国と顧客のルール

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

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

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

    再帰的な従業員ツリー
  4. 「ツリー・レベル・ルール」リストでルールのいずれかを選択します。

  5. ダイアログの下部で、「属性の表示」リストに属性を移動することによって、ノードの表示に使用する属性を設定します。

  6. 残りの各ルールに手順4から5を繰り返します。

  7. 「OK」をクリックします。

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

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

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

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

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

例31-2 データバインド・ツリー用のJSFページ内のコード

<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ユーザー・インタフェースの開発』のプログラムを使用したノードの開閉に関する必知事項を参照してください。

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

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

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

<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要素は、先行するノードのサブノードを定義します。

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

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

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

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

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

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

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


注意:

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


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

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

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

ツリーで選択され、フォームで表示されるSimms Athletics

始める前に:

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

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

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

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

  1. 「データ・コントロール」パネルから、レコードがツリーのユーザー選択に基づいて表示されるディテール・コレクションをドラッグして、フォームまたは別のデータバインドされたコンポーネントとしてそれをドロップします。

  2. 「データ・コントロール」パネルから、ドロップした親ディテール・コレクションをドラッグして、「作成」「ツリー」「ADFツリー」(または「ADFツリー表」)の順に選択します。

  3. 「ツリー・バインディングの編集」ダイアログで、31.4.1項「ツリーでのマスター/ディテール・オブジェクトの表示方法」で説明するように、ツリー階層のレベルのすべてに対してツリー・バインディング・ルールを構成し、ダイアログを開いたままにします。

  4. 手順1で使用される同じコレクションに対応するディテール・ツリーレベル・ルールを選択します。

  5. 「ターゲット・データソース」ノードを開いて、「ELピッカー」ボタンをクリックします。

  6. 「変数」ダイアログで、「ADFバインディング」「バインディング」の順に開き、手順1で作成したコンポーネントのイテレータ・バインディングを選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<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ファセットは、ユーザーがディテール・ノードにフォーカスした後で親ノードに戻れるように、表の上に列およびパスのリンクをレンダリングします。

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

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

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

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イベントが送信されます。このイベントのisExpandedメソッドは、ユーザーの操作に基づいてすべてのノードを開くか閉じるかを判断します。その後、現在フォーカスしているルート・ノードの子ノードが、開くか閉じます。大規模なツリーの場合は、「すべて開く」コマンドを使用しても、直下の子より下にあるノードは開きません。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クラスを参照してください。

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

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

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

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


注意:

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


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