接上一篇,看一下CrystalReport是通过什么样的办法来实现图表的。
新建一个网站,创建一个rpt文件,命名为CR1,并在字段资源管理器中添加一个xtreme.mdb实例库中的订单表,以这个表来行进图表的演示.下面分别来展示几个场景.
场景1:老板要最近几年,每年的订单总额,要表示明确.
解决方案:选中字段资源管理器,打开Crystal Report-插入工具栏的图表,打开图表专家,在类型选项卡上,在图表类型列表中,选择饼图,切换到数据选项卡,在可用字段列表中,是订单表中的所有字段,选择订单日期,添加到变更主体下方的列表框中,这里的意思是,以订单日期为单元来汇总数据,就是订单日期为一个变化的主体,来展现订单总额。然后选中订单金额,添加到显示值下方的列表中,显示值是以变更主体的基础上去整合的数据,这里合计订单金额,依据为变更主体。
在这里,老板要的是最近几年的一个总计,所以得改变更主体的日期,因为日期有日,周,月,季,年等单位,所以要选择顺序,在图表排序顺序中设置一下将打印该节为每年。订单金额应该为该年合计,现在看到显示值下方的订单金额,就是取的合计,如果要改变这种运算,可以选中订单金额合计,设置汇总运算,来改变对订单金额的运算。
在图中,图例显示的是比例,为了加入准备数字,需要把每年的合计加到饼形图中。选择饼形图,右键,图型选项,常规,在图表选项中,选择数据标签项,把显示值选中,再选中扇区上单选框,确定。
这样,报表的样式设置部分就设置好了,接下来来整合数据。
在项目中新建一个页面,从工具箱中填加一个CrystalReportViewer控件,在页面的cs中写入如下代码:
string path = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\xtreme.mdb;Persist Security Info=True";
string sql = "select * from 订单";
OleDbDataAdapter DA = new OleDbDataAdapter(sql, path);
DataTable DT = new DataTable();
DA.Fill(DT);
ReportDocument doc = new ReportDocument();
doc.Load(Server.MapPath(@"CR1.rpt"));
doc.SetDataSource(DT);
CRV.ReportSource = doc;
这段代码实现了从数据中查询订单,并把数据集绑定到报表上,实现预览报表。
在上面实场景中,是通过设置报表样式和整合报表数据两步来完成的,在设置报表样式部分,可以总结通过右键饼形图的三个菜单及设置对象格式,图表专家,图表选项来设置
设置对象格式:设置报表的整体属性,例如报表的边框,背景等
图表专家:本菜单是报表样式设置的主体,图表专家分四个部分,类型:图表的呈现方式;数据:报表数据的来源,及报表显示数据的整合区域;选项:对报表的详细数据展示样式作设置,不同的图表,选项的属性不同;文本:是对报表标题和脚注的一个样式设置。
图表选项:设置表报的样式,有一部份与图表专家选项相同,但比选项卡中更详细,全面。
场景2:老板要最近几年,每年各承运商承运的订单额
解决方案:现在发现有三个数据要素,年,承运商,订单金额,这样的数据,采用三维效果的堆积条形图来解决是比较好的。添加图表,选中条状图,并在右边的图表可视化区域选上三维效果的堆积条形图。然后切换到数据选项卡,在可用字段中显示的是订单表,向变更主体中添加订单日期,承运商,向显示值中添加订单金额。因为老板要的是以年为单位的,所以得改一下统计的方式,选变更主体中的订单日期,点击顺序,将打印该节下拉列表选成每年,确定。
为了使报表数据更明确,更符合常理,右键图表,图表选项,常规,数据标签,选中显示数据标签的多选按钮,标签位置选中Center,标签格式选Value。切换到数字,在类别的选项卡中选择货币即可,这样,整个报表就相对完整了。
报表数据的设置同上场景。
场景3:老板要最近几年的订单总额,但每年的条形柱上显示各季度的总额
解决方案:老板的这个要求看起来不难,与场景2极为类似,填加年与订单金额有可用的字段,但没有季度,接下来的难题就转到这个季度上了,在数据库中,可以用订单日期来得到相应的季度,算法也简单,就是 月整除4+1,有了这个公式就好办了,可以在字段管理器中,填加一个公式字段,在编辑框中输入Int (Month ({订单.订单日期})/4)+1,就能得到相应订单日期的季度了。其实在这里只关心季度就行,不用关心是那一年的季度。这里因为是以订单日期为主,以季度为辅作为变更主体的。
报表的数据就同上了。