Skip to main content

ADF: Revert only changes to one View Object (mini rollback)

JDeveloper 11.1.2.1

I really struggled to get this working so hopefully this helps someone out:
I needed to just rollback the changes on a single vo backed popup and not the parent object so this is what I did. (not the pk for this view was rowid based and normal methods to do this just refused to work)
Also I failed to mention it is a multi line editable table.

NOTE: Performance was not an issue here.

Phase 1) Parent VO Impl
  We have a parent object for all our View Objects so I implemented this method there.

 public void clearAllCache() {
  //dont ask
  ViewRowSetImpl drsi = super.getDefaultRowSetInternal();
  while(drsi.hasNext()) {
    Row item = drsi.next();
  }

  Iterator iter = super.getEntityDef(0).getAllEntityInstancesIterator(this.getDBTransaction());
  while(iter.hasNext()) {
    EntityImpl entityItem = (EntityImpl) iter.next();
    if(entityItem.getEntityState() == EntityImpl.STATUS_NEW ||
      entityItem.getEntityState() == EntityImpl.STATUS_DELETED) {
      entityItem.refresh(EntityImpl.REFRESH_REMOVE_NEW_ROWS | 
  EntityImpl.REFRESH_UNDO_CHANGES);
    }
  }
  getViewObject().clearCache();
}

Phase 2) AM (implement this method and map it as a client interface)
 public void rollbackVO(String iteratorName) {
    DCIteratorBinding iterator = ((DCBindingContainer)   
      BindingContext.getCurrent().getCurrentBindingsEntry()).
      findIteratorBinding(iteratorName);

  ViewObject vo = iterator.getViewObject();
  if(vo instanceof WesbankVOImpl) {
    ((WesbankVOImpl) vo).clearAllCache();
  }
 }

Phase 3) Backing bean method (mapped to close popup button - all our popups work the same way and the backing bean holds the current popup iterator name)
public String resetPopup() {
  Map params = new HashMap();
  params.put("iteratorName", getCurrentPopupIteratorName());
  ADFUtils.executeOperationBindingWithoutException("rollbackVO", params);
  AdfFacesContext.getCurrentInstance().returnFromDialog(null, null);
  return null;

Phase 4) Page
Bind a method action to your page for the rollbackVO method

This still needs to be cleaned up (ie the getEntityDef(0) wont work everywhere).

Comments

Popular posts from this blog

ADF sort of generic screen for tables with the same structure

We have a couple (about a hundred) of tables with the same structure (Code, Description, Create Date, Update Date). So I wanted to do something simple so that I did not have to create all these screens 1) EO   I created the EO based on one of the tables I had that had the above columns. I then Added a transient attribute called table name to my EO based on a groovy expression. (the expression needs to change as I am reading web tier stuff from the model layer but I will fix this later) I then generated a java class for my EO. And added the following overriden method to my newly created java class. protected StringBuffer buildDMLStatement(int i, AttributeDefImpl[] attributeDefImpl,   AttributeDefImpl[] attributeDefImpl2, AttributeDefImpl[] attributeDefImpl3, boolean b) {   StringBuffer statement = super.buildDMLStatement(   i, attributeDefImpl, attributeDefImpl2, attributeDefImpl3, b); return new StringBuffer(StringUtils.replace(statement.to...

MANIFEST.MF merge JDeveloper for an executable jar

Goto your project > properties. Then click on deployment in the menu. Edit or add a jar deployment profile. Fill in the details under jar options (select Include manifest and give it a main class name) Also remember that the merge functionality only works with a BLANK line at the end of the merge file. REALLY this caught me. My merge file contents: Class-Path: commons-codec-1.3.jar [...empty line here CRLF...]

ADF: LOV Description instead of code

I keep on forgetting how to do this so this is a note to self in terms I understand (ie pictures): Add the related entiy object to yours (in the example we are adding RegionEO(list of values) to CountryEO) Now add the RegionName field from the EO and a transient attribute (I named mine RegionNameLOV) Make the transient attribute updateable and base it on the expression RegionName (the description you wish to display) Add a list of values to RegionNameLOV and map BOTH key to parent fk (region id here) AND RegionName to your transient coulmn (RegionNameLOV).  Map the transient as an Input text with List of Values. Then just drag the lov item onto the page (RegionNameLOV)