本文介绍了在特定平台(如金蝶云)中开发表单插件时常用的事件函数及其示例代码,包括按钮点击、菜单按钮点击、工具栏按钮点击、字段数据改变等事件。同时,提供了插件中常用属性和方法的使用说明,以及日期相关的条件判断和赋值操作。
常用的事件函数
注意:
1、(False \ True \ None) 等关键字必须是首字母大写,正确写法会自动亮橙黄色。
2、换行缩进,必须是用 Tab 键缩进 或 敲 4个空格 代表缩进。
#从这里开始
0、获取当前表单,单据头FID与明细行ID
this.View.Model.DataObject["Id"]#获取当前单据头FID
this.View.Model.GetEntryPKValue("FSaleOrderEntry", 0); #获取明细行ID,"FSaleOrderEntry" 为单据明细标识+“0”即行下标,一般需配合使用循环。
1、按钮被点击
def ButtonClick(e):
#注意:默认 e.Key 是大写,需将我们的按钮标识转换为大写,或者lower 统一转换为小写 e.Key.lower()
if e.Key.ToUpperInvariant() == "按钮标识".ToUpperInvariant(): #将 我们的按钮标识 转换为大写
this.View.ShowMessage("插入表单上的按钮被点击事件")
return
2、菜单栏的菜单按钮被点击
def BarItemClick(e): #最优先执行
if e.BarItemKey == "按钮标识":
this.View.ShowMessage("菜单栏的菜单按钮被点击")
return
def AfterBarItemClick(e):#次执行
if e.BarItemKey == "按钮标识":
this.View.ShowMessage("菜单栏的菜单按钮被点击")
return
3、单据体--菜单按钮--点击事件
def EntryBarItemClick(e):
if e.BarItemKey == "单据体菜单按钮标识":
this.View.ShowMessage("单据体菜单按钮点击事件")
return
4、工具栏按钮点击事件
def ToolBarItemClick(e):
if e.BarItemKey == "按钮标识":
this.View.ShowMessage("工具栏按钮点击事件")
return
5、字段的数据发生改变
def DataChanged(e):
if e.Key == "要监控的字段标识":
this.View.ShowMessage("要监控的字段数据发生改变")
return
6、初始化加载单据时
def OnLoad(e):
this.View.ShowMessage("打开单据,载入单据时")
return
7、单据体--明细行--双击--事件
def EntityRowDoubleClick(e):
this.View.ShowMessage("单据体明细行,双击事件"));
8、单据体--明细行-单击事件
def EntityRowClick(e):
if e.Row == 0:
this.View.ShowMessage("单据体明细行,单击事件");
return
9、动态列表选择(F8选择功能)
def BeforeF7Select(e):
this.View.ShowMessage("动态列表选择");
return
10、保存成功
def AfterSave(e):
this.View.ShowMessage("保存成功");
return
11、保存前
def BeforeSave(e):
this.View.ShowMessage("保存前");
return
12、焦点触发事件
def EntryCellFocued(e):
if e.NewFieldKey.ToUpper() <> "":
this.View.ShowMessage("焦点触发事件");
return
#在参数e里可以获取到新行NewRow,新列NewFieldKey,旧行OldRow,旧列OldFieldKey,这四个值!
13、服务操作插件
def EndOperationTransaction(e):
# 保存8 提交9 审核1 反审核26
if this.FormOperation.OperationId == 8:
for dataEntity in e.DataEntitys:#遍历数据包
FText = dataEntity["字段标识"];#获取数据
raise Exception("提示:xxxxx!Python主动抛异常方法");
############################################################################
#以下摘自:https://vip.kingdee.com/article/338117169206442496?productLineId=1&lang=zh-CN
表单插件的重要成员
插件基类为我们提供了许多重要的成员供开发时使用,下面介绍一下常用的一些属性和用法。
在插件中可以通过this关键字来调用这些成员。
Context:上下文对象
this.Context.UserId;#当前用户ID
this.Context.UserName;#当前用户名称
this.Context.UserPhone;#当前用户手机号
this.Context.CurrentOrganizationInfo.ID;#当前组织Id
this.Context.CurrentOrganizationInfo.Name;#当前组织名称
this.Context.DBId;#当前数据中心Id
this.Context.DataCenterNumber;#当前数据中心编码
this.Context.DataCenterName;#当前数据中心名称
this.Context.IpAddress;#客户端本机网络信息:IP、MAC等
View:视图层对象,可理解为当前界面,界面类插件特有,服务类的插件没有这个,View能为开发提供很多特有的功能。
①View的常用属性
this.View.BillBusinessInfo;#单据的业务逻辑元数据,元数据包含的信息很多,下面列了一下常用的信息
this.View.BillBusinessInfo.GetBillNoField().FieldName;#单据编号字段名
this.View.BillBusinessInfo.GetBillStatusField().FieldName;#单据状态字段名
this.View.BillBusinessInfo.GetBillTypeField().FieldName;#单据类型字段名
this.View.BillBusinessInfo.GetForm().Id;#单据FormId
this.View.BillBusinessInfo.MainOrgField.FieldName;#主业务组织字段名
this.View.BillBusinessInfo.GetEntity("FBillHead").TableName;#单据头表名
this.View.BillBusinessInfo.GetEntity("实体标识").TableName;#实体主表名
this.View.BillBusinessInfo.GetEntity("实体标识").SplitTables;#实体所有拆分表
#****************************************************************************************************
this.View.OpenParameter;#表单入口参数
this.View.OpenParameter.Status;#当前界面状态:0,新增;1,查看;2,修改;
this.View.OpenParameter.GetCustomParameter("参数标识");#获取单据打开传入的参数
#****************************************************************************************************
this.View.ParentFormView;#获取父页面的View
this.View.ParentFormView.BillBusinessInfo.GetForm().Id;#父页面的FormId,用来判断单据是从哪里进来的
②View的常用方法
this.View.GetFormTitle();#获取单据标题
this.View.SetFormTitle(LocaleValue("新标题"));#修改单据标题
this.View.GetFormOperation("操作代码");#获取单据的一个操作实例对象
this.View.InvokeFormOperation("操作代码");#触发单据的某个操作:保存、提交、审核、关闭 等!
this.View.GetControl[控件类]("控件标识");#获取单据上的控件:按钮、菜单等,可用来设置控件的状态(可见性,锁定性等)
this.View.InvokeFieldUpdateService("字段标识",行号);#触发字段值更新,单据头字段行号填0
#触发实体服务规则,下面2行代码
obj=BOSActionExecuteContext(this.View);
this.View.RuleContainer.RaiseDataChanged("字段标识", 字段所在实体行数据包,obj);#触发实体服务规则
#显示3种提示信息
this.View.ShowMessage("绿色背景提示信息");#显示正常提示信息
this.View.ShowWarnningMessage("黄色背景提示信息");#显示警告提示信息
this.View.ShowErrMessage("红色背景提示信息");#显示错误提示信息
#刷新界面数据,修改实体数据包后需要刷新重新读取,必须传标识,不建议粗暴刷新整个单据
this.View.UpdateView("字段标识/单据体标识");#刷新界面数据
Model:单据数据模型,很重要,单据的实体数据包获取从这里开始,结合上1篇所讲的实体数据包。
this.View.Model;#单据数据模型,很重要,单据的实体数据包获取从这里开始,结合上文
this.View.Model.DataObject;#单据的完整数据包,相当于前面讲的单据头实体数据包
this.View.Model.GetEntryCurrentRowIndex("单据体标识");#获取单据体当前焦点行号
this.View.Model.GetEntryRowCount("单据体标识");#获取单据体行数
this.View.Model.CreateNewEntryRow("单据体标识");#为单据体新增一行
this.View.Model.BatchCreateNewEntryRow("单据体标识",x);#批量为单据体新增x行
this.View.Model.InsertEntryRow("单据体标识", i);#在第i行前插入1行
this.View.Model.DeleteEntryRow("单据体标识", i);#删除第i行
this.View.Model.DeleteEntryData("单据体标识");#清空整个单据体数据
#获取第x行(单据头不传x)某字段的值,不同字段类型返回不同类型数据,参考第3篇讲解
this.View.Model.GetValue("字段标识",x);
#更新第x行(单据头不传x)某字段的值,不同字段类型赋值不同类型数据,参考第3篇讲解
this.View.Model.SetValue("字段标识","字段值",x);
this.View.Model.SetItemValueByID("字段标识","内码id",x);#用资料内码id更新第x行资料字段的值
this.View.Model.SetItemValueByNumber("字段标识","编码",x);#用资料编码更新第x行资料字段的值
############################################################################
BOS 平台日期相关
一:条件判断
(1)大于某个固定日期:FDate1.ToString('yyyy-MM-dd')>='2021-05-01'
(2)两个元素类型为日期字段的比较:FDate1 > FDate2
(3)判断日期是否大于今天:FDate1 > @currentshortdate
注:@currentshortdate是系统变量,常用的日期类系统变量还有:
@currentshortdate : 今天,短日期,不包含时间
@currentlongdate : 此时,长日期,包含时间
@maxdate : 系统最大时间
@mindate : 系统最小时间
二:赋值
(1)设置固定日期:FDate1='202105-05'
(2)日期的计算,如结束日期为开始日期+1天:
FEndDate = FStartDate.AddDays(1)
同理:增加月份:FStartDate.AddMonths(1)
增加年份:FStartDate.AddYears(1)
(3)计算日期差:(FDate1 - FDate2).Days
(4)时间间隔,如2个日期的时间间小时数:
FText = ( FEndDate - FStartDate).TotalHours
(5)获取日期的月份、天:
FText =FDate1.Date.Month
FText =FDate1.Date.Day
(6)获取日期是对应的星期几
FText = '星期'+str(int(FDate1.DayOfWeek))
(7)取本月最后一天:
FEndDate = FStartDate.AddDays(1-float((FStartDate.ToString("dd")))).AddMonths(+1).AddDays(-1)
(8)取本月第一天日期:
日期字段 = @currentshortdate.AddDays((1-float(@currentshortdate.ToString("dd"))))