Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

Сортировка иерархических данных   Найти похожие ветки 

 
Макс ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
7-28318
netm
2002-10-09 22:34
2002.12.09
Как добавить путь к своей программе в Win2k?


7-28325
Tony'c
2002-09-28 19:59
2002.12.09
Как программно включить удалённый компутер


1-27917
Manulo
2002-11-28 18:34
2002.12.09
Работа с textfile


14-28195
Волков
2002-11-16 11:53
2002.12.09
Помогите найти ответы на вопросы по Операционным системам


1-28087
Dr. Web
2002-11-28 11:20
2002.12.09
исходники компонентов Dream Scripter и Dream controls для Delphi6