Hap 报表开发示例

任何报表都以页面的形式呈现,因此看作一个普通的功能模块,报表中的数据可以导出为Excel、Word、PPT、PDF等格式的文件保存。

下面以一个简单报表的示例介绍Hap报表开发的流程:

业务需求

Hap 报表开发示例_第1张图片
报表需求.png

该报表以订单头表为基础,关联了区域表等表。
其中,还要可以根据订单头表的业务实体字段,日期字段进行查询。

开发步骤

报表设计

报表设计中的数据源包含数据库连接、Spring Bean连接,内置数据源连接三种,本次开发用到的是内置数据源连接,三者的区别参见UReport文档 报表存储与数据源配置。
设计报表的第一步是创建数据集,数据集类似于数据库中视图的概念,一个数据源可以包含多个数据集,实现本次需求可以选择配置多个数据集(如区域表),在报表设计时进行关联,具备较大的灵活性,也可以定义一个数据集,在SQL中进行关联,开发难度较低,本次选择了第二钟方式。

  1. 根据所需的字段编写基础的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
  1. 配置数据源,生成数据集
    ${}返回的是一个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 " 
}

分别添加查询参数,可以为查询参数指定默认值

Hap 报表开发示例_第2张图片
添加查询参数.png

以业务实体为例,可以通过 :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编写完成后可以点击数据预览进行简单检查

  1. 将数据集放到表格中
    第一行设置报表的表头,第二行通过UReport 数据集表达式选择对应的字段,选择单元格,在数据集中对应的字段商双击即可,选择单元格可以为单元设置字体、前景色、背景色等样式。


    Hap 报表开发示例_第3张图片
    调用数据源.png

注意:单元格有左父格和上父格的概念,单元格默认随父格展开,单元格默认的聚集方式为分组。


Hap 报表开发示例_第4张图片
A2单元格默认聚集.png

将A2单元格聚集方式调整为列表,操作如下图所示:


Hap 报表开发示例_第5张图片
切换为列表.png

Hap 报表开发示例_第6张图片
A2单元格分组聚集.png

报表定义

  1. 基础配置
    报表编码: 不与已定义的报表重复即可
    报表文件: 选择报表设计中生成的XML文件
    报表名称、报表描述: 自己定义
    点击保存
  2. 添加查询控件
    点击报表参数下的编辑按钮,进入查询控件添加界面
    unitId对应输入框 ,startDate、endDate对应日期框,分别从字段名下拉框选择在数据集定义中定义的参数,行号为控件出现的顺序,保存,点击预览。


    Hap 报表开发示例_第7张图片
    配置查询控件.png
参考:
  1. Hap 报表管理
  2. UReport 官方文档

你可能感兴趣的:(Hap 报表开发示例)