ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド
11g リリース2(11.1.2.3.0)
B69399-02
  目次へ移動
目次

前
 
次
 

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

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

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

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

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

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

ADFデータバインディングを使用してページにマスター/ディテール・データを表示するには、マスター/ディテール調整をサポートしているデータ・モデル・ビュー・リンク・インスタンスのみを使用します。ADFモデル・レイヤーとADF Faces UIコンポーネントを組み合せてADF Business Componentsを使用した場合、データ・モデルは自動的に更新され、ビジネス・オブジェクトの行セットに対する変更が反映されます。

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

マスター/ディテールの表、フォーム、ツリーおよびツリー表は、階層データを表示するための優れた手段となります。

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

マスター/ディテール調整を有効にするには、マスター・ビュー・オブジェクトとディテール・ビュー・オブジェクトの両インスタンスをアプリケーション・モジュールのデータ・モデルに追加する必要があります。たとえば、図29-1に示すように、Fusion Order DemoアプリケーションにはProductId属性に基づくProductsVOビュー・オブジェクトからWarehouseStockLevelsVOビュー・オブジェクトへのビュー・リンクがあり、どちらもアプリケーション・モジュールのデータ・モデルに含まれています。マスター・ビュー・オブジェクト・インスタンスの現在の行を変更すると、ディテール・ビュー・オブジェクト・インスタンスの行セットがリフレッシュされて現在のマスターの詳細が含まれるようになります。

図29-1 ProductsおよびWarehouseStockLevelsの両ビュー・オブジェクト間のビュー・リンク

この図は、「ビュー・リンクの作成」ダイアログを示しています。

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

図29-2 ディテール表

この図は、マスター・フォーム・ディテール表を示しています。

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


注意:

Jdeveloperで提供されるマスター/ディテールUIコンポーネントでは必要な機能を発揮できない場合があります。たとえば、マスター/ディテールUIコンポーネントを使用するかわりに、コンポーネントをプログラム的にバインドすることが必要な場合があります。

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

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


図29-3は、ディテール表を伴うマスター・フォームの例を示します。ユーザーがコマンド・ボタンを使用して部署間を移動すると、その部署に該当する従業員が表内に一覧表示されます。

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

マスター・フォームとディテール表

図29-4は、複数のノード・レベルからなるツリーを示します。ツリーを使用して、階層情報を表示できます。この例では、ツリーを使用してファイル・システム内のフォルダおよびアイテムを表示しています。ユーザーは各ノードを開いて、ツリーのブランチを下位に横断し、リーフ・レベルのアイテムにアクセスできます。

図29-4 複数レベルのツリー

ツリー

図29-5では、同じファイル構造を、ツリーではなくツリー表を使用して表示しています。ツリー表では、階層ノード・レベルのツリーだけでなく、各ノードに対する列情報も表示できます。また、要素を開いたり閉じるだけでなく、サブツリーに焦点を当てることもできます。

図29-5 ツリー表

ツリー表

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

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

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

マスター/ディテール表、フォーム、ツリーおよびツリー表を使用するには、モデル内でマスター/ディテール関係を確立する必要があります。マスター/ディテール関係が存在する場合は、「データ・コントロール」パネルに反映されます。

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

「データ・コントロール」パネルを使用して、マスター/ディテール・データを表示するページを宣言的に 作成できます。「データ・コントロール」パネルでは、マスター/ディテール関係にあるオブジェクトが階層に表示されますが、これは、アプリケーション・モジュールのデータ・モデルで定義した、ディテール・オブジェクトがマスター・オブジェクトの子となる階層を反映するものです。データ・モデルへのマスター/ディテール・オブジェクトの追加に関する詳細は、5.6.4項「データ・モデルでアクティブなマスター/ディテール調整を有効化する方法」を参照してください。

