EAS ListUI 默认虚模式导致页面超过500行数据未分页重复

项目场景: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值