ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Reportsレポート作成のためのユーザーズ・ガイド
11gリリース1(11.1.1)
B61376-01
  ドキュメント・ライブラリへ
ライブラリ
製品リストへ
製品
目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2.3 データ・モデル・オブジェクト

この項のトピックは、第1.7項「データ・モデル・オブジェクト」で説明した基本的な概念に基づいています。

2.3.1 サマリー列について

サマリー列は、他の列にあるデータに対して計算を実行するときに使用します。レポート・ウィザードまたはデータ・ウィザードでは、合計、平均、件数、最小値、最大値および%合計のサマリーを作成できます。また、サマリー列はデータ・モデル・ビューで手動で作成することもでき、プロパティ・インスペクタを使用すると、最初、最後、標準偏差および分散のサマリーも作成できます。

消費税などのカスタマイズされた計算がレポートで必要な場合は、式列を作成します(第4.8.10項「式列の作成または編集」を参照)。


注意:

グループ・レポートでは、レポート・ウィザードおよびデータ・ウィザードによって、定義するサマリー列のそれぞれに対して、n個のサマリー・フィールドがデータ・モデルに作成されます。つまり、サマリーを作成する列上の各グループに対してそれぞれ1つのサマリー・フィールドが作成され、レポートレベルで1つのサマリー・フィールドが作成されます。たとえば、部単位にグループ化され、さらに課単位にグループ化されているレポートの場合、給与合計用のサマリー列を定義すると、各部および各課の給与合計(グループレベルのサマリー)用フィールドと、すべての給与の合計(レポートレベルのサマリー)用フィールドが作成されます。

関連項目

第4.8.11項「サマリー列の作成」

2.3.2 式列について

式列は、プレースホルダ列などの1つ以上の列にあるデータに対してユーザー定義の計算を実行するときに使用します。たとえば、:ITEMTOT *.07は1つの列に対して計算を実行する式で、:SAL + :COMMはレコード内の2つの列を使用して計算を実行する式です。式は、PL/SQLエディタを使用してPL/SQLで作成できます。


注意:

パラメータの値を設定するために、式列を使用しないでください。

関連項目

第4.8.10項「式列の作成または編集」

第2.6.8項「式について」

2.3.3 プレースホルダ列について

プレースホルダは、任意のPL/SQLでデータ型と値を設定する列です。プレースホルダ列は、列の値を選択的に設定するとき(たとえば、毎回n番目の値をフェッチする場合、または毎回特定の値を含むレコードをフェッチする場合など)に便利です。プレースホルダ列の値は、次の場所に設定できます。

  • Before Reportトリガー(プレースホルダがレポートレベルの列の場合)

  • レポートレベルの式列(プレースホルダがレポートレベルの列の場合)

  • プレースホルダのグループまたはその下のグループ内の式(値はグループの各レコードに一度ずつ設定します)

関連項目

第4.8.12項「プレースホルダ列の作成または編集」

第2.6.8項「式について」

2.3.4 列参照とパラメータ参照について

ユーザー・パラメータ、システム・パラメータおよび列は、バインド参照または字句参照で参照できます。

2.3.4.1 バインド参照について

バインド参照(またはバインド変数)は、文字列、数字、日付などの、SQLまたはPL/SQL内の1つの値を置換するときに使用します。特に、問合せのSELECTWHEREGROUP BYORDER BYHAVINGCONNECT BYおよびSTART WITHの各句で式を置換するときに、バインド参照を使用すると効果的です。バインド参照はFROM句では参照できず、予約語または予約句のかわりに使用することもできません。

バインド参照は、コロン(:)の後に対象の列名またはパラメータ名を入力して作成します。SELECT文でバインド参照を作成する前に、対象になる列またはパラメータを作成しないと、Reports Builderによってデフォルトでパラメータが作成されます。

制限

バインド参照に、予約済のSQLキーワードと同じ名前を使用することはできません。詳細は、『Oracle Database SQLリファレンス』を参照してください。

例1: SELECT句

次の例では、選択された行にあるCOMMPLANのNULL値がDFLTCOMMの値によって置換されます。

SELECT CUSTID, NVL(COMMPLAN, :DFLTCOMM) COMMPLAN
  FROM ORD;

例2: WHERE句

CUSTの値を使用して、特定の1人の顧客を選択します。

SELECT ORDID, TOTAL
  FROM ORD
  WHERE CUSTID = :CUST;

例3: GROUP BY句

SELECT句にあるNVL(COMMPLAN, :DFLTCOMM)のような非集計式はすべて、GROUP BY句でレプリケートする必要があります。