マスター/ディテール・オブジェクトをフォーム・オブジェクトまたは表オブジェクトとして表示するには、「データ・コントロール」パネルからディテール・オブジェクトをドラッグし、ページにドロップします。マスター・オブジェクトは、ページ上に自動的に作成されます。

図29-6は、Fusion Order Demoアプリケーションの「データ・コントロール」パネルに表示された2つのマスター/ディテール関連コレクションを示しています。ProductsコレクションはProductsVOビュー・オブジェクトのインスタンスであり、Productsコレクションの子として表示されるWarehouseStockLevelsコレクションはWarehouseStockLevelsVOビュー・オブジェクトのインスタンスです。


注意:

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


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

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

「データ・コントロール」パネル上のマスター/ディテール階層には、図29-7に示す、アプリケーション・モジュールのデータ・モデルに定義されている階層が反映されます。この階層は、ProductsVOビュー・オブジェクトからWarehouseStockLevelsVOビュー・オブジェクトへのビュー・リンクを作成することで確立されています。次に、図29-7に示すように、作成されるディテール・ビュー・オブジェクト(WarehouseStockLevelsVO via ProductsToWarehouseStockLevels)のインスタンスが、アプリケーション・モジュールのデータ・モデルに追加されます。

図29-7 アプリケーション・モジュールのデータ・モデルで定義されたマスター/ディテール階層

この図は、マスター/ディテール階層を示しています。

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


ヒント:

デフォルトでは、ビュー・リンクの作成ウィザードを使用してビュー・リンクを定義する場合、ソース・ビュー・オブジェクトがマスターになり、リンク先ビュー・オブジェクトがディテールになります。一方、リンク元とリンク先の両方のビュー・オブジェクトでアクセッサを生成することを選択した場合、マスター/ディテール関係は双方向になります。双方向のビュー・リンクによって確立されたマスター/ディテール・ビュー・オブジェクトの両セットをアプリケーション・モジュールのデータ・モデルに追加すると、ビュー・オブジェクトの両セットのインスタンスは「データ・コントロール」パネルで独立して表示されます。


「データ・コントロール」パネルに表示されるアイコンの詳細は、13.4.1項「「データ・コントロール」パネルの使用方法」を参照してください。

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

「データ・コントロール」パネルを使用すると、マスター/ディテール参照ページを単一の宣言的アクションで作成できます。そのために必要な操作は、ディテール・コレクションをページにドロップして、使用するウィジェットのタイプを選択することのみです。

「データ・コントロール」パネルで使用できる事前作成済のマスター/ディテール・ウィジェットには、コレクション内のデータ・オブジェクトをエンド・ユーザーがスクロールできるレンジ・ナビゲーションが含まれます。テキスト・フィールドまたは列をページから削除すると、不要な属性を削除できます。

図29-8に示す事前作成済のマスター/ディテール・ウィジェットの例では、ページ上部のフォームに商品情報が表示され、ページ下部の表に在庫レベルが表示されています。ユーザーが「次へ」ボタンをクリックし、ページ上部のマスター・データのレコードをスクロールすると、関連するディテール・データが自動的にページに表示されます。

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

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

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

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

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

作業を始める前に、次のようにします。

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

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

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

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

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


    注意:

    編集可能なマスター/ディテール・フォームを作成する場合は、マスター・オブジェクトとディテール・オブジェクトを別々にページにドロップします。


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

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

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

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

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

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

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

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

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

    デフォルトのフォームまたは表を変更する場合は、26.3項「基本的なフォームの作成」または27.2項「基本表の作成」を参照してください。

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

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

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

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

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

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


ヒント:

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


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

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

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

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

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

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

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

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

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

<executables>
    <iterator Binds="Products" RangeSize="25"
              DataControl="StoreServiceAMDataControl" id="ProductsIterator"/>
    <iterator Binds="WarehouseStockLevels" RangeSize="25"
              DataControl="StoreServiceAMDataControl"
              id="WarehouseStockLevelsIterator"/>
</executables>

