已经N年没做ERP软件了,近日在帮一个老客户做用友软件年结时,在等了大半小时的时候,竟然弹出提示说结转失败!除此外无任何提示,郁闷啊!
没办法,只好操起MSSQL的屠龙宝刀-事件探查器,监控用友软件年结时所执行的操作,发现在年转时对存货核算总账表IA_Summary进行结转时,竟然无故中止了。连插入失败都失败?将最后一条语句执行了一下,无任何报错,看来问题不是在插入这里,往上查看,发现用友在做年转时,是把年末数据先查询出来,然后一条一条插入到新账套中去(怪不得要等这么久,效率够低啊,真应该把他们的开发人员培训一番才行)。看来问题可能是出现就查询年末数据上面,一直往上查找,发现以下语句,证实自己的猜想
SELECT 0, IA_Summary.cWhCode as cwhcode, IA_Summary.cInvCode,
cast(str(IA_Summary.iNum,20,5) as float) as iNum,
IA_Summary.iDif,
IA_Summary.iDifRate,
cast(str(iMoney,20,2) as money) as iMoney,
(case cast(str(iNum,20,5) as float) when 0 then Null
else cast(str(iMoney/cast(str(iNum,20,5) as money) ,20,4) as float) end ) as Cost,
fMinInCost,fMaxInCost FROM IA_Summary WHERE (((IA_Summary.iMonth)=12))
该句就是将存货总账期末数据查询出来,将该语句放在查询分析器中执行,出现被零除错误,真相终于大白。从以上语句上,用友已经是对数量iNum字段为零时做了判断处理,为啥还会出现除数0的错误?经调查发现,原因在于iNum字段出现极小的数据,而上面的语句只判断了小数前面5位都为零的情况,如果iNum字段的内容小于0.000001情况下,问题就发生了。
原因找到,解决的方法也很简单,删除有问题的记录,因为iNum是存货的结存数量,当结存数量为零或极小时,完全可以删除掉该记录,无需结转,执行以下语句
delete IA_Summary where abs(iNum)<0.000001 and iMonth=12
执行后重新做年转,顺利通过!