SELECT NVL(COMMPLAN, :DFLTCOMM) COMMPLAN, SUM(TOTAL) TOTAL
  FROM ORD
  GROUP BY NVL(COMMPLAN, :DFLTCOMM);

例4: HAVING句 

MINTOTALの値を使用して、最小発注量の顧客を選択します。

SELECT CUSTID, SUM(TOTAL) TOTAL
  FROM ORD
  GROUP BY CUSTID HAVING SUM(TOTAL) > :MINTOTAL;

例5: ORDER BY句

SORTの値を使用して、ソート基準にSHIPDATEまたはORDERDATEを選択します。これはORDER BY 1とは異なることに注意してください。ここでは、:SORTは値として使用されており、SELECTリストでの式の位置を識別しているわけではありません。この例ではDECODEが必要になることにも注意してください。DECODEを伴わない場合は、ORDER BY句でバインド変数を使用できません。

SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL
  FROM ORD
  ORDER BY DECODE(:SORT, 1, SHIPDATE, 2, ORDERDATE);

例6: CONNECT BY句およびSTART WITH句

CONNECT BY句およびSTART WITH句での参照の使用方法は、WHERE句およびHAVING句と同じです。

例7: PL/SQL

procedure double is begin; :my_param := :my_param*2; end;

my_paramの値は、2で乗算されmyparamに代入されます。

2.3.4.2 字句参照について

字句参照は、SELECT文に埋め込む列またはパラメータのプレースホルダです。字句参照を使用すると、SELECTFROMWHEREGROUP BYORDER BYHAVINGCONNECT BYおよびSTART WITHの後の句を置換できます。字句参照は、実行時にパラメータで複数の値を代入するときに使用してください。

PL/SQL文では、字句参照を作成できません。ただし、PL/SQLでバインド参照を使用すると、次の例に示すように、SQLで字句的に参照されるパラメータ値を設定できます。

字句参照は、アンパサンド(&)の後に対象の列名またはパラメータ名を入力して作成します。デフォルトの定義では、字句参照を使用できません。そのため、次のことを実行する必要があります。

  • 問合せを作成する前に、問合せ内の各字句参照に対する列またはパラメータをデータ・モデルで定義します。列の場合は「NULL時の値」プロパティを、パラメータの場合は「初期値」プロパティを設定する必要があります。Oracle Reports Builderでは、これらの値を使用して、字句参照を含む問合せが検証されます。

  • 字句参照を含む問合せを作成します。

制限

  • PL/SQL文では、字句参照を作成できません。

  • 問合せで列またはパラメータを字句参照として使用する場合は、そのデータ型がCHARACTERである必要があります。

  • SELECT句で字句参照を使用する場合は、代入する列ごとに別々の字句参照を作成する必要があります。また、各字句参照に対して別名を割り当てることをお薦めします。これにより、ランタイム・パラメータ・フォームで字句参照に対して異なる値を入力しても、同じレイアウト・フィールドとボイラープレート・ラベルを使用できるようになります。

  • SELECT句で字句参照を使用する場合は、レポートのデータ・モデルに指定されている数と同じ数の項目を実行時に指定する必要があります。実行時に字句参照に対して指定する各値は、「初期値」と同じデータ型にする必要があります。

  • SELECT句で字句参照を使用する場合は、列幅がパラメータの「初期値」プロパティから取得されます。そのため、使用する最大幅の列にパラメータの「初期値」が対応していることを確認する必要があります。

  • Oracle Reports Builderのリンクは、字句参照に依存しないようにします。つまり、リンクの子列もその表名も、字句参照によって決めることはできません。この機能を可能にするには、列の指定されていないリンクを作成して、問合せにリンク用のSQL句(WHEREなど)を直接入力する必要があります。たとえば、親問合せと子問合せが次のように記述されているとします。

    親問合せ:

    SELECT DEPTNO FROM EMP
    

    子問合せ:

    SELECT &PARM_1 COL_1, &PARM2 COL_2
      FROM EMP
      WHERE &PARM_1 = :DEPTNO
    

    WHERE句でのDEPTNOに対するバインド参照の作成方法に注意してください。このDEPTNOは親問合せで選択されています。また、この例では、データ・モデル・ビューで列を指定せずに、問合せ間にリンクが作成されていることを前提にしています。

  • 字句参照を使用して、After Formトリガーの起動後に追加されるバインド変数を作成することはできません。たとえば、次のような問合せがあるとします(WHERE句が字句参照によって置換されることに注意してください)。

    SELECT ENAME, SAL FROM EMP
    &where_clause
    

    where_clauseパラメータの値にバインド変数への参照が含まれる場合は、After Formトリガーでその値を指定するか、事前に指定する必要があります。Before Reportトリガーでパラメータに次の値を設定すると、エラーが発生します。

    WHERE SAL = :new_bind
    

    After Formトリガーで同じ値を設定すると、レポートが実行されます。

