Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Иерархические запросы


Страницы:   1 2 3 4

Елена ©   (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]

не могу сообразить, как проставить номера ) мож просто торможу


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо