40 データバインドされたピボット・テーブルおよびピボット・フィルタ・バー・コンポーネントの作成

この章では、ADFビジネス・コンポーネントでモデル化されたデータから、ピボット・テーブルを作成する方法について説明します。このピボット・テーブルの作成には、Fusion WebアプリケーションのADFデータ・コントロールとADF Facesコンポーネントを使用します。具体的には、ADFデータ視覚化コンポーネントのpivotTableおよびpivotFilterBarを使用して、ビジネス・データを視覚的に表現するピボット・テーブルの作成方法について説明します。ここでは、ADFデータ・コントロールを使用して、ピボット・テーブルをデータ優先開発で作成する方法について説明します。

簡単なUI優先開発を使用してページを設計する場合は、ピボット・テーブルをページに追加してから、データ・バインディングを構成してください。ピボット・テーブル・コンポーネントのデータ要件、タグ構造、および外観と動作をカスタマイズするためのオプションの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「ピボット・テーブル・コンポーネントの使用方法」の章を参照してください。

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

ADFデータ視覚化ピボット・テーブル・コンポーネントおよびピボット・フィルタ・バー・コンポーネントについて

ピボット・テーブルでは、グリッド・レイアウトにデータが表示されます。このグリッド・レイアウトには、階層的にネストされた行ヘッダー・セルおよび列ヘッダー・セルの無制限のレイヤーが備わっています。表計算ソフトウェア同様、ピボット・テーブルでは、グリッド・データの小計と合計を自動的に生成するオプションが用意されています。ピボット・フィルタ・バーは、ユーザーの要件に応じてデータを選択的に表示することで、ピボット表を強化します。

ADFデータ視覚化コンポーネントは、ビジネス・データを視覚的に表示、分析するための幅広いグラフィック機能と表機能を提供します。コンポーネントをレンダリングできるようにするには、これらのコンポーネントをそれぞれ、データにバインドする必要があります。コンポーネントの外観は表示されるデータによって変わるからです。

ピボット・テーブル・コンポーネントでは、複数レイヤーのデータ・ラベルをグリッドの行エッジまたは列エッジでサポートするグリッドが生成されます。オプションのピボット・フィルタ・バーは使用可能なピボット・テーブル・データをフィルタリングするページ・エッジを表します。このコンポーネントには、グリッド・データの小計および合計を自動的に生成するオプションもあります。ピボット・テーブルを使用すると、データ・レイヤーをあるエッジから別のエッジに切り替えてデータの表示を変更できます。たとえば、あるピボット・テーブルには、最初、行エッジに複数地域にわたる商品売上合計、列エッジに年別の明細が表示されていたとします。実行時に地域と年を切り替えると、複数年にわたる商品売上合計の地域別明細が表示されます。実行時に、エンド・ユーザーは内部列ラベルに表示されるボタンをクリックして、昇順または降順で行をソートできます。

接頭辞dvt:は、各データ視覚化コンポーネント名の先頭に付いて、そのコンポーネントがADFデータ視覚化ツール(DVT)のタグ・ライブラリに属することを示します。

データ視覚化コンポーネントのユースケースと例

データ視覚化ごとのユースケースと例の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』ピボット・テーブルおよびピボット・フィルタ・バー・コンポーネントのユースケースと例に関する項を参照してください。

エンド・ユーザー機能およびプレゼンテーション機能

魅力的な外観を備えたデータ視覚化コンポーネントを使用すると、エンド・ユーザーは複雑なビジネス・データを理解して分析できるようになります。このコンポーネントは機能が豊富で、そのまますぐに使用できる対話型のサポートも用意されています。各コンポーネントのエンド・ユーザー機能およびプレゼンテーション機能の詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』ピボット・テーブル・コンポーネントのエンド・ユーザー機能とプレゼンテーション機能に関する項を参照してください。

データ視覚化コンポーネントの追加機能

データ視覚化コンポーネントをデータ・バインドする前に、その他のOracle ADF機能について理解しておいてください。また、いったんデータ視覚化コンポーネントをページに追加すると、検証やアクセシビリティなどの機能を追加する必要があることに気付く場合があります。データ視覚化コンポーネントで使用されるその他の機能へのリンクは、次のとおりです。

  • 部分ページ・レンダリング: データ視覚化コンポーネントをリフレッシュして、ページの別のコンポーネントで実行されたアクションに基づく新しいデータを表示できます。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「部分ページ・コンテンツの再レンダリング」の章を参照してください。

  • パーソナライズ: ユーザーは実行時にデータ視覚化コンポーネントの表示を変更できますが、ユーザーがカスタマイズできるようにアプリケーションを構成していないかぎり、ユーザーがページを終了するとそれらの値は保持されません。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「JSFページでのユーザー・カスタマイズの許可」の章を参照してください。

  • アクセシビリティ: データ視覚化コンポーネントは、デフォルトでアクセス可能です。アプリケーションの各ページは、スクリーン・リーダーでのアクセスが可能になるように作成できます。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「アクセス可能なADF Facesページの開発」の章を参照してください。

  • スキンおよびスタイル: アプリケーションに適用するADFスキンを使用するか、スタイル関連のプロパティ(styleClassまたはinlineStyle)を使用してCSSスタイル・プロパティを直接適用することで、データ視覚化コンポーネントの外観をカスタマイズできます。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「スタイルおよびスキンを使用した外観のカスタマイズ」の章を参照してください。

  • プレースホルダ・データ・コントロール: 最終的にページのデータ視覚化コンポーネントでADFデータ・バインディングが使用されることがわかっていても、データ・コントロールの準備ができる前にページを開発する必要がある場合、手動でコンポーネントをバインドするのではなく、プレースホルダ・データ・コントロールの使用を検討します。プレースホルダ・データ・コントロールを使用すると、開発済データ・コントロールを使用した場合と同じ宣言的な開発が行われます。詳細は、「プレースホルダ・データ・コントロールによるページの設計」を参照してください。

