关于库存收发存汇总表——计算金额依据取数的一案例U8客服中心-北京79号工程师2010年12月问题介绍分析及处理小结问题来源:热线电话问题版本:U872问题描述:移动平均计价方式。库存收发存汇总表,计算金额依据为“结存成本”,为什么某存货明明在存货明细账中有结存单价,但在库存收发存汇总表中未取到单价从而计算金额?(关于“结存成本”的取价规则请参照11月份ppt《关于库存收发存汇总表一过滤条件分析》)一、问题介绍二、分析及处理1、存货“123”在存货明细账中的情况如下:A、问题分析:2、查看库存收发存汇总表:过滤结果如下:过滤条件的截止日期为2009-11-30,结存成本取价应为11月月末结存单价:4.83333333,而此时未取到单价?3、回忆一下,按”结存成本“取价的后台执行规则语句:ifnotobject_id('tempdb..#ia')isnulldroptable#iaselectisnull(cwhcode,'')ascwhcode,cinvcode,cfree1,cfree2,cfree3,cfree4,cfree5,cfree6,cfree7,cfree8,cfree9,cfree10,casewhencount(*)=1andnot(max(iunitprice)isnull)thenmax(iunitprice)Elsecasewhensum(inum)<>0thensum(imoney)/sum(inum)Elsecasewhensum(iinum)<>0thensum(iimoney)/sum(iinum)else0endEndEndasiunitpriceinto#iaFromia_summarywhereiMonth=11groupbyisnull(cwhcode,''),cinvcode,cfree1,cfree2,cfree3,cfree4,cfree5,cfree6,cfree7,cfree8,cfree9,cfree10根据语句,我们想到是否可以到存货总账中查看一下呢?4、查看存货总账:我们发现,iunitprice为0???而非null。在《关于库存收发存汇总表一过滤条件分析》中我们曾提到过:期末处理后,系统自动将全月平均仓库的iunitprice(平均单价)值回填。即仅有全月平均计价方式才回填iunitprice值,其他计价方式均应为null值。用户提到,出现该现象的存货非常多,难道是数据问题??在自己的872及872sp1环境下测试,发现的确存在和用户一样情况:移动平均计价方式下,新增存货和新增相应单据,第一次记账时ia_summary中回填了iunitprice值为0,而非null。则此时就不应是数据问题了,我们跟踪一下,看后台程序是怎样处理的?a.正常单据记账—事件探查器:b.查找到存储过程:ia_sp_addtosummary:if@cAccountMode=N'按仓库核算'beginSet@bManual=(SelectIsNull(bManual,0)fromIa_SummaryWherecWhCode=@cWhDepCodeAndcInvCode=@cInvCodeAndIsNull(cFree1,N'')=Isnull(@cFree1,N'')AndIsNull(cFree2,N'')=Isnull(@cFree2,N'')AndIsNull(cFree3,N'')=Isnull(@cFree3,N'')AndIsNull(cFree4,N'')=Isnull(@cFree4,N'')AndIsNull(cFree5,N'')=Isnull(@cFree5,N'')AndIsNull(cFree6,N'')=Isnull(@cFree6,N'')AndIsNull(cFree7,N'')=Isnull(@cFree7,N'')AndIsNull(cFree8,N'')=Isnull(@cFree8,N'')AndIsNull(cFree9,N'')=Isnull(@cFree9,N'')AndIsNull(cFree10,N'')=Isnull(@cFree10,N'')AndiMonth=@imonthAndIsNull(iDirect,0)=0)if@bManualisnullbeginInsertIntoIa_Summary(cWhCode,cInvCode,iMonth,iUnitPrice,iInum,iOnum,iNum,iImoney,iOmoney,iMoney,cFree1,cFree2,cFree3,cFree4,cFree5,cFree6,cFree7,cFree8,cFree9,cFree10,iDirect,bManual)Values(@cWhDepCode,@cInvCode,@imonth,0,0,0,0,0,0,0,@cFree1,@cFree2,@cFree3,@cFree4,@cFree5,@cFree6,@cFree7,@cFree8,@cFree9,@cFree10,0,0)Set@bManual=0end我们看到,系统默认插入iunitprice值为0.B、问题处理:问题解决:1、对已存在该现象的存货,可修改其ia_summary中对应iunitprice值为null。如下:2、此时再查看库存收发存汇总表(过滤条件与之前一致):3、为避免日后出现该现象,先查看一下是否已有补丁处理该问题?——暂时没有。则:从用户现有数据情况出发,修改存储过程:ia_sp_addtosummary,将iunitprice的插入值由0修改为null。根据以上内容,我们得知872(含sp1)版本上有该现象,暂未发现有补丁处理。890版本中不存在该问题(同样的存储过程中,虽iunitprice字段同样插入值为0,但由于插入的表为#ia_summary。而在其后ia_recountsummary中不会插入该字段,即仍旧插入null值)。(有兴趣的同事可自行跟踪一下)三、小结谢谢