Построить дерево 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 компании.
Комментариев нет :
Отправить комментарий