如何实现将不同的单据展示在同一个列表(二)原创
金蝶云社区-wbshcy
wbshcy
8人赞赏了该文章 2,091次浏览 未经作者许可,禁止转载编辑于2021年10月18日 17:57:36
summary-icon摘要由AI智能服务提供

本文介绍了在同一列表中展示不同单据,并动态添加“创建人”和“单据类型”等自定义字段的过程。由于原始方案只展示单据编号和状态,用户希望增加更多信息。通过注册监听器和动态创建列,实现了自定义字段的添加。但列表控件只能显示单据本身字段,故需在单据中添加新字段。修改取数逻辑,为自定义字段赋值。此外,修正了数据总数显示问题,通过重写getRealCount方法解决了列表只显示部分数据的问题。

标签:

列表、不同单据

需求背景:

将不同的单据放在同一列表展示的需求可以通过https://vip.kingdee.com/article/214023634032177920的方案。但是该方案只实现列表展示单据编号和单据状态两个字段,还希望能放创建人和单据类型等字段。创建人是单据有的字段,而单据类型是单据没有的字段。

分析过程

刚开始是想在列表控件直接增加表格字段,绑定单据的创建人名称字段,如图,然后取数时增加creator.name

 image.png

image.png

但是由于取到的是平铺对象,值是字符串,而列表字段字段映射是基础资料属性,导致类型转换报错

 image.png

所以只能自己动态创建列(文本类型),然后取数时取到单据的creator.name动态列对应的字段赋值。

 

实现步骤:

关键步骤1给列表控件注册CreateListColumnsListener监听,并在CreateListColumns事件增加两个自定义列。

@Override
public void initialize() {
// TODO Auto-generated method stub
super.initialize();
BillList billlist=this.getView().getControl("billlistap");
//给列表控件注册增加自定义列监听
billlist.addCreateListColumnsListener(this); 
//给列表控件注册增加自定义取数监听
billlist.addCreateListDataProviderListener(this); 
}
@Override
public void createListColumns(BeforeCreateListColumnsArgs paramBeforeCreateListColumnsArgs) {
// TODO Auto-generated method stub
// 设计器预置的列集合
List<IListColumn> columns = paramBeforeCreateListColumnsArgs.getListColumns();
ListColumn colText1= this.createListColumn("kded_textfield", "创建人", 3);
colText1.setParentViewKey("kded_listgridviewap");//列表控件里表格视图的标识
columns.add(colText1);
ListColumn colText2 = this.createListColumn("kded_textfield1", "单据类型", 4);
colText2.setParentViewKey("kded_listgridviewap");//列表控件里表格视图的标识
columns.add(colText2);
}
 
/**
 * 创建列对象返回
 * 
 * @param key 列标识,需要显示的字段,如"textfield"、 "basedatafield.name"
 * @param caption 列标题
 * @param colIndex 列顺序
 * @return
 */
private  ListColumn createListColumn(String key,String caption,int colIndex) {
ListColumn col = new ListColumn(); 
col.setCaption(new LocaleString(caption));
col.setKey(key);    
col.setListFieldKey(key);
col.setFieldName(key); 
col.setSeq(colIndex); 
col.setWidth(new LocaleString("8%"));
return col;  
 
}


关键步骤2.通过上一个步骤增加的自定义字段,预览列表看不到字段,但是在列表设置控制可以看到,原因是列表控件的限制,只能显示单据本来的字段,所以需要在对应的单据增加kded_textfieldkded_textfield1这两个文本字段。

 image.png

 

关键步骤3.修改取数逻辑,将取到的crearor.name赋值给kded_textfieldkded_textfield1赋值单据类型。

@Override
public void initialize() {
// TODO Auto-generated method stub
super.initialize();
BillList billlist=this.getView().getControl("billlistap");
billlist.addCreateListDataProviderListener(this);
}
@Override
public void createListDataProvider(BeforeCreateListDataProviderArgs paramBeforeCreateListDataProviderArgs) {
// TODO Auto-generated method stub
paramBeforeCreateListDataProviderArgs.setListDataProvider(new ListDataProvider() {
@Override
public DynamicObjectCollection getData(int start, int limit) {      
return getCollection();//自己重新取数
}
});
}
private DynamicObjectCollection getCollection() {
QFilter  filter= new QFilter("billstatus", QCP.not_equals,"A");//根据业务需求自定定义数据过滤条件
DynamicObjectCollection dCollection1 = QueryServiceHelper.query("kded_officesuppliesbill", "billno,billstatus,creator.name,kded_textfield,kded_textfield1,id", new QFilter[] {filter});
DynamicObjectCollection dCollection2 = QueryServiceHelper.query("kded_offsupregisterbill", "billno,billstatus,creator.name,kded_textfield,kded_textfield1,id", new QFilter[] {filter});
for(DynamicObject object:dCollection1) {
object.set(3, object.get("creator.name")); 
object.set(4, "办公用品领用申请单"); 
}
for(DynamicObject object:dCollection2) {
object.set(3, object.get("creator.name")); 
object.set(4, "办公用品登记单"); 
}
dCollection1.addAll(dCollection2);  
return dCollection1;     
   
}

实现效果:

image.png 

遗留问题

如上图,列表只展示了4条数据,但是总计是8条,原因是是自己自定义取数需要重写kd.bos.mvc.list.ListDataProvidergetRealCount()方法。

@Override
public void createListDataProvider(BeforeCreateListDataProviderArgs paramBeforeCreateListDataProviderArgs) {
// TODO Auto-generated method stub
paramBeforeCreateListDataProviderArgs.setListDataProvider(new ListDataProvider() {
@Override
public int getRealCount() {
// TODO Auto-generated method stub
DynamicObjectCollection collections=getCollection();//重复取数可能有性能问题,可考虑使用缓存存储集合大小    
return collections.size();
}
@Override
public DynamicObjectCollection getData(int start, int limit) {
                //自己重新取数  
return getCollection();
}
});}

实现效果如下

 image.png

 


赞 8