AX4.0 SP2本地化的问题汇兑损益报表打印

问题描述:
1.总帐->查询->凭证交易记录,输入一张 汇兑损益 产生的凭证的凭证号,点击打印->凭证
也可以通过如下路径:总帐->会计科目表(找到在汇率处设定的 汇兑损益科目)->交易记录->凭证->打印
出现如下错误:

修复如上bug(问题原因和修复方法在本文下面描述),重新打印凭证
2.打印出的报表没有金额,如下图所示:

问题原因
1.SP1有个bug,汇率的计算用了  (外币发生额/当前交易币种发生额)*100,也就是除反了,SP2修复了这个bug,采用了(本币发生额/当前交易币种发生额)*100,但没有改变零的判断条件,依然判断了本币发生额是否为零,而没有改成判断当前交易币种发生额,于是就出错了。
具体代码为:类LedgerReport_Voucher_CN的initFromLedgerTrans方法.
2.取不出数是因为AX在处理LedgerPostingType为汇兑收益(ExchRateGain),汇兑损失(ExchRateLoss)等(当然也可能还有其他的过账类型,具体还有哪些类型我没测试过,可能要微软给出相应文档了)过账类型的时候跟其他过账类型处理方式不同,这些过账类型在LedgerTrans的当前交易币种的金额字段AmountCur并没有记录金额(可能本来就是汇兑损益产生的金额,所以就没有记录该金额吧?),而是只在本位币发生额字段AmoutMST处记录了金额,而这张报表在取数的时候是通过LedgerReport_Voucher_CN的initFromLedgerTrans实现的,这个方法只取了LedgerTrans的字段AmountCur的值,报表中的本位币金额是使用AmountCur通过汇率计算出来的,由于汇兑损益类型的过账在LedgerTrans只记录了本位币发生额,并没有记录当前交易币种的发生额AmountCur,于是就取不到数了。
解决方法
1.将LedgerReport_Voucher_CN的initFromLedgerTrans的方法判断零那段代码修改为如下代码:
if (_ledgerTrans.AmountCur != 0)
    
{
        tmpVoucher.ExchRate         
= (_ledgerTrans.AmountMST / _ledgerTrans.AmountCur) * 100;
    }
2.由于在这种情况下只有本位币金额没有当前交易币种发生额的金额,也就没办法计算汇率了,就不能绕个弯通过汇率计算本位币金额的方式了。
可以考虑给表TmpVoucher_CN增加两个字段AmountMSTDebit和AmountMSTCredit,分别用于记录LedgerTrans的本位币贷方和借方发生额。然后修改报表LedgerVoucher_CN的fetch和printerLedgerTrans方法以及类LedgerReport_Voucher_CN的initFromLedgerTrans方法,改变Design的字段AmountMSTCredit和AmountMSTDebit字段的取数逻辑,改为直接从表TmpVoucher_CN的相应字段取数。
当然仁者见仁,智者见智,每个人都有自己的修改方法,另外俺也没有仔细分析这个报表的代码,没搞清楚AX在实现的时候为什么要绕个弯,先通过本位币金额计算出汇率,再用汇率计算出本位币,而不是直接取LederTrans的本位币发生额AmountMST,可能有些地方俺没考虑周全,.所以这里只给出一个俺的思路供参考,每个人可以根据自己的理解去改,只要改对了就OK了,期待微软尽快给出统一的解决方案,我们就不用都自己改一个版本了,呵呵。
原文地址:https://www.cnblogs.com/Farseer1215/p/880880.html