ActiveReports for.Netレポート開発のクロスレポート

16314 ワード

【IT 168技術文書】
クロス・レポートは一般的なレポート・タイプであり、開発も煩わしいレポートです.ActiveReportでは、クロス・レポートに十分な柔軟性を提供し、複雑なビジネス・ロジックに対応できます.前のエッセイで主従表を示した後、このエッセイではクロスレポートの作成方法を簡単に紹介します.クロス・レポートの一般的なアプリケーションの1つは、売上高を表示するレポートとして使用されます.たとえば、複数のチェーン店の1年以内の毎月の売上高を表示し、月を列として表示することがよくあります.各店は1行で表示されます.
店名
1月
2月
3月
……………
AC
500
200
10000
……………
BC
511
85245
4545
……………
しかし、データベース内のストレージは、次のような方法で使用されることが多い.
Sales
Month
Shop
12312
1
AB
243423
2
AB
323232
3
AB
1231312
1
BC
1232
2
BC
これにより、表示前にデータを処理し、売上高と月を列に変換する必要があります.データを取得する際にsqlを使用してこれらの操作を行うことができます.ここでは、activeReportでの使用を示すために、変換をレポートに入れて作成します.例を簡略化するために、最初の四半期の毎月の売上高だけを表示します.
    1. データの取得:
SelectSales,Month,Shop from CrossReport Order by Shopのようなsqlを使用してデータを直接取得し、合計や変換処理を行わない.
    2. 変換:
最終的に表示するレコードを表す簡単なオブジェクトを定義します.



  
    
public class Sale { public decimal money1; // public decimal money2; // public decimal money3; // public string shopname; }

同時に、変換後のデータを保存するためにSaleのセットsalesを定義します.表には各店舗で複数のレコードが対応しているため、複数のレコードを1つにまとめるために、以下の変換動作を行います.



  
    
// ArrayList shopname = new ArrayList(); while (dr.Read()) { if ( ! shopname.Contains(dr.GetString( 2 ))) // { Sale s = new Sale (); s.shopname = dr.GetString( 2 ); // shopname.Add(s.shopname); if (dr.GetInt32( 1 ) == 1 ) // { s.money1 = dr.GetDecimal( 0 ); } else if (dr.GetInt32( 1 ) == 2 ) // { s.money2 = dr.GetDecimal( 0 ); } else if (dr.GetInt32( 1 ) == 3 ) // { s.money3 = dr.GetDecimal( 0 ); } sales.Add(s); } else // { Sale s = (Sale)sale [sales.Count - 1 ]; if (dr.GetInt32( 1 ) == 1 ) { s.money1 = dr.GetDecimal( 0 ); } else if (dr.GetInt32( 1 ) == 2 ) { s.money2 = dr.GetDecimal( 0 ); } else if (dr.GetInt32( 1 ) == 3 ) { s.money3 = dr.GetDecimal( 0 ); } } }

    3. 表示:データベースから取り出したレコードを変換し、レポートに表示するフォーマットにします.次に、Salesコレクションのデータをレポートに表示します.前のエッセイで説明した方法に従って、インタフェースにコントロールを配置し、そのFiledNameフィールドを設定してレポートのDataInitializeイベントにFiledセットを設定し、データを取り出します.



  
    
this .Fields.Add( " money1 " ); this .Fields.Add( " money2 " ); this .Fields.Add( " money3 " ); this .Fields.Add( " shopname " ); this .GetReportData(); //

最後のレコードが表示されたかどうかを示すタグを設定します.



  
    
int index = 0 ;

FetchDataイベントにSalesコレクションのデータを表示します.



  
    
if (index == sales.Count ) // { eArgs.EOF = true ; return ; } else { eArgs.EOF = false ; } Sale s = (Sale)sales[index]; this .Fields[ " shopname " ].Value = s.shopname; this .Fields[ " money1 " ].Value = s.money1; this .Fields[ " money2 " ].Value = s.money2; this .Fields[ " money3 " ].Value = s.money3; index += 1 ;

上記の手順に従って、主要なコードはすべて完了しました.もちろん、フォームに表示し、Viewerを追加して、ロードされたレポートを指定します.



  
    
ActiveReports1 rpt = new ActiveReports1(); rpt.Run(); this .viewer1.Document = rpt.Document;

表示の効果に不満がある場合は、レポートにオンラインボックスを付けて表に表示することができます.まとめ:例のコードは重複しているが,変換の過程を説明するために最適化されていない,また,コードにArrayListが用いられ,箱詰め,解体の動作が現れるため,性能に最適化の余地があることも分かる.表データから表示用データへの変換はSqlで行うことができますが、ビジネスロジックが複雑な場合、Sqlは力不足に見えます.例えば、毎月のデータを表示し、収入、支出もあります.税金、割引、損失、賃貸料、前年同期との比較など予測できないビジネスロジックを加えると、SQLをコードに書くと、デバッグが問題になり、ストレージプロセスに書くと、パッケージを破壊しました.したがって,コードでの変換作業は複雑であるが,柔軟な利点がある.