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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理