本文描述了一个通过Python脚本在ERP系统中实现智能补货功能的案例。在无法使用MRP模块的情况下,开发了一个基于SQL账表的智能补货参考报表,该报表能自动计算补货物料及建议采购数量。用户可通过报表上的菜单按钮跳转到采购申请单新增界面,并自动填充采购信息。文中展示了两个关键代码段:一是如何在SQL账表表单插件中获取数据并触发跳转至采购申请单;二是如何在采购申请单新增界面接收传递的参数(临时表名),并通过SQL查询自动填充采购申请表单体数据。此方法适用于需要从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);#调用方法,根据临时表填充新增采购申请单数据