Oracle® Fusion Middleware Oracle Reportsレポート作成のためのユーザーズ・ガイド 11gリリース1(11.1.1) B61376-01 |
|
戻る |
次へ |
この項のトピックは、第1.7項「データ・モデル・オブジェクト」で説明した基本的な概念に基づいています。
サマリー列は、他の列にあるデータに対して計算を実行するときに使用します。レポート・ウィザードまたはデータ・ウィザードでは、合計、平均、件数、最小値、最大値および%合計のサマリーを作成できます。また、サマリー列はデータ・モデル・ビューで手動で作成することもでき、プロパティ・インスペクタを使用すると、最初、最後、標準偏差および分散のサマリーも作成できます。
消費税などのカスタマイズされた計算がレポートで必要な場合は、式列を作成します(第4.8.10項「式列の作成または編集」を参照)。
注意: グループ・レポートでは、レポート・ウィザードおよびデータ・ウィザードによって、定義するサマリー列のそれぞれに対して、n個のサマリー・フィールドがデータ・モデルに作成されます。つまり、サマリーを作成する列上の各グループに対してそれぞれ1つのサマリー・フィールドが作成され、レポートレベルで1つのサマリー・フィールドが作成されます。たとえば、部単位にグループ化され、さらに課単位にグループ化されているレポートの場合、給与合計用のサマリー列を定義すると、各部および各課の給与合計(グループレベルのサマリー)用フィールドと、すべての給与の合計(レポートレベルのサマリー)用フィールドが作成されます。 |
関連項目
式列は、プレースホルダ列などの1つ以上の列にあるデータに対してユーザー定義の計算を実行するときに使用します。たとえば、:ITEMTOT *.07は1つの列に対して計算を実行する式で、:SAL + :COMMはレコード内の2つの列を使用して計算を実行する式です。式は、PL/SQLエディタを使用してPL/SQLで作成できます。
注意: パラメータの値を設定するために、式列を使用しないでください。 |
関連項目
プレースホルダは、任意のPL/SQLでデータ型と値を設定する列です。プレースホルダ列は、列の値を選択的に設定するとき(たとえば、毎回n番目の値をフェッチする場合、または毎回特定の値を含むレコードをフェッチする場合など)に便利です。プレースホルダ列の値は、次の場所に設定できます。
Before Reportトリガー(プレースホルダがレポートレベルの列の場合)
レポートレベルの式列(プレースホルダがレポートレベルの列の場合)
プレースホルダのグループまたはその下のグループ内の式(値はグループの各レコードに一度ずつ設定します)
関連項目
ユーザー・パラメータ、システム・パラメータおよび列は、バインド参照または字句参照で参照できます。
バインド参照(またはバインド変数)は、文字列、数字、日付などの、SQLまたはPL/SQL内の1つの値を置換するときに使用します。特に、問合せのSELECT
、WHERE
、GROUP BY
、ORDER BY
、HAVING
、CONNECT 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
に代入されます。
字句参照は、SELECT
文に埋め込む列またはパラメータのプレースホルダです。字句参照を使用すると、SELECT
、FROM
、WHERE
、GROUP BY
、ORDER BY
、HAVING
、CONNECT 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_ENAME
、P_EMPNO
およびP_JOB
を使用して、実行時に選択する列を変更できます。たとえば、P_EMPNO
の値としてDEPTNO
をランタイム・パラメータ・フォームで入力します。この場合、列に別名を使用してください。別名を使用しないと、実行時に選択する列を変更する場合に、SELECT
リストの列名がOracle Reports Builderの列と一致しなくなり、レポートが実行されなくなります。
例2: FROM句
SELECT ORDID, TOTAL
FROM &ATABLE;
ATABLE
を使用して、実行時に列を選択する表を変更できます。たとえば、実行時にATABLE
にORD
を入力します。この方法で表名を動的に変更するとき、列名が表によって異なる場合は、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
の値を使用して、ソート基準にSHIPDATE
、ORDERDATE
、ORDID
またはこれらの任意の組合せを選択できます。また、問合せにCONNECT BY
句やSTART WITH
句などを追加するときにも使用できます。
例7: CONNECT BY句およびSTART WITH句
CONNECT BY
句およびSTART WITH
句でのパラメータの使用方法は、WHERE
句およびHAVING
句と同じです。
例8: 複数句
SELECT &COLSTABLE;
COLSTABLE
を使用して、実行時にSELECT
句とFROM
句の両方を変更できます。たとえば、実行時にCOLSTABLE
にDNAME ENAME, LOC SAL FROM DEPT
を入力できます。
SELECT * FROM EMP &WHEREORD;
WHEREORD
を使用して、実行時にWHERE
句とORDER BY
句の両方を変更できます。たとえば、実行時に&WHEREORD
にWHERE 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
へのバインド参照を作成する必要があります。
バインド参照は、SQLまたはPL/SQLで1つの値を置換するときに使用します。特に、問合せのSELECT
、WHERE
、GROUP BY
、ORDER BY
、HAVING
、CONNECT BY
およびSTART WITH
の各句で式を置換するときに、バインド参照を使用すると効果的です。バインド参照はFROM
句では参照できません。次に例を示します。
SELECT ORDID,TOTAL
FROM ORD WHERE CUSTID = :CUST
字句参照は、実行時にパラメータで複数の値を代入するときに、SELECT
文に埋め込むテキストのプレースホルダです。字句参照を使用すると、SELECT
、FROM
、WHERE
、GROUP BY
、ORDER BY
、HAVING
、CONNECT BY
およびSTART WITH
の後の句を置換できます。PL/SQLでは、字句参照を作成できません。列または表の字句パラメータを参照する前に、そのパラメータを事前定義して、初期値を指定する必要があります。次に例を示します。
SELECT ORDID, TOTAL
FROM &ATABLE
リンク不可能な問合せとは、列間のリンクを介してその問合せにリンクできない列オブジェクトを含む詳細な問合せのことです(列間にリンクを作成すると、Oracle Reports Builderによって問合せにWHERE
句が追加されます)。このようなリンクを作成しようとすると、メッセージ・ダイアログ・ボックスが表示され、グループ対グループの問合せ(親グループを使用)を作成するか、または操作を取り消すかのいずれかを選択するように求められます。リンク不可能な問合せには、そのタイトル・バーにリンク不可能な問合せのアイコンが表示されます。
かわりに、2つの問合せの間に、グループ対グループのリンクを作成して(グループ対グループのリンクを作成しても、問合せにWHERE
句は追加されません)、親列を参照するバインド変数を使用し、子問合せのSELECT
文にWHERE
句を追加できます。第4.8.9項「データ・リンクの作成」を参照してください。
たとえば、子問合せのADDRESS.STREET
列と親問合せのLOC1
列の間に、列対列のリンクを作成するとします。この場合、グループ対グループのリンクを作成して、子問合せのSQL文を次のように変更します。
SELECT * FROM EMP E WHERE E.ADDRESS.STREET = :LOC1
関連項目
Oracle Reports Builderでは、データはフォーマット(レイアウト)とは無関係に定義されます。そのため、どのようなときに(グループではなく)データ・リンクを使用するかを理解しておく必要があります。
2つの問合せと1つのデータ・リンクを使用するマスター/ディテール・レポートのレイアウトと、1つの問合せと2つのグループを使用するグループ・レポートのレイアウトは同じになります。次の例は、同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポートです。2つのレポート間の相違点に注意してください。グループ・レポートとは異なり、マスター/ディテール・レポートには部門40が表示されています。これは、マスター/ディテール・レポートのデータ・リンクによって外部結合が生じ、このリンクにより自動的に無関係なデータがフェッチされるためです。外部結合を必要とするグループ・レポートを設計する場合は、(+)を使用してSELECT
文に明示的に外部結合を指定します。
図2-3 同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポート
次の図に示すマスター/ディテール/ディテール・レポートは、3つのデータ・グループを含むレポートです。マスター・グループごとに、2つの無関係なディテール・グループが表示されています。マスター/ディテール/ディテール・レポートまたはその応用レポートを作成するには、データ・リンクを使用する必要があります。1つの問合せと3つのグループを使用して、コントロール・ブレークを持つこのレポートを作成する場合は、その問合せにより2つのディテール・グループ間にリレーションシップが構築されます。
関連項目
マトリックス・オブジェクトは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
関連項目