Oracle® Fusion Middleware Oracle Reportsレポート作成のためのユーザーズ・ガイド 12c (12.2.1.3.0) E90221-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 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
のいずれかを選択するのに役立ちます。:SORT
は、SELECT
リストでの式の位置の特定のためではなく、値として使用されるので、ORDER BY 1
と異なることに注意してください。この例では、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;
myparam
の値は、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
親問合せで選択されたDEPTNO
へのバインド参照が、WHERE
句でどのように作成されるかに注意してください。また、この例では、データ・モデル・ビューで列を指定せずに、問合せ間にリンクが作成されていることを前提にしています。
字句参照を使用して、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つの問合せの間に、グループ対グループのリンクを作成して(グループ対グループのリンクを作成しても、Oracle Reports Builderでは問合せにWHERE
句は追加されません)、親列を参照するバインド変数を使用し、子問合せのSELECT
文にWHERE
句を追加できます。第4.8.9項「データ・リンクの作成」を参照してください。
たとえば、子問合せのADDRESS.STREET
列と親問合せのLOC1
列の間に、列対列のリンクを作成するとします。この場合、グループ対グループのリンクを作成して、子問合せのSQL文を次のように変更します。
SELECT * FROM EMP E WHERE E.ADDRESS.STREET = :LOC1
関連項目
Oracle Reports Builderでは、データはフォーマット(レイアウト)とは無関係に定義されます。そのため、どのようなときに(グループではなく)データ・リンクを使用するかを理解しておく必要があります。
2つの問合せとデータ・リンクを使用するマスター/ディテール・レポートのレイアウトと、1つの問合せと2つのグループを使用するグループ・レポートのレイアウトは同じです。同じデータを問い合せるデフォルトのマスター/ディテール・レポートとグループ・レポートの例を次に示します。2つのレポート間の違いに注意してください。グループ・レポートとは異なり、マスター/ディテール・レポートでは部門40が表示されています。これは、マスター/ディテール・レポートのデータ・リンクによって外部結合が行われているためです。リンクは関連付けのないデータを自動的にフェッチします。外部結合が必要なグループ・レポートを設計する場合は、(+)を使用して外部結合を明示的にSELECT
文に追加します。
図2-3 同じデータを問い合せているデフォルトのマスター/ディテール・レポートとグループ・レポート
マスター/ディテール・レポートは、次の図に示すように、3つのデータ・グループを含むレポートです。各マスター・グループには、2つの関連付けのないディテール・グループが表示されています。マスター/ディテール/ディテール・レポートやそのバリエーションを作成するには、データ・リンクを使用する必要があります。1つの問合せと3つのグループを使用してコントロール・ブレーク付きのレポートを作成する場合、問合せにより2つのディテール・グループ間でリレーションシップが確立されます。
関連項目
マトリックス・オブジェクトは2つの繰返し枠の間にリレーションシップを定義し、いずれかのオブジェクトに所有されているわけでも、マトリックス・オブジェクト自体がいずれかのオブジェクトを所有しているわけでもありません。マトリックス・オブジェクトは、「マトリックス」レイアウト・スタイルのレイアウトにのみ作成できます。データ・モデルに必要なグループが揃っていれば、レポートに複数のマトリックスを含めることができます。Oracle Reports Builderでは、垂直に交差する繰返し枠の各組合せに対して、1つのマトリックス・オブジェクトが作成されます。
繰返し枠はマトリックスのディメンションであり、マトリックス・オブジェクトにはセル・グループのフィラーまたは値を保持するフィールドが含まれます。マトリックスを形成するには、繰返し枠の1つは「印刷方向」プロパティを「縦」に、もう1つは「横」に設定する必要があります。
注意: マトリックス・オブジェクトが含まれているJSPベースのWebレポートを実行する場合、JSP<rw:include> タグは、そのマトリックス・オブジェクトが1ページのみにフォーマットされることを前提とします。ただし、交差した繰返し枠にあるセルが拡張されている場合、マトリックスの列のヘッダーは、ページのサイズに関係なく、次のページに移動する場合があります。したがって、これらのマトリックス・ヘッダーは、レポート出力に表示されません。さらにこの状況では、ヘッダー・フィールドは後続のページに移動しますが、セルの値は最初のページに残るので、ペーパー・レイアウトは正しく表示されません。対処するには、交差した繰返し枠で利用可能なスペースで最大値を表示できるようにし、交差した繰返し枠の「垂直拡張度」プロパティを「固定」に設定するよう、レポート・エディタで注意深く定義することが重要になります。 |
制限
マトリックスでは、縦繰返し枠は横繰返し枠より下にある必要があります。
マトリックス・オブジェクトは、常にそれを構成する繰返し枠の上にある必要があります(つまり、マトリックス・オブジェクトは、その水平繰返し枠と垂直繰返し枠より上の1つ以上のレイヤーである必要があります)。Oracle Reports Builderでは、マトリックスを水平繰返し枠と垂直繰返し枠より下に移動することはできません。
マトリックスを移動すると、その2つの繰返し枠も移動されます。
マトリックス・オブジェクトを他のオブジェクトにアンカーすることも、他のオブジェクトをマトリックス・オブジェクトにアンカーすることもできません(つまり、マトリックス・オブジェクトは、アンカーの親オブジェクトまたは子オブジェクトにはできません)。
マトリックスをコピーするには、マトリックスとその2つの繰返し枠を選択する必要があります。マトリックス・オブジェクト自体を選択しても、貼付け用のバッファには何もコピーされません。マトリックスとその繰返し枠の1つを選択した場合は、その繰返し枠のみが貼付け用のバッファに置かれます。
マトリックス・オブジェクトのサイズは、その関連する繰返し枠のサイズを変更することでのみ変更されます。
マトリックス・オブジェクトの「レイアウト」メニューからは、「整列」または「オブジェクト・サイズ設定」を使用できません。
マトリックスのディメンションを作成する繰返し枠のソース・グループは、同じクロス積グループにある必要があります。
ソース・グループが同じファミリ階層にある繰返し枠(つまり、お互いが子や親の場合)には、同じ「印刷方向」を設定する必要があります。クロス積グループ内の親子関係は、マトリックスにネストを作成するときに使用します。したがって、こうしたグループに関連する繰返し枠は、ページ上で同じ方向に印刷される必要があります。
マトリックス・オブジェクトでは、他のオブジェクトと同じように境界線を挿入できますが、その幅は常に可能な最小幅になります。マトリックス・レイアウト内のオブジェクトは密接に配置されるため、境界線を広くすることはできません。
例
データベースの列DEPTNOから値を取得するC_DEPTNOという列を含む、Group1という名前のグループがあるとします。Group2というグループには、データベースの列JOBから値を取得する列C_JOB、およびGroup1の問合せへのリンクに使用される列C_DEPTNO1が含まれています。Group3というグループには、データベースの列SALの合計であるSUMSALという列が含まれています。
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
関連項目