Tuesday, January 24, 2012

Executing iterator binding in deferred Mode when there are required bind variable parameters

An iterator binding can be set to execute in "deferred" mode.  This is the default behavior if you don't change it.   What this means is that the query will not execute unless the page needs to display it's data.   This is great for use on a page that doesn't initially display the data to the user, like in a popup or tab that is not initially disclosed.  If the popup is displayed or the tab is disclosed, then and only then will the query be executed.  Also for tables that are set to lazy load (retrieve it's data after the page initially loads) this prevents the query from executing until the page is first displayed and the "Fetching data..."  message is displayed over the table.  A problem arises when the view object requires named bind variables.  The bind variables do not get set unless you add an ExecuteWithParams action binding to the task flow.   Calling an ExecuteWithParams will execute the query but that defeats the value of setting the iterator binding to "deferred"   So how do I set the bind variables without executing the query?

Here is one technique:
  • Edit the View object, select the Java panel and check the "Generate View Object Class" and "Include bind_variable accessors.
  • Edit the Client Interface and add the setMyValueBind()  method to the interface.
  • Select the Data Control panel and click the refresh icon to refresh the data controls.
  • Find your view object in the data controls panel and expand it.  You should see the setMyValueBind method under the list of attributes.
  • Drag the method call over onto your task flow and add an EL expression to set the bind variables value.
  • insert the method call into the chain of operations that execute prior to displaying the page.
That is all that is needed.  The first time the data is displayed, the iterator binding will execute the query using the set bind parameters and if the user never displays the popup or tab that displays the data, the query will not need to be executed.

3 comments:

  1. Hi, I have followed you until the 'Drag the method call over...' but now am confused about this. Could you please ellaborate?

    Do you mean me to drag the setMyValueBind to the jspx and then, create a method called by the EL expression in a backing bean?

    ReplyDelete
  2. Drag the setMyValueBind method from the data control panel onto your bounded or unbounded task flow (the one where your jspx page shows up on). Then make the method call the default action (if on a bounded task flow) and draw a line from it to your jspx page. The EL Expression can come from anywhere. i.e from a pageFlowScope.parameter (passed to the task flow) or from an attribute binding or from a backing bean.

    ReplyDelete
  3. I came for your explanation of the deferred refresh property, and I loved it.

    Thank you

    ReplyDelete