Python动态构建下拉列表-年份动态下拉选择
今天分享一下如何用Python脚本动态构建下拉列表选项,简单实用!
这里以年份为例,当我们需要在简单账表过滤框或者单据里面录入年份时,通常只能用整数字段或者文本字段,因为时间在流动,年份无法枚举出来,但是年份是有规律的,所以我们可以写一个Python脚本动态构建年份选项,一劳永逸!
一、单据/简单账表过滤框构建年份下拉字段
C#插件可以参考:https://wenku.my7c.com/article/137250328441093888?productLineId=1
首先在单据上添加一个【下拉列表】,不用设置枚举类型,字段标识为:F_ora_Year。
在表单插件中注册如下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);#如果单据打开为新增,设置年份默认值为当前年份
二、单据列表根据动态下拉字段过滤时,也要需要动态构建选项,否则将无法正常使用此字段过滤
这个步骤应用于在单据中自己构建了动态下拉字段的时候使用,如果仅仅是简单账表过滤,则不需要!
注意:这里是用来设置单据列表下拉字段过滤功能正常使用,所以构建的下拉选项一定是历史单据都用到过的选项值。
按照以上知识教程处理之后,只能在过滤弹窗里面使用这个下拉字段过滤,在快捷过滤还不能正常使用。
经过研究,可以通过列表插件完成,条件过滤框和快捷过滤都可以生效,列表插件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对缩进格式有严格要求,直接赋值网页代码,会有格式问题,如需复制代码,可下载附件!
Python动态构建下拉列表-年份动态下拉选择
本文2024-09-16 17:18:23发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-14852.html