Category Archives: ADF UI

Tuning for ADF


MaxFetchSize

MaxFetchSize is the maximum number of rows fetched from the database for the current view object. Setting -1 will retrieve unlimited number of rows or the entire rows returned from a query. Setting 0 will cause no query execution and no rows will be returned. Check in the VO for this property.

1

FetchSize

This is the number of rows that is returned on a single database round trip. This setting will determine how many rows will be returned for a particular view object at run-time on a single query. Set the size In batches of n+1. check in VO, AM instance, table component for this property.

2

FetchMode

This is the mode that controls how the rows are retrieved in a JDBC resultset. Some of the modes allowed for the FETCH_ALL, FETCH_AS_NEEDED. Number of rows retrieved is based on the RangeSize of the VO.

FETCH_ALL – will fetch all the rows at a time. This causes all rows to be retrieved from a JDBC result set immediately, and then closes the result set.

3

FETCH_AS_NEEDED – will fetch number of rows defined by the RangeSize first and is again fetched upon request. A fetch mode that causes rows to be retrieved from a JDBC result set as the user navigates through the row set. The result set is closed when the user reaches the end of the row. The executeQuery() will fetch this much only.

4

RangeSize

Number or rows to be displayed in the Iterator collection. Table rows maps to this. By default is 25. Maps from View Object to the UI Collection. Check in VO, Page definition file for this property.

5

ListRangeSize

ListRangeSize is the setting for the List of values that is added to the attribute in the View object which will be set to less value to reduce large number of rows getting returned unnecessarily. Setting -1 will retrieve all the rows. Check in the VO for this property.

6RowCountThreshold

Specify a value to determine if a result set returns the number of rows you specify as a value. If you set RowCountThreshold to 0, the Iterator returns the estimated row count in the result set by executing the count query. If you set RowCountThreshold to less than 0, the Iterator does not execute the count query. If RowCountThreshold is set to -1 then it will load the table faster and will not execute the SELECT COUNT query for the number of data retrieved. Check in page definition file.

7

AccessMode

This defines how the row is accessed in a view object. The modes are

SCROLLABLE – Rows are cached in a collection. This is the most flexible mode for accessing rows and working with a RowSet. Ideal for less number of rows. For large numbers use RANGE_PAGING or RANGE_PAGING_INCREMENTAL.

FORWARD_ONLY– Sequential Access to rows in a collection. The Iterator on this RowSet will not allow scrolling back

8

RANGE_PAGING – The paging is done based on the RangeSize defined. If the rows which are requested are not in the range then the rows are fetched from the database using the ROWNUM query. it only keeps the current range (or “page”) of rows in memory in the view row cache at a time

RANGE_PAGING_AUTO_POST – The rowset will post any changes in the transaction for rows out of the current range.

9

RANGE_PAGING_INCR – the UI incrementally displays the result set from the memory cache and thus supports scrolling within a single database query. the UI incrementally displays the result set from the memory cache and thus supports scrolling within a single database query. The number of rows that the end user can scroll though in a single query is determined by the range size and a range paging cache factor that you set. For example, suppose that you set the range size to 4 and the cache factor to 5. Then, the maximum number of rows to cache in memory will be 4*5 = 20

10

Query Optimizer

These are hints added to the query to help retrieve the record efficiently. This will influence the execution plan of the query.  Check in the VO.

ALL_ROWS – Fetch all the rows as soon as possible.

FIRST_ROWS – fetch the first rows as quickly as possible

Row Limit

This is updated in the adf-config.xml file. The value of -1 will fetch all the rows for the VO in the application. You can limit the row limit fetched by the VO in an application using this option.

11

AutoHeightRows

The number of rows used to size the component height. The default value is -1 (no auto-sizing for any number of rows). The height of the component can grow to a maximum of autoHeightRows after which a scrollbar is displayed. A value of 0 can be used to default the autoHeightRows to the current fetchSize. autoHeightRows value cannot be larger than fetchSize attribute. Check in the table component.

12

Advertisements

Jdeveloper 11.1.2.3 is out with ADF Essentials


Jdeveloper 11.1.2.3 is out with ADF Essentials – ADF Free to develop and Deploy.. 🙂

