报表日期漏斗查询不准确解决方案

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:2

报表日期漏斗查询不准确解决方案

1 问题描述

在报表中,通过漏斗查询是很常见的搜索方式。而日期漏斗查询有时会出现不那么精确的现象。

2 原因分析

 原因是日期漏斗范围过滤的结束时间判断条件默认都是"<"当前所选择的时间。所以”上月“条件和”从...到...“选择6月1日至6月30日,实际上是相差一天的,如下图。这俩个条件本身都没有问题,但如果我们拿他们做对比,可能就觉得查询没那么舒适了。



3 解决方法

可以对"从..到..."这个条件进行二开

准备数据源,以及报表查询取数插件这里就不详细说了。

步骤一:先实现报表显示漏斗过滤功能,需要继承报表表单插件并重写setSortAndFilter方法

public void setSortAndFilter(List<SortAndFilterEvent> allColumns) {
    super.setSortAndFilter(allColumns);
    for(SortAndFilterEvent event: allColumns){
        event.setFilter(true);
    }

}

步骤二:报表取数插件重写query方法,拿到前端漏斗过滤的条件,执行过滤查询

public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable {

    DataSet resultDataSet = null;
    String pattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    QFilter[] qFilters =null;
    Calendar calendar = Calendar.getInstance();


    //获取漏斗过滤条件
    List<QFilter> headFilters = reportQueryParam.getFilter().getHeadFilters();
    //获取漏斗过滤条件的选择项
    List<FilterItemInfo> tableHeadFilterItems = reportQueryParam.getFilter().getTableHeadFilterItems();
    String search=null;
    for (int x=0;x<headFilters.size();x++){
    //判断是否是日期字段过滤
        if(headFilters.get(x).getProperty().equals("lago_datefield")){
        //拿到搜索条件
            search= (String) headFilters.get(x).toString();
            //拿到过滤条件的选择项
            String compareType = tableHeadFilterItems.get(x).getCompareType();
            String[] splitstart = search.split(">=");
            String[] splitend = search.split("<");
            String startDate = splitstart[1].substring(2, 21);
            String endDate = splitend[1].substring(2, 21);
            Date date = sdf.parse(startDate);
            Date date2 = sdf.parse(endDate);
          //判断如果是”从...到...“就给结束时间加一天
           if(compareType.equals("BETWEEN")){//从...到...:BETWEEN,上月:LASTMONTH,本月:THISMONTH,本周:THISWEEK,今天:TODAY,过去三个月:LASTTHREEMONTH
                calendar.setTime(date2);
                calendar.add(Calendar.DAY_OF_MONTH,+1);
                date2=calendar.getTime();
            }
            //重新拼接查询条件
            qFilters = new QFilter[]{new QFilter("lago_datefield", QCP.large_equals, date).and(new QFilter("lago_datefield", QCP.less_than, date2))};
        }

    }
    
     resultDataSet = QueryServiceHelper.queryDataSet(getClass().getName(), "lago_sheet1", "id,lago_combofield,lago_textfield,lago_textfield1,lago_textfield2,lago_textfield3,lago_datefield", qFilters, null);

    return resultDataSet;

}

4 效果图


5 注意事项

我们可以利用compareType属性做更多的二开操作。通过断点调试可以看到该属性条件对应的编码

比如:

从...到...=BETWEEN,上月=LASTMONTH,本月=THISMONTH,本周=THISWEEK,今天=TODAY,过去三个月=LASTTHREEMONTH等


6 源码

源码.zip


报表日期漏斗查询不准确解决方案

1 问题描述在报表中,通过漏斗查询是很常见的搜索方式。而日期漏斗查询有时会出现不那么精确的现象。2 原因分析 原因是日期漏斗范围过滤...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息