データバインドされたピボット・テーブルの作成

DVTピボット表コンポーネントを作成し、データ優先開発アプローチでデータ・コレクションにバインドできます。JDeveloperでは、「データ・コントロール」パネルからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を実行できます。

ADFピボット・テーブルは、グリッド・レイアウトでデータを表示します。このレイアウトでは、階層型のネストされた行ヘッダー・セルと列ヘッダー・セルのレイヤー数に制限はありません。ピボット・テーブルでは、使用可能なピボット・テーブル・データをフィルタするページ・エッジを表すオプションのピボット・フィルタ・バーをサポートしています。ピボット・テーブルの構造は次のとおりです。

  • 列エッジ: 1つ以上の情報レイヤーを持つピボット・テーブル上の横軸。

  • 行エッジ: 1つ以上の情報レイヤーを持つピボット・テーブルの横側の縦軸。

  • ページ・エッジ: ピボット・テーブルで、データの表示をフィルタするために、0個以上の情報レイヤーを持つオプションのピボット・フィルタ・バー。

  • データ本体: ピボット・テーブルのセルに表示される1つ以上の指標(つまり、データ値)。

図40-1に、製品在庫のピボット・テーブルを示します。このピボット・テーブルは、データ本体に在庫数量と再発注点についてのデータ値を表示し、列エッジには倉庫ID、行エッジには製品カテゴリと製品データのレイヤーを表示しています。ピボット・フィルタ・バーは、世界の地域と地域フィルタをページ・エッジに表示します。

図40-1 製品在庫のピボット・テーブル

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

「ピボット・テーブルの作成」ウィザードでは、ピボット・テーブルのデータ・バインディングおよび構成のための宣言をサポートしています。ウィザードページでは、次の操作を行うことができます。

  • ピボット・テーブルの初期レイアウトの指定

  • ピボット・フィルタ・バーの関連付けと構成

  • データ・レイヤーに対する代替ラベルの指定

  • ドリルの挿入またはフィルタの設定

  • データ値の集計の定義

  • カテゴリおよびデータ・ソートの構成

ウィザードの先頭ページでピボット・テーブルのレイアウトを行うと、2ページめ以降で対応するエントリが初期化されます。ウィザードのページを進めるに従って、「戻る」ボタンおよび「次へ」ボタンを使用して、ピボット・テーブルを調整できます。ウィザード・ページの後半では、「終了」をクリックして、構成オプションをスキップすることもできます。

データ・バインディング完了後のピボット・テーブルのカスタマイズの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「ピボット・テーブル・コンポーネントの使用方法」の章を参照してください。

ADFデータ・コントロールを使用したピボット・テーブルの作成方法

データ・コントロールを使用してピボット・テーブルを作成するには、ピボット・テーブル・コンポーネントをコレクションにバインドします。JDeveloperでは、「データ・コントロール」パネルからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を実行できます。

ヒント:

また、「コンポーネント」ウィンドウからピボット・テーブル・コンポーネントをドラッグして、ピボット・テーブルを作成することもできます。この方法では、コンポーネントをデータにバインドする前に、ピボット・テーブルのユーザー・インタフェースを設計できます。

始める前に:

データバインドされたピボット・テーブルおよびピボット・フィルタ・バーについて理解しておいてください。詳細は、「データバインドされたピボット・テーブルの作成」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「データ視覚化コンポーネントの追加機能」を参照してください。

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

  • 「アプリケーション・モジュールの作成と変更」の説明に従い、ピボット・テーブルのデータ・モデルで必要になる、ビュー・オブジェクトのインスタンスが含まれているアプリケーション・モジュールを作成します。

    たとえば、図40-1に示す製品在庫のピボット・テーブルのデータソースは、ADF DVTコンポーネントについてのSummitサンプル・アプリケーション用に作成したビュー・オブジェクトから取得しています。

  • 『Oracle ADF FacesによるWebユーザー・インタフェースの開発』JSFページの作成方法に関する項の説明に従って、JSFページを作成します。

