Python实现自定义单据选择往来单位银行信息原创
金蝶云社区-CQ周玉立
CQ周玉立
19人赞赏了该文章 2,829次浏览 未经作者许可,禁止转载编辑于2022年01月08日 13:40:30
summary-icon摘要由AI智能服务提供

本文介绍了如何在金蝶BOS系统中实现付款申请单中根据往来单位类型和单位自动选择银行信息并回填到单据字段的功能。通过在BOS中设置文本字段属性,触发银行信息选择窗口,并通过Python插件编写回调函数处理选择结果,将选择的银行信息回填到单据对应字段。同时提供了Python代码示例和步骤说明,以及开发技巧的总结。

标准费用报销单据支持根据不同往来单位类型和往来单位选择往来单位的银行信息,并返回到单据对应的字段里面。

类似下图的功能:

image.png



这里分享一下付款申请单如何实现这一功能,本案是在付款申请单的明细增加往来单位类型、往来单位。可以对每一个往来单位的银行信息进行选择后回传字段值。其他单据参考此方法皆可实现!

实现方法:

  1. 在BOS中打开【付款申请单】。

  2. 本案例采用的弹出银行信息选择窗口的触发条件是"文本字段右侧的3个点",插件中触发的事件是:BeforeSelect

    文本字段显示"3个点"设置方法:在文本字段(例如,银行账号)字段属性中,勾选【显示编辑按钮】即可,如下图所示image.png

  3. 注意:需要根据代码中的注释自行修改字段标。

  4. 开发技巧总结:通过本案例可以学习如何在Python插件中做界面交互,实现弹窗与回调的代码写法。

  5. 在【表单插件】中注册Python脚本,参考代码如下(网页复制有格式问题,可下载参考代码附件):




#引入clr运行库
# -*- coding: utf-8 -*-
import clr

#添加对cloud插件开发的常用组件的引用
clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.ServiceHelper')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from System import *
from System.Data import *
from Kingdee.BOS.App.Data import *
from System.Collections.Generic import List
from Kingdee.BOS.ServiceHelper import *

def ChildFromClosed(obj):
	if (obj.ReturnData == None):
		return;
	dictionary=obj.ReturnData;
	FBankAccountNameT="";
	FBankBranchT="";
	FBankAccountT="";
	FBankAddress="";
	FBANKCNAPS="";
	FBankTypeRecT="";
	if (dictionary.ContainsKey("FBANKHOLDER")):
	 	FBankAccountNameT="{0}".format(dictionary["FBANKHOLDER"]);
 	if(dictionary.ContainsKey("FOPENBANKNAME")):
 		FBankBranchT="{0}".format(dictionary["FOPENBANKNAME"]);
	if(dictionary.ContainsKey("FBANKCODE")):
 		FBankAccountT="{0}".format(dictionary["FBANKCODE"]);
	if(dictionary.ContainsKey("FOpenAddressRec")):
 		FBankAddress="{0}".format(dictionary["FOpenAddressRec"]);
	if(dictionary.ContainsKey("FCNAPS")):
 		FBANKCNAPS="{0}".format(dictionary["FCNAPS"]);
	if(dictionary.ContainsKey("FBankTypeRec")):
 		FBankTypeRecT="{0}".format(dictionary["FBankTypeRec"]);
	Row= this.Model.GetEntryCurrentRowIndex("FPAYAPPLYENTRY");
	#以下是接收弹窗返回的数据后,返回到单据上的字段进行赋值
	this.View.Model.SetValue("FEACHCCOUNTNAME",FBankAccountNameT,Row);#FEACHCCOUNTNAME:账户名称
	this.View.Model.SetValue("FEACHBANKNAME",FBankBranchT,Row);#FEACHBANKNAME:账户名称
	this.View.Model.SetValue("FEACHBANKACCOUNT",FBankAccountT,Row);#FEACHBANKACCOUNT:银行账号
	this.View.Model.SetItemValueByNumber("FBANKDETAIL",FBANKCNAPS,Row);#FBANKDETAIL:银行网点基础资料

def GetOppositeBankAcc(Row):
	#billObj = this.View.Model.DataObject;
	ContactUnit = this.View.Model.GetValue("F_SKDW",Row);
	if(str(ContactUnit)=="None"):
		this.View.ShowErrMessage("请先录入收款单位!");
		return;
	baseDataID = ContactUnit["Id"];
	text = str(this.View.Model.GetValue("F_SKDWLX",Row));#F_SKDWLX:收款单位类型字段标识
	if ((text == "BD_Empinfo" or text == "BD_Supplier" or text=="BD_Customer") and str(baseDataID)<>"0"):
		dynamicFormShowParameter = DynamicFormShowParameter();
		guid = str(Guid.NewGuid());
		dynamicFormShowParameter.PageId=guid;
		dynamicFormShowParameter.FormId="CN_OPPBANKINFO";
		dynamicFormShowParameter.CustomComplexParams.Add("UNITID", baseDataID);
		dynamicFormShowParameter.CustomComplexParams.Add("UNITTYPE", text);
		this.View.ShowForm(dynamicFormShowParameter, Action[FormResult](ChildFromClosed));
def BeforeF7Select(e):
	key=e.FieldKey;
	#this.View.ShowMessage(str(key));
	if(key=="FEACHBANKACCOUNT"):#触发字段("显示3个点"的字段)的标识,根据实际情况进行修改
		Row= this.Model.GetEntryCurrentRowIndex("FPAYAPPLYENTRY");#获取当前选择行,若是单据头设置为0
		GetOppositeBankAcc(Row);

#====参考代码结束=============
图标赞 19
19人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!