webapi下推过程中给仓位赋值
金蝶云社区-Jaden
Jaden
2人赞赏了该文章 1667次浏览 未经作者许可,禁止转载编辑于2018年12月18日 10:38:46
仓位是一个维度关联字段,赋值比较麻烦(问了总部的老师,都是这样说的)。一开始的时候我对这个字段了解不深,然后在做项目的时候在仓位赋值这个问题上被坑了很久。当时项目场景如下:采购订单下推采购入库单的时候,需要在下推的参数里面添加仓库和仓位信息。采购入库单的仓库值和仓位值不能通过上游单据携带过来,只能在自定义的下推接口里面通过代码来赋值。当时找到了如下一篇帖子(https://vip.kingdee.com/article/17604),上面有实现方法,当时也没想太多,直接撸代码开搞,结果在调用longid = flexService.GetFlexDataId(ctx, flexFldDataObj,flexField.BDFlexType.FormId);这个方法的时候报错,提示“新增属性后,请关闭当前已打开单据,再重新打开。{0}否则,缓存中取不到该属性值!”。然后在论坛上找解决方法,试了几遍都不行。后面实在没辙,我就写了一个测试用例,直接通过调试看一下到底仓位这个字段在单据里面是一个什么样的数据包,然后在代码里面根据调试的结果通过硬编码来构建这个数据包的数据,结果。。。通过了。后面看了一下Kingdee.BOS.App.Core.FlexService.GetFlexDataId这个方法的源代码,算是明白了其中的原理。(注:“新增属性后,请关闭当前已打开单据,再重新打开。{0}否则,缓存中取不到该属性值!”这个错误信息实际上是因为在调用Kingdee.BOS.App.Core.FlexService.GetFlexDataId这个方法的时候,传递的仓位数据包格式不正确,里面需要正确传递仓位的扩展字段名,否则上面的方法就会以为你需要新增仓位的扩展字段名。)在对仓位这种维度关联字段赋值的时候,大致上是这么个过程:1、 查询仓位在仓位值集里面的内码。2、 通过查询值集资料维度数据(T_BAS_FLEXVALUES)得到该仓位的扩展字段名(如FF100009、FF100010等)3、 根据步骤1得到的内码和步骤2得到的扩展字段名在T_BAS_FLEXVALUESDETAIL这个表里面查询是否有这个组合的记录,查询条件为步骤2得到的字段名作为筛选字段,步骤1得到的内码作为筛选值。如果有记录,则直接将得到的记录的FID值赋给单据的仓位,否则需要先将在FLEXVALUESDETAIL这个组合表里面添加该仓位的组合记录,然后把新增的记录的FID值赋给单据的仓位字段。实际上上面这些操作的实质都是为了保证在T_BAS_FLEXVALUESDETAIL这个表里面有需要赋值的仓位的信息,实际单据里面仓位字段保存的也是T_BAS_FLEXVALUESDETAIL这个表的内码,而不是仓位的实际内码。下面贴出我的代码(基于采购订单下推采购入库单过程代码) /// ///获取仓位值集信息 /// /// /// /// /// publicstaticDynamicObject LoadStockLocList(Kingdee.BOS.Context ctx, string number) { OQLFilter filter = new OQLFilter(); filter.Add(new OQLFilterHeadEntityItem(){ FilterString = string.Format("FNumber='{0}'", number) }); varbdObjs = BusinessDataServiceHelper.Load(ctx,"BD_FLEXVALUES", null,filter); if(bdObjs.Count() > 0) return bdObjs[0]; else return null; }
//destObjs[0]是根据采购订单调用下推接口得到的采购入库单的数据包 for(inti = 0; i < (destObjs[0]["InstockEntry"]asDynamicObjectCollection).Count; i++) { DynamicObject row = (destObjs[0]["InstockEntry"] asDynamicObjectCollection)[i];[/i][i] string StockLocNumber = ""; //仓位值编码[/i][i] string StockLocListNumber = ""; //仓位值集编码[/i][i] DynamicObject stockloclist =LoadStockLocList(ctx, StockLocListNumber); //仓位值集信息[/i][i] if(stockloclist == null)[/i][i] {[/i][i] thrownewException("没有找到仓位值集信息");[/i][i] }[/i]
[i] //仓位值集信息[/i][i] DynamicObject flexValueEntry = ((DynamicObjectCollection)stockloclist["FLEXVALUESENTRY"]).Where(t => t["Number"].ToString() ==StockLocNumber).FirstOrDefault();[/i][i] if(flexValueEntry == null)[/i][i] {[/i][i] thrownewException("没有找到仓位值信息");[/i][i] } [/i]
[i] //取发货通知单的出货仓位字段元数据(弹性域类型)[/i][i] Kingdee.BOS.Core.Metadata.FieldElement.RelatedFlexGroupFieldstockLocFld = targetMeta.BusinessInfo.GetField("FStockLocId")asKingdee.BOS.Core.Metadata.FieldElement.RelatedFlexGroupField;[/i]
[i] DynamicObject newstocklocdata = newDynamicObject(stockLocFld.RefFormDynamicObjectType);[/i]string flexNumberStr = stockloclist["FlexNumber"].ToString().Substring(1); newstocklocdata[flexNumberStr+"_Id"] = flexValueEntry["Id"]; newstocklocdata[flexNumberStr] = flexValueEntry;[i] DynamicObject flexSaveValue = CustFlexSaveService.SaveFlexData(ctx,stockLocFld, newstocklocdata); //这个方法可以在https://vip.kingdee.com/article/17604这篇帖子找到[/i]
[i] if(flexSaveValue == null)[/i][i] {[/i][i] thrownewException("生成或查询仓位值集维度资料数据失败");[/i][i] }[/i][i] stockLocFld.DynamicProperty.SetValue(row, flexSaveValue);[/i][i] stockLocFld.RefIDDynamicProperty.SetValue(row,flexSaveValue[0]);[/i][i] }[/i]