单据套打注册动态字段 使用python
1、在某些场景下,如果需要进行套打发现单据上没有相关的字段,如果在单据上添加上自定义字段多,且与其它的基础设置重复,导致不好添加。
例如:发票需要套打,且没有销售方的相关信息,导致很多内容取不到。如果放在金税开票单上,销售发票有自定义字段带到开票单上不妥。
2、只能通过使用动态字段的方式在打印的时候进行获取;
3、论坛中有几个帖子提到了这种动态注册的方法,但是修改后都无法正常执行。最终通过网络搜索找到了一个好用的方法能够完整的运行程序。地址如下:
https://www.cnblogs.com/zjsk/articles/11571156.html?share_token=5fb7ca4d-d58f-4589-806a-c4161f7cdfe8
4、在进行尝试探索的阶段,CQ周玉立老师提供了套打动态字段批量注册的方法;
5、最终的代码如下
```python
#引入clr运行库
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.DataEntity')
clr.AddReference("Kingdee.BOS.ServiceHelper")
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from System import *
from System.Data import *
from System.Collections.Generic import List
from Kingdee.BOS import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.Bill.PlugIn import *
from Kingdee.BOS.Core.List import*
from Kingdee.BOS.Core.List.PlugIn import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from Kingdee.BOS.Orm.DataEntity import *
def OnPrepareNotePrintData(e):
DataSourceId=e.DataSourceId
if (DataSourceId !="BillHead" and ((e.DataObjects == None) or (e.DataObjects.Length == 0))): #获取发票的表头
return
else:
# 获取到单据头的数据包
qureyObjs = e.DataObjects
# 获取数据包行数
_count = e.DataObjects.Count
# 获取到单据头的数据包类型
objectType = e.DataObjects[0].DynamicObjectType
# 检查并注册自定义属性
objectType = e.DataObjects[0].DynamicObjectType
prop_names = ["FCOMPANY", "FBANK", "FBANKACCT", "FTELE", "FSWIFT"] #自定义动态字段
for fld in prop_names:
spAttr=SimplePropertyAttribute()
spAttr.Alias=fld
objectType.RegisterSimpleProperty(fld,"".GetType(),None,False,spAttr)
#objectType.RegisterSimpleProperty(fld,typeof(string),None,False,spAttr)
#objectType.RegisterSimpleProperty(fld,typeof(string))
if objectType.Properties.ContainsKey("FCOMPANY")==True:
this.View.ShowMessage("cg")
else:
this.View.ShowMessage("erro")
for i in range(0,_count):
#创建一个新的数据包
obj_data = DynamicObject(objectType)
# 把旧数据包的值全部给新数据包
for p in qureyObjs[0].DynamicObjectType.Properties:
obj_data[p] = e.DataObjects[0][p]
# 根据单据ID构造SQL查询语句
bill_ids =str(qureyObjs[i][0])
#bill_ids = this.View.Model.DataObject["Id"].ToString()
sql = ("""/*dialect*/SELECT TAXGET.FCOMPANYNAME, SUBSTRING(TAXGET.FBANKINFO, 1, CHARINDEX(' ', FBANKINFO)) AS FBANKINFO,
SUBSTRING(TAXGET.FBANKINFO, CHARINDEX(' ', FBANKINFO), LEN(FBANKINFO)) AS FBANKACCT,
SUBSTRING(TAXGET.FMAILINFO, CHARINDEX(' ', FMAILINFO), LEN(FMAILINFO)) AS FTEL,
F_TWOF_SWIFT FSWIFT FROM T_IV_GTSETTINGENTRY TAXGET
INNER JOIN (SELECT FID, FSETTLEORGID, FBILLNO FROM T_IV_SALEEXINV UNION ALL SELECT FID, FSETTLEORGID, FBILLNO FROM T_IV_SALESIC) TAX
ON TAXGET.FSETTLEORGID = TAX.FSETTLEORGID
WHERE 1=1 AND TAX.FID IN ('{0}')""").format(bill_ids)
# 执行SQL并获取数据
list_db = DBServiceHelper.ExecuteDynamicObject(this.Context, sql)
if list_db is not None and len(list_db) > 0:
#for index in range(len(list_db)):
FCOMPANY = list_db[0].FCOMPANYNAME
FBANK = list_db[0].FBANKINFO
FBANKACCT = list_db[0].FBANKACCT
FTELE = list_db[0].FTEL
FSWIFT = list_db[0].FSWIFT
obj_data["FCOMPANY"] = FCOMPANY
obj_data["FBANK"] = FBANK
obj_data["FBANKACCT"] = FBANKACCT
obj_data["FTELE"] = FTELE
obj_data["FSWIFT"] = FSWIFT
# 最后用新的数据包来替换旧的数据包
e.DataObjects[i] = obj_data
```
另外原帖中写的getvalue("动态字段名称")获取动态字段的值方法在8.2.0.20231109上不好用,动态字段在套打中直接选择,参考如下
![image.webp](/download/010028b113927a55441badae17fc8751dc02.webp)
6、插件要分别放在单据的表单插件和列表插件中,否则在表单插件中只能实现单个单据预览打印,无法实现选择多条单据进行连续或者合并打印。
单据套打注册动态字段 使用python
1、在某些场景下,如果需要进行套打发现单据上没有相关的字段,如果在单据上添加上自定义字段多,且与其它的基础设置重复,导致不好添加。...
点击下载文档
本文2024-09-16 18:27:58发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-22323.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章