単一データセット改ページSQLによる階層帳票の実現

  • 作成者:ayuan0625
  • 編集回数:44次
  • 最終更新:ayuan0625 于 2021-09-28
  • 一.グリッドエンジンに直接対応するデータベース

    グリッドエンジンで階層帳票を実行には、直接グリッドエンジンを使って階層帳票を実現する方法を説明しました。MySQLのようなグリッドエンジンを直接使って階層帳票を実現するデータベースにとって、グリッドエンジンを選択するとプログラムは改ページSQLを自動的に生成します。例えば、MySQLデータベースからの新しいデータベースds1を作成し、SQL文を次のようにします。

    SELECT * FROM Orders

    改ページSQLを定義せずにグリッドエンジンオプションを選択した場合、帳票をプレビューする時、プログラムは上記のSQL文を次の文に転換して一ページのデータを取り込みます。

    SELECT COUNT(*) AS totalRowCount FROM (SELECT * FROM Orders) t

    グリッドエンジンに直接対応するデータベース:Oracle、MySQL、HSQL、SQL Server 2012以上(order byを追加)

    注:マルチデータソースは現在、主にデータセット間にフィルタリング関係がないシーンをサポートしています。マルチデータソースのフィルタリングシーンは現在最適化されていないため、当面はお勧めしません。

    二.改ページSQLの作成が必要のデータベース

    データベースが上記のAccessデータベースのように改ページSQLを直接生成できないデータベースである場合は、改ページSQLを作成する必要があります。

    注:グリッドエンジンに対応しないデータベースの場合、グリッドエンジンにチェックを入れてから改ページSQLを追加する必要があります。グリッドエンジンにチェックを入れずに改ページSQLのみを追加しても、有効になりません。

    改ページSQLの作成を必要とするデータベース:SQLite、Access、SQL Server 2005、SQL Server 2008、INFORMIX、Sybaseなど

    三.Sqlite データベースの改ページ SQL

    FRDemo に内蔵された Sqlite を例に、Sqlite の改ページクエリの作成方法を説明します。

    1.新規データセット

    新規データセットds1:SELECT * FROM Orders

    2.改ページクエリSQL文を追加

    次に示すように、データクエリパネルで改ページクエリボタンをクリックし、改ページSQL文を編集します。

    01.png

    完全な改ページクエリーSQLは次の通りになります。

    SELECT * FROM ( SELECT * FROM( SELECT * FROM Orders ORDER BY OrderID ASC limit ${fr_pagesize*fr_pagenumber} ) AS e1
    ORDER BY OrderID DESC
    limit ${ if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),
    fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize) } ) AS e2
    ORDER BY OrderID ASC

    注:上記コードを改ページSQLパネルに配置する時、文中にある三つのORDER BYを絶対無くしてはなりません。

    注釈:

    ${if(fr_pagenumber ==int( (((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)}

    最後のページである場合、最後のページの残り行数を取り込み、最後のページでない場合は、各ページの要表示行数を取り込みます。例に示した各ページの要表示行数は30行になります。

    fr_pagenumber:現在閲覧されているページ数、例えば第2ページをプレビューする場合、fr_pagenumber=2になります。

    fr_rowcount:現在のデータセット内のデータの総数。

    fr_pagesize:グリッドエンジンを設定する時、各ページに表示する必要のある行数を示します。この例では、fr_pagesize = 30になります。

    プレビューする時、設定された改ページクエリは3つの変数の値に基づいてデータベースクエリを生成します。たとえば、fr_pagenumber=2fr_pagesize=30の場合、Web側で帳票をプレビューします。第2ページまでプレビューすると、上記のSQL文は次のように転換されます。

    SELECT * FROM ( SELECT * FROM ( SELECT * FROM Orders ORDER BY OrderID ASC limit 60 )AS e1 ORDER BY OrderID DESC limit30 ) AS e2 ORDER BY OrderID ASC

    第3ページまでプレビューする時、fr_pagenumber=3、SQL文は次のように転換されます。

    SELECT * FROM ( SELECT * FROM ( SELECT * FROM Orders ORDER BY OrderID ASC limit 90 )AS e1 ORDER BY OrderID DESC limit30) AS e2 ORDER BY OrderID ASC

    最後のページまでプレビューする時、残りのデータは30行未満の可能性があります。それではSQL文はどのように転換されるでしょうか?

    fr_rowcount=100fr_pagesize=30である場合、即ちデータの総行数が100行で、一ページにつき30行表示する時、最後のページまでプレビューすると、つまり第4ページになると、fr_pagenumber=4、SQL文は次のように転換されます。

    SELECT * FROM ( SELECT * FROM ( SELECT * FROM Orders ORDER BY OrderID ASC limit 120 )AS e1 ORDER BY OrderID DESC limit30) AS e2 ORDER BY OrderID ASC

    3.帳票主体設計

    下に示すように、データセットのデータ列をセルにドラッグします。

    02.png

    4.グリッドエンジン設定

    前節の設定方法と同じのため、ここでは繰り返さないことにします。

    5.効果確認

    改ページプレビューをクリックすると、次のように表示されます。

    03.png

    四. Access、SQLServer2008、SQLServer2005 データベースの改ページSQL文

    SELECT * FROM (
    SELECT TOP ${ if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize) } *
    FROM(
    SELECT TOP ${fr_pagesize*fr_pagenumber} *
    FROM Orders
    ORDER BY OrderID ASC
    ) AS e1
    ORDER BY OrderID DESC
    ) AS e2
    ORDER BY OrderID ASC

    注:SQLServer2008、SQLServer2005 及び Accessデータベースは操作手順が同じになります。

    五.SQLServer2008ビューテーブルの改ページSQL

    ビューテーブルを使用する時、上記のSQLをそのまま使うと、ページが繰り返し表示されます。そのため、SQLServerがビューを使用する場合、改ページSQLを作成する前に、row_numberを使用して、各データに番号を付けてorder byする必要があります。

    改ページSQLを使用する場合は、クエリを実行し、また改ページSQLにwhere条件を記述する必要があります。そうしない場合、データをクエリできません。

    04.png

    with t_rowtable
    as (
    select row_number() over(order by object_id DESC) as row_number,*
    from sys.[all_columns]
    where 1=1
    )
    SELECT *
    FROM (
    SELECT TOP ${ if(fr_pagenumber == int((((fr_rowcount-1)/6)+1)),fr_rowcount - (6*(fr_pagenumber-1)),6) } *
    FROM(
    SELECT TOP ${6*fr_pagenumber} *
    FROM t_rowtable ORDER BY row_number ASC
    ) AS e1
    ORDER BY row_number DESC
    ) AS e2
    ORDER BY row_number ASC

    Attachment List


    Theme: FineReport システム性能最適化
    既に最初
    既に最後
    • Helpful
    • Not helpful
    • Only read