<bindings>
    <methodAction id="findHelpTextById" RequiresUpdateModel="true"
                  Action="invokeMethod" MethodName="findHelpTextById"
                  IsViewObjectMethod="false"
                  DataControl="LookupServiceAMDataControl"
                  InstanceName="LookupServiceAMDataControl.dataProvider"
                  ReturnName="LookupServiceAMDataControl.methodResults.
                      findHelpTextById_LookupServiceAMDataControl_
                      dataProvider_findHelpTextById_result">
                  <NamedData NDName="helpId" NDType="java.lang.Long"
                       NDOption="2"/>
    </methodAction>
    <tree IterBinding="ProductsIterator" id="Products">
      <nodeDefinition DefName="oracle.fodemo.storefront.store.queries.ProductsVO">
        <AttrNames>
          <Item Value="ProductId"/>
          <Item Value="SupplierId"/>
          <Item Value="CategoryId"/>
          <Item Value="ProductName"/>
          ...   
          <Item Value="CostPrice"/>
          <Item Value="DragId"/>
        </AttrNames>
      </nodeDefinition>
    </tree>
    <tree IterBinding="WarehouseStockLevelsIterator" id="WarehouseStockLevels">
      <nodeDefinition DefName="oracle.fodemo.storefront.store.
           queries.WarehouseStockLevelsVO">
        <AttrNames>
          <Item Value="ProductId"/>
          <Item Value="WarehouseId"/>
          ...
          <Item Value="ShippingClassCode"/>
        </AttrNames>
      </nodeDefinition>
    </tree>
</bindings>

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

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

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

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

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

29.3.4 別々のページへのマスター/ディテール・ウィジェットの表示について

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

たとえば、Fusion Order Demoアプリケーションのホームページには、製品表および製品の詳細が表示されます。このページに製品表のみを表示することも可能です。「詳細」というボタンを含めることができます。ユーザーが「詳細」ボタンをクリックすると新しいページが表示され、関連するすべての詳細がリストに表示されます。ユーザーは、リストのページのボタンを使用して、サービス・リクエスト・ページに戻ることができます。

マスター/ディテール・オブジェクトを別々のページに表示するには、マスター・オブジェクト用として1ページ、ディテール・オブジェクト用として1ページの、計2ページを作成します。その際には、「データ・コントロール」パネルから使用できる、個々の表またはフォームを使用します。ディテール・オブジェクト・イテレータは、マスター・データとディテール・データの同期化を管理することを忘れないでください。ディテール・データを表示するページを作成する際には、必ず「データ・コントロール」パネルから適切なディテール・オブジェクトをドラッグしてください。詳細は、第29.2.1項「「データ・コントロール」パネルでのマスター/ディテール・オブジェクトの識別」を参照してください。

ページ・ナビゲーションを処理するには、ADFタスク・フローを作成し、マスター・ページ用として1つ、ディテール・ページ用として1つの、計2つのビュー・アクティビティを追加します。(ビュー・アクティビティと既存のJSFページの関連付けの詳細は、18.2項「タスク・フローの作成」を参照してください)。コマンド・ボタンまたはリンクを各ページに追加するか、「データ・コントロール」パネルを使用してフォームまたは表を作成するときに使用可能なデフォルトの「発行」ボタンを使用します。各ボタンについて、action属性内で、ナビゲーション・ルールの結果値を指定する必要があります。task-flow-defintion.xmlファイルで、マスター・データ・ページからディテール・データ・ページへのナビゲーション・ルール、およびディテール・データ・ページからマスター・データ・ページに戻るための別のルールを追加します。ナビゲーション・ルール内のfrom-outcomeの値は、ボタンのaction属性で指定された結果値と一致する必要があります。ページ間ナビゲーションの追加に関する詳細は、18.2項「タスク・フローの作成」を参照してください。

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

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

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

