【金蝶二开案例.Python插件.金蝶二开Python代码基本语法概念】学习进步

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

【金蝶二开案例.Python插件.金蝶二开Python代码基本语法概念】学习进步

@[TOC](一.导航) # 二.python包概念 包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为`__init__.py` 文件,那么这个文件夹就称之为包。 ## 2.1 制作包 [New] — [Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。 注意:新建包后,包内部会自动创建`__init__.py`文件,这个文件控制着包的导入行为。 ### 2.1.1 快速体验 1. 新建包`mypackage` 2. 新建包内模块:`my_module1` 和 `my_module2` 3. 模块内代码如下 ``` python # my_module1 print(1) def info_print1(): print('my_module1') ``` ``` python # my_module2 print(2) def info_print2(): print('my_module2') ``` ## 2.2 导入包 ### 2.2.1 方法一 ``` python import 包名.模块名 包名.模块名.目标 ``` #### 2.2.1.1 体验 ``` python import my_package.my_module1 my_package.my_module1.info_print1() ``` ### 2.2.2 方法二 注意:必须在`__init__.py`文件中添加`__all__ = []`,控制允许导入的模块列表。 ``` python from 包名 import * 模块名.目标 ``` #### 2.2.2.1 体验 ``` python from my_package import * my_module1.info_print1() ``` # 三. 总结 - 导入模块方法 ``` python import 模块名 from 模块名 import 目标 from 模块名 import * ``` - 导入包 ``` python import 包名.模块名 from 包名 import * ``` - `__all__ = []` :允许导入的模块或功能列表 - ## 一、上下文对象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能为开发提供很多特有的功能。 ###  2.1、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,用来判断单据是从哪里进来的 ### 2.2、View的常用方法 this.View.GetFormTitle();#获取单据标题 this.View.SetFormTitle(LocaleValue("新标题"));#修改单据标题 this.View.GetFormOperation("操作代码");#获取单据的一个操作实例对象 this.View.InvokeFormOperation("操作代码");#触发单据的某个操作:保存、提交、审核、关闭 等! this.View.GetControl\[控件类\]("控件标识");#获取单据上的控件:按钮、菜单等,可用来设置控件的状态(可见性,锁定性等) this.View.InvokeFieldUpdateService("字段标识",行号);#触发字段值更新,单据头字段行号填0 #触发实体服务规则 obj=BOSActionExecuteContext(this.View); this.View.RuleContainer.RaiseDataChanged("字段标识", 字段所在实体行数据包,obj);#触发实体服务规则 #显示3种提示信息 this.View.ShowMessage("绿色背景提示信息");#显示正常提示信息 this.View.ShowWarnningMessage("黄色背景提示信息");#显示警告提示信息 this.View.ShowErrMessage("红色背景提示信息");#显示错误提示信息 #刷新界面数据,修改实体数据包后需要刷新重新读取,必须传标识,不建议粗暴刷新整个单据 this.View.UpdateView("字段标识/单据体标识");#刷新界面数据 ## 三、单据数据模型Model  单据的实体数据包,赋值和取值都是通过Model获取,非常重要、非常重要、非常重要!!! 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("单据体标识");#清空整个单据体数据 this.View.Model.GetValue("字段标识",x);#获取第x行(单据头不传x)某字段的值,不同字段类型返回不同类型数据 this.View.Model.SetValue("字段标识","字段值",x);#更新第x行(单据头不传x)某字段的值,不同字段类型赋值不同类型数据 this.View.Model.SetItemValueByID("字段标识","内码id",x);#用资料内码id更新第x行资料字段的值 this.View.Model.SetItemValueByNumber("字段标识","编码",x);#用资料编码更新第x行资料字段的值 ## 四、Python事件 ### 4.1、AfterCreateModelData  单据新增界面打开时触发,可以获取到单据初始化之后的数据。通常用于对单据新增进行默认值填充,例如,设置默认日期,填充单据体默认数据等 def AfterCreateModelData(e): ¨NBSP; billObj = this.Model.DataObject;#单据完整数据包,如需通过实体数据包操作读写数据,可从这里开始取  this.View.Model.SetValue("FDate", "2022-7-1");#设置默认日期  msg=("{0}").format(this.View.BillBusinessInfo.GetEntity("FBillHead").TableName);  this.View.ShowMessage(msg);#调试使用 ### 4.2、AfterBindData  界面数据绑定完毕后触发,通常在这里对字段控件状态进行设置。例如,设置颜色、设置字段锁定性/可见性、设置下拉列表动态枚举选项等 def AfterBindData(e):  this.View.GetControl("FDate").Enabled=False;#False:锁定,True:解锁  #this.View.GetControl("控件标识").Visible=False;#False:隐藏,True:显示 ### 4.3、BarItemClick  单据头菜单点击事件,从参数e中获取菜单标识,来判断是哪个菜单发生了点击。一定要加判断,只需要监听需要的菜单 def BarItemClick(e):  key=e.BarItemKey.ToUpperInvariant();#菜单标识大写  if(key=="TESTBTN1".ToUpperInvariant()):  msg=("菜单\[{0}\]点击事件捕捉到了,可以继续菜单的功能啦!").format(key);  this.View.ShowMessage(msg);  elif(key=="TESTBTN2".ToUpperInvariant()):  msg=("菜单\[{0}\]点击事件捕捉到了,可以继续菜单的功能啦!").format(key);  this.View.ShowMessage(msg); ### 4.4、EntryBarItemClick  单据体菜单点击事件,与BarItemClick类似,只不过这个是监听单据体菜单栏 def EntryBarItemClick(e):  key=e.BarItemKey.ToUpperInvariant();  if(key=="entryTESTBTN1".ToUpperInvariant()):  msg=("单据体菜单\[{0}\]点击事件捕捉到了,可以继续菜单的功能啦!").format(key);  this.View.ShowMessage(msg); ### 4.5、ButtonClick  按钮控件/超链接控件点击事件。点击一个超链接,弹出某个单据等等 def ButtonClick(e):  BtnKey=e.Key.ToUpperInvariant();#控件标识大写  if(BtnKey=="F\_ora\_LINK".ToUpperInvariant()):  msg=("按钮\[{0}\]点击事件捕捉到了,可以继续菜单的功能啦!").format(BtnKey);  this.View.ShowMessage(msg); ### 4.6、EntityRowDoubleClick  单据体行双击事件,使用时一定要判断单据体!!! def EntityRowDoubleClick(e):  entityKey=e.Key.ToUpperInvariant();#单据体标识大写  row=e.Row;#双击行号,从0开始  fldKey=e.ColKey.ToUpperInvariant();#双击单元格字段标识大写  msg=("单据体\[{0}\]第\[{1}\]行,字段\[{2}\]双击啦!").format(entityKey,row,fldKey);  this.View.ShowMessage(msg); ### 4.7、EntityRowClick 单据体行点击事件,也就是单据体单行选择事件,通过此事件可以知道当前焦点行,通常需要开发切换行处理子单据体数据时使用 def EntityRowClick(e):  entityKey=e.Key.ToUpperInvariant();#单据体标识大写  row=e.Row;#选择行号,从0开始  msg=("单据体\[{0}\]第\[{1}\]行被选中啦!").format(entityKey,row);  this.View.ShowMessage(msg); ### 4.8、AfterDeleteRow 单据体行删除事件,在这个事件里可以最后获取被删除的行数据 def AfterDeleteRow(e):  entityKey=e.EntityKey.ToUpperInvariant();#单据体标识大写  row=e.Row;#删除的行号,从0开始,注意:此时用此行号从单据实体数据包中取的数据已不是删除的行数据了  deletRowObj=e.DataEntity;#删除的行数据包  msg=("单据体\[{0}\]第\[{1}\]行被删除啦!").format(entityKey,row);  this.View.ShowMessage(msg); ### 4.9、DataChanged  值更新事件,当BOS的值更新与实体服务配置实现不了想要的功能时,就会用到插件值更新事件。事件参数中可以获取:发生值更新的字段标识、行号、更新前字段值、更新后字段值 def DataChanged(e):  fldKey=e.Field.Key.ToUpperInvariant();#字段标识大写  if(fldKey<>"ABC"):#注意:示例代码是不等于,实际应使用等于进行判断  row=e.Row;#字段所在的行号,从0开始,单据头字段为0  oldValue=e.OldValue;#更新前字段值  newValue=e.NewValue;#更新后的字段值  msg=("第\[{0}\]行字段\[{1}\]从\[{2}\]更新成了\[{3}\]").format(row,fldKey,oldValue,newValue);  this.View.ShowMessage(msg); **注意:使用时一定要判断字段标识!!!字段在BOS中勾选【即时触发值更新】才会触发插件值更新事件** ### 4.10、BeforeDoOperation  单据界面执行单据操作前触发,例如,保存,提交,审核等,使用时一定要判断操作代码。此事件在校验规则之前触发 def BeforeDoOperation(e):  opCode=e.Operation.FormOperation.Operation.ToUpperInvariant();#触发操作代码大写,例如保存:SAVE  if(opCode=="SAVE"):  e.Cancel=True;#可以取消触发操作  this.View.ShowWarnningMessage("取消保存!"); ### 4.11、AfterDoOperation  单据界面执行单据操作完成后触发,例如,保存,提交,审核等,使用时一定要判断操作代码 def AfterDoOperation(e):  opCode=e.Operation.Operation.ToUpperInvariant();#触发操作代码大写,例如保存:SAVE  this.View.ShowMessage(str(opCode));

【分享】完整视频教学

https://flowus.cn/share/2f59da35-1951-4494-a5da-c387d75646a7



【金蝶二开案例.Python插件.金蝶二开Python代码基本语法概念】学习进步

@[TOC](一.导航)# 二.python包概念包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为`__init__.py` 文...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息