Skip to main content

ADF Exact custom filters

Step 1)
Add your custom filter to the column filter facet.
  <f:facet name="filter">
    <af:selectBooleanCheckbox value="#{backingBean.customfilter}"         id="id99"/>
  </f:facet>

Step 2) Create the getters and setters in your backing bean
    public Boolean getCustomfilter(){
        Boolean returnobj = null;
        Object filterValue = super.getFilterValue("AttributeName");
        if (filterValue != null){
            returnobj = ("Y".equalsIgnoreCase(filterValue.toString())) ? Boolean.TRUE : Boolean.FALSE;
        }
        return returnobj;
    }
 
    public void setCustomfilter(Boolean deletefilter){
        String value = filter == null ? null : (deletefilter) ? "Y" : "N";
        super.setFilterValue(value, "AttributeName");
    }

NOTE: Dates

Filtered Dates with timestamps in ADF dont work very nicely if you just want to filter by date. So your can modify the date filters as above and here is some code to help with the process. (Note you will need to override the queryListener)
just call this from your listener.

ArrayList fieldNames = new ArrayList();
fieldNames.add("DateAttr");
queryWithDateFilter(
queryEvent, vo, "#{bindings.CustomVOQuery.processQuery}", fieldNames);


public void queryWithDateFilter(
  QueryEvent queryEvent, ViewObject vo, 
  String mappedQueryEL, List fieldNames){

  FilterableQueryDescriptor fqd = 
    (FilterableQueryDescriptor)queryEvent.getDescriptor();
  Map map = fqd.getFilterCriteria();

  if (fieldNames != null){
    Map selectedValues = getSelectedValues(fieldNames, map);
    StringBuilder whereClauseSql = new StringBuilder();
    for (String fieldKey : fieldNames){
      String filterKey = "dateFilter_" + fieldKey;
      Object selectedValue = selectedValues.get(fieldKey);
      if (selectedValue != null){
        fqd.getFilterCriteria().put(fieldKey, null);
        AttributeDef def = getAttributeDefForKeyName(vo, fieldKey);
        whereClauseSql.append(
          "TRUNC(" + def.getColumnNameForQuery() + ", 'DDD') = :" + filterKey);
        vo.defineNamedWhereClauseParam(filterKey, convertDate(selectedValue), null);
        vo.ensureVariableManager().setVariableValue(
          filterKey, convertDate(selectedValue));
      } else {
        if (hasParam(filterKey, vo.getNamedWhereClauseParams())){
        vo.removeNamedWhereClauseParam(filterKey);
      }
     }
   }
   if (whereClauseSql.length() > 0){
     vo.setWhereClause(whereClauseSql.toString());
    } else {
      vo.setWhereClause(whereClause);
    }
    JSFUtils.invokeMethodExpression(
      mappedQueryEL, Object.class, QueryEvent.class, queryEvent);
    for (String fieldKey : fieldNames){
      Object selectedValue = selectedValues.get(fieldKey);
      fqd.getFilterCriteria().put(fieldKey, selectedValue);
    }
  } else {
    JSFUtils.invokeMethodExpression(
      mappedQueryEL, Object.class, QueryEvent.class, queryEvent);
  }
}

protected Map getSelectedValues(
  List fieldNames, Map mapValues){
  Map returnMap = new HashMap();
  Set set = mapValues.keySet();
  for (String key : set){
    if (fieldNames.contains(key)){
      returnMap.put(key, mapValues.get(key));
    }
  }
  return returnMap;
}

private Object convertDate(Object selectedValue){
   if (selectedValue != null && selectedValue instanceof java.util.Date){
     java.util.Date dateValue = (java.util.Date)selectedValue;
     return new Date(new java.sql.Date(dateValue.getTime()));
   } else {
    return selectedValue;
  }
}

protected AttributeDef getAttributeDefForKeyName(
  ViewObject vo, String fieldKey){
  AttributeDef def = null;
  AttributeDef[] defs = vo.getAttributeDefs();
  if (defs != null){
    for (AttributeDef currentDef : defs){
      if (currentDef.getName().equalsIgnoreCase(fieldKey)){
        return currentDef;
      }
    }
  }
  return def;
}

Comments

Popular posts from this blog

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...]

JBO-25013: TooManyObjectsException

oracle.jbo.TooManyObjectsException: JBO-25013: Too many objects match the primary key oracle.jbo.Key[Key null ]. Ok so for you it may be trying to insert a duplicate record this should explain your problem (also check trigger they could be the cause.) NOTE: You can also try to create a new duplicate EO if you have a page with two VO's using the same EO. This could sort your problems. For me I needed to add a launch listener on my LOV and clear the cache of my vo. LOV <af:inputListOfValues id="NameId" popupTitle="#{bindings.Name.hints.label}" value="#{bindings.RolName1.inputValue}" label="#{bindings.RolName1.hints.label}" model="#{bindings.RolName1.listOfValuesModel}" required="#{bindings.RolName1.hints.mandatory}" columns="#{bindings.RolName1.hints.displayWidth}" shortDesc="#{bindings.RolName1.hints.tooltip}" launchPopupListener="#{backingBeanScope.backingBean.launchPop...

ADF Encountered deferred syntax #{ in template text.

OracleJSP error: oracle.jsp.parse.JspParseException:  Error: Encountered deferred syntax #{ in template text.  If intended as a literal, escape it or set directive  deferredSyntaxAllowedAsLiteral This normally happens when you have some tag lib dependancy problems but this was  not the case for me... My problem: For some reason my model project had web stuff in it(public html etc)  so I had to remove the public html stuff from my project and manually edit the Model.jpr project file and remove the tag lib entries at the bottom o the file. Go figure.