项目场景:EAS ListUI 默认虚模式导致页面超过500行数据未分页重复
这里简述项目相关背景:
问题背景
因为金蝶EAS通用的设计模式及功能
采用的是取数虚模式
采用的是取数虚模式
对于列表方式数据查询,应用框架统一使用虚模式进行取数。
他们的意图是:
在数据量较大的情况下,进行分批取数,减少网络流量,加快响应速度。
2.动机:
在信息系统中,数据查询是最常用的操作,但如果查询结果数据量很大情况下,一方面会增加网络传输的数据量,另一方面是一个耗时的过程,客户会出现一个可能较长时间的等待。这两方面都会降低软件的可用性。
为解决这个问题,我们使用虚模式。如果列表中定义了主键,Query会创建一个临时表来存放主键,以后取数据均通过此临时表进行处理。如果没有定义主键,则使用top 100等方式来获取。后一种方式不推荐使用。
3.适用性:
在数据量较大情况下非常有效。
额外消耗是会创建一个临时表处理。
4.应用:
ListUI中使用。
5.缺点及注意事项:
因为大于100条数据时,会会创建一个临时表处理。
问题描述及完整代码(建议看完下面的解决方案)
这里描述项目中遇到的问题:
我遇到的问题是 一个单独的UI页面 在进行数据展示的时候会出现联查的数据超过500行就会导致数据重复显示
废话不多说 我直接展示我的解决方法 和代码就好了
第一个UI的Action按钮跳转到单独的应该UI方法↓
/**
* 查询变更明细
*/
public void actionShowAccountDetail_actionPerformed(ActionEvent e)
throws Exception {
if (this.getSelectedKeyValue() == null) {
MsgBox.showInfo("请选择相应的预收款账户!");
return;
}
PRAccountInfo prAccInfo = PRAccountFactory.getRemoteInstance().getPRAccountInfo(
new ObjectUuidPK(this.getSelectedKeyValue()));
String ui = "com.kingdee.eas.auto4s.arp.aar.client.PRAccountShowDetailListUI";
IMetaDataPK showDetailQueryPK = new MetaDataPK("com.kingdee.eas.auto4s.arp.aar.app", "PRAccountShowDetailQuery");
EntityViewInfo entityFilterInfo = new EntityViewInfo();
FilterInfo filterInfo = getShowDetailFilter(prAccInfo);
entityFilterInfo.setFilter(filterInfo);
//查询对应的query
IQueryExecutor executor = this.getQueryExecutor(showDetailQueryPK,entityFilterInfo);
//记录查询的数
int count = executor.getRowCount();
UIContext uiContext = new UIContext(this);
uiContext.put("prAccInfo", prAccInfo);
uiContext.put("count", count);
uiContext.put("fromUI", this);
uiContext.put(UIContext.ID, this.getSelectedKeyValue());
// UIFactoryName.NEWTAB 为弹出模式
IUIWindow uiWindow = UIFactory.createUIFactory(UIFactoryName.NEWTAB)
.create(ui, uiContext, null, OprtState.VIEW);
// 开始展现UI
uiWindow.show();
refreshList();
}
跳转过后接受展示数据页面 ↓
/**
* 此方法为tblMain在执行时候 框架中List中的方法 会设置列表的取数方法
* @param e
*/
@Override
protected void tblMain_doRequestRowSet(RequestRowSetEvent e) {
//设为实模式
tblMain.getDataRequestManager().setDataRequestMode(0);
super.tblMain_doRequestRowSet(e);
}
/**
* 此方法为tblMain在执行时候 框架中List中的方法 会设置列表的取数方法
* @param e
*/
@Override
protected void tblMain_doRequestRowSetForHasQueryPK(RequestRowSetEvent e) {
//设为实模式
tblMain.getDataRequestManager().setDataRequestMode(0);
super.tblMain_doRequestRowSetForHasQueryPK(e);
}
public void onLoad() throws Exception {
super.onLoad();
//设置页大小,防止有的客户屏幕太小,导致默认值随之变小,当查询数据超过默认值时,超过的部分不显示,然后又从第一行开始重复显示
tblMain.getDataRequestManager().setPageRowCount(3000);
if(this.getUIContext().get("count") != null && Integer.valueOf(this.getUIContext().get("count").toString()) > 500) {
int count = Integer.valueOf(this.getUIContext().get("count").toString());
tblMain.getDataRequestManager().setPageRowCount(count);
}
}
解决方案:
上面的方法不一定可以解决全部场景
1.首先排查系统中引用com.kingdee.bos.ctrl.kdf.table中的KDTDataRequestManager类中的方法跟下面一致
public int getDataRequestMode() {
return this.dataRequestMode;
}
public void setDataRequestMode(int dataRequestMode) {
this.dataRequestMode = dataRequestMode;
}
public int getPageRowCount() {
return this.pageRowCount;
}
public void setPageRowCount(int pageRowCount) {
this.pageRowCount = pageRowCount;
}
2.根据录制或者debug继续查看出来的数据是否是数据问题 和主建ID