定制化开发事故案例——报表查询groupby原创
金蝶云社区-技术支持与赋能部_ZH
技术支持与赋能部_ZH
8人赞赏了该文章 837次浏览 未经作者许可,禁止转载编辑于2023年12月14日 10:54:14

一、关键词

报表、algo、groupby

二、项目背景

某定制化开发项目发现一业务报表跨多月查询会报错“报表查询错误:field null as 字段 not found”。该问题在本地开发环境无法复现。重新多次部署元数据和代码确认版本一致,仍然无法解决问题。最后通过部署日志跟踪发现问题竟然是group by使用不正确导致

image.png

三、反面真实代码案例(错误示范,不要模仿!!!!!

group by只支持字段,还不支持表达式和函数

错误点:

可以看到groupby函数里使用了"null as 字段"的语法

//3、根据字段分组求出小计合计  ,fiedls[ ]是字段数组     

DataSet finish =
                         ds.groupBy(new String[]{fields[0], fields[1], fields[3], fields[4],
                         "null as 字段A","null as  字段B","null as 字段C",
                         fields[8], fields[9],....).sum(fields[10]).sum(fields[11])....finish();

四、影响范围

1、影响客户业务报表功能使用,跨月查询报异常

2、开发环境无法复现问题,导致客户现场开发没办法确定问题原因

3、发现问题——解决问题,这中间消耗了很长时间,问题定位比较困难

五、原理解析

往groupby里写表达式,开发环境没有报错,导致初期排查方向被误导为元数据或代码没有同步

主要原因是

groupby在小数据量处理时,会往内存里写所以该表达式“null as 字段”会执行成功,而当数据量达到一定程度时,为了避免OOM,平台会让groupby往硬盘里写数据,这个时候表达式和函数不支持往硬盘里写数据,这个时候报表就会报错not found

同样有这个问题还有orderby方法!

六、改正方案(重要!!!!!!

不要往groupby里写表达式!null as 表达式可以用addNullField方法替代!代码如下

 DataSet finish = 
                            ds.groupBy(new String[]{fields[0], fields[1], fields[3], fields[4],.......})
                            .sum(fields[10]).sum(fields[11]).....finish()
                            .addNullField("字段A").addNullField("字段B").addNullField("字段C");
















赞 8