図29-9に、Fusion Order Demoアプリケーションのhome.jspxページに含まれるツリーの例を示します。このツリーには、ルートおよびブランチの2つのノード・レベルが表示されます。ルート・ノードは「Media」、「Office」および「Electronics」などの親製品カテゴリを表示します。ブランチ・ノードには、「Office」親カテゴリの下の「Hardware」、「Supplies」、「Software」のような、各親カテゴリの下のサブカテゴリが表示されます。

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

この図は、データバインドされたADF Facesツリーを示しています。

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

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

図29-9に示す「参照」ツリーをFusion Order Demoホームページに作成するには、ビュー・オブジェクトParentProductCategoriesを作成して親カテゴリのリストを戻します。もう1つのビュー・オブジェクトProductCategoriesも作成して、製品のサブカテゴリを戻します。また、ParentProductCategoriesビュー・オブジェクトからProductCategoriesビュー・オブジェクトへのビュー・リンクを作成し、マスター/ディテール関係を確立しています。

各サブカテゴリの下の製品のリストなどの第3レベルのノードを追加するには、ProductCategoriesオブジェクトからProductsビュー・オブジェクトへのビュー・リンクが必要です。ビュー・リンクの作成の詳細は、5.6.6項「ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法」を参照してください。

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

作業を始める前に、次のようにします。

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

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

データ・モデル・オブジェクト内にマスター/ディテール・ビュー・オブジェクトを作成し、ツリー・コンポーネントに対する行セットのアクセス・パフォーマンスを最適化します。最適化フラグ「ビュー・リンク・アクセッサ行セットの保存」の設定の詳細は、5.6.6.3項「マスター/ディテール・データを表示するためのビュー・リンク・アクセッサのアクセスの最適化」を参照してください。

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

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

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

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

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

    「ツリー・バインディングの編集」ダイアログを示しています。
  3. 「ルート・データソース」ドロップ・ダウン・リストで、ルート・ノード・レベルを移入するデータ・コレクションを選択します。これがマスター・データ・コレクションとなります。デフォルトでは、これはツリーを作成するために「データ・コントロール」パネルからドラッグしたものと同じコレクション(マスター・コレクション)です。


    ヒント:

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


  4. +アイコンをクリックし、選択したルート・データソースを「ツリー・レベル・ルール」リストに追加します。

  5. 「ツリー・レベル・ルール」リストで追加したデータソースを選択します。

  6. 「アクセッサ」ドロップダウン・リストで、ビュー・リンク・アクセッサ属性を選択します。

    リストには、選択したマスター・コレクションのディテール・コレクションを戻すアクセッサ属性のみが表示されます。たとえば、ParentProductCategoriesノード・レベルを定義する場合に各親カテゴリの下のすべてのサブカテゴリを表示するディテール・レベルを追加するには、ProductCategoriesコレクションを戻すアクセッサ属性を選択します。

    「<none>」を選択した場合は、ノードが開かずディテール・コレクションは表示されないため、ブランチは分岐しません。

    データ・コレクションを戻すビュー・リンク・アクセッサ属性は、ビュー・リンクの作成時に生成されます。「アクセッサ」フィールドには、「ツリー・レベル・ルール」リストで選択したマスター・コレクションのディテール・コレクションを戻すアクセッサ属性がすべて表示されます。ビュー・オブジェクト、ビュー・リンクおよびビュー・リンク・アクセッサの詳細は、5.6.6項「ビュー・リンク・アクセッサを使用したディテール・コレクションのアクセス方法」を参照してください。

  7. 「使用可能な属性」リストで属性を選択し、「属性の表示」リストに移動します。

    この属性はマスター・レベルのノードの表示に使用されます。たとえば、親製品カテゴリ・レベルでは、Categories属性を選択します。

    終了すると、「ツリー・バインディング・エディタ」には図29-10のような値が表示されます。

    マスター・レベルの規則を定義した後、次にツリー内のマスター・レベルの下に表示されるディテール・レベルに対する2つ目の規則を定義する必要があります。

    たとえば、図29-9に示したツリーの例の場合、「ツリー・バインディング・エディタ」に追加された最初の規則により、親カテゴリ・ノード(「Media」、「Office」および「Electronics」)が移入されます。ディテール・レベルのルールでは、商品カテゴリ・ノード(たとえば、親カテゴリ「Media」の下の「Hardware」、「Supplies」および「Software」など)が移入されます。 '

  8. 2つ目のルールを追加するには、「ツリー・レベル・ルール」リストの上の「追加」アイコンをクリックします。

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

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

    マスター/ディテール・ツリー・ルールを示します。

    たとえば、マスターのルート・データソースとしてProductsを指定すると、「ツリー・レベル・ルール」リストの下にWarehouseStockLevelsが自動的に表示されます(これは、2つのデータソースがマスター/ディテール関係にあるためです)。

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

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

    再帰的なツリー・ルールを示します。

    たとえば、EmployeesViewで定義されたコレクションでは、各ブランチのルート・ノードを従業員のManagerIdで指定でき、セルフ・アクセッサDirectReportsで指定されたとおり、同じブランチの子ノードはManagerIdに関連する従業員です。

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

  10. 「ツリー・レベル・ルール」リストにデータソースを追加し、ツリーに表示されるノード数を増やすこともできます。残りのデータソースの順序は、ツリーに表示するノードの階層に従う必要があります。

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

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

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

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

例29-2は、「データ・コントロール」パネルを使用してツリーを作成したときにJSFページで生成されるコードを示しています。このツリーの例には、親製品カテゴリおよび製品カテゴリの2つのノード・レベルが表示されます。ルート・ノードを移入するために、ParentProductCategoriesコレクションが使用されています。

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

<af:tree id="productCategoriesTree" contentDelivery="immediate"
            selectionListener="#{homePageBean.
                   productCategoriesTreeSelectionListener}"
            rowSelection="single"
            value="#{bindings.ParentProductCategories.treeModel}"
            var="node" initiallyExpanded="true">
       <f:facet name="nodeStamp">
             <af:panelGroupLayout>
                   <af:outputText rendered="#{node.ParentCategoryId eq null}"
                         value="#{node.CategoryName}"
                            inlineStyle="color:#FF8000;font-weight:bold;"/>
                   <af:outputText rendered="#{node.ParentCategoryId ne null}"
                         value="#{node.CategoryName}"/>
             </af:panelGroupLayout>
       </f:facet>
</af:tree>


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

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

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

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

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

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

<executables>
    <iterator Binds="ParentProductCategories" RangeSize="25"
              DataControl="StoreServiceAMDataControl"
              id="ParentProductCategoriesIterator"/>
</executables>
<bindings>
    <tree IterBinding="ParentProductCategoriesIterator"
          id="ParentProductCategories">
      <nodeDefinition
          DefName="oracle.fodemo.storefront.store.queries.ProductCategoriesVO">
        <AttrNames>
          <Item Value="CategoryId"/>
        </AttrNames>
        <Accessors>
          <Item Value="ProductCategoriesVO"/>
          <Item Value="ParentCategoryIdProductCategoriesVO"/>
        </Accessors>
      </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」を参照してください。

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

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

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

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

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

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

たとえば、国、州または地方、都市という3つのノード・レベルを表示するツリー表を作成できます。各ルート・ノードは、個別の国を表します。各ルート・ノードが分岐して、その国の州または地方が表示されます。各州または地方のノードが分岐して、その中の都市を表示します。

ツリーの場合と同様、複数のノードがあるツリー表を作成するには、ビュー・オブジェクト間のビュー・リンクを作成する必要があります。ビュー・リンクによってマスター・ディテール関係が確立されます。たとえば、国、州、市という3つのレベルを持つツリー表を作成するには、CountryCodesオブジェクトからStatesandProvincesビュー・オブジェクトへのビュー・リンク、およびStatesandProvincesビュー・オブジェクトからCitiesビュー・オブジェクトへの別のビュー・リンクを作成する必要があります。ビュー・リンクの作成に関する詳細は、5.6項「マスター/ディテール階層における複数表の使用」を参照してください。

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

プロパティ・インスペクタで、次のtreeTableコンポーネント・プロパティを編集できます。

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

ADF Facesデータ・バインド・ツリー表の作成手順は、ADF Facesデータ・バインド・ツリーの作成手順とほぼ同じですが、データ・コレクションをドロップする際に、ADFツリーとしてではなくADFツリー表としてドロップします。

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

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

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

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

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

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

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

<af:form>
      <af:treeTable value="#{bindings.Products.treeModel}" var="node"
                    selectionListener="#{bindings.Products.treeModel.makeCurrent}"
                    rowSelection="single">
        <f:facet name="nodeStamp">
          <af:column customizationId="column1">
            <af:outputText value="#{node}"/>
          </af:column>
        </f:facet>
        <f:facet name="pathStamp">
          <af:outputText value="#{node}"/>
        </f:facet>
      </af:treeTable>
</af:form>

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

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

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

29.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クラスを参照してください。

29.5.4 TargetIteratorプロパティの使用方法

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

ノード定義(規則)ごとに、オプションのTargetIteratorプロパティを指定できます。その値は、ユーザーがツリーで行を選択すると、実行時に評価されるEL式です。このEL式は、現在のバインディング・コンテナ内のイテレータ・バインディングを評価します。イテレータ・バインディングのビュー行キーの属性は、ツリー用にnodeDefinitionタイプの行が取得されるイテレータのビュー行キーと(順序、数およびデータ型が)一致します。

実行時に、ツリー・コントロールはselectionChangedイベントを受け取ると、ツリーのレベルごとにキーのリストを渡します。これらのキーは選択されたノードを一意に識別します。

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

たとえば、DeptEOおよびEmpEOエンティティ・オブジェクトを作成し、これらのエンティティ・オブジェクトに基づいてビュー・リンクを作成します。その部門の従業員のリンクされたコレクションを戻すDeptVOオブジェクトでのビュー・リンク・アクセッサは、EmployeesInDepartmentです。アプリケーション・モジュールは、DeptVOタイプのDepartmentsTreeビュー・オブジェクト・インスタンスを保持します。また、DeptVOタイプのEditDepartmentビュー・オブジェクト・インスタンスと、EmpVOタイプのEditEmployeesビュー・オブジェクト・インスタンス用のビュー・リンクも保持します。

作業を始める前に、次のようにします。

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

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

プロパティの使用手順:

  1. 「データ・コントロール」パネルからページへDepartmentsTreeデータ・コレクションをドラッグして、「作成」「ツリー」「ADFツリー」の順に選択します。

  2. EmployeesInDepartmentビュー・リンク・アクセサ属性に移動するように、ツリー・バインディング・ルールを構成します。

    これで、現在の部門行の子従業員行にアクセスできます。

  3. EditEmployeesディテール・ビュー・オブジェクト・インスタンスをページにドラッグし、「作成」「マスター/ディテール」「ADFマスター・フォーム、ディテール・フォーム」を選択します。

    これで、部門を編集するためのフォームと、その部門の従業員を編集するためのフォームが作成されます。

  4. ツリー・バインディングのDeptVOノード定義について、TargetIteratorプロパティを構成して#{bindings.EditEmployeesIterator}とします。

  5. ツリー・バインディングのEmpVOノード定義について、TargetIteratorプロパティを構成して#{bindings.EditEmployeesIterator}とします。

    マスター/ディテール・フォームの実行時、ツリーで任意の部門の従業員をクリックすると、最初に、その選択した従業員の部門のターゲット・イテレータに現在の部門行が設定されます。次に、選択した従業員のターゲット・イテレータに現在の従業員行が設定されます。

29.6 ツリーおよび表での選択イベントの使用

アプリケーションでなんらかの処理を行うために、ツリーまたはツリー表で選択されているノードを判別する必要が生じることがあります。たとえば、StoreFrontモジュールのホームページでは、ユーザーが「参照」ツリーでカテゴリ・ノードを選択すると、選択イベントが起動します。このイベントに関連付けられているリスナーは、選択されたノードの商品カテゴリを判別し、その値に一致するカテゴリ属性を持つ商品をすべて戻す必要があります。

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

29.6.1 ツリーおよび表での選択イベントの使用方法

選択イベントをプログラム的に使用するには、選択イベントを処理して必要なロジックを実行するリスナーを、マネージドBean内に作成する必要があります。その後、ツリーまたは表のselectionListener属性をそのリスナーにバインドする必要があります。

作業を始める前に、次のようにします。

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

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

ツリーおよび表で選択イベントを使用する手順:

  1. 必要なリスナーを格納するマネージドBeanがまだ存在しない場合は、作成します。マネージドBeanの作成および使用に関する詳細は、24.4項「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。

  2. マネージドBeanのリスナー・メソッドを作成します。リスナー・メソッドの作成の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のADF Facesサーバー・イベントの使用に関する項を参照してください。リスナーは次の処理を実行する必要があります。

    1. イベント・ソースを使用してコンポーネントにアクセスします。例29-5は、HomeBeanマネージドBeanのproductCategoriesTreeSelectionListenerメソッドが、選択イベントを起動したツリーにアクセスする方法を示しています。

      例29-5 イベント・ソースの取得

      public void productCategoriesTreeSelectionListener(SelectionEvent evt) {
          RichTree tree = (RichTree)evt.getSource();
      

      イベント・ソース・コンポーネントの特定の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のイベントの発生元を返す方法に関する項を参照してください。

    2. ツリー・モデルにアクセスしてモデルの値を取得し、RowKeySetオブジェクトを使用して現在選択されているノードを取得した後、例29-6に示すように、それをモデルの現在の行として設定します。RowKeySetオブジェクトの詳細は、29.6.2項「実行時に行われる処理: RowKeySetオブジェクトとSelectionEventイベント」を参照してください。

      例29-6 ツリー・モデルの現在の行の設定

      TreeModel model = (TreeModel)tree.getValue();
      RowKeySet rowKeySet = evt.getAddedSet();
      Object key = rowKeySet.iterator().next();
      model.setRowKey(key);
      
    3. 次に、現在選択されている行に対して実行するロジックを追加します。たとえば、productCategoriesTreeSelectionListenerメソッドは、選択されている行の値バインディングを使用してカテゴリIDを判別した後、その値を、実行時にそのカテゴリIDを持つ商品をすべて戻す(例29-7を参照)別のメソッドのパラメータとして使用します。

      例29-7 特定の属性値に一致するオブジェクトを戻す

      JUCtrlValueBinding nodeBinding = 
          (JUCtrlValueBinding)model.getRowData();
      Number catId = (Number)nodeBinding.getAttribute("CategoryId");
      _selectedCategory = (String)nodeBinding.getAttribute("CategoryName");
      
      OperationBinding ob =
           ADFUtils.findOperation("ProductsByCategoriesExecuteWithParams");
      ob.getParamsMap().put("category", catId);
      ob.execute();
      
  3. 対応するJSFページで、ツリー・コンポーネントまたは表コンポーネントを選択します。プロパティ・インスペクタで、「動作」セクションを開いて、SelectionListener属性の値を、作成したリスナー・メソッドに設定します。ドロップダウン・メソッドの「編集」オプションを使用すると、Beanとメソッドを宣言的に選択できます。

29.6.2 実行時に行われる処理: RowKeySetオブジェクトとSelectionEventイベント

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