http://www.oracle.com/technetwork/developer-tools/jdev/documentation/index.html

How to in Jdeveloper ADF–Single row table selection


Scenario:

How to enable single row table selection?

Solution:

This seems an obvious question but newbie’s miss to understand this and will find difficulties in fixing this.

So what exactly we do to make the selection happen and confirm that it points to the current row of the af:table.

first, make sure that you have the following entries added to the af:table component of your page

selectedRowKeys="{bindings.Customers.collectionModel.selectedRow}"
selectionListener="#{bindings.Customers.collectionModel.makeCurrent}"
rowSelection="single"

Note: Customers is the tree binding for the table in the page definition file.

So what these entries do?

selectedRowKeys – the state of the selection is stored in this property. This property identifies the current selected row in the collectionModel of the table.

selectionListener – this is a listener that corresponds to the selection of the row. we bind it to the makeCurrent method of the table bindings collectionModel

rowSelection – we make it single row selection.

How To in Jdeveloper ADF Tutorials – Add Date based on another Date


Scenario:

How to calculate the datefield by considering another datefield that’s entered in by the user.
If you have entered a datefield “Today” as 12/04/2012
Now the requirement is to calculate another datefield’s date as 12/04/2012 + 30 days?

Solution:

  • Have two fields in the page. inputDate1 and inputDate2 bounded to the value in the bean as date1 and date2.
  • set inputDate1 autosubmit=true, and inputDate2 partialTrigger is set to the id of the inputDate1

<af:inputDate label="Date 1" id="id1" value="#{bean.date1}" autoSubmit="true"/>
<af:inputDate label="Date 2" id="id2" value="#{bean.date2}" partialTriggers="id1"/>

in the bean for the date fields. have getter and setter

in the getter of the date2 field have the following code


private Date date1;
private Date date2;

public void setDate1(Date date1) {
this.date1 = date1;
}

public Date getDate1() {
return date1;
}

public void setDate2(Date date2) {
this.date2 = date2;
}

public Date getDate2() {
if(date1 != null){
Calendar cal =Calendar.getInstance();
cal.setTime(date1);
cal.add(Calendar.DATE, 30);
date2 = cal.getTime();
}
return date2;
}

The source code is downloaded from here, for Jdeveloper 11.1.2.2.0

How To in Jdeveloper ADF Tutorials – creates new row in af:panelist


Scenario:

How to make a panellist that reads data from a database and according to the number of records in the database creates new row in the panellist?

Solution:


<af:iterator id="i3" value="#{emp.collectionModel}" var="row"> //emp.collectionModel is your collection
          <af:panelList id="pl1">
            <af:outputText value="#{row.empName}" id="ot3"/> // empName is the attribute to show
          </af:panelList>
        </af:iterator>

How To in Jdeveloper ADF Tutorials – set and get SelectOneChoice values


Imagine that you have a ViewObject added to the Application Module and you want to add this view instance as a selectonechoice for the base VO in your UI.

Setup:

Lets have a setup as ‘DeliveryRuleView’ VO as a base datasource and for the column ‘CapTrgTyp’ you are going to add a LOV list of values coming from ‘DeliveryTriggerType’ VO

The following screenshot will show a VO ‘SystemDictionaryView’ added to the AM as a View Instance ‘DeliveryTriggerType’. The ‘SysemDictinaryView’ will list the values based on the ‘Subcategory’ provided during runtime.

To Map this to a select one choice in the UI. You will have to have the list binding created as shown in the screenshot.

  • The Base Data Source is selected as ‘DeliveryRuleView’ and the List Data Source is selected as ‘DeleiveryTriggerType’.
  • The Data Mpping is done against the ‘CaptrgType’ from ‘DeliveryRuleView’ and the ‘SubCategory’ attribute from the ‘DeliveryTriggerType’.
  • The List Binding will have another attribute ‘Value’ as a Display Attribute. The binding is named as Deliverytrigger’
  • Have an iterator defined for the ‘DeliveryTriggerType’ View instance from AM and name it as ‘DeliveryTriggerTypeIterator’

