Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
4-28332
Renat
2002-10-23 16:55
2002.12.09
С помощью какой API - функции можно вызвать из моей программы..


3-27839
alcat
2002-11-20 17:08
2002.12.09
Хочется в 20 раз быстрее......


1-28039
Ag2002
2002-11-30 11:25
2002.12.09
двухсвязные списки


3-27828
Виталий Викторович Яничкин
2002-11-14 21:01
2002.12.09
отлавливание событий InterBase


1-28107
D_V_I
2002-11-28 13:15
2002.12.09
MoveTo, Pen.Color и LineTo слишком медленные, надо быстрее





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский