Построить дерево hGrid с определенного элемента можно с помощью метода OAHGridBean.setInitialFocusPath(intArr), где intArr - массив элементов типа int. Как его, массив, формировать?
Адресация элементов в hGrid подчиняется изображенной ниже схеме:
Самое интересное в шаге 2. Ниже приведен пример иерархического запроса на демо-данных, который формирует то, что нам нужно. Создадим таблицу и заполним данными (иерархия высшего руководства компании):
Адресация элементов в hGrid подчиняется изображенной ниже схеме:
Таким образом, чтобы перейти на второй элемент уровня 2, нужно передать методу массив {1, 0, 1}. Для перехода на произвольную страницу с автоматической фокусировкой на нужный элемент hGrid, нужно:
- передать ID элемента как параметр на страницу;
- по ID получить последовательность (индекс) элемента в hGrid;
- распарсить индекс, получить массив типа int;
- вызвать 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 компании.
Комментариев нет :
Отправить комментарий