データバインドされたピボット・テーブルを作成するには:

  1. 「データ・コントロール」パネルから、コレクションを選択します。

    たとえば、世界中の各倉庫の製品インベントリ・レベルを表示する、ピボット・テーブルとピボット・フィルタ・バーを作成する場合は、「データ・コントロール」パネルからWorldProductInventory1コレクションを選択します(図40-2を参照)。

    図40-2 製品インベントリ・レベルのデータ・コレクション

    図40-2の説明が続きます
    「図40-2 製品インベントリ・レベルのデータ・コレクション」の説明
  2. JSFページにデータ・コレクションをドラッグして、ポップアップ・メニューから 「表/リスト・ビュー」「ADFピボット・テーブル」を選択します。

  3. 「ピボット・テーブルの作成」ウィザードの「表示属性の選択」ページで、次のようにして、ピボット・テーブルの初期レイアウトを指定します。

    1. ピボット・フィルタ・バーとピボット・テーブルを関連付ける場合は、「ピボット・フィルタ・バーの作成」を選択します。必要に応じて、「使用可能な属性」リストからページ・エッジに属性をドラッグして、フィルタの初期ディスプレイを設定します。設定しなかった場合、空のピボット・フィルタ・バーが作成されます。

      ノート:

      ウィザードの完了後にピボット・フィルタ・バーを追加するには、「構造」ウィンドウの「pivotTable」ノードを右クリックして、「ピボット・テーブルの前に挿入」「ADFデータ視覚化」「ピボット・フィルタ・バー」を選択します。

      ピボット・フィルタ・バーを削除する場合は、「pivotFilterBar」ノードを右クリックして、「削除」を選択します。

    2. 初期レイアウトでは、属性を「使用可能な属性」リストからピボット・テーブルのレイアウトにドラッグし、ピボット・テーブルの列、行、ページ・エッジおよびデータ本体の属性を選択します。

      ピボット・テーブル・レイアウトでは、「データ・ラベル」は、セル内のデータ(データ値)を識別するピボット・テーブルのレイヤーを表し、行エッジ、列エッジまたはページ・エッジのヘッダー・ラベルとしても表示されます。ピボット・テーブルのデータ本体にドラッグした属性のラベルは、「データ・ラベル」レイヤーに表示されます。

      データ・ラベルは、列エッジ、行エッジまたはページ・エッジ上の任意の場所にドラッグできます。また、属性を同じエッジ上の別の場所や、別のエッジ上にドラッグすることも可能です。

      レイアウトで属性を配置または移動するためにドラッグ操作を使用するかわりに、属性を右クリックするか、[Shift]を押しながら[F10]を押して、ポップアップ・メニュー・オプションを表示することもできます。図40-3に、RegName属性のポップアップ・メニュー・オプションを示します。

      図40-3 属性のポップアップ・メニューの表示

      図40-3の説明が続きます
      「図40-3 属性のポップアップ・メニューの表示」の説明

      ノート:

      属性の間に存在しうるドリル・パスは、行エッジ、列エッジ、およびページ・エッジに複数の属性をレイアウトするときに定義されます。このようなドリル・パスは、実行時にピボット・テーブルのドリルをサポートするために後で有効化できます。

    3. 「入力済属性」のデフォルトの選択から「名前-値ペア」に変更してデータ・ポイントをコレクションに格納する方法を構成する場合は、「データ形状の変更」ボタンをクリックします。次のオプションを提示するダイアログが表示されます。

      • 入力済属性

        コレクション内の各種データ・ポイントは、別々の属性によって表されます。このオプションは、ピボット・テーブル内のデータ・ポイントの種類が1つのみの場合も有効です。

        たとえば、推定値実際値に対するデータ・ポイントがある場合は、推定値の属性と実際値の属性が異なる場合にのみ、「入力済属性」を選択します。

      • 名前-値ペア

        次の2つの属性によって表されるデータ・ポイントが2種類以上あることを示します。データ・ポイントの種類を指定するName属性とデータ値を指定するValue属性です。

        たとえば、Name属性に、推定値を表すValue属性の値としてESTがある場合や、実際値を表すValue属性の値としてACTName属性にある場合があります。

    たとえば、製品在庫のピボット・テーブル(図40-1を参照)の初期レイアウトを指定する場合、ページ・エッジにはRegName属性とCountry属性をドラッグし、行エッジにはCategory属性とProdName属性、データ本体(データのラベル)にはAmountinStock属性とReorderPoint属性、列エッジにはWarehouseIDをドラッグして、「ピボット・フィルタ・バーの作成」を選択します(図40-4を参照)。

    図40-4 「ピボット・テーブルの作成」ウィザードの「表示属性の選択」ページ

    図40-4の説明が続きます
    「図40-4 ピボット・テーブルの作成ウィザードの「表示属性の選択」ページ」の説明
  4. ウィザードの「表示属性の選択」ページにレイアウトされた属性に対して代替の値またはラベルを指定する場合は、「次へ」をクリックしてから、「属性プロパティの指定」ページを使用して、次の手順を実行します。

    1. デフォルトでは、ピボット・テーブル内のセルは編集できません。af:outputTextコンポーネントは、自動的に各データ・セルにスタンプされます。データ・セルの編集が可能なピボット・テーブルを作成する場合は、「読取り専用ピボット・テーブル」の選択を解除して、「コンポーネント」列の各データ・セル属性のaf:inputTextコンポーネント・オプションを使用できるようにします。その後で、af:inputTextコンポーネントを選択することで、0個以上のデータ値を編集可能として指定できるようになり、タグとそのタグに対応するf:validatorタグがピボット・テーブルのデータ・セルにスタンプされます。詳細は、「編集可能なデータ・セルの構成に関する必知事項」を参照してください。

    2. 「データ値」エリアでデータ値の代替ラベルを指定するには、実行時にその属性のヘッダー・セルにスタンプされているデフォルトの「データ属性名の使用」テキスト・ラベルを変更します。テキストを直接入力する、ピボット・テーブルでデータ値を1つ使用する場合のように「ラベルなし」を選択してヘッダー・セルを抑制する、リソース・バンドルからテキスト・リソースを指定する、またはEL式ビルダーを使用して実行時にラベル・テキストを評価することが可能です。

    3. 「カテゴリ」エリアで属性カテゴリの代替ラベルを指定するには、「属性の表示名」列で、実行時にその属性のヘッダー・セルにスタンプされているデフォルトの「属性の表示名」テキスト・ラベルを変更します。テキストを直接入力できますし、リソース・バンドルからテキスト・リソースを指定したり、EL式ビルダーを使用して実行時にラベル・テキストを評価できます。ラベルは、実行時、ピボット・ハンドルに表示されます。

      また、「属性の表示名」列で別の属性を選択して、属性カテゴリに代替値を指定することもできます。たとえば、データ・コレクション内のRegionId属性を使用してピボット・テーブルをレイアウトできますが、実行時にはピボット・テーブル・ヘッダーにRegionName属性の値を表示して情報を読みやすくすることが必要になる場合があります。

    テキスト・リソースを設定すると、ユーザーのブラウザの言語設定と一致する言語を、JSFページやアプリケーションに表示できるようになります。「データ値」のラベルと「カテゴリ」属性の表示名フィールドに「テキスト・リソースの選択」オプションを選択して、翻訳可能なテキスト・リソースを設定します。

    ノート:

    「プロジェクト・プロパティ」「リソース・バンドル」ページを「バンドルの自動同期化」に構成した場合は、かわりのラベル文字列を入力できます。これにより、設計時のコードから翻訳可能なテキスト・リソースが作成されます。

    たとえば、図40-1の製品在庫のピボット・テーブルで、ラベルと表示名にテキスト・リソースを使用するように設定する場合は、図40-5に示すように、ウィザードの「属性プロパティの指定」ページに必要事項を入力します。

    図40-5 「ピボット・テーブルの作成」ウィザードの「属性プロパティの指定」ページ

    図40-5の説明が続きます
    「図40-5 ピボット・テーブルの作成ウィザードの「属性プロパティの指定」ページ」の説明
  5. 実行時に、ピボット・テーブルでドリル操作を公開する必要がある場合は、「次へ」をクリックしてから、「ピボット・テーブルの作成」ウィザードの「ドリルの構成」ページを使用して、次のいずれかのオプションを有効にします。

    • 「ドリルの挿入」を選択すると、兄弟および集計データを保持しながら、詳細なデータを折りたたまれたビューまたは展開されたビューに表示できます。実行時、ドリル・アイコンは親属性の表示ラベル内に表示されます。

      展開されたビューで、親属性の総計を子属性の前または後のどちらに表示するかを指定するには、「親行の挿入」を使用します。

      ドリルの挿入を有効にするには、次の手順の実行も必要です。

      • 有効化するドリル・パスを選択します。ドリル・パスは、ウィザードの「表示属性の選択」ページにある属性レイアウトに基づいて設定されます。

      • ウィザードの「集計の構成」ページで集計を設定します。

      たとえば、図40-6のピボット・テーブルは、ドリルの挿入を使用して、Yearデータ・レイヤーのビューを展開しています。各年の売上の集計値(2007年52,500ドル、2006年544,150ドル)および売上個数(2007年410個、2006年507個)は、製品の上にある行に表示されます。

      図40-6 ドリルの挿入が有効になっているピボット・テーブル

      この図は周囲のテキストで説明しています
    • 「ドリルのフィルタ」を選択すると、兄弟および集計データを保持せずに、詳細なデータを折りたたまれたビューまたは展開されたビューに表示できます。実行時、ドリル・アイコンは親属性の表示ラベル内で有効化されます。

      ドリルのフィルタはデータ・レイヤー属性の詳細にビューの焦点を当てます。たとえば、図40-7のピボット・テーブルは、ドリルのフィルタ機能を使用して、Year (2007)データ・レイヤーのビューを展開し、総売上高(52,500)および売上げ個数(410)を表示する一方、それ以外の年のデータとすべての年の総計の両方をフィルタアウトして表示から除外しています。

      図40-7 ドリルのフィルタが有効化されているピボット・テーブル

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

      「ドリルのフィルタ」を有効化するには、有効化するドリル・パスを選択する必要があります。ドリル・パスは、ウィザードの「表示属性の選択」ページにある属性レイアウトに基づいて設定されます。

    たとえば、図40-1の製品在庫ピボット・テーブルでドリルの挿入を使用できるようにするには、図40-8に示すように、ウィザードの「ドリルの構成」ページに必要事項を入力します。

    図40-8 「ピボット・テーブルの作成」ウィザードの「ドリルの構成」ページ

    図40-8の説明が続きます
    「図40-8 ピボット・テーブルの作成ウィザードの「ドリルの構成」ページ」の説明
  6. ピボット・テーブルでデータの合計と小計を集計する方法を定義する場合は、「次へ」をクリックし、ピボット・テーブルの作成ウィザードの「集計の構成」の1ページまたは2ページとも使用します。

    デフォルトでは、ピボット・テーブルに表示されている属性によってデータ・コレクションの各行が一意に識別されない場合、重複行のデータを集計してピボット・テーブルの単一のセルに折りたたむことができます。また、特定のデータ項目では、デフォルトの集計タイプを無視することもできます。

    • ピボット・テーブルでのデータの集計方法を指定するには、「データ集計」ページで次の手順を実行します。

      • 重複行を処理するためのデフォルト集計方法を変更する場合は、「デフォルトの関数」ドロップダウン・リストを使用して、値を指定します。有効な値は、SumAverageCountMaximumMinimumStandard DeviationMedianおよびVarianceです。

      • 特定のデータ値について、デフォルトの集計タイプを無視する場合は、「追加」アイコンをクリックして、使用可能な属性のために1行挿入します。次に、各属性の「関数」列で、集計に使用する数学演算を選択します。使用可能なオプションは、SumAverageCountMaximumMinimumStandard DeviationMedianおよびVarianceです。この属性は、ピボット・テーブルに複数のデータ値(SalesやUnitsなど)がバインドされている場合のみ有効です。

      たとえば、売上のピボット・テーブル(図40-1を参照)にあるUnitsデータ値のデフォルト集計タイプをオーバーライドするには、図40-9に示すように、「追加」アイコンを使用してUnits属性を追加し、「データ集計」ページの「関数」列でAverageを選択します。

      図40-9 「ピボット・テーブルの作成」ウィザードの「データ集計」ページ

      図40-9の説明が続きます
      図40-9 ピボット・テーブルの作成ウィザードの「データ集計」ページ」の説明
    • また、ピボット・テーブルの列エッジ、行エッジまたはページ・エッジに追加された属性カテゴリについて、合計と小計を定義することもできます。「カテゴリの合計」ページで、「追加」アイコンを使用して、各属性を挿入するか、「すべての集計」を選択して、使用可能な属性をすべて追加してから、次の手順を実行します。

      • 「属性」列で、合計する属性を選択します。

      • 「関数」列で、集計に使用する数学演算を選択します。使用可能なオプションは、SumAverageCountMaximumMinimumStandard DeviationMedianおよびVarianceです。

      • 「属性」列で参照しているアイテムを基準として、集計結果を表示する位置を示す値を「合計の挿入」列で選択します。有効な値はBeforeAfterまたはReplaceです。

      • 「合計ラベル」列に、集計のラベルとして使用するテキストを入力します。テキストを直接入力できますし、リソース・バンドルからテキスト・リソースを指定したり、EL式ビルダーを使用して実行時にラベル・テキストを評価できます。

      ノート:

      読取り専用の「ドリル挿入の合計」表には、ピボット・テーブルでドリルの挿入を有効にした結果として、自動的に定義されたカテゴリ合計が表示されます。

      たとえば、売上のピボット・テーブル(図40-1を参照)でGeographyデータ・レイヤーとYearデータ・レイヤーの合計を定義するには、「関数」列でSum「合計の挿入」列でAfterを選択し、図40-10に示すように、「カテゴリの合計」ページの属性それぞれについて、「合計ラベル」列にテキスト(「Total Geography」と「Total Year」)を入力します。

      実行時に結果として得られたピボット・テーブルで特定の年の値を展開すると、直前のウィザードページのドリルの挿入オプションで指定したレイアウトと設定に基づいて子値から計算された合計が自動的に保存されます。

      図40-10 「ピボット・テーブルの作成」ウィザードの「カテゴリの合計」ページ

      図40-10の説明が続きます
      図40-10 ピボット・テーブルの作成ウィザードの「カテゴリの合計」ページ」の説明
  7. ピボット・テーブルのソート機能を構成するには、「次へ」をクリックしてから、「ピボット・テーブルの作成」ウィザードの「ソートの構成」の一方のページまたは両方のページ使用します。

    デフォルトでは、ピボット・テーブルのデータは、最初は外部行データ・レイヤーの値に基づいてソートされます。任意の行エッジ、列エッジまたはページ・エッジのデータ・レイヤーにソート順序を指定することができます。このようなソートをカテゴリ・ソートと呼びます。実行時に、データ・レイヤーを異なるエッジにピボットした場合、指定されたカテゴリのソート順序が使用されます。

    ウィザードの「表示属性の選択」ページでデータ本文にマップされた属性を並べることはできますが、データ・ラベル(データ値)のカテゴリ・ソートは指定できません。たとえば、図40-4はSalesおよびUnitsのデータ値を使ったピボット・テーブルのレイヤーを示しています。これらのメジャーのカテゴリ・ソートは指定できませんが、図40-1のように、実行時にピボット・テーブルのデータ本文に表示される値の順序は指定できます。

    また、ピボット・テーブルをレンダリングするときに、データ本文でのデータ値の初期ソート順序を指定することもできます。これはデータ・ソートと呼ばれます。

    • カテゴリごとにソートを設定するには、「カテゴリ・ソート」ページの「追加」アイコンを使用して、設定の対象となる各行エッジ、列エッジまたはページ・エッジの属性を追加し、その後、次の手順を実行します。

      • 「ソート属性」列で、ピボット・テーブル・ヘッダーの実際値に基づいてアルファベット順でソートすることを指定するにはデフォルトのUse Attribute Valueをそのまま使用します。ソート順序をカスタマイズするには、ドロップダウン・リストからかわりのソート順序属性を指定します。たとえば、基礎となる問合せに、収益性別製品ランキングのランク計算が含まれている場合、ProductRank別に降順で製品が表示されるように指定できます。

      • 「初期ソート順序」列で、初期ソート方向を選択します。有効な値はASCENDINGまたはDESCENDINGです。

      たとえば、図40-11に示すウィザードの「カテゴリ・ソート」ページでは、Categoryデータ・レイヤーが列エッジに昇順に表示されるように構成しています。

      図40-11 「ピボット・テーブルの作成」ウィザードの「カテゴリ・ソート」ページ

      図40-11の説明が続きます
      「図40-11 ピボット・テーブルの作成ウィザードの「カテゴリ・ソート」ページ」の説明

      実行時に表示されるピボット・テーブルは図40-12のとおりです。

      図40-12 カテゴリ・ソートの例

      図40-12の説明が続きます
      「図40-12 カテゴリ・ソートの例」の説明
    • データのソートを構成するには、「データ・ソート」ページで、次の手順を実行します。

      • ピボット・テーブルがレンダリングされたときのデータの初期ソート順序を指定するには、「列でソート」を選択します。

      • 「初期ソート順序」ドロップダウン・リストで、初期ソート方向を選択します。有効な値はASCENDINGおよびDESCENDINGです。

      • 「シーケンスNull」ドロップダウン・リストで、NULL値をソートの先頭に表示する場合はFirst、NULL値をソートの最後に表示する場合はLastを指定します。

      • 「初期ソート列」表で、「レイヤー属性」列に表示される各データ・レイヤーの「値」列にデータ値を指定します。

      たとえば、図40-13は、Units/World/Canoesデータ値に基づいて、年ごとにグループ化されたChannelデータ・レイヤーをソートするように構成された「データ・ソート」ページを示しています。

      図40-13 「ピボット・テーブルの作成」ウィザードの「データ・ソート」ページ

      図40-13の説明が続きます
      図40-13 ピボット・テーブルの作成ウィザードの「データ・ソート」ページ」の説明

      実行時、ピボット・テーブルは最初に図40-14のようにレンダリングされます。

      図40-14 データ・ソートの例

      図40-14の説明が続きます
      「図40-14 データ・ソートの例」の説明
  8. 「終了」をクリックして、データバインドされたピボット・テーブルの作成を完了します。

    ピボット・テーブルを作成するウィザードの完了後に、JDeveloperのツールを使用すると、ピボット・テーブルのルック・アンド・フィールをカスタマイズできます。たとえば、ヘッダー・セルのデフォルト・サイズに収まらないラベルのワード・ラップを構成したり、図40-1のピボット・テーブルのデータ・セット用にスクロール・バーのかわりのページ・コントロールを追加したりできます。

  9. ピボット・テーブルをカスタマイズするには、次のタスクを実行します。

    1. 「構造」ウィンドウで「dvt:pivotTable」ノードを右クリックし、「プロパティに移動」を選択します。

    2. 「プロパティ」ウィンドウで、「共通」セクションを開き、ScrollPolicyプロパティをpageに設定することで、デフォルトのスクロール・バーのかわりとしてのページ・コントロールを構成します。

    3. 「構造」ウィンドウで「dvt:headerCell」ノードを右クリックし、「プロパティに移動」を選択します。

    4. 「プロパティ」ウィンドウで、「動作」セクションを開き、WhiteSpace属性をnormalに設定することで、ピボット・テーブルの各ヘッダーにワード・ラップを構成します。

