Identifying Modified/newely added row in af:table, get all modified rows of viewobject in bean

Sharing is Caring

Hello All,
First of all, a very Happy new year to everyone, learn more and more ADF. This tutorial is about a requirement of showing modified rows in af:table on the page.

Suppose if there is lot of data in af:table and user is modifying some rows then it must reflected immediately on page that which rows are modified for more clarity

Andrejus has also posted about it in 2010
http://andrejusb.blogspot.in/2010/04/changed-row-highlighting-in-oracle-adf.html

But this post talks about two requirements-

  1. Want to highlight modified rows only on page
  2. Want to get modified rows in managed bean

First One could be achieved without writing a single line of code only using expression, a row in table or view object has four state-

  • New
  • Modified
  • Un-Modified
  • Initialized

/* this expression returns state of current row in collection such as table or treeTable*/
#{row.row.entities[0].entityState}

/*here row is reference variable of collection, this expression returns an int value if it is 
 2-Modified
 0-New
 1-Unmodified
-1-Initialized
*/

 

    • I’m using Departments table of HR Schema to implement this sample app
    • after business components configuration, Drop departments VO from data control on the page as af:table
    • Now to check row status , i have written following expression in the inline style of af:column of af:table, so that it can check the state of all rows of the table

#{row.row.entities[0].entityState==2 ? 'background-color:orange' : row.row.entities[0].entityState==0 ? 'background-color:darkgreen' : ''}

 

  • Now Run your page and change any value of the table

After Updating Values in Row- see modified rows are highlighted

    •  Now you are done with the first requirement , if we talk about the second one, in case you want to get all modified rows in the managed bean to perform some operation
    • To achieve this i have used a transient attribute in Departments view Object to store the state of each row
    • Now in RowImpl of departments viewobject, I have to write some code to get the current state of Row, see the getter method of the transient attribute in RowImpl

    /**
     * Gets the attribute value for the calculated attribute CheckRowStatus.
     * @return the CheckRowStatus
     */
    public Integer getCheckRowStatus() {
        byte entityState = this.getEntity(0).getEntityState();
        return new Integer(entityState);

        // return (Integer) getAttributeInternal(CHECKROWSTATUS);
    }

 

    • Now I have placed a button on the page to get all modified rows and show a message on the page through a managed bean
    • See the method written in ApplicationModuleImpl class and then exposed to the client to be used in managed bean action event

    /**Method to get all modified rows and store corresponding Department Name in an ArrayList
     * @return
     */
    public ArrayList<String> getModifiedRows() {
        ArrayList<String> deptNm = new ArrayList<String>();
        ViewObject deptVo = this.getDepartmentsView1();
        RowSetIterator deptIter = deptVo.createRowSetIterator(null);
        while (deptIter.hasNext()) {
            Row nextRow = deptIter.next();
            if (nextRow.getAttribute("CheckRowStatus") != null) {
                Integer rowStatus = (Integer)nextRow.getAttribute("CheckRowStatus");
                if (rowStatus == 2) {
                    deptNm.add(nextRow.getAttribute("DepartmentName").toString());
                }
            }
        }
        return deptNm;

    }

 

    • Now call this method in managed bean through Binding Layer

    /**Method to get BindingContainer of current page
     * @return
     */
    public BindingContainer getBindings() {
        return BindingContext.getCurrent().getCurrentBindingsEntry();
    }

    /**Method to call AM method and to show modified rows on page in FacesMessage
 * @param actionEvent
 */
    public void getModifiedRows(ActionEvent actionEvent) {
OperationBinding ob = getBindings().getOperationBinding("getModifiedRows");
ob.execute();
        if (ob.getResult() != null) {
ArrayList<String> deptName = (ArrayList<String>)ob.getResult();
StringBuilder saveMsg =
                new StringBuilder("<html><body><b><p style='color:red'>Modified Rows in Departments table are-</p></b>");

saveMsg.append("<ul>");
            for (String name : deptName) {
System.out.println(name);
saveMsg.append("<li> <b>" + name + "</b></li>");
            }

saveMsg.append("</ul><br>");
saveMsg.append("</body></html>");
FacesMessage msg = new FacesMessage(saveMsg.toString());
FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

 

  • Now again run this page and change some departments then click on get modified rows, it will show currently modified rows
af:table

 

Sample ADF Application- Download

Cheers 🙂 Happy Learning

Related Posts

I’m an Oracle ACE, Blogger, Reviewer,
Technical Lead working on Oracle ADF

0 thoughts on “Identifying Modified/newely added row in af:table, get all modified rows of viewobject in bean”

Leave a Reply

Your email address will not be published. Required fields are marked *