正常单据记帐过滤不出单据的分析过程及处理问题的方法论意义用友软件股份有限公司王小朋03/28/2024一、错误现象二、分析/跟踪过程三、最终解决方案四、方法论引申客户实际问题:客户销售成本按照发票核算,请客户对比,找到某销售发票上某记录,在正常单据记账时过滤不出来;该记录的仓库与其它记录完全一致,不是退补,没有记账。即:正常单据记账过滤出来的销售发票的数量少于销售发票列表中的数量?由客户实际问题引申出的案例共享:正常单据记帐过滤不出单据的分析过程及处理问题的方法论意义。一、错误现象分析思路:使用事件探查器跟踪存货正常单据记帐过滤单据的语句:二、分析/跟踪过程分析思路:关键语句:select''asSelCol,inventory.bTrack,0asbAccFlag,aa_enum.EnumNameascvouchname,Rd_Style.cRdName,comUnit.cComUnitNameascComUnitName,Warehouse.cwhname,Warehouse.cWhValueStyleascvaluetype,Inventory.cComUnitCodeascComUnitCode,Inventory.cInvAddCodeascInvAddCode,(Inventory.cInvName)ascInvName,(Inventory.cInvStd)ascInvStd,Customer.cCusAbbNameascCusAbbName,(Vendor.cVenAbbName)ascVenAbbName,casewhen(Warehouse.cWhValueStyle=N'计划价法'orWarehouse.cWhValueStyle=N'售价法')then(InvCheckFreeIA870.finvrcost)elsenullendasiInvRCost,casewhen(Warehouse.cWhValueStyle=N'计划价法'orWarehouse.cWhValueStyle=N'售价法')二、分析/跟踪过程分析思路:then(InvCheckFreeIA870.finvrcost*iquantity)elsenullendasiInvRPrice,cInvCCode,cVCCode,cInvDefine1,cInvDefine2,cInvDefine3,cInvDefine4,cInvDefine5,cInvDefine6,cInvDefine7,cInvDefine8,cInvDefine9,cInvDefine10,cInvDefine11,cInvDefine12,cInvDefine13,cInvDefine14,cInvDefine15,cInvDefine16,IA_Data_Subsidiary.*--intoIA_GUI_Data注意插入该表。二、分析/跟踪过程分析思路:fromIA_Data_SubsidiaryinnerjoinInventoryonInventory.cInvCode=IA_Data_Subsidiary.cInvCodeleftjoinWarehouseonWarehouse.cWhCode=IA_Data_Subsidiary.cWhCodeleftjoinVendoronVendor.cVenCode=IA_Data_Subsidiary.cVenCodeleftjoinCustomeronCustomer.cCusCode=IA_Data_Subsidiary.cCusCodeleftjoinComputationUnitcomUnitoncomUnit.cComunitCode=Inventory.cComUnitCodeleftjoinRd_StyleonRd_Style.cRdCode=IA_Data_Subsidiary.cRdCodeinnerjoinVouchTypeonvouchtype.cvouchtype=IA_Data_Subsidiary.cvoutypeinnerjoinaa_enumonvouchtype.cVouchName=aa_enum.EnumCodeandaa_enum.LocaleID='zh-CN'andaa_enum.EnumType='IA.VchType'leftjoinInvCheckFreeIA870onInvCheckFreeIA870.cinvcode=IA_Data_Subsidiary.cinvcodeand((inventory.bCheckFree1=1andisnull(InvCheckFreeIA870.cfree1,'')=isnull(IA_Data_Subsidiary.cfree1,''))orinventory.bCheckFree1=0)and((inventory.bCheckFree2=1二、分析/跟踪过程分析思路:andisnull(InvCheckFreeIA870.cfree2,'')=isnull(IA_Data_Subsidiary.cfree2,''))orinventory.bCheckFree2=0)and((inventory.bCheckFree3=1andisnull(InvCheckFreeIA870.cfree3,'')=isnull(IA_Data_Subsidiary.cfree3,''))orinventory.bCheckFree3=0)and((inventory.bCheckFree4=1andisnull(InvCheckFreeIA870.cfree4,'')=isnull(IA_Data_Subsidiary.cfree4,''))orinventory.bCheckFree4=0)and((inventory.bCheckFree5=1andisnull(InvCheckFreeIA870.cfree5,'')=isnull(IA_Data_Subsidiary.cfree5,''))orinventory.bCheckFree5=0)and((inventory.bCheckFree6=1andisnull(InvCheckFreeIA870.cfree6,'')=isnull(IA_Data_Subsidiary.cfree6,''))orinventory.bCheckFree6=0)and((inventory.bCheckFree7=1二、分析/跟踪过程客户实际问题:andisnull(InvCheckFreeIA870.cfree7,'')=isnull(IA_Data_Subsidiary.cfree7,''))orinventory.bCheckFree7=0)and((inventory.bCheckFree8=1andisnull(InvCheckFreeIA870.cfree8,'')=isnull(IA_Data_Subsidiary.cfree8,''))orinventory.bCheckFree8=0)and((inventory.bCheckFree9=1andisnull(InvCheckFreeIA870.cfree9,'')=isnull(IA_Data_Subsidiary.cfree9,''))orinventory.bCheckFree9=0)and((inventory.bCheckFree10=1andisnull(InvCheckFreeIA870.cfree10,'')=isnull(IA_Data_Subsidiary.cfree10,''))orinventory.bCheckFree10=0)orderbydVouDate,dnOrderTime,ipzid--正常单据记账过滤语句通过最后的正常单据记帐过滤语句,找到以下存储过程:二、分析/跟踪过程客户实际问题:execIA_AccountLoad'',N'1=1And(cVouTypeIN(N''26'',N''27''))andcwhcodein(selectcwhcodefromwarehousewherebincost=1)anddvoudate<=N''2008-10-31''And((NotcWhCodeIN(SelectcWhCodeFromWarehouseWherebInCost=0))orcWhCodeisnull)','','',''---正常单据记账界面单据加载存储过程然后分析该存储过程,找到另一个过滤单据后,删除不符合记账条件的存储过程:IA_RepairDataSource二、分析/跟踪过程客户实际问题:execIA_RepairDataSource10select*FROMIA_Data_SubsidiaryiaINNERJOINRdrecordsrdsONia.cvoutypein(N'26',N'27',N'28',N'29')ANDia.cDLCode=rds.idlsidANDISNULL(rds.cbaccounter,N'')<>N''(关键点,判断Rds表中的表体记账人不为空)INNERJOINrdrecordrdONrd.id=rds.idAND(ISNULL(rd.csource,N‘’)<>N‘出口销货单’ANDISNULL(rd.csource,N‘’)<>N‘出口退货单’)即:正常单据记账时,先默认加载所有符合过滤条件的单据,之后,再使用IA_RepairDataSource存储过程,删除那些不符合记账条件的单据。二、分析/跟踪过程由该问题的分析过程,看问题的产生的原因虽然是按照销售发票记账,但系统记账过滤单据时,同时要判断Rds表中的表体记账人是否为空,表体有记账人的记录,要被删除掉。那么,回到客户实际的业务中,既然是按照销售发票记账,那为什么销售出库单的表体会有记账人呢?由此不难发现,用户可能修改过销售成本的核算方式,而且直接修改的Accinformation表,导致之前按照销售出库单记账方式下已经记过账的销售出库单,对应的销售发票,在按照销售发票核算成本的方式下,无法正常单据记账。同时,也提醒我们在处理客户实际问题时,比如修改销售成本的核算方式,一味简单的去修改Accinformaiton表中的选项,而不顾及如此修改后对之后操作的影响,是不可取的。三、最终解决方案那么由此问题,引申出的方法论意义在于:使用语句分析的方法,主要是通过Where语句的判断,分别去除不同的where条件,直至查询出的符合实际业务的结果,那么问题就在该Where语句的条件上,比如,刚才的例子,表体的记账人<>NULL,去除该条件,则可以过滤出需要记账的发票,那么,问题也就在此,解决方案则不言而喻。再比如,生产订单工序计划生成后,末道工序已经有合格数量,但就是无法被参照入库?该问题分析时,关键点也在where条件上,看如下跟踪语句:四、方法论引申方法论意义:selectMoId,MoDId,convert(money,ufts),Status,MoCode,byproductflagFROMv_st_mom_orderdetailwith(nolock)Where((1>0)AND(1>0))AND(1>0)and(casewhenISNULL(SfcFlag,0)=1theniquantity+QualifiedInQtyelse1end)<>0andISNULL(QCFLAG,0)=0(注意该条件:QCFLAG,检验否,0为不检验)andISNULL(Status,0)=3and(ISNULL(iQuantity,0))>0andisnull(MrpQty,0)<>0四、方法论引申方法论意义:当一条条去除where条件后,到ISNULL(QCFLAG,0)=0,QCFLAG,检验否,则系统便能过滤出相应的生产订单,即:表体记录是否检验要选择“否”,那么再回到客户实际业务,根本没有质检的模块,那么就谈不上检验问题了,那,问题又出在哪里?该问题多数是因为客户的存货档案是直接导入的,原来存货档案的属性是否质检选择的“是”,而导入的时候,不判断目前账套是否有质检模块,所以导致后续的生产订单无法入库。四、方法论引申