本示例旨在说明如何对嵌入单据的单据与PLM业务对象进行关联性扩展的方法; 同时通过脚本插件来进行业务处理的方式。脚本演示了获取当前PLM业务对象的生命周期阶段与创建的扩展字段值的方法,演示了如何获取PLM业务对象的字段值来对单据体选单数据进行过滤的方法。
Step 1: 创建新单据用于业务扩展
Step 2: 与PLM系统业务对角进行关联性(项目)
Step 3: 通过子单据头分离单据中的字段数据表存储
Step 4: 单据绑定到标准业务对象中(项目)
Step 5: 用脚本插件来编写单据中业务
Step 1、创建一个单据来显示并维护新业务维度数据:
注意:单据标识(标识4位置)使用开发项目标识字符开头,如“EPX_”
Step2: 设置好与PLM系统的数据关联性:
在单据的主单据头中,设置表名为 "T_PLM_PDM_BASE"
注意:这里用T_PLM_PDM_BASE表,但并不用于数据表存储,一定不要把字段设置到单据头上(也就是保存到这个表中),以免二开数据串到标准PLM系统中,这里这样设置只是为了作数据关联。
Step 3: 添加子单据头,用于存储这个单据的所有字段数据
a) 添子单据头
b) 确保单据上的每一个字段,都设置“实体”为上面创建的子单据头
c) 添加相关的操作菜单与操作
***特别注意***: 不要在单据菜单中作删除操作,否则关联表 T_PLM_PDM_BASE 的数据会导致删除,从而会影响PLM标准的业务。
Step 4:将该单据绑定到标准业务系统中界面中
将上面创建的单据关联到项目的页签中 ,具体可参考: 在业务对象中关联另一类业务对象的方法
项目页签表单单据 名称: 项目对象 标识:PLM_STD_PROJECTOBJECT
任务页签表单单据 名称:任务对象 标识:PLM_STD_TASKOBJECT
物料页签表单单据 名称:物料平台 标识:PLM_CFG_MATERIALPLATFORM
设置单据绑定的协议性参数(位置5),具体参数参考上面引用帖
下图为运行的效果:
Step 5: 用脚本插件来干预单据中的业务示例
a)在PLM扩展字段单据中给项目添加一个扩展字段模板
b)在项目业务类型上绑定这个扩展字段
c)这样,项目的基本属性中就会有这个扩展字段
d)在新建的单据中,添加业务插件
业务干预示例1:通过获取当前PLM业务对象的ID标识,查询了扩展字段中项目新加的字段值,并应用于单据体制造BOM选单的过滤,如:当前项目的扩展字段值(研发用途)为“通用”时,在上面创建的单据的单据体选制造BOM("物料清单")时,会只可以选制造系统的BOM 用途字段为“通用”的BOM。
业务干预示例2:在数据绑定事件中,通过判断项目的状态是否“完成",如果完成则锁定界面不可编辑。
脚本代码示例说明:
import clr;
clr.AddReference("Kingdee.BOS.App") #添加引用的程序集
from Kingdee.BOS.App.Data import DBUtils #导入BOS平台的数据操作组件
global usefor #设置一个全局变量
usefor="" #初始值为空串
def OnLoad(e):
global usefor #使用全局变量
#获取当前的PLM业务对象标识
plmId=this.View.OpenParameter.GetCustomParameter("plm_param_SourceId").ToString()
#在扩展字段表:T_PLM_PDM_BASE_0 查找业务对象的扩展字段值
sql="SELECT F_EPX_EX1_USERFOR FROM T_PLM_PDM_BASE_0 WHERE FID="+plmId.ToString()
r=DBUtils.ExecuteDynamicObject(this.View.Context,sql)[0]
usefor=r.F_EPX_EX1_USERFOR.ToString()#把业务对象值,保存到全局变量,以在过滤时使用
def AfterBindData(e):
plmId=this.View.OpenParameter.GetCustomParameter("plm_param_SourceId").ToString()
#查询当前业务对象的名称(多语言),编码,与生命阶段标识
sql="SELECT b.FNAME,a.FCODE,a.FLIFECIRCLESTAGE FROM T_PLM_PDM_BASE a INNER JOIN T_PLM_PDM_BASE_L b ON(a.FID=b.FID AND b.FLOCALEID="+this.View.Context.UserLocale.LCID.ToString()+") WHERE a.FID="+plmId
r=DBUtils.ExecuteDynamicObject(this.View.Context,sql)[0]
#将当前的项目显示在单据的提示标签中
this.View.GetControl("F_EXP_Notice").Text = r.FNAME.ToString()+":"+r.FCODE.ToString()
status=r.FLIFECIRCLESTAGE.ToString()
if status=="AI": #项目除非为完成,AI表示完成,参考 T_PLM_CFG_STAGE表
this.View.ShowMessage(r.FNAME.ToString()+"已经完成,不能编辑!");
this.View.LockBill() #锁定单据
def BeforeF7Select(e):#选单前事件
global usefor #使用全局变量
if usefor!="" and e.FieldKey.ToUpper()=="F_EPX_BOMS":#由单据体中的基础资料字段选单
e.ListFilterParameter.Filter="FBOMUSE="+usefor#传到制造的物料清单的用途字段以过滤
----END---