データ・バインディング完了後のピボット・テーブルのカスタマイズの詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』「ピボット・テーブル・コンポーネントの使用方法」の章を参照してください。

「データ・コントロール」パネルによるピボット・テーブルの作成時の処理

ピボット・テーブルを「データ・コントロール」パネルからドロップすると、次の処理が行われます。

  • ピボット・テーブルのバインディングを作成し、ページ定義ファイルにそのバインディングを追加します。

  • UIコンポーネントに必要なコードをJSFページに追加します。

「データ・コントロール」パネルからピボット・テーブルを作成すると、ページ定義ファイルがバインディングを使って更新されます。次の例は、地域内の商品売上と売上個数を年別に表示するピボット・テーブルに対して生成された行セット・バインディングを示しています。ピボット・テーブルのデータ・マップには次の要素が含まれます。

  • <columns>: 各列項目を適切な順番で定義します

  • <rows>: 各行項目を適切な順番で定義します

  • <pages>: ピボット・フィルタ・バーに組入れられる項目を定義します

  • <aggregatedItems>: 項目の合計と小計を定義します

  • <hierarchies>: 2つの項目間で考えられるドリル・パスを定義します

  • <sorts>: ピボット・テーブル・データのカテゴリ・ソートと初期ソート順序を定義します

重複する行のデフォルト・データ集計方法は、<data>要素で指定します。重複の集計の詳細は、「ピボット・テーブルの属性の集計に関する必知事項」を参照してください。

