报表不仅是静态的,还可以动起来,本文会通过3个报表实战例子说明之。例如通过文档目录,用户可以非常清晰的查看报表数据结构,并能方便地跳转到指定的章节,最终还可以将报表导出为PDF等格式的文件。例如通过年度销售数据可以向下钻取到月度销售数据,从月度销售数据可以向下钻取到月度销售明细数据。
实战报表1: 交互式报表--向下钻取
在 ActiveReports 中可以动态的现实或者隐藏某区域的数据,通过该功能用户可以根据需要现实或者隐藏所关心的数据,结合数据排序、过滤等功能可以让用户更方便地分析报表数据。
Step 1: 添加rptDrillDown.rdlx报表模板
Step 2:添加报表数据源
用到的SQL:
select DatePart("yyyy",订单.订购日期) as 订购年, DatePart("m",订单.订购日期) as 订购月, 订单.订单ID, 订单.客户ID, 订单.订购日期, 产品.产品名称,订单明细.数量, 订单明细.单价, 订单明细.折扣, 类别.类别名称 from ((( 订单
inner join 订单明细 on 订单.订单ID = 订单明细.订单ID )
inner join 产品 on 订单明细.产品ID = 产品.产品ID )
inner join 类别 on 产品.类别ID = 类别.类别ID)
order by DatePart("yyyy",订单.订购日期) desc;
Step 3:设计BandedList(多区域列表)报表控件
BandedList 中可以设置任意数量的区域,您可以将控件放置在各个区域中。明细区域将根据数据集中的数据进行重复显示,BandedList 的设计界面与区域报表的界面有些类似。
可通过右键弹出的菜单,添加一个Head(区域1)、一个分组头(区域2)、一个Detail区域(区域3),结果如下所示:
分别在这3个区域内拖入TextBox控件、Chart控件,并修改属性绑定数据源字段。
为了实现动态点击往下专区,需要修改如下的属性:
分组头区域(区域2)默认是隐藏的: “Hidden = True”
当点击TextBox2的时候,会触发显示这个区域:“ToggleItem = TextBox2”
实战报表2: 交互式报表--主从联动
ActiveReports具有极强的报表交互能力,主从联动是应用系统中常见的功能,从上一级的选择决定下一级报表的显示结果。
Step 1: 添加rptMasterDetails.rdlx报表模板
Step 2:添加报表数据源
这个例子中,我们使用了2个数据源用于报表设计。
用到的SQL 1:
select Top 5 * from 供应商
用到的SQL 2:
select 产品.*, 供应商.公司名称, 类别.类别名称
from (产品 inner join 供应商 on 产品.供应商ID = 供应商.供应商ID ) inner join 类别 on 产品.类别ID = 类别.类别ID
where 公司名称 in(?)
SQL 2里面的?是有用途的,在Step 4再做解读。
Step 3:设计报表布局
区域1:显示供应商列表,由一个完整的Table报表控件实现布局。
区域2:显示的是供应产品列表,通过区域1传递供应商名称显示,由一个完整的Table报表控件实现布局。
Step 4:实现报表主从联动
实现主从联动,有2个核心
第一个:报表参数, 即通过参数的传递实现子报表内容的程序,包括SQL语句的查询传递参数(Step 2里面的?那个符号)
第二个:报表跳转,即通过点击某个数据(TextBox、Label等报表控件)会触发这个事件
然后修改DataSet3数据源,新增一个参数:
这样就可在查询里面写SQL了,用?来代替参数值,可实现动态的传递查询,SQL语句查询。
调用是通过Action实现的,图解如下
另外,为了实现没有点击供应商的时候隐藏Table2,请在Table2中添加如下属性设置:
Hidden:=IIF( Parameters!CompanyName.Value =null , true,false)
实战报表3: 交互式报表--文档目录
通过文档目录,用户可以非常清晰的查看报表数据结构,并能方便地跳转到指定的章节,最终还可以将报表导出为PDF等格式的文件。
Step 1: 添加rptMonthlySalesByCategory.rdlx报表模板
Step 2:添加报表数据源
用到的SQL:
SELECT DATEPART("yyyy",订单.订购日期) AS 订购年, DATEPART("m",订单.订购日期) AS 订购月, 类别.类别名称, 类别.说明, 产品.产品名称, 订单明细.数量, 订单明细.单价, 订单明细.折扣 FROM (( 订单
INNER JOIN 订单明细 ON 订单.订单ID = 订单明细.订单ID)
INNER JOIN 产品 ON 订单明细.产品ID = 产品.产品ID)
INNER JOIN 类别 ON 产品.类别ID = 类别.类别ID
WHERE DATEDIFF("yyyy",订单.订购日期,'2012-01-01') = 0
ORDER BY DATEPART("yyyy",订单.订购日期), DATEPART("m",订单.订购日期), 类别.类别ID, 订单明细.产品ID
Step 3:设计TableOfContents报表目录控件
设置TableOfContents的Levels属性如下所示
官方提供的完整demo和中文数据库文件下载地址:
为了方便共享和交流,还可通过Git@OSC进行Watch。