Форум: "Базы";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизСортировка иерархических данных Найти похожие ветки
← →
Макс (2002-11-20 12:55) [0]Есть таблица в которой хранятся иерархические данные, без зацикливаний, попросту говоря дерево. Структура таблицы примерно следующая
ID - идентификатор
N_Data - номер пункта в разделе (1,2,3,....n)
Data - что то там...
Parent_Id - ссылка на идентификатор старшего раздела
В процессе работы приложения требуется построить отчет, для чего нужно отсортировать эти данные по порядку, т.е.
1. Первый пункт
1.1. Первый подпункт первого пункта
1.1.1. ------------------
1.1.2. ------------------
1.2. Второй подпункт --------
1.3. Третий подпункт --------
2. Второй пункт
и т.д.
вот тут-то и возникает вопрос как это сделать. Я думаю для такого случая есть определенные алгоритмы работы. Если у кого есть предложения и/или готовые алгоритмы поделитесь, буду очень признателен...
Заранее всем спасибо
← →
Карелин Артем (2002-11-20 13:08) [1]Да запросто. Сначала определимся с предельным уровнем вложенности. Скажем 5 - заводим 5 переменных типа кверя. У меня IbКверь. Не важно.
Далее идет цикл. Первый кверь выбирает всех самых первых родителей Parent_id=0.
Внутри него идет второй цикл. Там уже выбор тех, у которых Parent_id=id первого кверя. И так все вкладывается.
Недостаток: ограничена глубина дерева.
Эт на пальцах, а дома есть конкретный пример на 2 уровня по той же схеме.
← →
Макс (2002-11-20 13:28) [2]Не совсем понял технологию, вероятно я дал не полную информацию...
Я пользуюсь генератором отчетов FastReport, ему на вход нужно подaть отсортированные данные из dataset-а, соответственно сортировку производить средствами сервера... скорее всего это должна быть какая нить хранимая процедура. Вот в написании этой процедуры у меня и возникли проблемы. Может быть я пошел по неверному пути.
Из вышеприведенного примера надо отсортированные данные как то передать в генератор отчетов, а это не совсем ясно...
← →
Наталия (2002-11-20 13:30) [3]У меня на сервере написана рекурсивная функция,
FUNCTION ROOT_PODRAZD ( p_dept_id IN number,p_id in number)
RETURN varchar2 IS
x_dept_id number;
x_id number;
x_s varchar2(255);
BEGIN
x_dept_id:=nvl(p_dept_id,0);
x_id:=p_id;
x_s:=lpad(to_char(x_dept_id),6,"0")||lpad(to_char(x_id),6,"0");
loop
select nvl(par_id,0),id into x_dept_id,x_id
from podrazd
where id=x_dept_id;
x_s:=lpad(to_char(x_dept_id),6,"0")||x_s;
end loop;
RETURN x_s ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
return x_s ;
END;
которая возвращает набор данных в виде
001000000
001001000
001001001 - т.е. это и есть сложносоставной номер, по которому затем произвожу сортировку.
Это для Oracle, но, думаю, идея понятна
← →
Карелин Артем (2002-11-20 13:34) [4]То же самое, но в хранимой процедуре.
FOR SELECT WID,WNAME,W_AID FROM .. where parent=0 INTO :WID,:WNAME,:W_AID, ....
DO
FOR SELECT ... where wid=:parent ....
DO
for select ...
BEGIN
SUSPEND;
END
END
И так до опупения. Это должно работать в интербазе.
← →
Макс (2002-11-20 13:45) [5]Только у меня не IB а MSSQL, там Transact SQL не сильно разгуляешся :-(
а за помощь СПАСИБО, буду разбираться
← →
NeyroSpace (2002-11-20 14:16) [6]http://ibase.ru/develop.htm
Прочее:
Как блокировать записи, Александр Невский
решение проблемы обрыва коннекта в IBX, Влад Филиппов и TreeDHead
решение проблемы обрыва коннекта в IBX, Иван Равин.
ООП в РСУБД, Владимир Котляревский.
Обновление клиентских наборов данных. Плотников Юрий.
SQL. С самого начала. Алексей Лукин
Естественные ключи против искуственных ключей. Анатолий Тенцер.
Ключ или отмычка. Александр Усов.
Представление объектов в реляционных базах данных (eng). Scott W. Ambler.
Распределение данных по разным базам данных из Delphi
Древовидные (иерархические) структуры данных в реляционных базах данных, часть 1
Незаконченная 2-я часть статьи "Древовидные..."
"Registry" в базе данных
Комментарий к статье "Древовидные ..."
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c