例1: SELECT句

SELECT &P_ENAME NAME, &P_EMPNO ENO, &P_JOB ROLE
  FROM EMP;

P_ENAMEP_EMPNOおよびP_JOBを使用して、実行時に選択する列を変更できます。たとえば、P_EMPNOの値としてDEPTNOをランタイム・パラメータ・フォームで入力します。この場合、列に別名を使用してください。別名を使用しないと、実行時に選択する列を変更する場合に、SELECTリストの列名がOracle Reports Builderの列と一致しなくなり、レポートが実行されなくなります。

例2: FROM句

SELECT ORDID, TOTAL
  FROM &ATABLE;

ATABLEを使用して、実行時に列を選択する表を変更できます。たとえば、実行時にATABLEORDを入力します。この方法で表名を動的に変更するとき、列名が表によって異なる場合は、SELECT句にも字句参照を使用すると効果的です(前述の例を見てください)。

例3: WHERE句

SELECT ORDID, TOTAL
  FROM ORD
  WHERE &CUST;

CUSTを使用して、ORDから取得するレコードを制限できます。実行時に、WHERE句を任意の形式で指定できます。

例4: GROUP BY句

SELECT NVL(COMMPLAN, DFLTCOMM) CPLAN, SUM(TOTAL) TOTAL
  FROM ORD
  GROUP BY &NEWCOMM;

NEWCOMMの値を使用して、GROUP BY句を定義できます。

例5: HAVING句

SELECT CUSTID, SUM(TOTAL) TOTAL
  FROM ORD
  GROUP BY CUSTID HAVING &MINTOTAL;

MINTOTALの値を使用して、最小発注量の顧客などを選択できます。

例6: ORDER BY句

SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL
  FROM ORD
  ORDER BY &SORT;

SORTの値を使用して、ソート基準にSHIPDATEORDERDATEORDIDまたはこれらの任意の組合せを選択できます。また、問合せにCONNECT BY句やSTART WITH句などを追加するときにも使用できます。

例7: CONNECT BY句およびSTART WITH句

CONNECT BY句およびSTART WITH句でのパラメータの使用方法は、WHERE句およびHAVING句と同じです。

例8: 複数句

SELECT &COLSTABLE;

COLSTABLEを使用して、実行時にSELECT句とFROM句の両方を変更できます。たとえば、実行時にCOLSTABLEDNAME ENAME, LOC SAL FROM DEPTを入力できます。

SELECT * FROM EMP &WHEREORD;

WHEREORDを使用して、実行時にWHERE句とORDER BY句の両方を変更できます。たとえば、実行時に&WHEREORDWHERE SAL > 1000 ORDER BY DEPTNOを入力できます。

例9: PL/SQLとSQL 

SELECT &BREAK_COL C1, MAX(SAL)
  FROM EMP
  GROUP BY &BREAK_COL;

BREAK_COLを使用して、実行時にSELECTリストとGROUP BY句の両方を変更します。パラメータ&BREAK_COLの「初期値」はJOBです。実行時に、レポートのユーザーはGROUP_BY_COLUMN(データ型はCHARACTER)というパラメータに値を指定できます。

GROUP_BY_COLUMNの検証トリガーで、次のPL/SQLプロシージャをコールして、GROUP_BY_COLUMNの値を渡します。

procedure conv_param (in_var IN char) is
begin
  if upper(in_var) in ('DEPTNO','EMPNO','HIREDATE') then
    :break_col := 'to_char('||in_var||')' ;
  else
    :break_col := in_var;
  end if;
end;

このPL/SQLでは、必要に応じて、1つのTO_CHARが、ユーザーが選択したブレーク列の箇所に挿入されています。SQLでBREAK_COLへの字句参照を作成する方法に注意してください。PL/SQLでは、字句参照は許可されていないため、BREAK_COLへのバインド参照を作成する必要があります。

2.3.4.3 バインド参照と字句参照の相違点

バインド参照は、SQLまたはPL/SQLで1つの値を置換するときに使用します。特に、問合せのSELECTWHEREGROUP BYORDER BYHAVINGCONNECT BYおよびSTART WITHの各句で式を置換するときに、バインド参照を使用すると効果的です。バインド参照はFROM句では参照できません。次に例を示します。

SELECT ORDID,TOTAL 
  FROM ORD
  WHERE CUSTID = :CUST

