OAF 请求等待界面
有时候我们会遇到这样的情况,点了按钮之后,在后台运行的代码会调用数据库的程序包,提交请求或者API,导致前台的页面需要等待。但是这个时候,前台页面的按钮,输入框等是可以继续操作的。
如上图,点击提交之后,后台调用采购接收接口程序,生成采购接收事务处理。但是点击了提交之后,并不是马上能操作完成的。
那么,如何避免客户重复点击提交或者进行别的操作呢?
此处我们用到了ProcessingCO:
参考文档:https://community.oracle.com/message/13563102?tstart=0
正常情况下,一个PG一个CO PG的操作,CO相应作出相应的逻辑操作,如调用AM。
先为需要的页面PG多建立一个CO
create a new controller oracle.apps.xxdm.ecrc.webui.xxProcessCO for ProcessingPG xxProcessCO:
我们将原先CO中的代码替换成:
if submitbtton!=null{ //新建的CO的路径 OAProcessingPage page = new OAProcessingPage("oracle.apps.xxdm.ecrc.webui.xxProcessCO"); //AM的路径 page.setApplicationModuleDefName("xxx.oracle.apps.xxdm.ecrc.server.xxMainAM"); // page.setRetainAMValue(false); page.setConciseMessage("This Will Submit Invoice Program"); page.setDetailedMessage("This Will Submit Concurrent Program to create Invoice in Oracle for the selected Request"); page.setProcessName("Concurrent Program is Runing! please do not close this window"); pageContext.putTransactionValue("reqId", reqId); // for parameters in ProcessCO pageContext.forwardToProcessingPage(page); }
将原先CO中的逻辑放到新的xxProcessCO中:
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { super.processFormRequest(pageContext, webBean); OAApplicationModule am = pageContext.getApplicationModule(webBean); Number reqId = (Number)pageContext.getTransactionValue("reqId"); String sreqId = reqId.toString(); Serializable[] parameters = { sreqId }; int concreqid = ((Integer)am.invokeMethod("submitCPRequest", parameters)).intValue(); // submitting the concurrent request pageContext.putSessionValue("concreqid",concreqid); //自己需要的页面跳转 pageContext.forwardImmediately("OA.jsp?page=/oracle/apps/xxdm/ecrc/webui/xxMainPG", null, OAWebBeanConstants.KEEP_MENU_CONTEXT, null, null, true, OAWebBeanConstants.ADD_BREAD_CRUMB_YES); }
运行效果如下:
只有当xxProcessCO中的逻辑全部运行完毕,才会跳出此页面,跳转到指定的页面。如果程序没有运行完毕,那么会一直在这个页面上等待。所以可以在xxProcessCO中先把调用AM的逻辑注释掉测试