Python单据转换插件处理寄售结算单结算币别错乱问题原创
金蝶云社区-angen
angen
3人赞赏了该文章 1,008次浏览 未经作者许可,禁止转载编辑于2022年12月08日 17:20:45
summary-icon摘要由AI智能服务提供

本文介绍了在金蝶软件某个版本中,关于寄售结算单结算币别获取逻辑的一个bug及其修复方案。在PT-146881版本前,寄售结算单结算币别依据直接调拨单获取,但应依据寄售结算单结算组织。PT-146881版本尝试修复但引入新bug,结算币别被汇率类型取代。PT-146884版本修复此问题,建议客户升级。若无法升级,可通过添加Python插件修正。文章还提供了Python插件代码和调试注意事项。

    在版本PT-146881 [7.7.0.202106]之前,由于直接调拨单的单据插件会依据调出库存组织(调出库存组织是直接调拨单上的主业务组织),调出货主(表头上的字段)获取结算币别,但是在寄售结算单中,结算币别应该要依据寄售结算单的结算组织获取,因此有客户提单了此需求,通版在PT-146881 [7.7.0.202106]版本中,把寄售结算单上的结算币别,汇率类型,本位币都从直接调拨单的直接上游(比如发货通知单或销售订单)获取,而不是直接调拨单上获取(默认情况下,直接调拨单到寄售结算单的单据转换中的字段映射就是从直接调拨单上携带的),但在这个补丁处理时,有一个小bug,那就是结算币别会被汇率类型取代,比如说在寄售结算单中的汇率类型为固定汇率,那么它的结算币别始终会是人民币,因为固定汇率和人民币默认在数据库中的ID是一样的(如果汇率是即期汇率,结算币别始终是香港元,通过下图Sql脚本查询结果中的FRATETYPEID和FCURRENCYID字段值对应),如下图1-1所示:

image.png

图1-1


    在后一个版本中,通版已经修复了这个问题,因此建议客户直接升级到PT-146884 [7.7.0.202108]版本中,如果客户有特殊要求不能升级,则可在直接调拨单到寄售结算单单据转换中的参照下图1-2所示,添加一个Python插件:

image.png

图1-2


    上图中如果点确定按钮时有弹出Python语法错误提示,可直接忽略,附件中包含有Python脚本,可直接从附件拷贝出来。下文为其Python脚本代码(注:不要直接从论坛中拷贝以下Python脚本,要从附件中拷贝,因为下文的空格会被HTML转义)

import clr
clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.DataEntity')
from System import *
global settleCurrency 
settleCurrency = None;
def OnAfterCreateLink(e):
    dataSet = e.TargetExtendedDataEntities;
    heads = dataSet.FindByEntityKey("FBillHead");
    for head in heads:
        headFinance = head.DataEntity["SaleCconsignSettleFinance"];
        headFinance = headFinance[0];
        global settleCurrency;
        if settleCurrency is not None:            
            headFinance["SettleCurrId_Id"] = Convert.ToInt32(settleCurrency["Id"])
            headFinance["SettleCurrId"] = settleCurrency;
        
def OnAfterFieldMapping(e):
    dataSet = e.TargetExtendDataEntitySet;
    heads = dataSet.FindByEntityKey("FBillHead");
    for head in heads:
        headFinance = head.DataEntity["SaleCconsignSettleFinance"];
        headFinance = headFinance[0];
        global settleCurrency;
        settleCurrency = headFinance["SettleCurrId"];


    上面的Python代码也要挂在寄售退回的单据转换中,如果客户后续又升级了版本(PT-146884 [7.7.0.202108]之后),则上面的Python插件可以删除。另外如果有特殊需求,客户也可以使用类似的Python脚本二开微调一些字段的赋值逻辑,个人认为星空支持的IronPython功能还是比较强大的,对于不想写C#插件的二开客户,Python插件功能更适用,有关如何用Visual Studio调试Python代码的介绍,可参阅地址:https://vip.kingdee.com/article/278933272208919552?productLineId=1 。这里需要注意的是,如果使用前面https://vip.kingdee.com/article/278933272208919552?productLineId=1 帖子介绍的调试方法,可能会出现本文Python插件调试不成功的情况,因为本人测试过单据转换插件的Python全局变量,用Visual Studio调试时,在OnAfterCreateLink和OnAfterFieldMapping方法中一直共享不了settleCurrency 全局变量。但是如果直接复制Python代码到图1-2中又是可以的,这个我也一直没有搞明白为何,有搞懂的大神可分享下知识。


图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!