一、业务背景
做一个地产项目营销日报表的详情统计。
二、学习成长
在这个插件开发中学习到什么,遇到什么问题
1、在有可以参考借鉴多单据数据关联的基础上,学会了dataSet集合的数据关联
DataSet ds = QueryServiceHelper.queryDataSet(this.getClass().getName(), "resbd_saleproject_f7", this.getSelectFields_new(), (QFilter[]) filterSet.toArray(new QFilter[0]), (String) null);
DataSet subscribeMoney= QueryServiceHelper.queryDataSet(this.getClass().getName(), "retra_signpurchasetpl", "project,purchaseamount,room.id,multicustom.fbasedataid", (QFilter[]) qFilters.toArray(new QFilter[qFilters.size()]), "id");
DataSet result = ds.leftJoin(subscribeMoney).on("eopg_projectname", "projectname").select(this.unionSelectFieldsNew1()).finish();
unionSelectFieldsNew1为两个dataSet集合共同需要展示的标识列。
过程中也了解dataSet对象的finish()、copy()、where()、groupBy()、addNullField()等方法。
2、单据与单据关联时,若某一单据的关联字段为多基础资料中的某一个值如果处理
此处借鉴链接:https://developer.kingdee.com/article/469199600172245248?productLineId=29&lang=zh-CN
3、单据的单据体数据表查询数据与插件查询数据量不一致
从数据表中查询同样是两条单据体数据,
DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "retra_proceedstdbook", "project,proceedsitemsentry.pie_fund.name," +
"proceedsitemsentry.pie_amount,proceedsitemsentry.pie_proceeddate,multiroom.fbasedataid,multicustom.fbasedataid,proceedsitemsentry.pie_srcitemid",
(QFilter[]) qFilters.toArray(new QFilter[qFilters.size()]), null);
用 QueryServiceHelper.queryDataSet查询显示其中一个显示两条,一个显示一条。经过各种方法测试定位原因
proceedsitemsentry.pie_fund.name,proceedsitemsentry.pie_amount,proceedsitemsentry.pie_proceeddate
这几个字段在表查询中显示值相同的数据在插件查询中只显示了一条,两条数据的proceedsitemsentry.pie_srcitemid值不同,添加此显示列后插件查询显示两条数据。
DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "retra_proceedstdbook", "project,proceedsitemsentry.pie_fund.name," +
"proceedsitemsentry.pie_amount,proceedsitemsentry.pie_proceeddate,multiroom.fbasedataid,multicustom.fbasedataid,proceedsitemsentry.pie_srcitemid",
(QFilter[]) qFilters.toArray(new QFilter[qFilters.size()]), null);
这样接口查询展示的数据均正常。
4、dataSet集合需要赋值如何处理
在苍穹中查询dataSet可以取值但是不弄重新赋值,若要将dataSet值赋值需要将dataSet集合转化为DynamicObjectCollection处理后再转化为dataSet集合。
dataSet取值方法:
for (Row row : dateSet) {
BigDecimal areas = row.getBigDecimal("buildarea");
Long roomId = row.getLong("room");
}
dataSet转化为DynamicObjectCollection方法:
DataSet dataSet = result.copy();
DynamicObjectCollection srcCollection = ORM.create().toPlainDynamicObjectCollection(dataSet);
DynamicObjectCollection转化为dataSet方法:
Field[] rowFields = dataSet.getRowMeta().getFields();
result = buildDataByObjCollection("algoKey", rowFields, srcCollection);
DynamicObjectCollection取值赋值方法:
for (DynamicObject dataItem: srcCollection ) {
Long roomId = dataItem.getLong("eopg_id");
dataItem.set("eopg_multicustom", dataItem.get("eopg_multicustom2"));
}
三、注意事项
单据体取值 表查询数据显示两条定金数据,插件查询只显示一条,原因:查询显示列若值一致只显示一条,两条数据的proceedsitemsentry.pie_srcitemid值不同,添加此显示列后插件查询显示两条数据。
推荐阅读