苍穹报表列表动态添加列原创
金蝶云社区-聚宝彭
聚宝彭
5人赞赏了该文章 3,916次浏览 未经作者许可,禁止转载编辑于2022年03月29日 10:25:53
summary-icon摘要由AI智能服务提供

本文介绍了在苍穹报表页面中动态添加列(包括表格字段分组、小数、用户等)的需求、思路、实现过程及注意事项。通过报表插件的二次开发,可以在getColumns方法或beforeQuery方法中动态添加列,并通过查询数据库展示相关业务数据。文章提供了具体的Java代码示例,并说明了如何在报表取数插件中设置查询字段别名以匹配设计器中的报表列表字段。此外,还提醒了开发环境的版本要求,并提供了样例元数据补丁包和Java代码源码的下载链接,以便读者复现效果。最后,文章还提到了注意事项和参考资料,帮助开发者更好地理解和实现动态添加列的功能。

关键词:报表、动态添加列


一、需求

苍穹报表页面中动态添加列(表格字段分组、小数、用户),并展示相关业务数据。


二、思路与方案

报表相关插件中提供了多个事件可进行二开,我们只需选择合适的事件来进行业务逻辑开发即可。关于动态添加列,我们不知道如何着手开发时,可先在设计器中添加同类型控件,然后在插件中断点获取到与之对应的对象,最后反过来在插件中new一个同样的对象并设置相关属性即可。


三、实现过程

1. 以采购申请单(kdec_template_purapply)为例,其报表设计器界面如下图所示。

采购申请单-设计器.png


2. 其报表设计器(kdec_report_demo1)界面如下图所示。

效果图.png


3. 动态添加列。

3.1 方案一:在报表取数插件的 getColumns 方法中动态添加列

	@Override
	public List<AbstractReportColumn> getColumns(List<AbstractReportColumn> columns) throws Throwable {
		logger.info("getColumns...");
		List<AbstractReportColumn> columnList = super.getColumns(columns);
		// 报表列表中动态添加小数字段列
		columnList.add(ReportUtils.createReportColumn(new String [] { "kdec_decimal_code", "小数(代码动态添加)", ReportColumn.TYPE_DECIMAL }));
		// 报表列表中动态添加用户字段列
		columnList.add(3, ReportUtils.createReportColumn(new String [] { "kdec_applier_code", "申请人(代码动态添加)", ReportColumn.TYPE_TEXT }));
		// 报表列表中动态添加表格字段分组
		columnList.add(5, this.createGroupColumnList());
		return columnList;
	}
	
	/**
	 * 报表列表动态创建表格字段分组
	 * @return
	 */
	private ReportColumnGroup createGroupColumnList() {
		logger.info("createGroupColumnList...");
		ReportColumnGroup reportColumnGroup = new ReportColumnGroup();
		reportColumnGroup.setFieldKey("kdec_entryfieldgroupap_code");
		reportColumnGroup.setCaption(new LocaleString("表格字段分组(代码动态添加)"));
		ReportColumn reportColumn1 = ReportUtils.createReportColumn(new String [] { "kdec_applier_code", "申请人(代码动态添加)", "text" });
		reportColumnGroup.getChildren().add(reportColumn1);
		ReportColumn reportColumn2 = ReportUtils.createReportColumn(new String [] { "kdec_applydate_code", "申请日期(代码动态添加)", "date" });
		reportColumnGroup.getChildren().add(reportColumn2);
		return reportColumnGroup;
	}


