Python实现自定义单据选择往来单位银行信息原创
金蝶云社区-CQ周玉立
CQ周玉立
16人赞赏了该文章 1985次浏览 未经作者许可,禁止转载编辑于2022年01月08日 13:40:30

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

类似下图的功能:

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);

#====参考代码结束=============
赞 16