Python动态构建下拉列表-年份动态下拉选择原创
金蝶云社区-CQ周玉立
CQ周玉立
33人赞赏了该文章 3262次浏览 未经作者许可,禁止转载编辑于2022年04月12日 12:34:10

今天分享一下如何用Python脚本动态构建下拉列表选项,简单实用!

这里以年份为例,当我们需要在简单账表过滤框或者单据里面录入年份时,通常只能用整数字段或者文本字段,因为时间在流动,年份无法枚举出来,但是年份是有规律的,所以我们可以写一个Python脚本动态构建年份选项,一劳永逸!


一、单据/简单账表过滤框构建年份下拉字段

C#插件可以参考:https://vip.kingdee.com/article/137250328441093888?productLineId=1

  1. 首先在单据上添加一个【下拉列表】,不用设置枚举类型,字段标识为:F_ora_Year。

  2. 在表单插件中注册如下Python脚本构建年份的下拉选项,参考代码如下:

----------------------------------------------------------------------------------------------------------------------------

#引入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.Bill import *
from Kingdee.BOS.Core.Metadata 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 *


def AfterBindData(e):
    year=str(DateTime.Now.Year);#当前年份
    lastYear=str(DateTime.Now.Year-1);#上年
    #这里演示:动态显示今年和上年,如果有其他需求,可以自行修改
    #注意!通常还需要获取所有历史单据中出现过的年份,都要添加进去。

    #写一个select distinct查询就行了,将查询结果构建进去,不复杂 。

    #否则,打开历史单据时,没有构建到下拉选项的年份将显示成空白。

    enumList=List[EnumItem]();
    enumItem = EnumItem();
    enumItem.Caption=LocaleValue(year,2052);
    enumItem.EnumId=year;

#这里可以这是下拉选项的有效性,true表示禁用    enumItem.Invalid=False;

#例如,2019年有单据,那么打开2019年的单据需要正常显示,所以就需要构建2019这个选项。

#但是新录入单据时,不再,允许选择2019了,就需要构建2019,但是要把2019设置成禁用。
    enumItem.Value=year;
    enumList.Add(enumItem);
    enumItem = EnumItem();
    enumItem.Caption=LocaleValue(lastYear,2052);#下拉选项显示标题
    enumItem.EnumId=lastYear;#下拉选项值,记录到数据库
    enumItem.Invalid=False;
    enumItem.Value=lastYear;
    enumList.Add(enumItem);
    comboList = this.View.GetFieldEditor[ComboFieldEditor]("F_ora_Year"0);
    if (comboList <> None):
        comboList.SetComboItems(enumList);
    if(this.View.OpenParameter.Status == OperationStatus.ADDNEW):
        this.View.Model.SetValue("F_ora_Year", year, 0);#如果单据打开为新增,设置年份默认值为当前年份


二、单据列表根据动态下拉字段过滤时,也要需要动态构建选项,否则将无法正常使用此字段过滤

这个步骤应用于在单据中自己构建了动态下拉字段的时候使用,如果仅仅是简单账表过滤,则不需要!

注意:这里是用来设置单据列表下拉字段过滤功能正常使用,所以构建的下拉选项一定是历史单据都用到过的选项值。

参考学习:列表过滤窗【条件】页签动态设置下拉选项C#插件

按照以上知识教程处理之后,只能在过滤弹窗里面使用这个下拉字段过滤,在快捷过滤还不能正常使用。

经过研究,可以通过列表插件完成,条件过滤框和快捷过滤都可以生效列表插件Python脚本参考如下:

----------------------------------------------------------------------------------------------------------------------------

#引入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.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.Core.ListFilter import *
from Kingdee.BOS.Core.CommonFilter import *
from Kingdee.BOS.JSON import*
from Kingdee.BOS.Util import *

#构建下拉选项值
def getItems():
    #通过SQL查询出历史单据这个下拉选项所有的值,并且去重复,如果有用户数据权限控制,可以在SQL中加逻辑
    #注意!!!这里的SQL为示例,请自行修改,切勿复制直接使用!

    Sql=(""" select distinct a.F_ora_Year
from  T_XXX a
 """);
    ds = DBServiceHelper.ExecuteDataSet(this.Context,Sql);
    tab = ds.Tables[0];
    items=JSONArray();
    for dr in tab.Rows:
        item=JSONArray();
        year=("{0}").format(dr["F_ora_Year"]);
        item.Add(year);#下拉选项后台值
        item.Add(year);#下拉选项显示标题值
        items.Add(item);
    return items;
def  PrepareFilterParameter(e):
    filterModel = this.View.GetService[IListFilterModelService]();
    filterFields=filterModel.QuickFilterObject.FilterFieldList;
    yearCombo=None;
    for fld in filterFields:
        fldKey=("{0}").format(fld.Key);
        if(fldKey=="F_ora_Year"):
            yearCombo=fld;
            break;
    if(yearCombo==None):
        return;
    commonFilterEditor=yearCombo.Editor;#条件过滤
    quickFilterEditor=yearCombo.QuickFilterEditor;#快捷过滤
    newItems=getItems();
    commonFilterEditor.Put("store", newItems);
    quickFilterEditor.Put("store", newItems);


【温馨提示】:Python对缩进格式有严格要求,直接赋值网页代码,会有格式问题,如需复制代码,可下载附件!

发布于 金蝶云星空BOS开发交流圈 社群

赞 33