понедельник, 5 августа 2013 г.

16й - практикум. Oracle ADF. JDeveloper 12c - RowFinder



Вышел JDeveloper 12c . По мере  изучения, возможно, сделаю несколько постов на тему новых возможностей. В этой статье посмотрим на новую возможность поиска записей «RowFinder». Создается он для ViewObject, на базе существующего ViewCriteria. И служит для того чтобы выполнять поиски-фильтровки данных основанных на ViewCriteria, но не затрагивая существующий набор данных, не меняя текущей записи и состава набора данных.   

Схема HR на Oracle XE.
Настраивается RowFinder на вкладке VO.

Таким образом можно сделать несколько поисков для различных ViewCriteria и вызывать их.
Работу с RowFinder можно вести из BC API, вот основной код.


 // 1. Find the view object with the row finder
      ViewObjectImpl vo = (ViewObjectImpl)am.findViewObject("View1");
      Row r;
      RowIterator ri;

      // 2. Find the row finder
      RowFinder finder = vo.lookupRowFinder("FinderName");
      // 3. Create name value pair for the row finder
      NameValuePairs nvp = new NameValuePairs();
      // 4. Set the row finder mapped attribute
      nvp.setAttribute("AttributeName", "value");
      // 5. Invoke the row finder
         ri = finder.execute(nvp, vo);
      while (ri.hasNext())
      {
        r = ri.next();
        r.getAttribute("Name");
      }


Я покажу пример использования  RowFinder для максимальной и минимальной з.п. сотрудников. Для VO EmployeesView создадим два соответствующих transient атрибута SalaryMin и SalaryMax. В EmployeesViewRowImpl классе выполним их вычисление 


    public BigDecimal getSalaryMin() {
        return getSalary(false);
        //return (String)getAttributeInternal(SALARYMIN);
    }

    public BigDecimal getSalaryMax() {
        return getSalary(true);
        //return (String)getAttributeInternal(SALARYMAX);
    }

    public BigDecimal getSalary(boolean isMax) {
        ViewObjectImpl vo = (ViewObjectImpl)getViewObject();
        Row r;
        RowIterator ri;

        RowFinder finder = vo.lookupRowFinder("RowDepartFinder");
        // Create name value pair for the row finder
        NameValuePairs nvp = new NameValuePairs();
        // Set the row finder mapped attribute
        nvp.setAttribute("DepartmentId", getDepartmentId());
        BigDecimal result = BigDecimal.valueOf(0);
        // Invoke the row finder
        try {
            ri = finder.execute(nvp, vo);
            while (ri.hasNext()) {
                r = ri.next();
                if(!isMax && result.intValue()==0){
                    result =  (BigDecimal)r.getAttribute("Salary");
                }
                if (isMax) {
                    if (((BigDecimal)r.getAttribute("Salary")).compareTo(result) > 0) {
                        result = (BigDecimal)r.getAttribute("Salary");
                    }
                }
                else {
                    if (((BigDecimal)r.getAttribute("Salary")).compareTo(result) < 0) {
                        result = (BigDecimal)r.getAttribute("Salary");
                    }                    
                }
            }
        }
  
Результат работы 

 
Функционал  RowFinder может быть полезен например, для того чтобы понять наличие/отсутствие записи какого-то типа в наборе данных. Ранее это делал примерно так:

RowIterator itr =
      vo.findByViewCriteria(vc, -1, ViewObject.QUERY_MODE_SCAN_DATABASE_TABLES);
while (itr.hasNext())
    {




Источник
Working with Row Finders

P.S.
Для запуска интегрированного WLS пришлось прописать в setDomainEnv.cmd, настройки NLS «set JAVA_OPTIONS=%JAVA_OPTIONS% -Duser.region=us -Duser.language=en».
В процессе небольшого дизайна, заметил неадекватную реакцию дизайна страницы, на изменение свойств в инспекторе, приходилось нажимать F5 страницы, сильно расстроило. 


Комментариев нет:

Отправить комментарий