关于java:SAASERP采购订单历史单据总结

2次阅读

共计 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. 思路还是一开始的思路,难点次要集中在没找到适合的办法,对传的参数的格局也比拟含糊,对封装返回值内部结构不够理解,很多状况编译时不报错,在运行时报错,破费了肯定的工夫进行尝试和调试

正文完
 0