ソート操作の詳細は、「ピボット・テーブルへの初期ソートの指定に関する必知事項」を参照してください。

<pivotTable IterBinding="WorldProductInventory1Iterator"
            id="WorldProductInventory1"
            xmlns="http://xmlns.oracle.com/adfm/dvt" ChangeEventPolicy="ppr">
  <pivotTableDataMap convert="false">
    <columns>
      <data aggregateDuplicates="true" defaultAggregateType="SUM">
        <item label="${adfBundle['view.ViewControllerBundle'].AMOUNT_IN_STOCK}"
              value="AmountInStock"/>
        <item label="${adfBundle['view.ViewControllerBundle'].REORDER_POINT}"
              value="ReorderPoint"/>
      </data>
        <item value="WarehouseId"
              itemLabel="${adfBundle['view.ViewControllerBundle'].WAREHOUSE_ID}"/>
    </columns>
    <rows>
      <item value="Category"
            itemLabel="${adfBundle['view.ViewControllerBundle'].CATEGORY}"/>
    </rows>
    <pages>
      <item value="RegName"
            itemLabel="${adfBundle['view.ViewControllerBundle'].REGION}"/>
      <item value="Country"
            itemLabel="${adfBundle['view.ViewControllerBundle'].COUNTRY}"/>
    </pages>
    <aggregatedItems>
      <item aggregateLocation="AFTER" aggregateType="AVERAGE" value="Category"
            aggregateLabel="${adfBundle['view.ViewControllerBundle'].AVERAGE}"/>
    </aggregatedItems>
    <drills type="INSERT"/>
    <hierarchies>
      <item value="Category" location="BEFORE">
        <child value="ProdName"
               itemLabel="${adfBundle['view.ViewControllerBundle'].PRODUCT}"/>
      </item>
    </hierarchies>
    <sorts>
      <categorySort item="Category" direction="ASCENDING"/>
    </sorts>
  </pivotTableDataMap>
</pivotTable>

「データ・コントロール」パネルを使ってピボット・テーブルを作成すると、必要なコードがページに追加されます。次の例は、売上のピボット・テーブルと関連するピボット・フィルタ・バーに対してJSFページで生成されるコードを示しています。

<dvt:pivotFilterBar id="pfb1"
                    value="#{bindings.WorldProductInventory1.pivotFilterBarModel}"
                    modelName="pt1Model"/>
<dvt:pivotTable id="pt1"
                value="#{bindings.WorldProductInventory1.pivotTableModel}"
                modelName="pt1Model"
                var="cellData" varStatus="cellStatus"
                summary="#{viewcontrollerBundle.WorldProductInventoryPivotTable}"
                scrollPolicy="page">
  <dvt:headerCell whiteSpace="normal">
    <af:switcher facetName="#{cellData.layerName}" defaultFacet="Default" id="s1">
      <f:facet name="DataLayer">
        <af:outputText value="#{cellData.label}" id="ot1"/>
      </f:facet>
      <f:facet name="WarehouseId">
        <af:outputText value="#{cellData.dataValue}" id="ot2">
          <af:convertNumber groupingUsed="false"
                            pattern="#{bindings.WorldProductInventory1.
                                     hints.WarehouseId.format}"/>
        </af:outputText>
      </f:facet>
      <f:facet name="Category">
        <af:outputText value="#{cellData.dataValue}" id="ot3"/>
      </f:facet>
      <f:facet name="ProdName">
        <af:outputText value="#{cellData.dataValue}" id="ot4"/>
      </f:facet>
      <f:facet name="RegName">
        <af:outputText value="#{cellData.dataValue}" id="ot5"/>
      </f:facet>
      <f:facet name="Country">
        <af:outputText value="#{cellData.dataValue}" id="ot6"/>
      </f:facet>
      <f:facet name="Default">
        <af:outputText value="#{cellData.dataValue}" id="ot7"/>
      </f:facet>
    </af:switcher>
  </dvt:headerCell>
  <dvt:dataCell>
    <af:switcher facetName="#{cellStatus.members.DataLayer.value}"
                 defaultFacet="Default" id="s2">
      <f:facet name="AmountInStock">
        <af:outputText value="#{cellData.dataValue}" id="ot8">
          <af:convertNumber groupingUsed="false"
                            pattern="#{bindings.WorldProductInventory1.
                                     hints.AmountInStock.format}"/>
        </af:outputText>
      </f:facet>
      <f:facet name="ReorderPoint">
        <af:outputText value="#{cellData.dataValue}" id="ot9">
          <af:convertNumber groupingUsed="false"
                            pattern="#{bindings.WorldProductInventory1.
                                    hints.ReorderPoint.format}"/>
        </af:outputText>
      </f:facet>
      <f:facet name="Default">
        <af:outputText value="#{cellData.dataValue}" id="ot10"/>
      </f:facet>
    </af:switcher>
  </dvt:dataCell>
