Tuesday, June 07, 2016

Create a Navigation Bar based on a SQL statement

Creating a Navigation Bar using static values is very straightforward. Just create a list similar to this example below - and you can easily define multiple levels.
Then, in the User Interface Attributes, set that list to be your application's "Navigation Bar List" and specify the template.
And the Navigation Bar pops up nicely in the upper right corner of the screen.
So far so good.

But what if you don't want a Static List, but get a list based on a SQL statement? Then you have to enter a statement that adheres to the this structure:
select level, labelValue label, 
       [targetValue]            target, 
       [is_current]             is_current_list_entry,
       [imageValue]             image, 
       [imageAttributeValue]    image_attribute,
       [imageAltValue]          image_alt_attribute,
       [attribute1]             attribute1,
       [attribute2]             attribute2,
       [attribute3]             attribute3,
       [attribute4]             attribute4,
       [attribute5]             attribute5,
       [attribute6]             attribute6,
       [attribute7]             attribute7,
       [attribute8]             attribute8,
       [attribute9]             attribute9,
       [attribute10]            attribute10
from ...
(the columns between the square brackets are optional ones). Adding any other column will fail. But it seems you can enter a "level", so if your query returns the rows in the correct order, you should be fine. You think.
Because doing so (and using the very same List Template) will not work when you have multiple (parent) entries with children: All parents will show the same children, the ones of the first parent. The issue is raised a few times on the Oracle Forums, but never answered (see here and here).

Because I ran into that very same issue this morning, I dived in a little deeper. The problem is in the generated HTML: all buttons (parents) will get the same ID. So that's why the same children are attached to all the parents. 
So where does it get it's ID from? That's defined in the "Navigation Bar" template. In there references to "#LIST_ITEM_ID#" and "#PARENT_LIST_ITEM_ID" are used. But those values are not returned by the query. Even worse, you can't even define columns with those names. 

So the solution is to copy that Navigation Bar Template and replace the references to #LIST_ITEM_ID# and #PARENT_LIST_ITEM_ID# with a column that is returned from the query (and of course contains the right value). So, for instance, use #A09# and #A10# instead of the #LIST_ITEM_ID# and #PARENT_LIST_ITEM_ID# and be sure to select "attribute9" and "attribute10" in your query.
This way you can define a multilevel Navigation Bar based on a SQL statement !

Post a Comment