有时候我们会遇到这样的情况,点了按钮之后,在后台运行的代码会调用数据库的程序包,提交请求或者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的逻辑注释掉测试