</dvt:pivotTable

ピボット・テーブルの属性の集計に関する必知事項

ピボット・テーブルに表示するために選択した属性によってデータ・コレクションの各行が一意に識別されない場合、重複行のデータを集計してピボット・テーブルの単一のセルに折りたたむことができます。

たとえば、図40-15に示すデータ・コレクションの行に店舗IDも含まれていた場合、商品、販路および地理の特定の組合せにおける全店舗のデータ行をピボット・テーブルの単一のセルに折りたたむ必要があります。

図40-15 売上のピボット・テーブル

図40-15の説明が続きます
「図40-15 売上のピボット・テーブル」の説明

ピボット・テーブルには、重複するデータ行の計算の制御に使用できる次のオプションのデータ・バインディング属性があります。

  • aggregateDuplicates: <data>要素のブール型プロパティ。重複行でデータ値を集計するために、バインディング実行時に特殊処理を有効化するかどうかを決定します。この属性が指定されていない場合、falseであると判断されます。

  • defaultAggregateType: 重複を処理するためのデフォルト集計方法を指定する<data>要素の文字列プロパティ。有効な値は、SUMAVERAGECOUNTMINMAXSTDDEVMEDIANおよびVARIANCEです。aggregateDuplicatestrueで、defaultAggregateTypeが指定されていない場合、SUMであると判断されます。

  • aggregateType: <item>要素の文字列プロパティ。特定のデータ項目のデフォルト集計タイプをオーバーライドすることができます。この属性は、ピボット・テーブルに複数のデータ値(SalesやUnitsなど)がバインドされている場合のみ有効です。

重複するデータ行のデフォルトの集計

デフォルトでは、ピボット・テーブルはSUM演算を使用してデータ・コレクション内で重複するデータ行のデータ値を集計し、ピボット・テーブルの単一のセル値を生成します。つまり、aggregateDuplicates属性はtrueに設定され、defaultAggregateTypeSUMであると判断されます。

次の例に示す<data>要素は、このようなデフォルトの集計の例です。

<pivotTable IterBinding="ptExampleDataIterator" id="ptExampleData"
            xmlns="http://xmlns.oracle.com/adfm/dvt"
            ChangeEventPolicy="ppr">
  <pivotTableDataMap>
    <columns>
      <item value="Geography" itemLabel="Location"/>
        <data aggregateDuplicates="true" defaultAggregateType="SUM">
          <item value="Sales"/>
          <item value="Units" aggregateType="AVERAGE"/>
        </data>
    </columns>
    <rows>
      <item value="Year"/>
    </rows>
    <pages>
      <item value="Channel"/>
    </pages>
    <aggregatedItems>
      <item aggregateLocation="AFTER" aggregateType="SUM" value="Geography"
            aggregateLabel="Total Geography"/>
      <item aggregateLocation="AFTER" aggregateType="SUM" value="Year"
            aggregateLabel="Total Across Years"/>
    </aggregatedItems>
    <drills type="INSERT"/>
    <hierarchies>
      <item value="Year" location="BEFORE">
        <child value="Product" label="Product"/>
      </item>
    </hierarchies>
    <sorts>
      <categorySort item="Channel" direction="DESCENDING"/>
      <categorySort item="Year" direction="ASCENDING"/>
      <qdrSliceSort direction="DESCENDING" edge="rows" grouped="true"
                    nullsFirst="true">
        <item name="Geography" value="World"/>
      </qdrSliceSort>
    </sorts>
  </pivotTableDataMap>
</pivotTable>
重複行のカスタム集計

ピボット・テーブルで別の数学演算を使用して重複行のデータ値を集計する場合は、defaultAggregateTypeを目的の演算に設定します。

次の例は、defaultAggregateTypeSUMに設定されているデータ要素を示しています。この演算は、商品、販路および州の一意の組合せごとに全店舗の売上合計を表示する場合に適しています。

<pivotTable IterBinding="SalesPivotTable1Iterator" id="SalesPivotTable11"
            xmlns="http://xmlns.oracle.com/adfm/dvt">
  <pivotTableDataMap>
    <columns>
      <data aggregateDuplicates="true" defaultAggregateType="SUM">
        <item value="Sales"/>
      </data>
      <item value="Geography"/>
    </columns>
    <rows>
      <item value="Channel"/>
      <item value="Product"/>
    </rows>
    <aggregatedItems>
      <item aggregateLocation="After" aggregateType="AVERAGE" 
            value="Product" aggregateLabel="Average"/>
    </aggregatedItems>
  </pivotTableDataMap>
</pivotTable>

売上や店舗の平均規模(平方フィート単位)など複数のデータ値がピボット・テーブルにあり、重複行の売上データ値を合計する一方、平方フィートのデータ値を平均化する場合は、次のようにします。

  • <data>要素で、defaultAggregateTypeSUMに設定します。

  • 平方フィート属性の<item>要素で、aggregateTypeAVERAGEに設定します。

次の例は、PivotTableDataMap要素でラップされた<columns>要素を示しています。<data>要素には、集計のデフォルトの属性が指定されています。これらは、特殊なカスタムaggregateType属性が指定されていないデータ・アイテムすべてに適用されます。

    <columns>
       <data aggregateDuplicates="true" defaultAggregateType="SUM">
         <item value="Sales" label="Total Sales"/>
         <item value="StoreSqFeet" label="Avg Sq Feet" aggregateType="AVERAGE"/>
       </data>
       <item value="State"/>
    </columns>

