本文主要介绍了在苍穹系统中,两种查询类BusinessDataServiceHelper和QueryServiceHelper的区别。前者查询结果以单据为单位,后者以数据条为单位;前者查询单据体字段无需加标识,后者需加;前者查询基础资料默认包含部分属性,不直接支持非引用属性查询,且需转换才能成DataSet,后者则支持更广泛的属性查询并直接返回DataSet。
BusinessDataServiceHelper与QueryServiceHelper有什么区别
在日常的开发中,查询是最常用的业务场景,在苍穹系统,常用的查询类有:
1. kd.bos.servicehelper.BusinessDataServiceHelper
2. kd.bos.servicehelper.QueryServiceHelper
3. 那么这两种查询方式有什么区别呢,本文主要以kd.bos.servicehelper.BusinessDataServiceHelper#load和kd.bos.servicehelper.QueryServiceHelper#query这两个方法的区别为例进行说明
我们做个例子来看一下:
1. 首先比较下查询结果
随便创建一个用于测试的简单单据:
列表加两个按钮,注册插件:
点击按钮测试:
可以看到BusinessDataServiceHelper的查询结果是以“张”为纬度,QueryServiceHelper的查询结果是以“条”为纬度,也就是说:BusinessDataServiceHelper将一张单据总体视为1个独体,而QueryServiceHelper是将每一行分录数据和单据头总体拉平当做一条数据
我们来看一下查询到的结果:
BusinessDataServiceHelper:
QueryServiceHelper:
报错了,我们取消查询单据体的字段
可以看到:
BusinessDataServiceHelper可以查询出单据头,单据体字段的值,而QueryServiceHelper只能查到单据头字段的值和单据体id,BusinessDataServiceHelper查询出来的基础资料是一个包含masterid,name,number的对象,而QueryServiceHelper查询出来的是基础资料的id
如果你在这里得出结论:QueryServiceHelper只能查到单据头字段的值和单据体id,不能查单据体字段值,那就大错特错了
可以看到,我们在单据体字段前面加上单据体标识,就可以查出来了,在这里,我们看出它们的又一个差别:BusinessDataServiceHelper可以直接查询单据体字段,而QueryServiceHelper查询需要加上单据体标识,为了避免这种兼容性错误,强烈建议大家在写查询字段的时候,单据体字段前面统一加单据体标识
在这里告诉大家一个小技巧:
在写过滤条件的时候,基础资料字段可以直接这样写
当然单据体过滤的时候也可以这样,但是要格外注意的是:
BusinessDataServiceHelper过滤出来的只到单据这一层,具体单据体行还要再次匹配
而QueryServiceHelper就不会这样
我们再看下查询引用属性的差别:
我们给结算方式的引用属性加上类别、对私支付、描述属性
执行操作
可以看到查询出来的 基础资料字段已经附上了引用属性
我们再查一下非引用属性
当然也查不出来相关属性:
但是跟先前说的一样,过滤条件里面是可以用其他属性的:
QueryServiceHelper是可以正常查询出来非引用属性的
还有个区别,做过报表的同事知道:
QueryServiceHelper.queryDataSet结果直接为DataSet
而BusinessDataServiceHelper.load查询出来还要进行下列的转换成为DataSet
总结:
1. BusinessDataServiceHelper查询结果是以“张”为单位,QueryServiceHelper的查询结果是以“条”为单位,BusinessDataServiceHelper的查询结果和单据结构一致,QueryServiceHelper则是将表头和单据体右关联进行拉平处理
2. BusinessDataServiceHelper查询基础资料或者单据体属性字段前面可以不写单据体标识,QueryServiceHelper则必须写,未防止这种兼容性错误,强烈建议大家在写查询字段的时候,单据体字段前面统一加单据体标识
3. BusinessDataServiceHelper查询出的基础资料属性默认只包含masterid,name,number属性,假如有引用属性的话,则也会查询出引用属性,查询不出非引用属性,QueryServiceHelper只要查询字段有的属性都可以查出
4. BusinessDataServiceHelper需要进行转换才能成为报表所需要的的DataSet,而QueryServiceHelper则提供了结果为DataSet的方法
这里列举下其他区别:
推荐阅读