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-采购订单-历史单据总结的主要内容,如果未能解决你的问题,请参考以下文章

sap创建采购订单步骤

金蝶K3cloud单据作废如何删除?

sap如何查看采购订单收货状态

开发版速达扩展功能-提供单据条码打印

在SAP中如何查采购信息记录的修改历史呢?

《U8开发听我说》第六讲:采购订单执行统计表中如何显示税率