任何报表都以页面的形式呈现,因此看作一个普通的功能模块,报表中的数据可以导出为Excel、Word、PPT、PDF等格式的文件保存。
下面以一个简单报表的示例介绍Hap报表开发的流程:
业务需求
该报表以订单头表为基础,关联了区域表等表。
其中,还要可以根据订单头表的业务实体字段,日期字段进行查询。
开发步骤
报表设计
报表设计中的数据源包含数据库连接、Spring Bean连接,内置数据源连接三种,本次开发用到的是内置数据源连接,三者的区别参见UReport文档 报表存储与数据源配置。
设计报表的第一步是创建数据集,数据集类似于数据库中视图的概念,一个数据源可以包含多个数据集,实现本次需求可以选择配置多个数据集(如区域表),在报表设计时进行关联,具备较大的灵活性,也可以定义一个数据集,在SQL中进行关联,开发难度较低,本次选择了第二钟方式。
- 根据所需的字段编写基础的SQL
SELECT
to_char(oooh.booked_date, 'yyyy-mm-dd') AS booked_date,
oooha2.delivery_date,
oooha2.suit_count,
oooh.customer_po_number,
ooot.order_type_name,
oooha2.order_amount,
mct.territory_name,
mcra.region_name,
mcra2.region_name city
FROM oms_oe_order_headers oooh
JOIN (
SELECT
oool.header_id,
oooha.suit_count,
MIN(oool.delivery_date) delivery_date,
ROUND(SUM(oooha.suit_count * oool.ordered_quantity * oool.unit_price),5) order_amount
FROM oms_oe_order_lines oool
JOIN oms_oe_order_header_atts oooha ON oool.header_id = oooha.header_id
GROUP BY (oool.header_id, oooha.suit_count)
) oooha2 ON oooh.header_id = oooha2.header_id
LEFT JOIN mdm_cust_territories mct ON oooh.territory_id = mct.territory_id
LEFT JOIN oms_oe_order_types ooot ON oooh.order_type_id = ooot.order_type_id
LEFT JOIN mdm_cust_account_sites_all mcasa ON mcasa.account_site_id = oooh.account_site_id
LEFT JOIN mdm_cust_regions_all mcra ON mcasa.province = mcra.region_code
LEFT JOIN mdm_cust_regions_all mcra2 ON mcasa.city = mcra2.region_code
- 配置数据源,生成数据集
${}
返回的是一个sql字符串,其中可以使用UReport中的所有函数,类似与Mybaits的SqlProvider,建议用sql压缩工具对以上sql代码进行压缩, 删除多余的空格, 否则编辑器可能出现无法识别字符串换行的问题,注意对字符串中的引号进行转义, 以下为示例代码。
${
"SELECT to_char(oooh.booked_date, \'yyyy-mm-dd\') AS booked_date, oooha2.delivery_date, oooha2.suit_count , oooh.customer_po_number, ooot.order_type_name, oooha2.order_amount, mct.territory_name, mcra.region_name AS province , mcra2.region_name AS city FROM oms_oe_order_headers oooh JOIN ( SELECT oool.header_id, oooha.suit_count, MIN(oool.delivery_date) AS delivery_date , ROUND(SUM(oooha.suit_count * oool.ordered_quantity * oool.unit_price), 5) AS order_amount FROM oms_oe_order_lines oool JOIN oms_oe_order_header_atts oooha ON oool.header_id = oooha.header_id GROUP BY (oool.header_id, oooha.suit_count) ) oooha2 ON oooh.header_id = oooha2.header_id LEFT JOIN mdm_cust_territories mct ON oooh.territory_id = mct.territory_id LEFT JOIN oms_oe_order_types ooot ON oooh.order_type_id = ooot.order_type_id LEFT JOIN mdm_cust_account_sites_all mcasa ON mcasa.account_site_id = oooh.account_site_id LEFT JOIN mdm_cust_regions_all mcra ON mcasa.province = mcra.region_code LEFT JOIN mdm_cust_regions_all mcra2 ON mcasa.city = mcra2.region_code where 1=1 "
}
分别添加查询参数,可以为查询参数指定默认值
以业务实体为例,可以通过
:unitId
在sql中获取查询参数的值,注:查询参数最后以查询字符串的形式拼接到报表页面URL后面
${
"SELECT to_char(oooh.booked_date, \'yyyy-mm-dd\') AS booked_date, oooha2.delivery_date, oooha2.suit_count , oooh.customer_po_number, ooot.order_type_name, oooha2.order_amount, mct.territory_name, mcra.region_name AS province , mcra2.region_name AS city FROM oms_oe_order_headers oooh JOIN ( SELECT oool.header_id, oooha.suit_count, MIN(oool.delivery_date) AS delivery_date , ROUND(SUM(oooha.suit_count * oool.ordered_quantity * oool.unit_price), 5) AS order_amount FROM oms_oe_order_lines oool JOIN oms_oe_order_header_atts oooha ON oool.header_id = oooha.header_id GROUP BY (oool.header_id, oooha.suit_count) ) oooha2 ON oooh.header_id = oooha2.header_id LEFT JOIN mdm_cust_territories mct ON oooh.territory_id = mct.territory_id LEFT JOIN oms_oe_order_types ooot ON oooh.order_type_id = ooot.order_type_id LEFT JOIN mdm_cust_account_sites_all mcasa ON mcasa.account_site_id = oooh.account_site_id LEFT JOIN mdm_cust_regions_all mcra ON mcasa.province = mcra.region_code LEFT JOIN mdm_cust_regions_all mcra2 ON mcasa.city = mcra2.region_code where 1=1 " +
(param("unitId") == null || param("unitId") == "" ? "" : "and oooh.unit_id = :unitId ") +
(param("startDate") == null || param("startDate") == "" ? "" : "and oooh.booked_date > :startDate ") +
(param("endDate") == null || param("endDate") == "" ? "" : "and oooh.booked_date < :endDate ") +
"order by oooh.booked_date asc"
}
点击保存按钮,将设计的报表以XML的格式保存进数据库
数据集SQL编写完成后可以点击数据预览进行简单检查
-
将数据集放到表格中
第一行设置报表的表头,第二行通过UReport 数据集表达式选择对应的字段,选择单元格,在数据集中对应的字段商双击即可,选择单元格可以为单元设置字体、前景色、背景色等样式。
注意:单元格有左父格和上父格的概念,单元格默认随父格展开,单元格默认的聚集方式为分组。
将A2单元格聚集方式调整为列表,操作如下图所示:
报表定义
- 基础配置
报表编码: 不与已定义的报表重复即可
报表文件: 选择报表设计中生成的XML文件
报表名称、报表描述: 自己定义
点击保存 -
添加查询控件
点击报表参数下的编辑按钮,进入查询控件添加界面
unitId对应输入框 ,startDate、endDate对应日期框,分别从字段名下拉框选择在数据集定义中定义的参数,行号为控件出现的顺序,保存,点击预览。