in the jsff page you will have the selectonechoice code as


<af:selectOneChoice label="Trigger" id="deliveryTrigger" value="#{pageFlowScope.backing_bean.deliveryTrigger}" required="true" autoSubmit="true">
<f:selectItems id="si131" value="#{bindings.DeliveryTrigger.items}"/>
selectOneChoice>

When you look closely, the value of the selectonechoice is mapped to the deliveryTrigger value in the managed bean and we have the selectItems bounded to the pagedef list bindings as ‘#{bindings.DeliveryTrigger.items}’

Create Operation

So during Creation of a record in ‘DeliveryRuleView’ the list will be populated from ‘DeliveryTriggerType’ instance. The user selects the option in the list and presses the save button.

Since selectonechoice stores only the index value, the value that is stored will point to the index value within the selectonechoice. for e.g if the user select’s choice ‘Third Option in the list'(underlying SubCategory as ‘THIRD_VALUE’) then the value for deliverTrigger will store as 2 as the index starts from 0.

So how to map this to the correct selection?.

Have an actionlistner for the save button and have the following code that computes the correct selection for the select one choice

What this method does:

  • Get the iterator binding corresponding to the iterator name passed through ‘iteratorName’, in our case this will be ‘DeliveryTriggerTypeIterator’
  • Get the Row corresponding to the index passed , this will be ‘deliveryTrigger’ which holds the index value of the selectonechoice
  • Get the ‘SubCategory’ value from the corresponding row and return it.

private String getListValueFromIndex(int index, String iteratorName) {
BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry()

DCIteratorBinding dciterContainer =
(DCIteratorBinding)bindings.get(iteratorName);

Row ri = dciterContainer.getRowAtRangeIndex(index);
String val = (String)ri.getAttribute("SubCategory");
return val;
}

The value returned will have the underlying subCategory value(‘THIRD_VALUE’) corresponding to the value selected in the UI as ”Third Option in the list”. Then the value can be saved to the ‘Captrgtyp’ column of the DB for ‘DeliveryRuleView’

Edit Operation

During the Edit operation of the record, we have to fetch the corresponding value for the selected record and populate for ‘Captrgtyp’ attribute in the selectonechoice.

What this method does:

  • The currentRow and the ‘Captrgtyp’ is passed as attribName to the method
  • Get the iterator binding corresponding to the iterator name passed through ‘iteratorName’, in our case this will be ‘DeliveryTriggerTypeIterator’
  • Get the RowSetIterator from the iiterator binding
  • Iterate over the record and check if the value is equal to the value of the ‘SubCategory’ from the rowSetIterator
  • If it’s equlal then save the index value to a variable ‘i’
  • Finally return the value ‘i’ which corresponds to corresct value in the selectonechoice

private Integer getListValueIndex(Row row, String iteratorName, String attribName) {
int i = 0;
BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry()

DCIteratorBinding dciterContainer =
(DCIteratorBinding)bindings.get(iteratorName);

RowSetIterator rs = dciterContainer.getRowSetIterator();
Row ri = rs.first();
for(int index = 0;index < rs.getRowCount(); index ++){
String temp = (String)ri.getAttribute("SubCategory");
String ar = (String)row.getAttribute(attribName);
if(ar != null && temp.equals(ar.toString().trim())){
i = index;
}
ri = rs.next();
}

return i;
}

How To in Jdeveloper ADF Tutorials- reset the inputText component values


Sometimes the value of the inputText component is not refreshed and the value that was previously entered will still persist within the component. To overcome this issue. we have to use the resetValue() method to reset the component value and display the components intial state

What it does:

  • Get handle to the inputText component using the JSFUtils find component method with the inputText id passed as a parameter
  • set the submitted value of the inputText as null
  • reset’s the input component value
  • refresh the component
private void resetInputText(String id) { 
RichInputText input = (RichInputText)JSFUtils.findComponentInRoot(id); 
input.setSubmittedValue(null); 
input.resetValue(); 
AdfFacesContext.getCurrentInstance().addPartialTarget(input); 
}

Usage:

This method is used to reset the inputText component value’s in a popup, af:formlayout, af:table.