Thursday, October 29, 2009

Integration of Forms and APEX : Calling APEX from Forms

In previous blog posts (like this, this and this one) I explained how you can integrate (or embed) Oracle Forms within an APEX Page. But yesterday I stumbled upon this question on the Oracle APEX Forum. There someone was looking for a solution how to access an APEX Page from an Oracle Form - so exactly the other way round. And, after some trial-and-error I came up with this solution:

1. Copy the basejpi.htm (or whatever html file you're using in the formsweb.cfg) on your application server to (something like) forms2apex-jpi.htm and reference that in your formsweb.cfg.

2. Edit the forms2apex-jpi.htm and add an IFRAME tag just before the closing BODY tag:
<IFRAME src="http://localhost:7778/pls/apex/f?p=104"
       style="width:800px;height:450px;visibility:hidden"  
       name="APEX" 
       id="APEX" 
       scrolling="auto" 
       marginwidth="1" 
       marginheight="1"
       frameborder="1" 
       vspace="1" 
       hspace="1" /> 
where the src references your APEX app.

3. In the same file, add a javascript function between the HEAD-tags, to call the APEX page (in this example it is an IR and I add a parameter to the call):
<script type="text/javascript">
  function ShowApexPage( pPage, pID ){
    vFrame = document.getElementById("APEX");
    vFrame.src = "http://localhost:7778/pls/apex/f?p=104:"+pPage+"::::RP,"+pPage+",RIR:IR_CUSTOMER_ID:"+pID;
     vFrame.style.visibility = "visible"; 
    }
</script>
and save the file.

4. In your Form add some code to a button or - in this example - to the WHEN-NEW-RECORD-INSTANCE trigger:
ShowApexPage( 12, :CUSTOMERS.CUSTOMER_ID ); 
and define that ShowApexProcedure as a Program Unit (in your Form or Library):
 PROCEDURE ShowApexPage
          ( p_page_no number
          , p_id      number 
          ) IS
BEGIN
 web.show_document('javascript:ShowApexPage( '||p_page_no||','||p_id||');', '_self');  
END; 
And now you're ready to roll....

Of course there are some limitations: It works best when you're using SSO or a Public APEX Page, otherwise APEX will present a login screen first...
Post a Comment