在云苍穹做报表开发的时候,遇到一个问题,在查询报表的某列数据的时候,为了统计该列数据(单据体的某个字段属性)对应单据头的id总数,用到了Algo的语法,发现统计出来的数字和点击数字跳转的结果不一样,两个过滤条件明明是一样的,为了方便排查问题,我将两个过滤条件分别贴出来,统计的该列数据是单据体的某个字段属性,姑且说为“风险关闭-停用”吧,该字段的标识为“kdps_entryentity.kdps_status",该单据头标识为“kdps_riskmonitor",单据体标识为”kdps_entryentity",,当时在统计数字时,即跳转前,用Algo语句查询的语法如下:
用到了QueryServiceHelper.queryDataSet();对应的过滤条件分别是timeFilter,FilterUtils.FIFILTER和FilterUtils.TYFILTER,前面两个过滤条件分别是时间过滤和单据状态过滤,就不贴出来了,关键是后面的FilterUtils.TYFILTER,对应的语句如下:
当时是根据单据体的风险状态等于“风险关闭-停用”进行过滤的,查询出来的结果是10条数据,点击数字跳转后查询出来的结果为4条,跳转后是通过QueryServiceHelper.queryPrimaryKeys()进行统计单据头id的总数:
跳转后的过滤条件timeFilter,FilterUtils.FIFILTER,FilterUtils.TYFILTER和前面是一模一样的,当查询的结果却不一样,后面通过排查问题发现,QueryServiceHelper.queryDataSet()进行查询时,没有过滤重复的数据,统计多出来的6条数据是单据体中分录的数据,对应的单据头id个数却只有1个,而QueryServiceHelper.queryPrimaryKeys()是通过查询主键,过滤了重复主键id,查询的结果是4条,后面将FilterUtils.TYFILTER改为了
通过主键id去查询过滤:
最后查询出来的结果就保持一致了,跳转前和跳转后的总数都变为了4条,然后我也去分析了一下,
BusinessDataServiceHelper.load()方法查询数据时,也是过滤了重复主键id的,而QueryServiceHelper.query()是没有考虑过滤重复主键id,但是QueryServiceHelper.queryPrimaryKeys()是有过滤重复主键id的。
推荐阅读