本文介绍了在特定业务背景下,出库申请单的单据类型和申请类型之间的联动关系需求。单据类型包括研发、制造等,每种单据类型对应不同的可选申请类型。为实现这一需求,提出了两种方案,并选择了第二种方案进行实现。通过扩展辅助资料功能,结合数据库查询和表单插件开发,实现了单据类型选择时自动过滤申请类型的逻辑。
【业务背景】出库申请单有研发、制造、管理等单据类型,申请类型有A、B、C、D、E这些类型,当单据类型=研发时,需要控制申请类型只能选择A、B;当单据类型=制造时,申请类型只能选择B、C。
【需求分析】单据类型和申请类型都为自定义的辅助资料,需要在单据扩展"单选辅助资料列表"时,两者形成联动的逻辑关系,即当单据类型=研发时,需要控制申请类型只能选择A、B;当单据类型=制造时,申请类型只能选择B、C。一个申请类型可能属于多个单据类型,即属于多对多的关系
方案1:使用"上级辅助资料过滤下级辅助资料"的方式,参考:【如何根据上级辅助资料过滤下级辅助资料】实现。这种方式属于一对一关系处理,两两组合会使得辅助资料的设置量翻倍,维护困难,无法满足需求
方案2:辅助资料能够扩展一个"多选辅助资料",结合插件,去数据库读取关联数据加入到过滤条件中
【实现】以方案2的处理方式:
1、辅助资料能够扩展一个"多选辅助资料",BOS会默认生成一个实体关联表存数据
多选基础资料和多选辅助资料,BOS的处理方式是生成一个关联表,具体表结构:
FPKID:关联表ID
FEntryID:单据体ID
F_RQHX_XXX:页面字段
2、针对1中生成的多选辅助资料表,手动修改表结构t_Cust_Entry100165,FPKID由INT改为varchar(36)类型,否则保存数据会出现报错
3、表单插件重写BeforeF7Select、BeforeSetItemValueByNumber事件,触发申请类型查询时,加入单据类型的值,进行过滤
辅助资料相关表
T_BAS_ASSISTANTDATA 辅助资料
T_BAS_ASSISTANTDATA_L 辅助资料多语言
T_BAS_ASSISTANTDATAENTRY 辅助资料分录
T_BAS_ASSISTANTDATAENTRY_L 辅助资料多语言
SELECT T2.FENTRYID, T2.FNUMBER, T3.FDATAVALUE from t_Cust_Entry100165 T1 JOIN T_BAS_ASSISTANTDATAENTRY T2 ON T1.FEntryID = T2.FENTRYID JOIN T_BAS_ASSISTANTDATAENTRY_L T3 ON T2.FENTRYID = T3.FENTRYID WHERE FMULASSISTANT IN ('61c138d8def61b') -- 申请类型所属上级,即:单据类型
import clr clr.AddReference("System") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") from System import * from System import StringComparison from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import * def BeforeF7Select(e): if e.FieldKey.Equals("FASSISTANT_S", StringComparison.OrdinalIgnoreCase): # 单选辅助资料列表 assistant_D = this.View.Model.GetValue("FAssistant_D") if assistant_D is not None: # 通过"单据类型"过滤"申请类型" e.ListFilterParameter.Filter = " FENTRYID IN (SELECT FENTRYID FROM t_Cust_Entry100165 WHERE FMULASSISTANT = '" + assistant_D["Id"] + "')" def BeforeSetItemValueByNumber(e): if e.BaseDataFieldKey.Equals("FASSISTANT_S", StringComparison.OrdinalIgnoreCase): assistant_D = this.View.Model.GetValue("FAssistant_D") if assistant_D is not None: # 通过"单据类型"过滤"申请类型" e.Filter = " FENTRYID IN (SELECT FENTRYID FROM t_Cust_Entry100165 WHERE FMULASSISTANT = '" + assistant_D["Id"] + "')"
推荐阅读