17.01.2013

Адресация на элементы дерева hGrid

Построить дерево hGrid с определенного элемента можно с помощью метода OAHGridBean.setInitialFocusPath(intArr), где intArr - массив элементов типа int. Как его, массив, формировать?
Адресация элементов в hGrid подчиняется изображенной ниже схеме:


Таким образом, чтобы перейти на второй элемент уровня 2, нужно передать методу массив {1, 0, 1}. Для перехода на произвольную страницу с автоматической фокусировкой на нужный элемент hGrid, нужно:
  1. передать ID элемента как параметр на страницу;
  2. по ID получить последовательность (индекс) элемента в hGrid;
  3. распарсить индекс, получить массив типа int;
  4. вызвать setInitialFocusPath с полученным массивом в качестве параметра.
Шаги 1,3,4:
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
  if (pageContext.getParameter("nodeId") != null)  { 
      String focusedNodeID =  pageContext.getParameter("nodeId");
      Number nCommentID = new Number (Integer.parseInt(focusedCommentID));
      Serializable[] methodParams = { nCommentID };
      Class[] methodParamTypes = { Number.class };
      // получает адрес
      String focusedCommentPath = (String) 
      am.invokeMethod("getCommentPath", methodParams, methodParamTypes);
      if (focusedCommentPath != "") {
       OAHGridBean hGrid = (OAHGridBean)
           webBean.findIndexedChildRecursive("Grid");
       String[] sArr = focusedCommentPath.split(",");
       int[] intArr = new int[sArr.length];
       for(int i=0; i<sArr.length; i++)
         intArr[i] = Integer.parseInt(sArr[i]);
       hGrid.setInitialFocusPath(intArr); 
      }
  }

Самое интересное в шаге 2. Ниже приведен пример иерархического запроса на демо-данных, который формирует то, что нам нужно. Создадим таблицу и заполним данными (иерархия высшего руководства компании):
-- создаем таблицу emp
create table emp(
    id number,
    parent_id  number,
    name varchar2(50)
)

-- заполняем демо-данными
insert into emp values (1, null, 'John Smith');
insert into emp values (2, 1, 'Tom Burn');
insert into emp values (3, 1, 'Jack Welch');
insert into emp values (4, 2, 'Fred Brauden');
insert into emp values (5, 2, 'Greg Matt');
insert into emp values (6, 5, 'Mike Class');
insert into emp values (7, 1, 'Colin Nedder');
Запрос:
select emp_name, 1 || SYS_CONNECT_BY_PATH(row_n - 1, ',') n_path
 from (select rn,
              emp_name,
              id,
              parent_id,
              row_number() over(partition by parent_id order by rn) row_n
          from (select rownum rn,
                       rpad('-', level, '-') || ' ' || e.name emp_name,
                       id,
                       parent_id
                  from emp e
                connect by prior e.id = e.parent_id
                 start with e.parent_id is null)
        connect by prior id = parent_id
         start with parent_id is null)
connect by prior id = parent_id
 start with parent_id is null
Результат:
EMP_NAME         N_PATH
--------------------------------------------------------------------------
- John Smith     1,0
-- Tom Burn      1,0,0
--- Fred Brauden 1,0,0,0
--- Greg Matt    1,0,0,1
---- Mike Class  1,0,0,1,0
-- Jack Welch    1,0,1
-- Colin Nedder  1,0,2
Функция SYS_CONNECT_BY_PATH возвращает путь от корня до элемента, состоящий из индексов промежуточных элементов, разделенных произвольным символом. "1 ||" - заданный нами по умолчанию индекс куста. В контексте нашей задачи это может быть, например, ID компании.

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