“戴帽”分栏报表的实现

我是社区第395637位番薯,欢迎点我头像关注我哦~
报表模板投稿
功能演示:
功能说明:
1.用一个模板实现分栏报表。报表包含一个整体的表头和表尾
2.导出的word文档全部内容可编辑
3.补全空白行
4最后一个分栏空白行显示“以下空白”
爬坑历程。

      由于这批报表是一个行业标准,必须按照模板来。其他报表通过帆软已经实现了。如果这个不能实现,所有都得推倒重来。
1.直接用分栏报表。整体的表头和表尾格式都乱套了。补充空白行也不行。不知道是不是一个bug。
2.分栏用子报表来实现。然后表头和表尾放在主报表。显示格式也调整好了。但是子报表是一张图片。不符合要求,只好当作一个备选方案,被淘汰的几率很大。。。

以上两种方式都不行,最后决定用原生的方式再尝试一把。主要解决方案思路如下:SQL是针对MYSQL数据库的
1. 用SQL生成左列的数据源。然后生成一个索引字段为page页码“-”行序列。SQL如下:
  1. SELECT
  2. xuhao+1 xuhao, CONCAT(xuhao DIV 44, '-', MOD(xuhao, 22)) page_row_key,  -- 这个就是当前页的行数关键字
  3. HYDROTEST_PKG_NO, LINE_NO
  4. FROM
  5. (SELECT (@i := @i + 1) AS xuhao, HYDROTEST_PKG_NO, LINE_NO FROM
  6. (SELECT
  7. phtp.HYDROTEST_PKG_NO,
  8. phtpd.LINE_NO
  9. FROM pro_hydro_test_pkg phtp
  10. LEFT JOIN pro_hydro_test_pkg_dtl phtpd
  11. ON phtp.PRO_PROJECT_INFO_ID = phtpd.PRO_PROJECT_INFO_ID
  12. AND phtp.PLANT_UNIT = phtpd.PLANT_UNIT
  13. AND phtp.HYDROTEST_PKG_NO = phtpd.PRO_HYDRO_TEST_PKG_NO
  14. WHERE phtp.STATUS = 'submitted'
  15. AND phtpd.LINE_NO IS NOT NULL
  16. ORDER BY phtp.HYDROTEST_PKG_NO,
  17. phtpd.LINE_NO) pkgLine ,
  18. (SELECT @i := -1) t ) pageRet
  19. WHERE MOD(xuhao, 44) DIV 22 = 0 --一页显示44条,一列显示22条,所以这个条件就是把所有左列的数据筛选出来。
复制代码
2. 用SQL生成右列的数据源。然后生成一个索引字段为page页码“-”行序列。
  1. SELECT
  2. xuhao+1 xuhao, CONCAT(xuhao DIV 44, '-', MOD(xuhao, 22)) page_row_key,  -- 这个就是当前页的行数关键字
  3. HYDROTEST_PKG_NO, LINE_NO
  4. FROM
  5. (SELECT (@i := @i + 1) AS xuhao, HYDROTEST_PKG_NO, LINE_NO FROM
  6. (SELECT
  7. phtp.HYDROTEST_PKG_NO,
  8. phtpd.LINE_NO
  9. FROM pro_hydro_test_pkg phtp
  10. LEFT JOIN pro_hydro_test_pkg_dtl phtpd
  11. ON phtp.PRO_PROJECT_INFO_ID = phtpd.PRO_PROJECT_INFO_ID
  12. AND phtp.PLANT_UNIT = phtpd.PLANT_UNIT
  13. AND phtp.HYDROTEST_PKG_NO = phtpd.PRO_HYDRO_TEST_PKG_NO
  14. WHERE phtp.STATUS = 'submitted'
  15. AND phtpd.LINE_NO IS NOT NULL
  16. ORDER BY phtp.HYDROTEST_PKG_NO,
  17. phtpd.LINE_NO) pkgLine ,
  18. (SELECT @i := -1) t ) pageRet
  19. WHERE MOD(xuhao, 44) DIV 22 = 1 --一页显示44条,一列显示22条,所以这个条件就是把所有右列的数据筛选出来。
复制代码
3.用左列的索引字段去过滤生成的
截图202011160843028396.png
4. 添加“以下空白”及补充空白行
由于用SEQ去判断添加右侧的第一个空白行为“以下空白”,所以在第五步添加了一个补充空白行的数据源
5.补充空白行的数据源
  1. SELECT xuhao, spaceChar FROM (select 1 id, '' xuhao, '以下空白' spaceChar union
  2. select 2 id, '' xuhao, '' spaceChar union
  3. select 3 id, '' xuhao, '' spaceChar union
  4. select 4 id, '' xuhao, '' spaceChar union
  5. select 5 id, '' xuhao, '' spaceChar union
  6. select 6 id, '' xuhao, '' spaceChar union
  7. select 7 id, '' xuhao, '' spaceChar union
  8. select 8 id, '' xuhao, '' spaceChar union
  9. select 9 id, '' xuhao, '' spaceChar union
  10. select 10 id, '' xuhao, '' spaceChar union
  11. select 11 id, '' xuhao, '' spaceChar union
  12. select 12 id, '' xuhao, '' spaceChar union
  13. select 13 id, '' xuhao, '' spaceChar union
  14. select 14 id, '' xuhao, '' spaceChar union
  15. select 15 id, '' xuhao, '' spaceChar union
  16. select 16 id, '' xuhao, '' spaceChar union
  17. select 17 id, '' xuhao, '' spaceChar union
  18. select 18 id, '' xuhao, '' spaceChar union
  19. select 19 id, '' xuhao, '' spaceChar union
  20. select 20 id, '' xuhao, '' spaceChar union
  21. select 21 id, '' xuhao, '' spaceChar) spacetbl
  22. where id<=${idnum} and 22!=${idnum}
复制代码
6. 补充空白行
截图202011160855275138.png

由于内部数据集不支持SQL,模板也没必要上传了。整体思路就是这样。
希望抛砖引玉,大家对这种报表有别的解决方案,欢迎大家踊跃留言。

编辑于 2020-11-16 08:55  
编辑于 2020-11-16 08:56  

发表于 2020-11-17 19:07:04
我感觉还是需要上传模板。否则真是难折腾出来
发表于 2020-11-18 07:44:23
不需要那么麻烦用结果集分栏就可以实现了
编辑于 2020-11-30 15:51  
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

11回帖数 6关注人数 5330浏览人数
最后回复于:2022-11-9 10:03

返回顶部 返回列表