3.2 方案二:在报表表单插件的 beforeQuery 方法中动态添加列

	@Override
	public void beforeQuery(ReportQueryParam queryParam) {
		logger.info("beforeQuery...");
		ReportList reportList = getControl("reportlistap");
		// 报表列表中动态添加小数字段列
		reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { "kdec_decimal_code", "小数(代码)", ReportColumn.TYPE_DECIMAL }));
		// 报表列表中动态添加用户字段列
		reportList.getColumns().add(3, ReportUtils.createReportColumn(new String [] { "kdec_applier_code", "申请人(代码)", ReportColumn.TYPE_TEXT }));
		// 报表列表中动态添加表格字段分组
		reportList.getColumns().add(5, this.createGroupColumnList());
		super.beforeQuery(queryParam);
	}
	
	/**
	 * 报表列表动态创建表格字段分组
	 */
	private ReportColumnGroup createGroupColumnList() {
		logger.info("createGroupColumnList...");
		ReportColumnGroup reportColumnGroup = new ReportColumnGroup();
		reportColumnGroup.setFieldKey("kdec_entryfieldgroupap_code");
		reportColumnGroup.setCaption(new LocaleString("表格字段分组(代码)"));
		ReportColumn reportColumn1 = ReportUtils.createReportColumn(new String [] { "kdec_applier_code", "申请人(代码)", "text" });
		reportColumnGroup.getChildren().add(reportColumn1);
		ReportColumn reportColumn2 = ReportUtils.createReportColumn(new String [] { "kdec_applydate_code", "申请日期(代码)", "date" });
		reportColumnGroup.getChildren().add(reportColumn2);
		return reportColumnGroup;
	}


4. 在报表取数插件中为动态添加列展示业务数据。

	@Override
	public DataSet query(ReportQueryParam param, Object obj) throws Throwable {
		logger.info("query...");
		String entityName = "kdec_template_purapply";
		// 查询案例采购申请单业务数据. 注意: 查询字段别名必须与设计器中报表列表字段的标识保持一致, 否则数据渲染不出来
		String selectFields = "billno kdec_billno, kdec_supplier, kdec_applier, kdec_applier.name kdec_appliername, "
						+ "kdec_applyorg, kdec_currency, kdec_applydate, billstatus kdec_billstatus, "
						+ "kdec_entryentity.kdec_materiel kdec_materiel, kdec_entryentity.kdec_unit kdec_unit, "
						+ "kdec_entryentity.kdec_applyqty kdec_applyqty, kdec_entryentity.kdec_price kdec_price, "
						+ "kdec_entryentity.kdec_amount kdec_amount";
		DataSet resultDataSet = QueryServiceHelper.queryDataSet(getClass().getName(), entityName, selectFields, null, null);
		// 复制列数据至其它列, 如: 	复制 "数量" 列数据至 "小数(设计器预置)" & "小数(代码)"列;
		//							复制 "申请人姓名"列数据至 "申请人(代码)"列
		//							复制 "申请日期"列数据至 "申请日期(代码)"列
		resultDataSet = resultDataSet.select("kdec_billno, kdec_supplier, kdec_applier, kdec_appliername, kdec_applyorg, kdec_currency, "
						+ "kdec_applydate, kdec_billstatus, kdec_materiel, kdec_unit, kdec_applyqty, kdec_price, kdec_amount, "
						+ "kdec_appliername kdec_applier_code, kdec_applydate kdec_applydate_code, "
						+ "kdec_applyqty kdec_decimal, kdec_applyqty kdec_decimal_code");
		return resultDataSet;
	}


四、效果图

注意:为了复现样例效果,需先在采购申请单(kdec_template_purapply)中新增测试数据。

方案一:在报表取数插件的 getColumns 方法中动态添加列。

效果图--方案一.png


方案二:在报表表单插件的 beforeQuery 方法中动态添加列。

效果图--方案二.png


五、开发环境版本

V3.0.009(含)以上


六、注意事项

1. 在报表取数插件中,查询字段的别名必须与设计器中报表列表字段的标识保持一致,否则数据渲染不出来。

2. 文章附件中包含样例元数据补丁包、Java代码源码。各位小伙伴下载附件之后解压,然后导入元数据(在MC中以更新补丁的形式升级 or 在开发平台下直接导入元数据压缩包),并将Java文件放到本地开发工具(Eclipse/Idea)中,重启服务,运行代码即可查看效果。


七、参考资料

开发平台

学习成长中心

插件开发—报表取数插件

插件开发—报表界面插件

苍穹报表列表设置小数字段精度

报表设置列冻结


赞 5