在后台处理从供应链传到财务的数据错误一例NC产品支持部徐建军xujianjun@ufida.com.cn近期遇到一个问题,是到从供应链的源头单据传到应付单,并通过会计平台生成凭证的问题,由于是由一个模块的数据传到另外一个模块并且经过了会计平台,因此问题处理起来比较头疼,需要对两个模块的产品都要熟悉。应用模式在下面的单据上引用自定义项(某个项目档案),通过修改VO对照按照下面的流程来传递:请购单表头自定义项3——》采购订单表头自定义项3——》采购入库单表头自定义项3——》采购发票表体自定义项10——》应付单表体自定义项10,在应付单的凭证模板上配置一行的分录辅助核算取次自定义项10,这样就能把最开始的自定义项传到凭证的辅助核算上。问题描述生成了凭证以后,在查询凭证的时候,如果没有输入辅助核算项的值就能查询出来,但是加上辅助核算项查询的时候就查询不到。问题分析很明显,问题就出现在这个辅助核算项上,很可能查询凭证的时候输入的这个辅助核算项和后台数据中凭证中存放的辅助核算项不一致。---查询凭证的pkselectpk_voucherfromgl_voucherwhereno='109'andpk_corp='1087'andprepareddate='2009-03-12'anddr='0'---根据凭证的pk和分录的信息查询有问题的分录的idselectassidfromgl_detailwherepk_voucher='1087A41000000001VJGD'anddebitamount='65598.03'---根据分录id来查询辅助核算项的pkselectcheckvaluefromgl_freevaluewherefreevalueid='1087A41000000001UNZE'checkvalue='1004011000000000038Y'---根据辅助核算项目的值在管理档案中查询管理档案的pkselectpk_jobmngfilfrombd_jobmngfilwherepk_jobbasfil=(selectpk_jobbasfilfrombd_jobbasfilwherejobname='彭山·恒大金碧天下(首期)')andpk_corp='1087'pk_jobmngfil=108701100000000000PL猜测正确,在数据库中存放的数据其实是错误的,但是这个错误数据怎么来的呢?由此,我们做以下推测:(1)应付单在会计平台生成凭证的时候出问题(2)采购发票传应付的时候有问题因此我们逐步来查询是否以上两步的原因(1)查询应收单表体的自定义项10的值SELECTzyx10FROMARAP_DJFBWHEREVOUCHID=(selectvouchidfromarap_djzbwheredwbm='1087'anddjbh='YF0903240015'ANDDR='0')orderbyzyx10发现有25行(合并生成凭证的)的zyx10上的值和凭证中辅助核算的值一致,这就说明在会计平台生成凭证的时候数据没有传递错误。(2)查询采购发票表体自定义项10的值selectpk_defdoc10frompo_invoice_bwherecinvoiceid=(SELECTCINVOICEIDFROMPO_INVOICEWHEREpk_corp='1087'andVINVOICECODE='0902S-03')andcinvoice_bidin(SELECTddhhFROMARAP_DJFBWHEREVOUCHID='1087A41000000001UEUP'andzyx10='1004011000000000038Y')发现数据也是一致的。上面的推测被打翻了,在产品中从请购单到发票的自定义项传递应该没有问题,难道是源头数据有问题?(不妨查询一下看看有什么情况)查询请购单单表头自定义项3的值---查询发票的源头单据的表头id、表体行id、源头单据类型selectcsourcebillid,csourcebillrowid,csourcebilltpefrompo_invoice_bwherecinvoiceid=(SELECTCINVOICEIDFROMPO_INVOICEWHEREpk_corp='1087'andVINVOICECODE='0902S-03')andcinvoice_bidin(SELECTddhhFROMARAP_DJFBWHEREVOUCHID='1087A41000000001UEUP'andzyx10='1004011000000000038Y')Csourcebillid=1087A41000000001LNI3发票的源头单据是采购订单,因此只能根据订单表体中的源头单据来查询请购单selectpk_defdoc3frompo_praybillwherecpraybillid=(selectdistinctcsourcebillidfrompo_order_bwherecorderid='1087A41000000001LNI3')发现在请购单上的自定义3中的值和最终生成凭证辅助核算的值是一致的,那为什么录入自定义项3的时候会有错误呢?进过仔细检查发现在请购单上的自定义项3不是手工录入的,而是在其他的字段上写公式触发出来的,我们分析一下下面的编辑公式:vdef3->getColValue(bd_jobbasfil,jobcode,jobname,vdef7);vdef3->left(vdef3,8);pk_defdoc3->getColValue(bd_jobmngfil,pk_jobmngfil,pk_jobbasfil,getColValue(bd_jobbasfil,pk_jobbasfil,jobcode,vdef3));vdef3->getColValue(bd_jobbasfil,jobname,jobcode,vdef3)这个公式可以等同于下面这个语句selectpk_jobmngfilfrombd_jobmngfilwherepk_jobbasfil=(selectpk_jobbasfilfrombd_jobbasfilwherejobcode=vdef3)在取pk_jobmngfil(管理档案的pk)值的时候只有一个条件就是根据pk_jobbasfil(基本档案的pk),这样的条件显然不严格,一个基本档案的pk对应多个公司内的管理档案的pk,因此必须要加上一个pk_corp的条件所以这个公式要改成pk_defdoc3->getColValue2(bd_jobmngfil,pk_jobmngfil,pk_jobbasfil,getColValue(bd_jobbasfil,pk_jobbasfil,jobcode,vdef3),pk_corp,pk_corp)到此为止,问题已经很清楚了,但是对于目前存在的这些错误数据怎么处理呢?如果要在数据库中对每个单据做修改工作量就很大,如果客户对于供应链的数据不太关注的话,可以采用下面的方案来将凭证修复正确在会计平台的应付单表体辅助核算中,将错误的项目管理档案主键值转换为项目管理档案基本键,再转换为当前公司正确的管理主键a->getcolvalue("bd_jobmngfil","pk_jobbasfil","pk_jobmngfil",#表体自定义项100#);b->getcolvalue2("bd_jobmngfil","pk_jobmngfil","pk_jobbasfil",a,"pk_corp","1087");然后在凭证生成中将这张业务单据重算一下,重新生成凭证即可。