服务单生成服务结算单某些存货出现重复记录215号工程师问题描述:890版本,服务单自动生成服务结算单,带出存货记录重复,导致结算单上金额不对。例如,服务单上的收费配件为a,b两个,但是自动生成结算单,有三行记录,其中a存在两行记录,导致结算单金额不对。问题现象:问题现象:从上图看,有服务单号为sns2009009的服务单,有存货编码为001的服务产品,需要有两个收费的配件00101,003,总计的金额为110元。但是服务单上体现的收费金额为120元。点击服务单上的“结算”按钮,进行自动生成结算单,将自动带出两行003存货,导致总计的结算金额为120元。什么原因导致此现象产生呢?单据上看到的存货就是两行记录。为何结算时会带出三行记录?问题分析:指导用户在服务结算单上,点击生单按钮进行参照生成,查看表体带出的记录,是否重复。如下图,发现003存货参照生成时带出的也是两行记录。到底是什么原因导致带出的记录会重复,但是在服务单上查看显示的记录是正常的呢?此时,我们需要先跟踪确认服务单后台存储相关记录的表有哪些,它们之间是如何关联的,来分析出现问题的原因。跟踪分析,找到服务单存储的后台数据表为服务单主表sr_servicebill,服务单表体sr_servicebilldetail,服务配件表sr_serviceitems.这三张表之间的关系为sr_servicebill表中的oid关联sr_servicebilldetail表中的serbillid,同时关联sr_serviceitems表中的serbillid。同时,servicebilldetail表中的oid与sr_serviceitems表中的serbodyoid进行关联。进行结算时,系统应该按照serbillid查询出sr_serviceitems表中的记录,带出到服务结算单上。而在服务单上显示服务配件,应该是按照serbodyoid关联出来sr_serviceitems表中的配件记录。会不会是sr_serviceitems表就有重复记录呢?后台查询一下看看。useufdata_001_2009select*fromsr_servicebillwherecSerBillCode='sns2009009‘select*fromsr_servicebilldetailwhereSerBillID='{D47289DD-10E8-454E-967D-65E345CA251C}‘selectSerBodyOID,SerBillID,*fromsr_serviceitemswhereSerBillID='{D47289DD-10E8-454E-967D-65E345CA251C}'下面是查询分析器的查询结果:从上面查询分析器查询的结果,可以看到sr_serviceitems表中确实存在三行记录,其中一行为重复记录,由于此行的serbodyoid为null值,则在服务单上的配件中,无法体现出来重复的记录,但是再进行结算,生成结算单时,用serbillid查找出记录,则将带出重复记录,导致结算单金额不正确。至此,我们找到问题存在的原因,问题解决就比较简单了。解决方案:删除sr_serviceitems表中的重复记录,同时更新sr_servicebill表中的mchargesum(收费金额)字段为正确的金额。deletefromsr_serviceitemswhereautoid=5updatesr_servicebillsetmChargeSum=110wherecSerBillCode='sns2009009'我们再前台参照看一下,参照带出的配件正确了。总结:对于此问题,在日常处理中应该不经常遇到。因为使用890版本售后服务模块的用户并不多。对于服务单,由于涉及到服务的产品,以及相应的配件,在后台需要三张表来记录,并不是一般单据的简单的主子表关系。服务单主表sr_servicebill与sr_servicebilldetail和sr_serviceitems关联。同时sr_servicebilldetail表和sr_serviceitems表关联。这样当st_serviceitems表中的serbillid正确,serbodyoid不正确或者为空时,则虽然在服务单查看配件正确,但是结算时会多出记录。同理,当st_serviceitems表中的serbodyoid字段正确,但是serbillid字段不对或者为空时,将导致虽然在服务单上查看配件正确,但是结算时会丢失记录。