本文介绍了实现分组报表的详细步骤和代码示例,包括新增树形基础资料、单据和报表,并编写Java插件以控制报表的列和查询逻辑。左树列表显示地区,右表根据左树的选择显示相应地区的数据,如水果单据信息,并可通过过滤面板选择地区进行过滤查询。文章还展示了实现后的效果图,包括过滤结果和点击左树节点时右表的自动刷新功能。最后,提供了开发环境版本、参考资料和附件链接。
关键词:分组报表
一、需求
实现报表的分组报表模板的查询,过滤面板选择地区基础资料,查询时过滤。实现点击左分组时,改变右表的数据。
如果想要了解如何实践简单的报表,请查看我的上一篇文章。
二、思路与方案
(1)新增一个 树形基础资料,命名为地区,一个单据 命名为 水果单据。单据引用基础资料。
(2)新增报表,选择 分组模板模板。在报表中添加过滤控件。
(3)新增两个插件,继承AbstractReportListDataPlugin。
报表设计器中左树列表添加报表查询插件,右表添加另一个报表查询插件。
(4)分别在两个Java插件中增加列。
(5)在两个插件中,左表获取树形基础资料的数据,右表获取单据数据
三、实现过程
1.准备工作,为第2步的报表准备一些展示的数据源。
创建树形基础资料,名称为 地区。
基础资料填充几数据
创建单据,命名为 水果单据。
加入一个分组字段,加入单据体和一些单据体字段,隐藏标准单据体的部分字段
新增几个水果单据数据
创建单据,命名为 电器单据。加入两个字段
新增几个电器单据
2.新增报表
3.代码新增两个插件
新增两个查询插件,继承AbstractReportListDataPlugin,注册方式参考上图
4.分别在两个Java插件中增加列
左树添加一个产地列:
@Override public List<AbstractReportColumn> getColumns(List<AbstractReportColumn> columns) throws Throwable { columns.add(createReportColumn("proname", "text", "产地")); return super.getColumns(columns); } private ReportColumn createReportColumn(String fieldKey, String fieldType, String caption) { ReportColumn column = new ReportColumn(); column.setFieldKey(fieldKey); column.setFieldType(fieldType); column.setCaption(new LocaleString(caption)); return column; }
右表添加如下列:水果单据id,水果单据编码,水果单机体id,水果产地,水果名称,电器品牌,电器名称
@Override public List<AbstractReportColumn> getColumns(List<AbstractReportColumn> columns) throws Throwable { columns.add(createReportColumn("id", ReportColumn.TYPE_TEXT, "水果单据id")); columns.add(createReportColumn("billno", ReportColumn.TYPE_TEXT, "水果单据编码")); columns.add(createReportColumn("enId", ReportColumn.TYPE_TEXT, "水果单据体id")); columns.add(createReportColumn("proname", ReportColumn.TYPE_TEXT, "水果产地")); columns.add(createReportColumn("fruits", ReportColumn.TYPE_TEXT, "水果名称")); columns.add(createReportColumn("kdec_brand", ReportColumn.TYPE_TEXT, "电器品牌")); columns.add(createReportColumn("kdec_etps", ReportColumn.TYPE_TEXT, "电器名称")); return super.getColumns(columns); } public ReportColumn createReportColumn(String fieldKey, String fieldType, String caption) { ReportColumn column = new ReportColumn(); column.setFieldKey(fieldKey); column.setFieldType(fieldType); column.setCaption(new LocaleString(caption)); return column; }
5.添加查询代码和过滤左表代码
左表获取过滤面板的查询控件,从水果单据获取地区名称
@Override public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable { // 获取过滤条件 FilterInfo filterInfo = reportQueryParam.getFilter(); FilterItemInfo itemBD = filterInfo.getFilterItem("kdec_search_basedata_pro"); QFilter fruitOutQFilter = null; // 构造QFilter if (itemBD.getValue() instanceof DynamicObject) { DynamicObject dynamicObject = (DynamicObject)itemBD.getValue(); String strName = dynamicObject.get("name").toString(); fruitOutQFilter = new QFilter("kdec_fruit_pro.name", QCP.like, strName); } return QueryServiceHelper.queryDataSet(this.getClass().getName(), "kdec_fruit_bill", "id, billno, kdec_fruit_pro.name as proname", fruitOutQFilter == null ? null : fruitOutQFilter.toArray(), null); }
右表使用左表的过滤条件对水果单据进行过滤,查询电器单据
水果数据左连接电器单据
@Override public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable { QFilter fruitOutQFilter = new QFilter("name", QCP.like, ((DynamicObject) o).get("proname")); DynamicObjectCollection fruitOutCollection = QueryServiceHelper.query("kdec_region_base", "id, number, name as proname", fruitOutQFilter.toArray(), null); List<String> foIdList = new ArrayList<>(); fruitOutCollection.forEach(dynamicObject -> { foIdList.add(dynamicObject.getString("proname")); }); QFilter fruitQFilter = new QFilter("kdec_fruit_pro.name", QCP.in, foIdList); // 查询水果 DataSet rDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "kdec_fruit_bill", "id, billno, kdec_entryentity.id as enId, kdec_entryentity.kdec_fruits as fruits, kdec_fruit_pro.name as proname", fruitQFilter.toArray(), null); // 返回查询水果的结果 //return rDataSet; // 查询电器 DataSet eDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "kdec_electrical_bill", "id, billno, kdec_brand, kdec_etps", null, null); // 配置左连接,水果单据left join电器单据 JoinDataSet join = rDataSet.join(eDataSet, JoinType.LEFT); // 配置Left Join的条件为 水果和电器的单据编码相同时,进行左连接 return join.on("billno", "billno") .select(new String[]{"id", "billno", "enId", "fruits", "proname"}, new String[]{"kdec_brand","kdec_etps"}) .finish(); }
四、效果图
效果1,过滤条件选择北京,点击查询,左表和右表都显示了产地为北京的数据
效果2,不添加过滤添加,展示左表展示4个地区,点击左表,右表自动刷新,显示对应产地的数据
五、开发环境版本
六、参考资料
七、附件
单据、基础资料的元数据请查看附件,java插件代码请查看实现过程或者附件。
报表,实现分组报表+Java查询插件+过滤.zip(28.30KB)
推荐阅读