应收应付核销规则及常见问题(续).7 预收款冲预付款1.7.1 预收款冲预付款定义就是应收系统的预收款与应付系统的预付款进行核销,可以是不同的客户与供应商之间进行。
1.8 收款冲付款1.8.1收款冲付款定义这个与预收款冲预付款的意思差不多,只是把预收单改为收款单,只是把预付单改为付款单而已。
1.9红蓝字的核销蓝字单据的核销按照以上规则核销完全正确,确定核销金额如果要求核销金额相等,核销直接取本次核销金额,如果不等,就会先把本次核销金额小的单据先核销掉。
对于有红字的单据参与核销,就需要附加一些特殊处理。
(以下部分来源湛剑的整理)1.9.1 全部是蓝字单据核销选中单据均是蓝字单据,核销时按金额小的一方核销,同时对金额大的一方的单据进行扣减处理;例如:核销界面同时选中以下单据应收款发票001 2004-04-15 2000发票002 2004-05-10 3000到款收款单 2004-05-15 4500系统处理:按核销金额4500核销,对发票002的本次核销金额自动改为2500,然后进行核销处理;1.9.2. 全部红字单据参与核销选中单据均是红字单据,核销时按金额绝对值小的一方核销,同时对金额绝对值大的一方的单据进行扣减处理;例如:核销界面同时选中以下单据应收款发票001 2004-04-15 -2000发票002 2004-05-10 -3000到款收款单 2004-05-15 -4500系统处理:按核销金额-4500核销,对发票002的本次核销金额自动改为-2500,然后进行核销处理;1.9.3 选中单据同时存在红蓝字单据,如果核销金额大于0选中单据同时存在红蓝字单据,如果核销金额大于0,核销时按金额小的一方核销,同时对金额大的一方的单据进行扣减处理;1.9.4 选中单据同时存在红蓝字单据,如果核销金额小于0选中单据同时存在红蓝字单据,如果核销金额小于0,则要求核销金额必须相等,同时按每张单据的本次核销金额进行核销处理例如:核销界面同时选中以下单据应收款发票001 2004-04-15 2000发票002 2004-05-10 -3000到款收款单 2004-05-15 4500退款单 2004-05-16 -5500系统处理:按核销金额-1000核销,然后对每张单据按其对应的本次核销金1.9.5 单边核销所谓单边核销就是在到款结算中,红字的发票和应收单可以与蓝字的发票和应收单核销,退款单也可以与收款单进行核销,但要求他们的绝对值相等。
1.10 核销中汇率的处理规则外币单据核销时,需要考虑汇率问题,直接影响期末调汇。
1.10.1 应收冲应付时汇率的处理规则应收冲应付时生成单据的汇率取得是过滤界面上币别的汇率,就是在币别设置中的汇率,与单据上的汇率是无关的。
例如:应收款单据原币为USD1000,单据汇率8.0,折本位币为8000,应付款单原币为USD1000,单据汇率8.1,折本位币为8100,核销处理时,假定核销的原币金额为USD1000,核销汇率参考当天外汇牌价为8.2,则核销本位币金额为USD1000*8.2=8200,输出各种账表(如应收款明细表)时,本位币金额按8200计算。
当天外汇牌价可以在核销界面中输入。
1.10.2 其他核销情况下汇率的处理规则由于全部取的是收款单的汇率,因此会造成应收单和发票的本位币差额,尤其会造成原币已经核销完,但本位币没有核销完,需要调汇来解决这个问题。
以到款结算为例来说明:如应收USD1000*8=8000,收款USD1000*8.1=8100,则核销的原币金额为USD1000,核销本位币金额为USD1000*8.1=8100,则核销完毕,应收单据的余额为原币为0,本位币为-100,收款单余额原币、本位币都为0。
由于汇率的差异导致的原币为0,本位币不为0的情况可以通过调汇进行处理。
如果多张外币应收款与多张外币收款单核销时,为保证核销汇率的一致,要求所有参与本次核销的收款单的汇率必须一样。
1.11 按存货数量的核销规则基本规律:按存货数量核销只对有发票单据的核销类型才有效。
由于其它应收单没有存货的信息资料,故只有销售发票可以参与按存货数量进行核销。
区别于选择按存货数量核销时,应收款列表框单据右边有一【详细】按钮。
单击【详细】,进入按货物核销界面,界面中显示了存货的品名、规格、数量、单价、未核销数量、未核销金额等信息。
录入本次核销数量及本次核销金额,单击【确定】,退回到“单据核销”界面,对刚才处理的销售发票及相应要核销的收款单打上选择标记,单击【核销】,即可按存货数量进行核销。
如果选择了按存货数量进行核销,会影响往来对账单和合同执行情况表的结果。
查询往来对账单时您可以选择按存货进行输出,随时了解未核销(即未收款)的存货品名、数量、金额等,同时还可查询合同的数量完成情况。
需要注意的是:如果某一发票体的本次核销的数量与剩余数量相同,那么本次核销金额会等于剩余金额,相反当本次核销金额等于为核销金额时,那么本次核销数量也自动设置为未核销数量。
这样保证了数量和金额的一致性。
1.12 按应收单号核销规则基本规则:按应收单号核销时,应收款列表框只显示与收款单关联的应收单据记录,选择待核销的收款单,则相关的其他应收单也自动打上选择标记,其他应收单不能手工选择。
单击【核销】,系统自动核销收款单及其对应的销售发票、其它应收单。
如果收款单金额大于销售发票、其它应收单的结算金额(即要核销的金额),则核销处理后,没核销完毕的收款单只能采用按金额或按存货数量方式进行核销,无法再按应收单号进行核销。
外币的处理:如果币别为非本位币币别,则核销金额的原币折本位币金额应为:核销原币金额 * 收款单的汇率。
1.13 自动核销基本规则:自动核销时,根据先进先出的方法按单据余额进行自动勾对。
即该往来单位所有未核销的发票、其它应收单与所有未核销的收款单、退款单(不包括预收单)核销。
此时参与核销的收款单不仅包括到款结算中显示的收款单据,还包括过滤框中未列示的未核销收款单,参与自动核销的其他应收单则包括您录入的所有该往来单位未核销的其他应收单,不只是过滤框中列示的其他应收单。
注意事项:由于汇率差异的影响,系统只对本位币提供自动核销功能,如果为非本位币单据,则必须通过手工核销进行处理。
◎但已按存货数量、应收单号进行部分核销的往来单位不能再参与自动核销。
◎除按金额方式进行到款结算核销外,对于其它核销类型与核销方式的组合,系统不提供自动核销的功能。
◎参与自动核销的其他应收单则包括您录入的所有该往来单位未核销的其他应收单,不只是过滤框中列示的其他应收单.二核销主要问题汇总2.1 性能问题2.1.1 性能问题主要表现◎如果数据量较大时,取数到填充表格的速度较慢,特别是到达10000条以上很慢。
◎核销时如果数据量较大核销的很慢,尤其是并发时数据更慢◎自动核销如果很多客户参与核销,而且单据较多时会很慢。
◎参与反核销的核销记录如果很多也会很慢。
◎以上如果多个用户并发操作时很慢。
2.1.1 性能问题主要对策客观上说,核销动作是个比较复杂的过程,需要很多数据的有效性检查,还需要更改每条单据的剩余金额,还需要生成单据,比一般的单据录入和报表取数的性能要差。
下面针对以上5点从设计的角度分析原因和需要改进的地方。
取数到填充的速度较漫:主要是我们使用的控件VaSpread采用实模式的数据填充方式造成填数很慢,以后使用kdGrid2000就不会存在这个问题。
核销时如果数据量较大核销的很慢:核销时我们要经过以下几个循环:A求出所有参与核销的应收单据本次核销金额和 B求出所有参与核销的收款单据本次核销金额和 C 对A,B的结果比较 D 打包所有参与核销的应收单据单据 E 打包所有参与核销的收款单据 F 到达中间层后解包,对每条数据又要进行合法性检查,然后减少单据余额,更新收付款计划。
,需要生成其他单据继续处理。
初步想法是合并A,B循环。
去掉中间层一般合法性检查,只保留对单据余额的合法性检查。
自动核销如果很多客户参与核销,而且单据较多时会很慢。
自动核销首先从应收款和到款中找到参与自动核销的客户。
但把所有返回的应收款和单据的单据都循环一边,感觉没有这个必要。
现在怎么从g_rsS和g_rsR中找到客户,而且找出来的客户不能相同?中间层也要两次循环,首先计算应收款和到款中的总额,然后扣减每条单据。
这两个循环是不是可以合并为一个循环。
参与反核销的核销记录如果很多也会很慢:以前是把所有参与的核销序号打包,送到中间层解包,并相应处理。
现在修改对每个核销序号分别发核销,大大减少了中间层事物的大小,从理论上可以提高性能,但没有得到实际的验证。
多个用户并发操作需要进一步的研究。
2.2 数据翻倍问题在自动核销时出现过数据翻倍问题,由于该问题一直不能在研发中心重现,我们初步认为由于K3V10.0以前版本没有网络控制,用户并发时可能造成多次扣减单据余额。
我们建议用户使用V9.4.1以前版本时使用自动核销时最好有一个用户操作,或者升级到K3V10.0,还要打上我们的SP补丁包。
我们还建议实施人员如果通过SQL更改我们数据库中表里的数据时,最好与研发中心联系,由我们分析SQl后再执行Update,delete或insert into操作。
2.4 核销常用SQl汇总(请注意红字部分)2.4.1 如果出现数据翻倍的问题第一步:先检查期初数据是否存在数据翻倍的情况。
--请执行如下SQL:select a.FID,a.Fnumber,a.Famount,a.FAmountFor,a.FRemainAmount,a.Frem ainAmountFor,c .Fnumber 客户代码from t_rp_contact aleft join(select FcontactID,sum(isnull(FcheckAmountFor,0)) FcheckAmou ntFor fromt_rp_newcheckinfo group by FContactID) b on a.FID=b.FcontactIDleft join t_item c on a.FCustomer=c.FitemIDleft join t_rpbegData d on a.FbegID=d.FIDwhere abs(a.FRemainAmountFor+isnull(b.FcheckAmountFor,0))>abs(d.FRemainAmountFor)and a.Fisinit=1 and a.FremainAmountFor<>0请把以上客户代码,单据代码为Fnumber的数据反核销第二步:再执行如下SQl修正数据翻倍--更新t_rp_rpdetail表中的期初数据update c set c.FRemainAmount=c.FAmount,c.FRemainAmountFor=c.FAMountFo rfrom t_rp_rpdetail cjoin t_rp_contact a on c.FOrgID=a.FIDjoin t_rpbegData d on a.FbegID=d.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=1 and a.FremainAmountFor<>0--删除t_rp_checkdetail中翻倍的期初数据delete c from t_rp_checkdetail cjoin t_rp_contact a on c.FContactID=a.FIDjoin t_rpbegData d on a.FbegID=d.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=1 and a.FremainAmountFor<>0--删除t_rp_checkentry 中翻倍的期初数据(应收系统)delete c from t_rp_checkentry cjoin t_rp_contact a on c.FInvoiceID=a.FbegIDjoin t_rpbegData d on a.FbegID=d.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=1 and a.FremainAmountFor<>0 and c.FRP=1--删除t_rp_checkentry 中翻倍的期初数据(应付系统)delete c from t_rp_checkentry cjoin t_rp_contact a on c.FInvoiceID=a.FbegIDjoin t_rpbegData d on a.FbegID=d.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=1 and a.FremainAmountFor<>0 and c.FRP=0--更新t_rp_contact表中的期初数据的单据余额Update a Set a.FRemainamount=d.FRemainAmount,a.FremainamountFor=d.FRemainAmountForfrom t_rp_contact a join t_rpbegData d on a.FbegID=d.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=1 and a.FremainAmountFor<>0第三步再检查本期录入数据数据是否存在数据翻倍的情况--请执行如下SQL:select a.FID,a.Fnumber,a.Famount,a.FAmountFor,a.FRemainAmount,a.Frem ainAmountFor,c .Fnumber 客户代码from t_rp_contact aleft join(select FcontactID,sum(isnull(FcheckAmountFor,0)) FcheckAmou ntFor fromt_rp_newcheckinfo group by FContactID) b on a.FID=b.FcontactIDleft join t_item c on a.FCustomer=c.FitemIDwhere abs(a.FRemainAmountFor+isnull(b.FcheckAmountFor,0))>abs(a.FAmou ntFor)and a.Fisinit=0请把以上客户代码,单据代码为Fnumber的数据反核销第四步再执行如下SQl修正数据翻倍--更新t_rp_rpdetail表中的正常数据update c set c.FRemainAmount=c.FAmount,c.FRemainAmountFor=c.FAMountFo rfrom t_rp_rpdetail cjoin t_rp_contact a on c.FOrgID=a.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=0 and abs(a.FremainAmountFor)>abs(a.FAmountFor)--删除t_rp_checkdetail中翻倍的正常数据delete c from t_rp_checkdetail cjoin t_rp_contact a on c.FContactID=a.FIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=0 and abs(a.FremainAmountFor)>abs(a.FAmountFor)--删除t_rp_checkentry 中翻倍的正常数据(应收系统)delete c from t_rp_checkentry cjoin t_rp_contact a on c.FInvoiceID=a.FInvoiceIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=0 and abs(a.FremainAmountFor)>abs(a.FAmountFor)and FRP=1--删除t_rp_checkentry 中翻倍的正常数据(应付系统)delete c from t_rp_checkentry cjoin t_rp_contact a on c.FInvoiceID=a.FInvoiceIDwhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=0 and abs(a.FremainAmountFor)>abs(a.FAmountFor) and FRp =0--删除t_rp_contact 中翻倍的正常数据Update a Set a.FRemainamount=a.FAmount,a.FremainamountFor=a.FAmountForfrom t_rp_contact awhere a.FID not in(Select FcontactID from t_rp_newcheckinfo)and a.Fisinit=0 and abs(a.FremainAmountFor)>abs(a.FAmountFor)/blog/more.asp?name=dml&id=28521。