Hi,
This is an example demonstrating the usage of treeTable and table of ADF all together.
Download Sample Application.
We are going to use the HR Schema and more specifically the following tables:
Departmens,
Employees,
EmployeesViewDetails.
Departments and Employees are going to be the Master detail that will be displayed in the Tree Table
the EmployeesViewDetails will be the detail table shown below the tree Table.
After generating the appropriate Business Components through JDeveloper wizard, we are going to create an additional association and a viewLink.
Because the EmployeesViewDetails is a database view, the associations are not provided by JDeveloper wizard.
Furthermore, we are changing the the Primary Key of the EmployeesViewDetails from RowId to EmployeeId.
Association:
ViewLink based on that association:
Finally we reach to a point where we will create the Application Module hierarchy:
This is the tricky part. at this point, we have to understand two things:
One, we are going to use the Target Data Source feature. This feature according to the following documents
http://www.oracle.com/technetwork/developer-tools/adf/master-detail-moredetail-154767.html
http://www.oracle.com/technetwork/developer-tools/adf/learnmore/sept2011-otn-harvest-508189.pdf
needs to point value that corresponds to a key of the other iterator..
Additionally the JDeveloper documentation for this feature says:
So, what we have to do is to point the right value to the right Key..
Two, Our hierarchy is not going to be the following:
Is going to be the following:
Now, why is that???
Simply because, we want to use the target Data Source feature, and for that reason, we need to map the same key attributes.
Further more, we do not want to show the details on our tree.... We just want to show it on a separate table.
The concept is simple: We have to have the same keys to synchronize properly.
Now, to our case, apparently, we cannot synchronize Employees and EmployeesViewDetails directly, for the simplest reason that we are on a master-detail-detail situation...
In fact, our example is a very special case, because it is a pure coincidence that Employees and EmployeeViewDetails have the same attribute as a primary key.
According to documentation, a draft and general explanation would be the following:
the targeted Data Source iterator, will find a row where it's key value is the same as the key value of the selected row of the iterator that invokes the target Data Source iterator and will set this row to current.
well, reading it again, it is not simple at all!! :D
ok lets try again...
The targeted iterator will simply search for a row in the list and make it current.
The key of that row, will have the same value as the key of the selected row in the tree.
hmm... still not good..
The iterator that uses the target Data Source feature, will force the specified iterator to find a row with the same key value as the previous one.
I give up.... :D
Well, so if we had just added the EmployeesViewDetail without having it as a detail under Employees... we should have seen all employees and every time we selected an employee, the employeesViewDetail table would simply change the current row.
And of course, we do not want that..
So, the best approach is the one showed in the screen.
Why? Well, when we select an employee from the tree, the target Data Source feature will invoke the other employees iterator, which in turn will invoke the employeesViewDetails iterator to refresh because, after all, it is a detail right?..
Next, we are going to Create our page.
First, we will create a task flow and a jspx on it.
Onto jspx, we drag and drop the departments Iterator from the dataControl and we select, treeTable.
Then, we add a rule for the Employees as shown in the Screen below.
For Departments rule, we shuttle DepartmentId and Department Name attributes.
For Employees rule, we shuttle EmployeesId, firstName and lastName.
Next, we surround our treeTable with a panelCollection. We Simply right click on the tree table component and we select panelCollection.
Since treeTable component, does not create other than the node column, we will create them ourselves.
After that, we surround the panelCollection with a panelGroupLayout with type Scroll. This will be the parent Container of both, our treeTable and table.
At this point, we have to apply the target Data Source feature. As we explained earlier, we are going to set this feature for the Employees detail iterator of the Departments master iterator. This Employees iterator will point to "other" Employees iterator.
But first, we have to add this iterator. So in our page definition we add the other Employees as iterator.
Then, we are going to set our Target Data Source value.
We simply select the tree of Departments and then the rule of Employees,
after that, we expand the target data source option and open the help wizard to choose our iterator. The iterator would be the "other" Employees iterator.
Now, every time we select an employee from our tree, the "other" employees iterator will change the current row to the same as the selected in the tree.
All we have to do now is to drag and drop the EmployeesViewDetails from our Data Control
After that, we surround the table with a panelCollection (the usual best practice..) and set partial triggers to table from the tree table.
And that is it!
When you run the page you will see a row in the empsDetailsView ofcourse, since it is querying, but this is not the scope of this post.. When ever you select an employee the table will be refreshed with the employee's details.
Download Sample Application
Regards.
This is an example demonstrating the usage of treeTable and table of ADF all together.
Download Sample Application.
We are going to use the HR Schema and more specifically the following tables:
Departmens,
Employees,
EmployeesViewDetails.
Departments and Employees are going to be the Master detail that will be displayed in the Tree Table
the EmployeesViewDetails will be the detail table shown below the tree Table.
After generating the appropriate Business Components through JDeveloper wizard, we are going to create an additional association and a viewLink.
Because the EmployeesViewDetails is a database view, the associations are not provided by JDeveloper wizard.
Furthermore, we are changing the the Primary Key of the EmployeesViewDetails from RowId to EmployeeId.
Association:
ViewLink based on that association:
Finally we reach to a point where we will create the Application Module hierarchy:
This is the tricky part. at this point, we have to understand two things:
One, we are going to use the Target Data Source feature. This feature according to the following documents
http://www.oracle.com/technetwork/developer-tools/adf/master-detail-moredetail-154767.html
http://www.oracle.com/technetwork/developer-tools/adf/learnmore/sept2011-otn-harvest-508189.pdf
needs to point value that corresponds to a key of the other iterator..
Additionally the JDeveloper documentation for this feature says:
Two, Our hierarchy is not going to be the following:
Is going to be the following:
Now, why is that???
Simply because, we want to use the target Data Source feature, and for that reason, we need to map the same key attributes.
Further more, we do not want to show the details on our tree.... We just want to show it on a separate table.
The concept is simple: We have to have the same keys to synchronize properly.
Now, to our case, apparently, we cannot synchronize Employees and EmployeesViewDetails directly, for the simplest reason that we are on a master-detail-detail situation...
In fact, our example is a very special case, because it is a pure coincidence that Employees and EmployeeViewDetails have the same attribute as a primary key.
According to documentation, a draft and general explanation would be the following:
the targeted Data Source iterator, will find a row where it's key value is the same as the key value of the selected row of the iterator that invokes the target Data Source iterator and will set this row to current.
well, reading it again, it is not simple at all!! :D
ok lets try again...
The targeted iterator will simply search for a row in the list and make it current.
The key of that row, will have the same value as the key of the selected row in the tree.
hmm... still not good..
The iterator that uses the target Data Source feature, will force the specified iterator to find a row with the same key value as the previous one.
I give up.... :D
Well, so if we had just added the EmployeesViewDetail without having it as a detail under Employees... we should have seen all employees and every time we selected an employee, the employeesViewDetail table would simply change the current row.
And of course, we do not want that..
So, the best approach is the one showed in the screen.
Why? Well, when we select an employee from the tree, the target Data Source feature will invoke the other employees iterator, which in turn will invoke the employeesViewDetails iterator to refresh because, after all, it is a detail right?..
Next, we are going to Create our page.
First, we will create a task flow and a jspx on it.
Onto jspx, we drag and drop the departments Iterator from the dataControl and we select, treeTable.
Then, we add a rule for the Employees as shown in the Screen below.
For Departments rule, we shuttle DepartmentId and Department Name attributes.
For Employees rule, we shuttle EmployeesId, firstName and lastName.
Next, we surround our treeTable with a panelCollection. We Simply right click on the tree table component and we select panelCollection.
Since treeTable component, does not create other than the node column, we will create them ourselves.
After that, we surround the panelCollection with a panelGroupLayout with type Scroll. This will be the parent Container of both, our treeTable and table.
At this point, we have to apply the target Data Source feature. As we explained earlier, we are going to set this feature for the Employees detail iterator of the Departments master iterator. This Employees iterator will point to "other" Employees iterator.
But first, we have to add this iterator. So in our page definition we add the other Employees as iterator.
Then, we are going to set our Target Data Source value.
We simply select the tree of Departments and then the rule of Employees,
after that, we expand the target data source option and open the help wizard to choose our iterator. The iterator would be the "other" Employees iterator.
Now, every time we select an employee from our tree, the "other" employees iterator will change the current row to the same as the selected in the tree.
All we have to do now is to drag and drop the EmployeesViewDetails from our Data Control
After that, we surround the table with a panelCollection (the usual best practice..) and set partial triggers to table from the tree table.
And that is it!
When you run the page you will see a row in the empsDetailsView ofcourse, since it is querying, but this is not the scope of this post.. When ever you select an employee the table will be refreshed with the employee's details.
Download Sample Application
Regards.
Dimitrios Stasinopoulos ... I become fan of your.. you write with so mch innovative way..I like reading whole article..good one.. I will share this on javapins.com... good work.. be in touch..
ReplyDeleteThanks vinay20 for your kind words.
DeleteDimitrios one issue i am having this implementation. I am using tree and table as data source.for click of every node i am displaying refresh table.It works fine for first time and after that i go to home page of application and come again on this page, i am not able to see table portion inside my page. what can be the issue.any idea
ReplyDeleteHello vinay20, thank you for your comment. I am afraid I cannot say much without having details on your application structure and design. Can you elaborate a bit more on the case?
DeleteRegards,
Dimitrios.
Hi Dimitrios,
ReplyDeleteNice post. It worked for me.
Thanks