在用友U8及相关产品中,库存管理期初要求必须录入数量,但单价和金额并不是必输的。从本人过去实施经验来看,为了保证ERP产品的快速上线,有不少企业只能先提供库存管理期初数量,而单价金额需要后续才能确定。

所以,对于一些ERP项目来说,库存管理期初只有数量,后续应用存货核算模块时只能从库存期初取到期初数量,而单价、金额只能在存货核算期初补录。

用友U8将存货核算期初单价金额回写到库存管理期初单价金额-LMLPHP

这样的应用通常情况下也没什么问题,因为库存模块的应用只需要数量,而单价金额并不是必须的,库存模块各类报表通常也不涉及金额,但有一个表比较特殊,涉及到单价金额,那就是《存货库龄分析表》。

在用友U8的产品逻辑中,《存货库龄分析表》所有数据只来源于库存管理期初以及库存管理各出入库单据,根据期初或单据上的数量、单价、金额来计算账龄及金额。

这样一来就产生问题了,由于库存管理期初没有单价金额,所以统计到的账龄表中,就会出现大量账龄较久的存货有数量却没有金额,其实就是期初存货:

用友U8将存货核算期初单价金额回写到库存管理期初单价金额-LMLPHP

好在存货核算是从库存管理取取数的,所以应该还是有办法从后台回写数据的,仔细研究一下两张表的数据关系:

库存管理期初有两张专门的表,包括rdrecord34(表头)和rdrecords34(表体),而存货核算期初没有独立的表,而是体现在存货明细账这一张表中。

要回写数据,就必须找到这三张表的关系,其中库存管理两张表倒是好办,主要是rdrecords34表和IA_Subsidiary之间的关联,仔细查看了一下,二者没有任何键是一样的。

最后的解决办法是,按存货编码、仓库编码及数量三个条件来取数,如果项目有自由项等参数,则一并加入,最终回写语句如下:

--该项目于2018年5月1日上线,期初日期为2018年4月30日
update rdrecords34 set iUnitCost=d.iInCost,iPrice=d.iAInPrice
from
(
select a.*,b.* from
--库存期初表
(select rdrecords34.ID,rdrecords34.AutoID,rdrecord34.cWhCode 库存仓库,rdrecords34.cInvCode 库存存货编码,rdrecords34.iQuantity,rdrecords34.iUnitCost,rdrecords34.iPrice
from rdrecords34,rdrecord34 where rdrecords34.ID=rdrecord34.ID )a
left join
--存货期初表
(select cWhCode,cInvCode,iInCost,iAInQuantity,iAInPrice from IA_Subsidiary where dVouDate='2018-04-30')b
--二表关联条件是存货编码、仓库及数量均相同
on a.库存仓库=b.cWhCode and a.库存存货编码=b.cInvCode and a.iQuantity=b.iAInQuantity
)d
where rdrecords34.AutoID=d.AutoID

通过如下语句检查二者总数量、总金额是否一致:

--检查二表总数量、总金额是否一致
select 'rdrecords34' tablename,SUM(iquantity) iquantity,SUM(iprice) price from rdrecords34
Union all
select 'IA_Subsidiary' tablename,SUM(iAINquantity) iquantity,SUM(iAINprice) price from IA_Subsidiary where dVouDate='2018-04-30'
05-02 18:22