понедельник, 21 января 2013 г.

Запуск канкарента с отчетом из OAF

На той странице где вы хотите вызвать отчет, и где вы знаете параметры этого отчета "рисуете" кнопку или ссылку(более предпочтительно т.к. можно указать чтоб открылась в новом окне, очень актуально для отчетов). В качестве target у кнопки или ссылки указываете на свою собственную пустую страницу, сделать ее можно за 1 минуту.
На этой странице ничего нет кроме контроллера с методом processRequest приблизительно такого содержания (внимание - в 12-й версии addLayout требует 6 параметров, а не 5, как в 11 версии) :

public void processRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processRequest(pageContext, webBean);
     

       OAApplicationModule am = pageContext.getApplicationModule(webBean);
        int xxRequestId = 0;
        // Считываем входные параметры
        String xxp_kvpid = pageContext.getParameter("p_kvpid");
        String xxp_loanId = (String)pageContext.getParameter("p_loanId");
      
        // Заполняем, вычисляем параметры необходимые для запуска конкарента
        String xxp_type = null;
        String applnName = "PER";
        String cpName = null;
        String LayName = null;
        String cpDesc = null;
        Vector cpArgs = null;
        String xxDate = null;
        String xxp_number = null;
        String xxp_summa = null;
        String xxp_code = null;
        String xxp_date = null;
        
       if (xxp_kvpid != null)
      {  xxp_date = (String)pageContext.getParameter("p_date"); 
       
        java.util.Date d1 =(java.util.Date) pageContext.getOANLSServices().stringToDate(xxp_date,"dd-MMM-yyyy");
         xxDate  =  new SimpleDateFormat("yyyy/MM/dd").format(d1);  
        
      
         xxp_number = pageContext.getParameter("p_number");
         xxp_summa = pageContext.getParameter("p_summa");
         xxp_code = pageContext.getParameter("p_code");
         xxp_type = "G"; 
        if  ("P".equals(xxp_code.substring(0,1)) ) { xxp_type = "P";}
      }
        // Запускаем конкарент
        try
        {
            OADBTransaction tx = am.getOADBTransaction();
            java.sql.Connection pConncection = tx.getJdbcConnection();
            ConcurrentRequest cr = new ConcurrentRequest(pConncection);
           
            if (xxp_kvpid != null)
           { 
             cpName = "XXKVP_KO1";  // Краткое название конкарента
             LayName = "XXKVP_KO1"; // код шаблона XML
             if ("G".equals(xxp_type))
             {  cpName = "XXKVP_KO2";
               LayName = "XXKVP_KO2";
             }
             // Заполняем параметры конкарента
             cpArgs = new Vector(6);
             cpArgs.addElement(xxDate);
             cpArgs.addElement(xxp_kvpid);
             cpArgs.addElement(xxp_type);
             cpArgs.addElement(xxp_number);
             cpArgs.addElement(xxp_summa);
             cpArgs.addElement(xxp_code);
           }
           else
           {  cpName = "XXKVP_DOG_LOAN"; // Краткое название конкарента
              LayName = "XXKVP_DOG_LOAN"; // код шаблона XML
              // Заполняем параметры конкарента
              cpArgs = new Vector(1);
              cpArgs.addElement(xxp_loanId);
           }
            try
            {
            // Добавление шаблона (для отчетов XML Publisher)
            cr.addLayout("PER",LayName,"ru","RU","PDF"); 
            }
            catch(Exception e)
            {throw new OAException("addLayout -" + e.getMessage(), (byte)0);
            }
            // Непосредственно запуск конкарента
            xxRequestId = cr.submitRequest(applnName, cpName, cpDesc, null, false, cpArgs);
            
          
            tx.commit();
            // xxRequestId - id конкарента
        }
        catch(RequestSubmissionException e)
        {
            throw new OAException("RequestSubmissionException " + e.getMessage(), (byte)0);
        }
        // Ждем завершения конкарента через пакет fnd_concurrent.wait_for_request
        OAException oaexception = null;
        String Stmt = "declare var_wait boolean; var_phase  varchar2(80); var_status  varchar2(80); var_dev_phase varchar2(80);  var_dev_status varchar2(80); var_message varchar2(80); begin var_wait := fnd_concurrent.wait_for_request( request_id  => " + xxRequestId + ",interval => 5 ,max_wait => 0,phase => var_phase,status => var_status,dev_phase => var_dev_phase,dev_status => var_dev_status,message => var_message ); end;";
        OAApplicationModule MyApplicationModule = pageContext.getRootApplicationModule();
        OADBTransaction oadbtransaction = MyApplicationModule.getOADBTransaction();
        OracleCallableStatement MyOraCallableStmt;
        try
        {
            MyOraCallableStmt = (OracleCallableStatement)oadbtransaction.createCallableStatement(Stmt, 1);
            MyOraCallableStmt.execute();
        }
        catch(Exception exception1)
        {
            oaexception = OAException.wrapperException(exception1);
            throw OAException.wrapperException(exception1);
        }
        try
        {
            MyOraCallableStmt.close();
        }
        catch(Exception exception)
        {
            throw OAException.wrapperException(exception);
        }
       // Дождались окончания конкарента и переходим на страницу отображения результатов конкарента с передачей параметра какой конкарент нужно отобразить
       pageContext.forwardImmediately("OA.jsp?_rc=FNDCPREQUESTVIEWPAGE&_ri=0&OUTPUT=Y&REQUESTID=" + xxRequestId, null, (byte)0, null, null, false, "N");
  } 
 
