必看!列表开发典型场景解决方案
列表是单据模型的重要组成部分,预置实体的数据展现、操作、权限、筛选排序、基本数据统计等框架逻辑。
对于常规单据来说,仅通过简单配置即可实现基本的列表查询功能;对于业务场景复杂的单据,则需要通过插件开发的方式实现个性化逻辑。
本文总结了列表自定义开发的典型场景解决方案,能够有效解决列表开发中遇到的常见问题,干货满满,推荐收藏 ~
1 典型场景一览
1. 列表包含多分录数据时,如何指定默认展示分录?
2. 如何给列表上的基础资料过滤字段添加过滤条件?
3. 列表/单据列表控件如何添加过滤条件?
4. 如何在列表上添加字段、控件?
5. 如何实现过滤字段的级联?
6. 如何在列表上切换不同的布局或者实体?
2 解决方案
场景1:列表包含多分录数据时,如何指定默认展示分录
苍穹单据支持多分录数据录入,但因为多分录数据是笛卡尔积关系,关联出来的数据无实际意义,故列表只能展示一个分录数据,或父子分录数据,无法同时展示同级分录数据。
列表默认展示单据上的第一个分录数据,并在过滤控件中提供【查询范围】选项,用户可自定义切换要展示的分录数据。
列表过滤控件示例
如需指定默认展示分录,可通过以下两种方式进行调整:
方式一:在【应用菜单】→【入口参数】中进行调整
如下图所示,单据上有两个单据体:entryentity、entryentity1,希望打开列表时默认展现entryentity1的数据:
单据体示例
如果单据是通过应用发布的,可以通过应用查找到应用菜单,在菜单的【高级信息】→【入口参数】配置selectedEntity参数,如下图所示:
配置selectedEntity参数示例
方式二:插件调整
如果是通过showform打开的表单,比如通过列表的beforeShowBill事件来干预单据打开列表页面,可以通过如下代码来设置:
@Override public void registerListener(EventObject e) { BasedataEdit basedataEdit = getControl("mulbasedatafield"); basedataEdit.addBeforeF7SelectListener(new BeforeF7SelectListener() { @Override public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) { ListShowParameter listShowParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter(); listShowParameter.seSelectedEntity("entryentity1"); } }); }
场景2:如何给列表上的基础资料过滤字段添加过滤条件
对于列表基础资料字段的过滤,如需限制数据范围,则可通过为基础资料添加过滤条件的方式来实现。常用过滤及方案过滤的过滤条件设置方式如下所述:
方式一:配置方式(推荐,同时对常用条件和方案过滤生效)
比如表单上有个“币别”字段,需要指定币别的范围为“人民币”,可以通过“过滤条件”设置货币编码为“RMB”,然后勾选“应用到列表”来实现,如下图所示:
配置方式示例
方式二:插件开发方式
【常用条件】过滤条件个性化设置
如果列表上的过滤条件需要跟单据上有所区分,可根据过滤字段所在的不同位置处理。常用过滤基础资料字段,可通过插件方式设置过滤条件,代码示例如下:
@Override public void filterColumnSetFilter(SetFilterEvent args) { if ("currencyfield.number".equals(args.getFieldName())) { args.addCustomQFilter(new QFilter("number", QFilter.equals, "RMB")); } super.filterColumnSetFilter(args); }
当基础资料的过滤条件较多时,选项无法全部平铺出来。如果想要查看全部选项,需要点击“更多”打开F7。对此,需要单独对“更多”进行处理,代码示例如下:
@Override public void filterContainerBeforeF7Select(BeforeFilterF7SelectEvent args) { if ("currencyfield.number".equals(args.getFieldName())) { args.addCustomQFilter(new QFilter("number", QFilter.equals, "RMB")); } super.filterContainerBeforeF7Select(args); }
注意:下述代码可抽取为一个方法供filterColumnSetFilter和filterContainerBeforeF7Select调用:
if ("currencyfield.number".equals(args.getFieldName())) { args.addCustomQFilter(new QFilter("number", QFilter.equals, "RMB")); }
【方案过滤】过滤条件个性化设置
对于方案过滤条件的个性化设置,有以下两种实现方法:
1、可以在设计器上配置方案过滤字段,如下图所示:
设计器配置方案过滤字段
2、插件开发方式,复用上面的filterContainerBeforeF7Select方法进行过滤条件设置,代码示例如下:
@Override public void filterContainerBeforeF7Select(BeforeFilterF7SelectEvent args) { if ("currencyfield.number".equals(args.getFieldName())) { args.addCustomQFilter(new QFilter("number", QFilter.equals, "RMB")); } super.filterContainerBeforeF7Select(args); }
场景3:列表/单据列表控件如何添加过滤条件
方式一:列表设计器配置方式
打开列表设计器,选中“单据列表”节点,通过“过滤条件”属性来进行设置,如下图所示:
列表设计器配置过滤条件示例
方式二:单据上的配置方式
1. 选中“单据列表”控件;
2. 打开“过滤条件”属性;
3. 通过“添加条件”来增加过滤;
4. 最后点击“确定”,然后“保存”。
单据上配置过滤条件示例
方式三:插件方式
列表上添加过滤条件
通过重写setFilter方法实现,代码示例如下:
@Override public void setFilter(SetFilterEvent setFilterEvent) { setFilterEvent.addCustomQFilter(new QFilter("number", "=", "RMB")); }
单据列表控件添加过滤条件
通过单据控件的addSetFilterListener进行注册,代码示例如下:
@Override public void initialize() { BillList billList = getControl("billlistap"); billList.addSetFilterListener(new SetFilterListener() { @Override public void setFilter(SetFilterEvent setFilterEvent) { setFilterEvent.addCustomQFilter(new QFilter("number", "=", "RMB")); } }); }
场景4:如何在列表上添加字段、控件
若想要在列表上展现额外元素,该怎么实现?比如在列表顶部添加一个复选框控件。方法示例如下:
步骤一:新建应用,先选择行业,再关联到“领域通用框架”。
新建应用示例
步骤二:新建PC布局,继承bos_list,选择PC端。
选择PC端
接着,选择动态表单。
选择动态表单
然后,选择继承现有表单。
继承现有表单
选择继承表单为bos_list,如下图所示:
选择继承表单为bos_list
点击“完成创建”进入设计器。
完成页面创建
搜索“复选框”控件,在页面头添加,最后保存,如下图所示:
添加”复选框“控件
步骤三:打开基础资料或者单据的列表设计器,此处以币别为例,设置“列表表单模板”为刚才创建的模板“test123456”,如下图所示:
设置列表表单模板
步骤四:预览列表,即可看到列表上添加了复选框。
预览列表
场景5:如何实现过滤字段的级联
非基础资料字段间的级联
以该场景为例:常用过滤里面存在“长日期”和“组织.名称”两个字段,当日期选择为“今天”时,组织自动定位为“环X集团”,组织id为10000。
常用过滤场景示例
实现方法如下:
首先,通过filterColumnSetFilter从缓存中拿到长日期控件的值,然后给组织添加过滤条件,代码示例如下:
@Override public void filterColumnSetFilter(SetFilterEvent args) { ControlFilters controlFilters = ((IListView) this.getView()).getControlFilters(); if (controlFilters != null && CompareTypeEnum.TODAY.getId() .equals(controlFilters.getFilter("datetimefield").get(0)) && "orgfield1.name".equals(args.getFieldName())) { args.addCustomQFilter(new QFilter("id", QFilter.equals, 10000L)); } super.filterColumnSetFilter(args); }
然后,将前端发送过来的选中值进行清理,代码示例如下:
@Override public void filterContainerSearchClick(FilterContainerSearchClickArgs args) { Object datetimeValue = args.getFilterValue("datetime"); if (datetimeValue != null && datetimeValue.equals(CompareTypeEnum.TODAY.getId())) { args.getFilterValues().get("customfilter").removeIf(t -> t.get("FieldName").get(0).equals("orgfield1.id")); } super.filterContainerSearchClick(args); }
基础资料字段间的级联
比如,常用过滤有两个基础资料,一个币别,一个组织,币别字段依赖于组织,最后一个参数是基础资料之间的外键关系字段。实现两个字段间的级联的代码示例如下:
@Override public void baseDataColumnDependFieldSet(BaseDataColumnDependFieldSetEvent args) { args.addDependField("currencyfield.name", "orgfield1.name", "id"); super.baseDataColumnDependFieldSet(args); }
场景6:如何在列表上切换不同的布局或者实体
场景:需要在列表上通过按钮或者常用过滤条件切换时隐藏部分字段,适用于隐藏的场景比较少的情况.
推荐解决方案:通过新建布局,将需要的字段拖到布局上,然后在列表的对应事件,比如itemClick事件,通过调用列表视图的changListView方法进行切换,代码示例如下:
@Override public void itemClick(ItemClickEvent itemclickevent) { AbstractListView listView = (AbstractListView) this.getView(); listView.changeListView("xxx_buju"); }
3 相关链接
4 划重点
本文总结了列表自定义开发的典型场景解决方案,主要包括以下6个场景:
1. 列表包含多分录数据时,如何指定默认展示分录?
2. 如何给列表上的基础资料过滤字段添加过滤条件?
3. 列表/单据列表控件如何添加过滤条件?
4. 如何在列表上添加字段、控件?
5. 如何实现过滤字段的级联?
6. 如何在列表上切换不同的布局或者实体?
在实现上述场景时,需要对列表多分录、列表的模板、列表过滤字段的实现方式,以及列表布局等原理有所了解。
#往期推荐#
更多精彩内容,“码”上了解!↓
必看!列表开发典型场景解决方案
本文2024-09-23 00:20:51发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-138884.html