Jack-Leung

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

现在报表上有个数据源:ds1,ds1包含一个表:dt1,dt1有3列c1,c2,c3(double类型的)
现在我想做以下事情:
1. 在水晶报表上显示3个数据:c1sum(c1列的和),c2avg(c2列的平均值),c3max(c3列最大值);
2. 在水晶报表上显示一个数值:double1 = 100.0;
3. 在水晶报表上显示一个值:double2 = c1sum + c2avg + c3max + double1;

这是我的测试数据及最后的效果(方案二的效果)

我这边给出两种方案:
一种是先把数据处理好,报表直接显示即可;
另一种则是在水晶报表内部处理数据。

关于如何在水晶报表中引用数据集,请参考http://topic.csdn.net/u/20100530/13/64b77d5f-94ed-42e0-9abc-b01a04fede22.html前半部分
我这边的数据集建了两个DataTable(根据方案选择其中一个即可),如图示:

这边每个列的数据类型都设为System.Double

方案一:
先在数据源头把数据处理好,再传给水晶报表。
先看报表的设计模板

这边有两个公式字段double1和double2(在字段资源管理器中右击公式字段,点新建),
其中double1的公式内容就是常数100.0(直接输入100.0即可);
double2的公式内容为:
{DataTable1.SumC1}+{DataTable1.AvgC2}+{DataTable1.MaxC3}+{@double1}
关键代码段:

view plaincopy to clipboardprint?
string strConnString = @"Data Source=Q-LUOLISHUANG\SQLEXPRESS;Initial Catalog=myDatabase;User Id=sa;Password=luols;";  
SqlConnection conn = new SqlConnection(strConnString);  
 
//这里为了和数据集里的列名保持一致,特别用as取了别名  
//务必保持一致!!  
string strSQL = "select sum(c1) as SumC1,avg(c2) as AvgC2,max(c3) as MaxC3 from myTable"; //在这边先处理好数据  
SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);  
DataSet1 myDataSet = new DataSet1();  
da.Fill(myDataSet.DataTable1); //把查询到的数据“塞”到数据集  
 
CrystalReport1 myReport = new CrystalReport1();  
myReport.SetDataSource(myDataSet);  
crystalReportViewer1.ReportSource = myReport; 
            string strConnString = @"Data Source=Q-LUOLISHUANG\SQLEXPRESS;Initial Catalog=myDatabase;User Id=sa;Password=luols;";
            SqlConnection conn = new SqlConnection(strConnString);

            //这里为了和数据集里的列名保持一致,特别用as取了别名
            //务必保持一致!!
            string strSQL = "select sum(c1) as SumC1,avg(c2) as AvgC2,max(c3) as MaxC3 from myTable"; //在这边先处理好数据
            SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
            DataSet1 myDataSet = new DataSet1();
            da.Fill(myDataSet.DataTable1); //把查询到的数据“塞”到数据集

            CrystalReport1 myReport = new CrystalReport1();
            myReport.SetDataSource(myDataSet);
            crystalReportViewer1.ReportSource = myReport;

方案二:
在报表内部处理数据(插入三个汇总字段)即可。
先看报表的设计模板

Col1,Col2,Col3三个字段可以根据你的需要是否要拖放到报表
好了,看完模板首先要知道如何插入汇总字段,这是最重要的,在报表空白处点右键,如图示

上图是对Col1汇总操作,所以汇总类型是求和,对Col2汇总时,汇总类型应是‘平均’,而对Col3汇总时,其类型应是‘最大’
这边也有两个公式,double1是常数和方案一 一样,double2的公式内容则是:
Sum ({DataTable2.Col1})+Average ({DataTable2.Col2})+Maximum ({DataTable2.Col3})+{@double1}
关键代码段:

view plaincopy to clipboardprint?
string strConnString = @"Data Source=Q-LUOLISHUANG\SQLEXPRESS;Initial Catalog=myDatabase;User Id=sa;Password=luols;";  
SqlConnection conn = new SqlConnection(strConnString);  
 
//这里为了和数据集里的列名保持一致,特别用as取了别名  
//务必保持一致!!  
string strSQL = "select c1 as Col1,c2 as Col2,c3 as Col3 from myTable"; //原始数据传给报表,让报表去处理  
SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);  
DataSet1 myDataSet = new DataSet1();  
da.Fill(myDataSet.DataTable2); //把查询到的数据“塞”到数据集  
 
CrystalReport1 myReport = new CrystalReport1();  
myReport.SetDataSource(myDataSet);  
crystalReportViewer1.ReportSource = myReport; 
            string strConnString = @"Data Source=Q-LUOLISHUANG\SQLEXPRESS;Initial Catalog=myDatabase;User Id=sa;Password=luols;";
            SqlConnection conn = new SqlConnection(strConnString);

            //这里为了和数据集里的列名保持一致,特别用as取了别名
            //务必保持一致!!
            string strSQL = "select c1 as Col1,c2 as Col2,c3 as Col3 from myTable"; //原始数据传给报表,让报表去处理
            SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
            DataSet1 myDataSet = new DataSet1();
            da.Fill(myDataSet.DataTable2); //把查询到的数据“塞”到数据集

            CrystalReport1 myReport = new CrystalReport1();
            myReport.SetDataSource(myDataSet);
            crystalReportViewer1.ReportSource = myReport;

仅供参考,有什么问题欢迎指正。。

水晶报表交叉表及数据过滤基础篇http://topic.csdn.net/u/20100530/13/64b77d5f-94ed-42e0-9abc-b01a04fede22.html

 http://blog.csdn.net/ajaxtop/archive/2009/10/29/4743811.aspx)水晶报表(CrystalReports)的简单应用(配置及发布)  

posted on 2011-04-01 11:44  Jack.leung  阅读(571)  评论(0编辑  收藏  举报