Hap 报表开发示例

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

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

业务需求

报表需求.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 " 
}

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

添加查询参数.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 数据集表达式选择对应的字段,选择单元格,在数据集中对应的字段商双击即可,选择单元格可以为单元设置字体、前景色、背景色等样式。


    调用数据源.png

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


A2单元格默认聚集.png

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


切换为列表.png

A2单元格分组聚集.png

报表定义

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


    配置查询控件.png
参考:
  1. Hap 报表管理
  2. UReport 官方文档
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容