如何开发分组报表和过滤原创
金蝶云社区-吴锐雄
吴锐雄
18人赞赏了该文章 8,294次浏览 未经作者许可,禁止转载编辑于2024年04月17日 16:51:42
summary-icon摘要由AI智能服务提供

本文介绍了实现分组报表的详细步骤和代码示例,包括新增树形基础资料、单据和报表,并编写Java插件以控制报表的列和查询逻辑。左树列表显示地区,右表根据左树的选择显示相应地区的数据,如水果单据信息,并可通过过滤面板选择地区进行过滤查询。文章还展示了实现后的效果图,包括过滤结果和点击左树节点时右表的自动刷新功能。最后,提供了开发环境版本、参考资料和附件链接。

关键词:分组报表

一、需求

实现报表的分组报表模板的查询,过滤面板选择地区基础资料,查询时过滤。实现点击左分组时,改变右表的数据。

如果想要了解如何实践简单的报表,请查看我的上一篇文章


二、思路与方案

(1)新增一个 树形基础资料,命名为地区,一个单据 命名为 水果单据。单据引用基础资料。

(2)新增报表,选择 分组模板模板。在报表中添加过滤控件。

(3)新增两个插件,继承AbstractReportListDataPlugin。

         报表设计器中左树列表添加报表查询插件,右表添加另一个报表查询插件。

(4)分别在两个Java插件中增加列。

(5)在两个插件中,左表获取树形基础资料的数据,右表获取单据数据


三、实现过程

1.准备工作,为第2步的报表准备一些展示的数据源。

创建树形基础资料,名称为 地区。

image.png

image.png

基础资料填充几数据

image.png

创建单据,命名为 水果单据。

加入一个分组字段,加入单据体和一些单据体字段,隐藏标准单据体的部分字段

image.png

新增几个水果单据数据

image.png


创建单据,命名为 电器单据。加入两个字段

image.png

新增几个电器单据

image.png

2.新增报表

image.png

image.png

image.png

3.代码新增两个插件

新增两个查询插件,继承AbstractReportListDataPlugin,注册方式参考上图

image.png

image.png

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,过滤条件选择北京,点击查询,左表和右表都显示了产地为北京的数据

image.png


效果2,不添加过滤添加,展示左表展示4个地区,点击左表,右表自动刷新,显示对应产地的数据

image.png

image.png

五、开发环境版本

image.png

六、参考资料

【开发平台】指导手册

学习成长中心

报表介绍

报表属性


七、附件

单据、基础资料的元数据请查看附件,java插件代码请查看实现过程或者附件。




图标赞 18
18人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!