__________________________________________________________
 
Чтобы другим не наступать на грабли и не гадать как этот javascript 
прилаживать к OAF, роя интернет. Выкладываю что у меня получилось. 
Получилось у меня и через кнопку и по линку.
Через кнопку, получилось используя javascript. Вот пример кода:
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
    {
      super.processFormRequest(pageContext, webBean);
        if (pageContext.getParameter("bPrint") != null)
          {
             String lookupType = pageContext.getParameter("LookupType");
             StringBuffer l_buffer = new StringBuffer();
             StringBuffer l_buffer1 = new StringBuffer();
             l_buffer.append("javascript:var mywin = openWindow(top, '");
             l_buffer1.append("/xxlookup/oracle/apps/fnd/lookups/webui/xxConcurent");
             l_buffer1.append("&retainAM=Y");
             l_buffer1.append("&LookupType="+lookupType);
             String url = "/OA_HTML/OA.jsp?page="+l_buffer1.toString();
             OAUrl popupUrl = new OAUrl(url, OAWebBeanConstants.ADD_BREAD_CRUMB_SAVE );
             String strUrl = popupUrl.createURL(pageContext);
             l_buffer.append(strUrl.toString());
             l_buffer.append("', 'ReportWindow', {width:800, height:600},false,'dialog',null);");
             pageContext.putJavaScriptFunction("RepLookup",l_buffer.toString());
          }
    }   


Где xxConcurent - это страничка (создавал в JDevelopere, как New -> OACompanets -> Page)
LookupType - это параметр который забираю с текущей странички

Для линка просто сам формирую дестинэйшин:
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
    {
        super.processRequest(pageContext, webBean);    
        OALinkBean linkBean = (OALinkBean) webBean.findIndexedChildRecursive("lPrint");//first get the LinkBean
        linkBean.setAttributeValue(linkBean.DESTINATION_ATTR, "OA.jsp?page=/xxlookup/oracle/apps/fnd/lookups/webui/xxConcurent&retainAM=Y&LookupType="+ (String)pageContext.getParameter("LookupType"));
    }


Ну и в свойствах у Линка стоит Target Frame = _blank

Надеюсь кому-нибудь будет полезным.  

1 комментарий: