This post is about a common development requirement- Can we increase or decrease number of fields , type of fields (columns in case of table), data in fields at run time?
Suppose i have to show data of Departments and Employees table on page using only one af:table component. It means columns should be generated dynamically at run time depending on any defined condition
So for this requirement i am using dynamic viewObject in model layer and af:dynamicComponent in view layer
See previous post about creating dynamic viewObject-
Creating Dynamic View Object at Runtime programmatically - Oracle ADF
See step by step implementation-
- Create Fusion Web Application and follow the link posted above to create dynamic viewObject, in short create a viewObject using dual and a method in AMImpl to create dynamic viewObject from sql query
/**Method to create viewObject using SQL query
* @param query
*/
public void createNewViewObject(String query) {
ViewObject dynVo = this.getdynamic1();
dynVo.remove();
this.createViewObjectFromQueryStmt("dynamic1", query);
this.getdynamic1().executeQuery();
}
- Created a page and added an inputText to enter SQL query and a button to process that query and create dynamic viewObject at run time
- See Managed Bean code to process query, value of inputText is passed using component binding
private RichInputText sqlQueryBind;
public DynamicTableBean() {
}
/*****Generic Method to call operation binding**/
public BindingContainer getBindingsCont() {
return BindingContext.getCurrent().getCurrentBindingsEntry();
}
/**
* Generic Method to execute operation Binding
* */
public OperationBinding executeOperation(String operation) {
OperationBinding createParam = getBindingsCont().getOperationBinding(operation);
return createParam;
}
/**Method to create viewObject
* @param actionEvent
*/
public void createViewObjectAction(ActionEvent actionEvent) {
if (sqlQueryBind.getValue() != null) {
OperationBinding ob = executeOperation("createNewViewObject");
ob.getParamsMap().put("query", sqlQueryBind.getValue().toString());
ob.execute();
}
}
public void setSqlQueryBind(RichInputText sqlQueryBind) {
this.sqlQueryBind = sqlQueryBind;
}
public RichInputText getSqlQueryBind() {
return sqlQueryBind;
}
- Now dropped this dual viewObject on page as dynamic form and dynamic table from Data Control (this snap is about creating form)
- Next is to change pageDef entry for this dynamic component , open pageDef and goto treeBinding. there is an entry for nodeDefinition, there will be separate treeBinding for form and table both (you should change both)
<tree IterBinding="dynamic1Iterator" id="dynamic1">
<nodeDefinition DefName="dynamictableapp.model.view.dynamicVO" Name="dynamic10"/>
</tree>
Change this entry like this-
<tree IterBinding="dynamic1Iterator" id="dynamic1">
<nodeDefinition Name="dynamic10"/>
</tree>
- Now run this application and enter SQL query in box and press process button
Thanks, Happy Learning :)
Download -
Sample ADF Application