共计 3342 个字符,预计需要花费 9 分钟才能阅读完成。
业务逻辑:
实现成果:点击须要查问行→点击历史订单→弹出历史订单页面→展现洽购过选中行对应商品的过往订单
开发文档形容:查看以后订单商品明细的历史订单数据
数据库构造:
单据(主表)的 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. 思路还是一开始的思路,难点次要集中在没找到适合的办法,对传的参数的格局也比拟含糊,对封装返回值内部结构不够理解,很多状况编译时不报错,在运行时报错,破费了肯定的工夫进行尝试和调试