![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Иерархические запросы
Елена © (2006-03-09 09:25:00)день добрый. Столкнулась со следующей проблемой - храние документов произвольной структуры в бд.
Значит так - есть документ, есть абзацы у него, у этих абазцев могут быть пункты и подпункты произвольной вложенности.
структура таблички в БД
1)id
2)idDok (номер договора=1 к примеру)
3)name (текст абзаца)
4)NVP (номер вышестоящего пункта)
как распечатать документ с нумерацией? в БД следующее
1 1 ПРЕДМЕТ 0
2 1 Заказчик должен.. 1
3 1 Все работы .. 1
4 1 ТЕХ УСЛОВИЯ 0
5 1 Исполнитель вправе 4
6 1 работать 5
7 1 не работать 5
8 1 Заказчик может 4
9 1 требовать 8
Вот.. Подскажите, как распечатать эту табличку с нумерацией типа
1.ПРЕДМЕТ
1.1.Заказчик должен..
1.2.Все работы ..
2.ТЕХ УСЛОВИЯ
2.1. Исполнитель вправе
2.1.1.работать
2.1.2.не работать
2.2.Заказчик может
2.2.1. требовать
А может структуру надо как-нибудь изменить?
Буду благодарна за любые советы
paul_k (2006-03-09 14:53:00) [21]> [45] Елена (09.03.06 14:49)
Лена, тогда проще образ документа в блоб поле держать. В MsWord вызвать в нем поправить/посмотреть и обратно в базу.
Елена (2006-03-09 14:49:00) [22]для каждого пункта будут поля - цвет , шрифт, отступы, а также признак - это текст или таблица.
если таблица - то использование доп компонента advstringgridd7
человек работает с таблицей, данные из нее буду хранить в тексте, определнного формата. Затем при печати этого документа выводит таблицу, если нада
paul_k (2006-03-09 14:24:00) [23]> [43] msguns © (09.03.06 14:13)
хмм... показать? да легко.. хотя мою морду ты на фотках видел.:)
все от задачи зависит и от того что есть "документ свободного формата" в рамках оной задачи.
В некоторых задачах крайне удобно хранить в дереве куски документа. (в частности пункты, как у автора) В других задачах это верный путь в яму.
msguns (2006-03-09 14:13:00) [24]>paul_k © (09.03.06 14:07) [42]
Зачем упорно советовать итти в могилу ?
Речь идет не о структурных данных, для хранения которых предназначены БД, а о документах произвольнойформы.
Что будешь делать с договором, в котором есть таблицы или графики ? Как "объяснить" серверу БД, что в пункте 5.1.6 слева листа там, гле первый абзац, надо нарисовать картинку ? Или как "засунуть" в документ подпись или печать ? Про цвет, размер, шрифт, разметку, колонтитулы и т.д. вообще молчу.
Кто предпочтет такую БД обыкновенному ворду, влегкую справляющемуся со всем перечисленным, покажи мне такого идиота ?
paul_k (2006-03-09 14:07:00) [25]Струкртуру хранеия бесконечной влодженности кроме дерева что ещё?
Для начала, все же изучите
> http://sdm.viptop.ru/articles/sqltrees.html
Если обход сверху вниз то у листа желательно явно задать признак окончания обхода, хотя можнои признаком считать отсутствие дочерных веток.
строим курсор по корневым веткам (parent_id is null)
и начинаем обрабатывать каждую запись собирать потомков и так далее. Пока не наступим на грабли ограничение количества вложенных вызовов.
Тоже самое можно проделать и на клиенте
Далее создаем временную табличку и собираем в нее данные.
Елена (2006-03-09 13:28:00) [26]Спасибо всем ) пересмотрю структуру хранения данных
Sergey13 (2006-03-09 13:26:00) [27]2[38] Елена (09.03.06 13:16)
Лена, таким способом с иерархией не работают. Это было бы слишком просто.
Рекомендую почитать про деревья в БД. Можно найти на http://ibase.ru/develop.htm
То, что это на сайте про ИнтерБейс - не важно. Суть важна.
msguns (2006-03-09 13:20:00) [28]>Елена (09.03.06 13:16) [38]
Флаг в руки.
Извиняйте, если что не так ;)
Елена (2006-03-09 13:16:00) [29]типа так
ADOSQL.Active:=false;
ADOSQL.SQL.Clear;
s1:='select * from Dokuments where NDog=1';
// получаю все пункты, абзацы и прочую херь документа 1
ADOSQL.SQL.Add(s1);
ADOSQL.Active:=True;
SetLength(MT,ADOSQL.RecordCount+1);
j:=1;
while not (ADOSQL.Eof) do
begin
MT[j].Name:=trim(ADOSQL.FieldValues['Name']); //текст пункта
MT[j].NVU:=ADOSQL.FieldValues['NVP']; // номер вышестоящего пункта
MT[j].id:=ADOSQL.FieldValues['id']; //id пункта в таблице
inc(j);
ADOSQL.Next;
end;
Sergey13 (2006-03-09 13:16:00) [30]2[33] msguns © (09.03.06 13:03)
>Только вот гемора не оберется.
Вот это правда. Я с самого начала предлагал ей отказаться от "кусковщины". Есть документ - и хранить надо документ. Иначе (кстати) надо еще следить за подлинностью всех кусочков этого документа.
Sergey13 (2006-03-09 13:12:00) [31]2[34] Елена (09.03.06 13:05)
>так. скриптом по номеру документа получаю массив,состоящий из
Каким скриптом?
msguns (2006-03-09 13:06:00) [32]>Елена (09.03.06 12:26) [25]
>понятно , ртфм
http://html.manual.ru
Елена (2006-03-09 13:05:00) [33]так. скриптом по номеру документа получаю массив,состоящий из
1) id пункта
2)наименования пункта
3) номера вышестоящего пункта
и как мне из массива вывести, в этож мемо, пункты по порядку?
1.ПРЕДМЕТ
1.1.Заказчик должен..
1.2.Все работы ..
2.ТЕХ УСЛОВИЯ
2.1. Исполнитель вправе
2.1.1.работать
2.1.2.не работать
2.2.Заказчик может
2.2.1. требовать
msguns (2006-03-09 13:03:00) [34]>Sergey13 © (09.03.06 12:57) [32]
>А речь уже однозначно про "хатмель"?
Ну почему же однозначно ? Это просто я советую делать через него, ибо он для этого (в т.числе) и был придуман.
Если же Алена предпочитает придумаьб себе проблему, а затем ее преодолевать с разной степенью успешности, то, как говорится, Бог в помощь.
Только вот гемора не оберется. При структурных правках в достаточно иерархически сложных документах будут "фокусы-покусы". Кроме того, в БД достаточно сложно реализовать ссылки, множественное использование одних и тех же кусков текста, контекстный поиск, будут проблемы с картинками, шрифтами и т.д.
Короче-муть голубая.
Sergey13 (2006-03-09 12:57:00) [35]2[31] msguns © (09.03.06 12:52)
>Ссылками. Нумерация идет автоматически. Или ты совсем не знаком с хатмелем ?
А речь уже однозначно про "хатмель"? Тогда я умываю руки, ибо не знаю его совсем. Я думал данные еще в БД. А там, что бы получить упорядоченный список, надо сортировать по какому то признаку. Признак последовательности кусков текста я знаю один - номер этого куска.
msguns (2006-03-09 12:52:00) [36]>Sergey13 © (09.03.06 12:32) [26]
>Я рад, что тебе понравилось. 8-)
Я рад, что ты рад ;))
>Если не понравилось (ну вдруг) и это сарказм - объясни мне, как сортировать пункты одного уровня без сохраненной нумерации?
Ссылками. Нумерация идет автоматически. Или ты совсем не знаком с хатмелем ?
Елена (2006-03-09 12:51:00) [37]РАскрывая дерево вниз..кажется..
я привела пример в самом начале - пример конечного результата
сижу, вспоминаю ,как с деревьями работать. Пока вспоминается плохо
paul_k (2006-03-09 12:49:00) [38]Если правильно понял вопрос речь идет о том как собрать номер поднимаясь вверх по дереву?
или наоборот, раскрывая дерево вниз?
Собирать надо из номеров каждой ветки?
Насколько мои знания позволяют судить, в mssql без цикла не обойдешься.
как организовывать обход дерева написано много где. Например по приведенной выше ссылке
собирать лучше не только номер, но и "соритровочный номер" предназначенный для сортировки результата. к примеру
00002.00022.00001
00005.00002.00001
00007.00022.00001
и складывать потом все во временную табличку, из которой все отдается наружу при помощи банального order by по "сортировочному номеру"
Sergey13 (2006-03-09 12:48:00) [39]2[27] Елена (09.03.06 12:46)
Я не работал с мелко-мягким сервером. Но насколько знаю, там нет иерархоческих запросов, значит надо делать рекурсивную ХП. Что мешает, при выборке выдавать номер?
Елена (2006-03-09 12:46:00) [40]не могу сообразить, как проставить номера ) мож просто торможу