ピボット・テーブルへの初期ソートの指定に関する必知事項

デフォルトでは、ピボット・テーブルのデータは、最初は外部行データ・レイヤーの値に基づいてソートされます。任意の行アイテム、列アイテムまたはページ・アイテムのデータ・レイヤーにソート順序を指定することができます。このようなソートをカテゴリ・ソートと呼びます。実行時に、データ・レイヤーを異なるエッジにピボットした場合、指定されたカテゴリのソート順序が使用されます。sorts要素内にcategorySort要素を挿入し、表40-1に示すように属性の値を設定します。

表40-1 categorySort要素の属性値

属性 説明

item

カテゴリ・ソートを設定する列アイテム、行アイテムまたはページ・アイテムを指定します。この属性の値は必須です。

direction

初期のソート方向を指定します。有効な値はASCENDINGおよびDESCENDINGです。この属性の値は必須です。

また、ピボット・テーブルをレンダリングするときに、データ本文でのデータ値の初期ソート順序を指定することもできます。これはデータ・ソートと呼ばれます。デフォルトの動作は、ページ定義ファイルでピボット・テーブル・バインディングのpivotTableDataMap要素内にsorts要素を挿入すると変更できます。sorts要素内にqdrSliceSort要素を挿入し、表40-2に示すように属性の値を設定します。

表40-2 qdrSliceSort要素の属性値

属性 説明

direction

初期のソート方向を指定します。有効な値はASCENDINGおよびDESCENDINGです。この属性の値は必須です。

edge

columnsまたはrowsを指定し、データをソートするエッジを決定します。この属性の値は必須です。

grouped

親のスライスをソートする場合はtrue、エッジ全体にわたってソートする場合はfalseを指定します。この属性の値は任意です。デフォルト値はfalseです。

nullsFirst

NULL値をソートの先頭に表示する場合はtrue、NULL値をソートの最後に表示する場合はfalseを指定します。デフォルト値はfalseです。この属性の値は任意です。

1つ以上のitemタグをqdrSliceSortタグに挿入します。itemタグは、ソート対象の値が取得されるのとは逆のエッジ上にスライスを指定します。たとえば、ソート行がデータに基づいている場合は、各レイヤーのitemタグを列エッジで指定する必要があります。表40-3に示すように属性の値を設定します。

表40-3 itemタグの属性値

属性 説明

name

ソート対象のレイヤーの名前を指定します。通常、これは行セットの列名です。行セットのデータ列(Sales、Costsなど)を含むレイヤーを識別する場合はDataLayerを指定します。

value

指定したレイヤーの値を目的のスライスに指定します。

編集可能なデータ・セルの構成に関する必知事項

デフォルトでは、ピボット・テーブル内のセルは編集できません。ADFデータ・コントロールを使用してピボット・テーブルを作成すると、各データ・セルにaf:outputTextコンポーネントが自動的にスタンプされます。また、ピボット・テーブルの作成ウィザードを使用して、データ・セルを編集可能として構成することもできます。このように構成するには、af:inputTextコンポーネントとタグ、およびそれに対応するf:validatorタグが、データ・セルにスタンプされるように指定します(次の例を参照)。

<dvt:dataCell>
  <af:switcher facetName="#{cellStatus.members.DataLayer.value}"
           defaultFacet="Default" id="s2">
    <f:facet name="AmountInStock">
      <af:inputText value="#{cellData.dataValue}"
                    label="#{bindings.WorldProductInventory1.hints.
                          AmountInStock.label}"
                    required="#{bindings.WorldProductInventory1.hints.
                          AmountInStock.mandatory}"
                    columns="#{bindings.WorldProductInventory1.hints.
                          AmountInStock.displayWidth}"
                    maximumLength="#{bindings.WorldProductInventory1.hints.
                          AmountInStock.precision}"
                    shortDesc="#{bindings.WorldProductInventory1.hints.
                          AmountInStock.tooltip}"
                    id="it1">
        <f:validator binding="#{cellData.bindings.AmountInStock.validator}"/>
      </af:inputText>
    </f:facet>
    <f:facet name="ReorderPoint">
      <af:outputText value="#{cellData.dataValue}" id="ot8">
        <af:convertNumber groupingUsed="false"
                          pattern="#{bindings.WorldProductInventory1.hints.
                                   ReorderPoint.format}"/>
      </af:outputText>
    </f:facet>
    <f:facet name="Default">
      <af:outputText value="#{cellData.dataValue}" id="ot10"/>
    </f:facet>
  </af:switcher>
</dvt:dataCell>

<dvt:dataCell>
  <af:switcher facetName="#{cellStatus.members.DataLayer.value}"
               defaultFacet="Default" id="s2">
    <f:facet name="Sal">
      <af:inputText value="#{cellData.dataValue}" id="ot5"
                    label="#{bindings.EmpView1.hints.Sal.label}"
                    required="#{bindings.EmpView1.hints.Sal.mandatory}"
                    columns="#{bindings.EmpView1.hints.Sal.displayWidth}"
                    maximumLength="#{bindings.EmpView1.hints.Sal.precision}"
                    shortDesc="#{bindings.EmpView1.hints.Sal.tooltip}">
      <f:validator binding="#{cellData.bindings.Sal.validator}"/>
    </af:inputText>
  </f:facet>
  <f:facet name="Default">
    <af:inputText value="#{cellData.dataValue}" id="ot6"/>
  </f:facet>
    </af:switcher>
</dvt:dataCell>

また、dataCellコンポーネントの子としてEditableValueHolderインタフェースまたはActionSourceインタフェースを実装するコンポーネント(af:selectBooleanCheckboxaf:inputComboboxListofValuesなど、ほとんどのコンポーネント)を使用するようにピボット・テーブルのデータ・セルを構成することもできます。詳細は、『Oracle ADF FacesによるWebユーザー・インタフェースの開発』ヘッダーおよびデータ・セルのスタンプの構成方法に関する項を参照してください。