辅助资料扩展多选辅助资料列表使用案例原创
金蝶云社区-邱育华
邱育华
8人赞赏了该文章 1,825次浏览 未经作者许可,禁止转载编辑于2021年12月22日 17:29:08
summary-icon摘要由AI智能服务提供

本文介绍了在特定业务背景下,出库申请单的单据类型和申请类型之间的联动关系需求。单据类型包括研发、制造等,每种单据类型对应不同的可选申请类型。为实现这一需求,提出了两种方案,并选择了第二种方案进行实现。通过扩展辅助资料功能,结合数据库查询和表单插件开发,实现了单据类型选择时自动过滤申请类型的逻辑。

【业务背景】出库申请单有研发、制造、管理等单据类型,申请类型有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:页面字段


image.png

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"] + "')"


image.png


image.png

image.png


image.png


图标赞 8
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!