SAASERP-采购订单-历史单据总结
Posted 李助瑞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAASERP-采购订单-历史单据总结相关的知识,希望对你有一定的参考价值。
业务逻辑:
实现效果:点击需要查询行→点击历史订单→弹出历史订单页面→展示采购过选中行对应商品的过往订单
开发文档描述:查看当前订单商品明细的历史订单数据
数据库结构:
单据(主表)的id作为外键,保存在单据体(子表)中
代码逻辑:
1.需要获取焦点行对应的商品id
2.根据商品id去子表查对应主表
3.通过单据(主表)dy对象,获取单据体(子表)dy对象(存了多条数据的DynamicObjectCollection)
4.遍历DynamicObjectCollection,取出每条数据dy对象,并通过每条数据dy对象取出每个商品的 id,与界面选中行商品id进行比较,从而筛选出所需数据
5.在历史订单页面注册插件,对历史订单页面进行遍历赋值
总结:需要得到单据的 单据体里的 指定的数据的 指定的字段,然后对指定页面的指定字段进行赋值
代码:
订单页面插件:
rm.purchase.formplugin.orderFormPlugin.GetFocusRowPkId
负责从页面取商品id并传值
难点:锁定焦点行并取值
/**
* 订单页面插件
* */
@Override
public void beforeDoOperation(BeforeDoOperationEventArgs e) {
FormOperate formOperate = (FormOperate) e.getSource();
String key = formOperate.getOperateKey();
if (key.equals("openformorderhistory")) {
//获取焦点行 并进行错误控制
try {
//获取焦点行行号
Integer index = this.getModel().getEntryCurrentRowIndex("rm_entryentity");
if (index != null) {
//获取本行dy对象
DynamicObject dy = this.getModel().getEntryRowEntity("rm_entryentity", index);
//获取本行商品dy对象
DynamicObject goodsIdDy = dy.getDynamicObject("goodsid");
//获取本行商品id
Long goodsid = (Long) goodsIdDy.getPkValue();
//给历史订单页面插件属性赋值
OrderHistoryPlugin.goodsid=goodsid;
}
} catch (NullPointerException e1){
//无效数据捕获异常 并弹出提示且取消操作
this.getView().showErrorNotification("请先选择一行数据");
e.setCancel(true);
}
}
}
业务层数据库查询:
rm.purchase.business.repository.orderForm.OrderFormRepository
从数据库取出符合条件数据
难点/误区:
1.最常使用的QueryServiceHelper下使用所提供的方法无法获取单据体子表的数据,在这里试用调试了很多方法没有获得想要的效果,而苍穹提供的Dataset工具只能在QueryServiceHelper下使用
2.过滤器QFilter需要的参数格式要求,单据体里的字段要 单据体标识.单据体里具体的字段名 查询字段同理
3.BusinessDataServiceHelper提供的方法可以带出但具体数据,但返回值类型是dy对象的数组,虽然在本业务中要查单据体(子表)数据,但传参是单据(主表)标识,先查出整合了子表数据的主表dy对象
public DynamicObject[] qurryBillno(Long goodsid){
//构建过滤器
QFilter qFilters = new QFilter("rm_entryentity.goodsid", QCP.equals,goodsid);
//封装查询字段
String select ="billno,rm_entryentity.goods_package,rm_entryentity.goodsid";
//查询数据库
DynamicObject[] dy = BusinessDataServiceHelper.load("rm_sc_purchase_order",select , qFilters.toArray());
return dy;
}
历史订单页面插件:
rm.purchase.formplugin.orderFormPlugin.OrderHistoryPlugin
从查询的数据中取出需要的字段进行页面回显
难点/误区:
1.接收的数据是单据(主表)dy对象,而有些需要的数据在单据体(子表)里,一开始以为可以直接获取单据体字段属性,忽略了单据体包含的不止一条数据,没有找到从单据体取值的方法 对取值传参格式也比较模糊,而取出的单据体是个包含多条数据dy对象的集合,需要判断取出对应商品的数据
2.取出的对应商品的dy对象,按照往常思路,直接调用getPKValue()取id,但这样取出的id是这条数据的id 并非商品的id,就需要根据商品基础资料标识取出对应商品的dy对象 从而getPKValue()取出商品本身的id
OrderFormRepository orderFormRepository = new OrderFormRepository();
public static Long goodsid;
@Override
public void afterCreateNewData(EventObject e) {
IDataModel model = this.getModel();
DynamicObject[] dys = orderFormRepository.qurryBillno(goodsid);
//遍历赋值
for(int i=0;i<dys.length;i++) {
//从DynamicObject[] dys中获取查出的整个表的数据包
DynamicObject dy1 = dys[i];
//声明两个遍历外用到的变量
String goods_package=null;
Long s_goodsid=null;
//单据体里不止一条数据 获取子表单据体的dy对象集合
DynamicObjectCollection rows=dy1.getDynamicObjectCollection("rm_entryentity");
//遍历子表单据体 通过商品id确定需要获取的数据
for (DynamicObject dy:rows) {
//获取单据体内单条数据的dy对象
DynamicObject s_goodsid1=(DynamicObject) dy.get("goodsid");
//取出商品的id
s_goodsid=(Long) s_goodsid1.getPkValue();
//页面传入的id和取出的id作比较确定需要取哪条数据
if (s_goodsid.equals(goodsid)){
//取出对应的所需数据
goods_package=dy.getString("goods_package");
//如果有多条同一商品数据则不设置跳出循环 并把回显语句放入此判断
break;
}
}
//给历史订单页面指定字段赋值
model.batchCreateNewEntryRow("rm_entryentity", 1);
model.setValue("billno", dy1.getString("billno"),i);
model.setValue("qty",goods_package,i);
}
}
总结:
1.弹出的历史订单页面没找到合适的原生方案,所以新建了动态表单(不会建表,也不会储存数据)来承接数据
2.目前的解决方案是当时只回显一条数据测试时候的做法,可以在历史订单界面设置需要的字段分别赋值满足需求,暂时还不清楚能不能直接传一个对象给整个表单一次性赋值
3.思路还是一开始的思路,难点主要集中在没找到合适的方法,对传的参数的格式也比较模糊,对封装返回值内部结构不够了解,很多情况编译时不报错,在运行时报错,花费了一定的时间进行尝试和调试
以上是关于SAASERP-采购订单-历史单据总结的主要内容,如果未能解决你的问题,请参考以下文章