字句参照は、実行時にパラメータで複数の値を代入するときに、SELECT文に埋め込むテキストのプレースホルダです。字句参照を使用すると、SELECTFROMWHEREGROUP BYORDER BYHAVINGCONNECT BYおよびSTART WITHの後の句を置換できます。PL/SQLでは、字句参照を作成できません。列または表の字句パラメータを参照する前に、そのパラメータを事前定義して、初期値を指定する必要があります。次に例を示します。

SELECT ORDID, TOTAL
  FROM &ATABLE

2.3.5 リンク不可能な問合せについて

リンク不可能な問合せとは、列間のリンクを介してその問合せにリンクできない列オブジェクトを含む詳細な問合せのことです(列間にリンクを作成すると、Oracle Reports Builderによって問合せにWHERE句が追加されます)。このようなリンクを作成しようとすると、メッセージ・ダイアログ・ボックスが表示され、グループ対グループの問合せ(親グループを使用)を作成するか、または操作を取り消すかのいずれかを選択するように求められます。リンク不可能な問合せには、そのタイトル・バーにリンク不可能な問合せのアイコンが表示されます。

かわりに、2つの問合せの間に、グループ対グループのリンクを作成して(グループ対グループのリンクを作成しても、問合せにWHERE句は追加されません)、親列を参照するバインド変数を使用し、子問合せのSELECT文にWHERE句を追加できます。第4.8.9項「データ・リンクの作成」を参照してください。

たとえば、子問合せのADDRESS.STREET列と親問合せのLOC1列の間に、列対列のリンクを作成するとします。この場合、グループ対グループのリンクを作成して、子問合せのSQL文を次のように変更します。

SELECT * FROM EMP E WHERE E.ADDRESS.STREET = :LOC1

関連項目

第1.7.4項「データ・リンクについて」

第1.7.1項「問合せについて」

第2.3.4.1項「バインド参照について」

2.3.6 リンクとグループの比較について

Oracle Reports Builderでは、データはフォーマット(レイアウト)とは無関係に定義されます。そのため、どのようなときに(グループではなく)データ・リンクを使用するかを理解しておく必要があります。

2つの問合せと1つのデータ・リンクを使用するマスター/ディテール・レポートのレイアウトと、1つの問合せと2つのグループを使用するグループ・レポートのレイアウトは同じになります。次の例は、同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポートです。2つのレポート間の相違点に注意してください。グループ・レポートとは異なり、マスター/ディテール・レポートには部門40が表示されています。これは、マスター/ディテール・レポートのデータ・リンクによって外部結合が生じ、このリンクにより自動的に無関係なデータがフェッチされるためです。外部結合を必要とするグループ・レポートを設計する場合は、(+)を使用してSELECT文に明示的に外部結合を指定します。

図2-3 同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポート

同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポート
「図2-3 同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポート」の説明

次の図に示すマスター/ディテール/ディテール・レポートは、3つのデータ・グループを含むレポートです。マスター・グループごとに、2つの無関係なディテール・グループが表示されています。マスター/ディテール/ディテール・レポートまたはその応用レポートを作成するには、データ・リンクを使用する必要があります。1つの問合せと3つのグループを使用して、コントロール・ブレークを持つこのレポートを作成する場合は、その問合せにより2つのディテール・グループ間にリレーションシップが構築されます。

図2-4 マスター/ディテール/ディテール・レポート

マスター/ディテール/ディテール・レポート
「図2-4 マスター/ディテール/ディテール・レポート」の説明

関連項目

第1.7.2項「グループについて」

第1.7.4項「データ・リンクについて」

2.3.7 マトリックス・オブジェクトについて

マトリックス・オブジェクトは2つの繰返し枠の間にリレーションシップを定義するだけで、いずれかのオブジェクトに所有されているわけでも、マトリックス・オブジェクト自体がいずれかのオブジェクトを所有しているわけでもありません。マトリックス・オブジェクトは、「マトリックス」レイアウト・スタイルのレイアウトにのみ作成できます。データ・モデルに必要なグループが揃っていれば、レポートに複数のマトリックスを含めることができます。Oracle Reports Builderでは、垂直に交差する繰返し枠の各組合せに対して、1つのマトリックス・オブジェクトが作成されます。

繰返し枠はマトリックスのディメンションであり、マトリックス・オブジェクトにはセル・グループのフィラーまたは値を保持するフィールドが含まれます。マトリックスを形成するには、繰返し枠の1つの「印刷方向」プロパティが「縦」に設定され、他の繰返し枠の「印刷方向」プロパティが「横」に設定されている必要があります。


注意:

