保质期修改后处理方法ERP客户服务中心65号工程师描述:在2008年修改过存货档案中的保质期,造成库存中的存货按照失效期反算后的生产日期错后很多,现在在查询现存量和生成销售相关单据时对应批号的存货带出的生产日期有很多是比现在晚很多的存货,客户最近要进行gsp检查希望能帮助更正之前的错误当保质期发生变化时,应当根据生产日期和新的保质期推算失效日期,因为生产日期是固定属性案例呈现首先,做一张入库单,生产日期2009-04-20,保质期5年,失效日期2014-04-20案例呈现然后,修改存货保质期为3年再做一张出库单,案例呈现发现参照批次时保质期并没有变化这时的现存量表也是正常的案例呈现存货的生产日期、保质期、失效日期都没有发生改变出库不能改变,再做一张入库试一试案例呈现保质期已经发生了变化了再查一下现存量案例呈现保质期虽然也发生了变化,但是由于还是其中一次入库的生产日期,还可以接受那什么操作还会影响现存量呢?影响现存量表的因素除了出入库单据,还有整理现存量,那么在整理一下现存量看看案例呈现生产日期终于变了以上是测试重现这个问题,那么怎么将用户的现有错误数据修改正确呢?案例呈现分析一下整理现存量的存储过程(SP_ClearCurrentStock_ST)是怎么将生产日期修改成错误的发现了生产日期是通过下面的表达式赋值的dbo.ST_DateAdd(rdrecords.dvdate,isnull(inventory.imassdate,0),inventory.cmassunit)asdmdate案例呈现函数ST_DateAdd的内容:CREATEFUNCTIONST_DateAdd(@BeginDatedatetime,@iMassDateint,@cMassUnitnvarchar(10))RETURNSDatetimeasbeginif(@cMassUnit=N''or@cMassUnit=N'0')set@cMassUnit=nullif(@cMassUnit=N'年'or@cMassUnit=N'1')set@cMassUnit=N'year'if(@cMassUnit=N'月'or@cMassUnit=N'2')set@cMassUnit=N'month'if(@cMassUnit=N'日'or@cMassUnit=N'3')set@cMassUnit=N'day'RETURNcase@cMassUnitwhenN'year'thendateadd(year,@iMassDate,@BeginDate)whenN'month'thendateadd(month,@iMassDate,@BeginDate)whenN'day'thendateadd(day,@iMassDate,@BeginDate)whennullthennullendend它的作用是通过rdrecords表的失效日期和存货档案的保质期推算生产日期案例呈现所以利用这个函数也可以通过失效日期和单据上的最大保质期推算出原来的生产日期selectrdrecords.autoid,rdrecords.cinvcode,rdrecords.cbatch,rdrecords.dvdate,dbo.ST_DateAdd(rdrecords.dvdate,-isnull(m.imassdate,0),inventory.cmassunit)asdmdate,dmadedate,inventory.imassdate,inventory.cmassunitintordsbakfrom(rdrecordsleftjoinrdrecordonrdrecords.id=rdrecord.id)leftjoininventoryonrdrecords.cinvcode=inventory.cinvcodeLEFTJOIN(selectmax(imassdate)asimassdate,cinvcodefromrdrecordsgroupbycinvcode)monm.cinvcode=rdrecords.cinvcode案例呈现然后再按推算生产日期更新单据的生产日期updaterdrecordssetrdrecords.dmadedate=rdsbak.dmdatefromrdrecordsjoinrdsbakonrdrecords.autoid=rdsbak.autoid案例呈现将失效日期按现在存货保质期和现有单据的生产日期反推,插入临时表selectrdrecords.autoid,rdrecords.cinvcode,rdrecords.cbatch,rdrecords.dvdate,dbo.ST_DateAdd(rdrecords.dmadedate,isnull(inventory.imassdate,0),inventory.cmassunit)asdvdatebak,dmadedate,inventory.imassdate,inventory.cmassunitintordsdvdatebakfrom(rdrecordsleftjoinrdrecordonrdrecords.id=rdrecord.id)leftjoininventoryonrdrecords.cinvcode=inventory.cinvcodeLEFTJOIN(selectmax(imassdate)asimassdate,cinvcodefromrdrecordsgroupbycinvcode)monm.cinvcode=rdrecords.cinvcode案例呈现按推算失效日期更新单据的失效日期updaterdrecordssetrdrecords.dvdate=rdsdvdatebak.dvdatebakfromrdrecordsjoinrdsdvdatebakonrdrecords.autoid=rdsdvdatebak.autoid案例呈现与现存量的相关的表还有:DispatchListsSaleBillVouchsPU_ArrivalVouchsScrapvouchsv_EX_WaitInForStocktransvouchsqminspectvouchersQMCheckVoucherQMRejectVoucher处理方式和RdRecord相同案例呈现