出典:
https://forums.opentext.com/forums/discussion/173783/dynamic-grouping-of-crosstab-in-birt#latest
事業が完了して、時には我々は、毎日、毎週、毎月、毎年のダイナミックグループ化を達成するための時間の長さに基づいて、動的なクロスパケット統計の時間に基づいてする必要があります。たとえば、次のビジネスニーズに基づいて会社、統計的な受注を達成するために、一定期間内の2つのパラメータ(開始日、終了日)を実行する必要があります。次のように統計的なルールは以下のとおりです。
例:入力パラメータ値、日付の差を計算します。
VAR差分=終了日-間隔の日数----開始日
の場合(差分<15)
「に設定した日付は」日付パケットとして表示されている
場合(差分> 15)
「に設定した日付が」周パケットとして表示されている
場合(デフ> 30)
「に設定した日付は」月として表示されるようにグループ化された
(差分> 365)があれば
年を表示するグループの「設定日」となります
小さなパートナーは、それに圧倒ビットではありませんか?上記の問題は、本質的にデータ準備の問題ですが、SQLまたはスクリプトのデータソースは、コードに重いワークロードをそのように書くのは難しいです;ない普遍的と非常に厄介な、列を非表示にするレポートを使用する2番目の方法を取りました。だから、より良い解決策は、問題のすべての種類が簡単になります解決するためのレポートツールで設定したカウントを導入することです。ここでは、バートレポートツールを持って、例えば、実装プロセスについて教えてください。他のレポートツールのために似ています。
この場合、入力パラメータに応じて、2012-07-04 2014年5月6日開始注文の総数、総運賃、注文の総量この期間の終わりに、企業から統計。データシート「ORDERS」生データを次のように
私たちは、この問題解決直視はSPLコードを設定し、解決します:
A | B | C | |
1 | =( "デモ")を接続します | //データベースに接続します | |
2 | = A1.query( "ORDERID、ORDERDATE貨物を選択し、ORDERDATE> =?とORDERDATE <= ORDERSからORDERAMOUNT"、たstartDate、endDateに) | //日付、たstartDateとendDateに日付パラメータ間のORDERSテーブルの注文データの最初から最後まで統計の日付をチェックしてください。 | |
3 | =間隔(たstartDate、endDateに) | //開始日と終了日の間の日数を計算します | |
4 | 365> A3であれば | //間隔は日数、1年365日の記者パケットよりも大きい場合 | |
5 | =たstartDate | A3(経過@ yを(たstartDate、〜))。 | //年によってシーケンステーブルのパケットを計算 | |
6 | = A2.group(B5.pseg(ORDERDATE)〜.count(ORDERID):TotalOrder、ラウンド(〜.SUM(運賃)、2):TotalFreight、ラウンド(〜.SUM(ORDERAMOUNT)、2):TotalOrderAmount、B5 (#):BEGINDATE) | A2グループの//プレスB5範囲、統計のための注文の合計数、運賃、総受注金額、小数点以下2桁、そして最後の一つとしてB5の合計数。 | |
7 | = B6.new(開始日:日付を起動し、#2:全順序、#3:TotalFreight、#4:TotalOrderAmount) | //新しいシーケンステーブルの結果を生成するために必要なデータ系列を削除します | |
8 | > A1.close() | //データベースを閉じます | |
9 | リターンB7 | //戻り結果セットは、年によってグループ化 | |
10 | それ以外の場合はA3> 30 | //間隔は日30日365日&以下の数よりも大きい場合、プレスパケット月 | |
11 | =たstartDate | A3(経過する@ M(たstartDate、〜))。 | //月でシーケンステーブルのパケットを計算 | |
12 | =A2.group(B11.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(FREIGHT),2):TotalFreight,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,B11(#):BeginDate) | //按 B11 区间对 A2 分组,统计出订单总数,运货费总数,订单金额总数,保留两位小数,并将 B11 作为最后一列。 | |
13 | =B12.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalFreight,#4:TotalOrderAmount) | ||
14 | >A1.close() | ||
15 | return B13 | //返回按月份分组的结果集 | |
16 | else if A3>15 | //如果天数间隔大于 15 天 & 小于等于 30 天,则按星期分组 | |
17 | =startDate|A3.(elapse(startDate,7*~)) | //计算出按星期的分组序表 | |
18 | =A2.group(B17.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(FREIGHT),2):TotalFreight,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,B17(#):BeginDate) | /按 B17 区间对 A2 分组,统计出订单总数,运货费总数,订单金额总数,保留两位小数,并将 B17 作为最后一列。 | |
19 | =B18.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalFreight,#4:TotalOrderAmount) | ||
20 | >A1.close() | ||
21 | return B19 | //返回按星期分组的结果集 | |
22 | else | //如果天数间隔小于 15 天,则按日期分组 | |
23 | =startDate|A3.(elapse(startDate,~)) | //计算出按日期的分组序表 | |
24 | = A2.group(B23.pseg(ORDERDATE)〜.count(ORDERID):TotalOrder、ラウンド(〜.SUM(運賃)、2):TotalFreight、ラウンド(〜.SUM(ORDERAMOUNT)、2):TotalOrderAmount、B23 (#):BEGINDATE) | /最後の一つとしてグループA2、統計のための注文の合計数、小数点以下2桁運賃、総受注金額の合計数、およびB23のプレスB23の範囲。 | |
25 | = B24.new(開始日:日付を起動し、#2:全順序、#3:TotalFreight、#4:TotalOrderAmount) | ||
26 | > A1.close() | ||
27 | B25を返します | //戻り結果セットは、日付ごとにグループ化され |
コードリゾルバSPL order.dfxのセットはファイルとして保存され、その後、BIRTレポートに導入します。引用した記事のドライ・カレッジを参照するにはどのように「BIRTスクリプトは、SPLを呼び出します。」
次の表のBIRTレポートのデザイン:
レポートセットソルバメソッドを呼び出して、そのようなBIRT集中手順で記憶されたデータと全く同じストアドプロシージャを呼び出す命令を呼び出すことができる(?、?)を呼び出します。
次に、我々はWEBプレビューは、異なる入力パラメータの結果をプレビューする場合を見てみましょう。
(1)入力パラメータ:2012-07-04開始時間、365より大きい数日2014年5月6日の終了時間間隔が、今年はパケットに表示しました。
(2)入力パラメータ:2012年7月15日、開始時刻、30より大きい数日2012年12月3日の最後の時間間隔は、月はパケットに表示しました。
(3)入力パラメータ:2012-07-20開始時刻、終了時刻は、グループ週に表示さ日2012年8月15日15の数よりも大きいです。
(4)入力パラメータ:2012-07-04開始時間、15より2012-07-18少ない数日の終了時間間隔、パケット内に表示される日付。