マトリックス・オブジェクトが含まれているJSPベースのWebレポートを実行する場合、JSP <rw:include>タグは、そのマトリックス・オブジェクトが1ページのみにフォーマットされることを前提とします。ただし、交差した繰返し枠にあるセルが拡張されている場合、マトリックスの列のヘッダーは、ページのサイズに関係なく、次のページに移動する場合があります。したがって、これらのマトリックス・ヘッダーは、レポート出力に表示されません。さらにこの状況では、ヘッダー・フィールドは後続のページに移動しますが、セルの値は最初のページに残るので、ペーパー・レイアウトは正しく表示されません。これに対処するには、交差した繰返し枠で利用可能なスペースで最大値を表示できるようにし、交差した繰返し枠の「垂直拡張度」プロパティを「固定」に設定するよう、レポート・エディタで注意深く定義することが重要になります。

制限

  • マトリックスでは、縦繰返し枠は横繰返し枠より下にある必要があります。

  • マトリックス・オブジェクトは、常にそれを構成する繰返し枠の上にある必要があります(つまり、マトリックス・オブジェクトは、その水平繰返し枠と垂直繰返し枠より上の1つ以上のレイヤーである必要があります)。Oracle Reports Builderでは、マトリックスを水平繰返し枠と垂直繰返し枠より下に移動することはできません。

  • マトリックスを移動すると、その2つの繰返し枠も移動されます。

  • マトリックス・オブジェクトを他のオブジェクトにアンカーすることも、他のオブジェクトをマトリックス・オブジェクトにアンカーすることもできません(つまり、マトリックス・オブジェクトは、アンカーの親オブジェクトまたは子オブジェクトにはできません)。

  • マトリックスをコピーするには、マトリックスとその2つの繰返し枠を選択する必要があります。マトリックス・オブジェクト自体を選択しても、貼付け用のバッファには何もコピーされません。マトリックスとその繰返し枠の1つを選択した場合は、その繰返し枠のみが貼付け用のバッファに置かれます。

  • マトリックス・オブジェクトのサイズは、その関連する繰返し枠のサイズを変更することでのみ変更されます。

  • マトリックス・オブジェクトの「レイアウト」メニューからは、「整列」または「オブジェクト・サイズ設定」を使用できません。

  • マトリックスのディメンションを構成する繰返し枠のソース・グループは、同じクロス積グループにある必要があります。

  • ソース・グループが同じファミリ階層にある繰返し枠(つまり、お互いが子や親の場合)には、同じ「印刷方向」を設定する必要があります。クロス積グループ内の親子関係は、マトリックスにネストを作成するときに使用します。したがって、こうしたグループに関連する繰返し枠は、ページ上で同じ方向に印刷される必要があります。

  • マトリックス・オブジェクトでは、他のオブジェクトと同じように境界線を挿入できますが、その幅は常に可能な最小幅になります。マトリックス・レイアウト内のオブジェクトは密接に配置されるため、境界線を広くすることはできません。

Group1という名前のグループにC_DEPTNOという列があるとします。C_DEPTNO列は、その値をデータベース列DEPTNOから取得します。Group2という名前のグループには列C_JOBと列C_DEPTNO1があります。列C_JOBの値はデータベース列JOBから取得し、列C_DEPTNO1はGroup1の問合せへのリンクに使用します。Group3というグループにはSUMSALという列があり、データベース列SALのサマリーになっています。

                    Job 
          Analyst  Clerk  Manager 

      10           $1300   $2450 
Dept  20    $6000  $1900   $2975 
      30           $ 950   $2850 

この例では、次のようになります。

  • 垂直繰返し枠は、Group2(ジョブ・タイトル)を含む繰返し枠になります。

  • 水平繰返し枠は、Group1(部門番号)を含む繰返し枠になります。

  • クロス積グループはGroup4(Group1とGroup2の親となるグループ)になります。

さらに複雑なマトリックスを構成する必要がある場合は、Group1とGroup2に列を追加します。たとえば、Group1に、部門番号を表す列以外に、部門の場所(LOC)を表す列を追加します。マトリックスは次のようになります。

                              Job
 Loc        Dept    Analyst  Clerk  Manager
 
 New York    10              $1300   $2450
 Dallas      20      $6000   $1900   $2975
 Chicago     30              $ 950   $2850

関連項目

第1.3.7項「マトリックス・レポートについて」

第2.1.7項「ネストしたマトリックス・レポートについて」

第2.1.8項「グループ別マトリックス・レポートについて」

第4.9.1.3項「マトリックス・オブジェクトの作成」

第4.8.8項「マトリックス(クロス積)グループの作成」

第4.5.3項「ネストしたマトリックス・レポートの作成」