必看!列表开发典型场景解决方案

列表是单据模型的重要组成部分,预置实体的数据展现、操作、权限、筛选排序、基本数据统计等框架逻辑。
对于常规单据来说,仅通过简单配置即可实现基本的列表查询功能;对于业务场景复杂的单据,则需要通过插件开发的方式实现个性化逻辑。
本文总结了列表自定义开发的典型场景解决方案,能够有效解决列表开发中遇到的常见问题,干货满满,推荐收藏 ~
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:如何在列表上添加字段、控件
若想要在列表上展现额外元素,该怎
必看!列表开发典型场景解决方案
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



