Python表单插件直接SQL账表-转换成单据
需求背景:
最近遇到这样一个场景,用不上MRP模块,通过直接SQL账表开发了一个智能补货参考报表(具体算法根据实际业务设计,个性化较强,不做详述),查看此报表可以自动计算出需要补货的物料以及建议采购数量,然后可以点击菜单按钮根据这些物料的建议采购数量自动跳转至采购申请单新增界面,类似于实现SQL账表下推单据。
通过此案例主要是学习一种Python脚本实现直接SQL账表的表单插件中获取账表数据的方法。
此方法适用于类似上述需求背景,直接SQL账表在其他应用场景取数的方法,请参考:Python直接SQL账表-表单插件中关键数据的获取方法
不说太多,下面看代码:
#以下代码,注册到直接SQL账表的表单插件中。
#引入clr运行库
# -*- coding: utf-8 -*-
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Model')
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.DependencyRules 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 *
from Kingdee.BOS.Model.Report import *
from Kingdee.BOS.Core.Report.PlugIn import *
#菜单按钮点击事件
def BarItemClick(e):
key=e.BarItemKey.ToUpperInvariant();#当前点击的菜单按钮标识大写
if(str(key)=="ora_ToPRBtn".ToUpperInvariant()):
dataM=this.Model;
tempTabName=dataM.TableName;#当前SQL账表数据对应的临时表
showParameter=BillShowParameter();
showParameter.FormId = "PUR_Requisition";#采购申请单FormID
showParameter.OpenStyle.ShowType = ShowType.MainNewTabPage;
showParameter.PageId = str(Guid.NewGuid());
showParameter.Status = OperationStatus.ADDNEW;
#弹出采购申请时,传入自定义参数:临时表名
showParameter.CustomParams.Add("SQLTempTabName",tempTabName);
this.View.ShowForm(showParameter);
下面就需要在采购申请单的新增界面获取到传过来的临时表名,然后通过SQL查询出数据自动填写到新增的采购申请单中。
这个代码需要注册到采购申请单的表单插件中,下面看代码:
#引入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.ServiceHelper')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DependencyRules 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 *
parentFormId="";#全局变量,记录父页面的ID
#根据智能补货自动填充表体数据
def fillEntryData(tabName):
entityKey="FEntity";
en = this.View.Model.DataObject["ReqEntry"];
en.Clear();
sql=("""SELECT * from {0} where 建议订货量>0 """).format(tabName);
ds = DBServiceHelper.ExecuteDataSet(this.Context,sql);
tab = ds.Tables[0];
if(tab.Rows.Count<=0):
return;
this.View.SetItemValueByNumber("FApplicationOrgId", "003", 0);
this.View.SetItemValueByNumber("FApplicationDeptId", "BM000030", 0);
obj=BOSActionExecuteContext(this.View);
i=0;
for dr in tab.Rows:
this.View.Model.CreateNewEntryRow(entityKey);
this.View.SetItemValueByNumber("FMaterialId", str(dr["物料编码"]), i);
this.View.InvokeFieldUpdateService("FMaterialId",i);
this.View.RuleContainer.RaiseDataChanged("FMaterialId", en[i],obj);
this.View.Model.SetValue("FEntryNote",("{0}").format(dr["物料名称"]),i);
this.View.Model.SetValue("FReqQty",dr["建议订货量"],i);
this.View.InvokeFieldUpdateService("FReqQty",i);
this.View.RuleContainer.RaiseDataChanged("FReqQty", en[i],obj);
this.View.SetItemValueByNumber("FSuggestSupplierId",str(dr["供应商编码"]),i);
i=i+1;
def OnInitialize(e):
global parentFormId;
parentView=this.View.ParentFormView;#获取父页面,可以知道是从哪个页面跳转过来的
if(parentView<>None):#如果父页面不为空
parentFormId=parentView.BillBusinessInfo.GetForm().Id;#取出父页面ID
def AfterCreateNewData(e):
global parentFormId;
if(str(parentFormId)=="ora_ZHBHCKB"):#我这里直接SQL账表的ID是ora_ZHBHCKB
#取出父页面传过来的参数,我这里的参数就是SQL账表临时表的表名
tempTabName=this.View.OpenParameter.GetCustomParameter("SQLTempTabName");
if(tempTabName==None or str(tempTabName)==""):
return;
fillEntryData(tempTabName);#调用方法,根据临时表填充新增采购申请单数据
不会写python插件 有c#插件的示例吗 老师 主要是感觉需要调试代码
如果非要获取SQL账表选中行的话,应该也可以,你看我另一篇分享SQL账表关键数据获取的文章,研究一下
那为啥不直接做成视图单据,做单据转换下推
过滤SQL的数据,将选中行的才跳转到采购申请单,这个有办法吗?
不需要清空临时表吗?
Python表单插件直接SQL账表-转换成单据
本文2024-09-16 17:19:09发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-14929.html