Python动态构建下拉列表-年份动态下拉选择原创
金蝶云社区-CQ周玉立
CQ周玉立
38人赞赏了该文章 4,907次浏览 未经作者许可,禁止转载编辑于2022年04月12日 12:34:10
summary-icon摘要由AI智能服务提供

本文介绍了如何使用Python脚本在单据或账表的过滤框中动态构建年份下拉列表选项。首先,以年份为例,展示了如何在单据上添加下拉列表字段并编写Python脚本以动态生成当前年份和上一年的选项。随后,文中提到如何根据历史单据中出现的年份动态构建下拉选项,并给出了如何在列表插件中设置这些动态下拉选项以支持过滤功能的实现。最后,文中还提醒了Python脚本的缩进格式要求及网页代码复制时可能遇到的问题。

今天分享一下如何用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开发交流圈 社群

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