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

Вниз

Иерархические запросы   Найти похожие ветки 

 
Елена   (2006-03-09 09:25) [0]

день добрый. Столкнулась со следующей проблемой - храние  документов  произвольной структуры в бд.
Значит так - есть документ, есть абзацы у него,  у этих абазцев могут быть пункты и подпункты произвольной вложенности.
структура таблички в БД
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. требовать          

А может структуру надо как-нибудь изменить?
Буду благодарна за любые советы


 
Елена   (2006-03-09 09:25) [1]

упс. забыла - работаю в Делфи-7,бд - мсскл 2000


 
Sergey13 ©   (2006-03-09 09:30) [2]

2Елена   (09.03.06 09:25)
А эти пункты/подпункты имеют какое-то самостоятельное значение для системы? Модет просто какой-нить DOC или RTF хранить в BLOB-е.


 
Елена   (2006-03-09 09:34) [3]

этот первый документ выступает в качестве шаблона для остальных документов.Не совсем поняла  - как это, самостоятельное значение?


 
Sergey13 ©   (2006-03-09 09:37) [4]

2[3] Елена   (09.03.06 09:34)
>Не совсем поняла  - как это, самостоятельное значение?
Ну типа например кто-то может работать только с каким-то конкретным пунктом, а другие недоступны. Т.е. есть ли смысл вообще придумывать струтуру для хранения?


 
Елена   (2006-03-09 09:42) [5]

тэк-с. Сама работа  с документом  будет заключатся в следующем - заводят новый документ, выбирают какие абзацы   будут в него входить, какие нет, какие  пунты абзацев, добавляют новые абзацы или пункты..
и соответственно его распечатывают.


 
Елена   (2006-03-09 09:43) [6]

такую структуру - стоит, т.к вложенность пунктов идет, и надо знать, какой пункт к чему относится. А какую стуктуру вы можеет предложить?


 
Sergey13 ©   (2006-03-09 10:10) [7]

2[5] Елена   (09.03.06 09:42)
И некий произвольный подпункт одного документа полностью идентичен такому же в другом документе? На 100%? Тогда какой смысл хранить их в разных местах?
Тогда, ИМХО, целесообразно завести 3 таблицы. Первая - перечень пунктов, вторая документы,  и третья  - собственно состав документа со своей иерархией и ссылками на таблицу пунктов.

ЗЫ: И все таки я думаю, что вордовые шаблоны - это то что тебе надо.


 
Nikolay M. ©   (2006-03-09 10:15) [8]


> Вот.. Подскажите, как распечатать эту табличку с нумерацией
>
> А может структуру надо как-нибудь изменить?


Например, прочитать очень полезную статью об организации деревьев в БД. Примеры запросов там тоже есть

http://sdm.viptop.ru/articles/sqltrees.html


 
Елена   (2006-03-09 10:38) [9]


> Sergey13 ©   (09.03.06 10:10) [7]
>
> 2[5] Елена   (09.03.06 09:42)
> И некий произвольный подпункт одного документа полностью
> идентичен такому же в другом документе?

нет, не полностью. могут быть одинаковыми, а могут быть разными.


 
Sergey13 ©   (2006-03-09 10:49) [10]

2[9] Елена   (09.03.06 10:38)
> нет, не полностью. могут быть одинаковыми, а могут быть разными.
Тогда еще более не понятна потребность хранить пункты. Если там будут расхождения (хоть в одну букву) таких вариантов этих пунктов через полгода станет столько, что придется делать отдельную навигацию по ним и долго анализировать, чем один отличается от другого.
ИМХО, создать несколько врдовых шаблонов на разные типы договоров. Их можно и в БД хранить при желании для сохранности. На основании шаблона формировать новый документ, и после правки сохранять готовый в БД, одним куском в БЛОБ-е. При необходимости сохранять новый документ как новый шаблон.
Я бы так стал делать.


 
Елена   (2006-03-09 10:50) [11]

Sergey13, в моем случае таблица документов существует отдельно
Номер документа , его название  и др. атрибуты
а почему пункты надо выносить отдельно?


 
Елена   (2006-03-09 10:55) [12]

Не будет навигации по  пунктам(не нужна). Потом  сделаю поиск по  номеру или по дате документа - чтобы его повторно можно было распечатать, не  более.


 
Sergey13 ©   (2006-03-09 10:57) [13]

2 [11] Елена   (09.03.06 10:50)
>а почему пункты надо выносить отдельно?
Мне это нравится! Это я у тебя спрашиваю - зачем тебе отдельные пункты? 8-)


 
Елена   (2006-03-09 11:11) [14]

э... мне это не нравится!
Вы предоложили использовать "Тогда, ИМХО, целесообразно завести 3 таблицы. Первая - перечень пунктов, вторая документы,  и третья  - собственно состав документа со своей иерархией и ссылками на таблицу пунктов."
у меня их две - документ и состав  документа, в этот состав и входят всякие пункты\подпункты. ПОэтому и спросила.. ЗАчем?


 
Елена   (2006-03-09 11:15) [15]

Стоп, поняла предлагемую вами структуру. А как же произольная вложенность и подчиненность одного пункта другому? см что должно быть на выходе
2.1. Исполнитель вправе
2.1.1.работать                
2.1.2.не работать


 
Sergey13 ©   (2006-03-09 11:18) [16]

2[14] Елена   (09.03.06 11:11)
Мне непонятна задача.
Я предложил 3 таблицы, так как думал, что пункты везде идентичны, и достаточно хранить ссылки на них, а не сами тексты. Если они хоть немного отличаются в разных документах, тогда это не проходит. Но мне до сих пор непонятно желание хранить пункты, а не документ в целом. Если будет 1000 документов и в каждом "немного свой" пункт допустим "1.1.Заказчик должен..", то какой смысл хранить этот документ, как сборник пунктов?


 
Елена   (2006-03-09 11:25) [17]

ну варианты храниения есть..
хранение в пунктах  -один из них, который пришел в голову.
В данном случае -  основнйо вопрос не в том, как хранить, а как "красиво вывести на печать"


 
msguns ©   (2006-03-09 11:30) [18]

Может, не до конца ососзнал, но все же..
А почему нельзя все это хранить в html, "пункты" описывать отдельными файлами, а в нужные документы вставлять фрэймами. При этом вся "красота" делается легко и просто.


 
Sergey13 ©   (2006-03-09 11:32) [19]

2[17] Елена   (09.03.06 11:25)
>В данном случае -  основнйо вопрос не в том, как хранить, а как "красиво вывести на печать"
Так неправильно думать в принципе. Печать фигня, рюшечка. Главное структура.
А печатать - элементарно. Выбери все записи согласно твоей иерархии в один датасет и отправь на печать.


 
Елена   (2006-03-09 11:46) [20]

как пронумервоать, согласно иерархии..


 
Sergey13 ©   (2006-03-09 11:55) [21]

2[20] Елена   (09.03.06 11:46)
>как пронумервоать, согласно иерархии..
Смотря как выбирать будешь. Можно и на клиенте пронумеровать. А если у тебя каждый пункт относится к конкретному документу, то можно нумерацию и в БД хранить (кстати и выбирать по этой нумерации проще будет).


 
msguns ©   (2006-03-09 12:13) [22]

>Sergey13 ©   (09.03.06 11:55) [21]
>то можно нумерацию и в БД хранить

Замечательно. Если в документе из 100 глав, в которой куча разделов и подразделов (1.4.7.12) понадобиться добавить главу в самое начало, то надо будет перенумеровать весь "горшок", модифицировав каждую запись.
И уж совсем непонятно, как все это будет работать при параллельном юзании такой БД.

ИМХО, сама постановка задачи бредовая от начала и до конца.


 
Елена   (2006-03-09 12:21) [23]

нет, нумерацию хранить точно смысла нет, храним ссылку на вышестоящее поле,этого должно быть достаточно.
Постановка задачи - как распечать документ, пронумеровав при этом пункты документа, учитывая произвольность вложения пунктов


 
msguns ©   (2006-03-09 12:22) [24]

>Елена   (09.03.06 12:21) [23]
>Постановка задачи - как распечать документ, пронумеровав при этом пункты документа, учитывая произвольность вложения пунктов

html


 
Елена   (2006-03-09 12:26) [25]

понятно , ртфм


 
Sergey13 ©   (2006-03-09 12:32) [26]

2[22] msguns ©   (09.03.06 12:13)
>Замечательно.
Я рад, что тебе понравилось. 8-)
Если не понравилось (ну вдруг) и это сарказм - объясни мне, как сортировать пункты одного уровня без сохраненной нумерации?

2[23] Елена   (09.03.06 12:21)
Ты не спрашиваешь, как выбирать иерархию, значит тебе понятно как это сделать. Но если при этом тебе непонятно как приделать при этом номер, то тут уже не понятно мне - в чем загвоздка то?


 
Елена   (2006-03-09 12:46) [27]

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


 
Sergey13 ©   (2006-03-09 12:48) [28]

2[27] Елена   (09.03.06 12:46)
Я не работал с мелко-мягким сервером. Но насколько знаю, там нет иерархоческих запросов, значит надо делать рекурсивную ХП. Что мешает, при выборке выдавать номер?


 
paul_k ©   (2006-03-09 12:49) [29]

Если правильно понял вопрос речь идет о том как собрать номер поднимаясь вверх по дереву?
или наоборот, раскрывая дерево вниз?

Собирать надо из номеров каждой ветки?
Насколько мои знания позволяют судить, в mssql без цикла не обойдешься.
как организовывать обход дерева написано много где. Например по приведенной выше ссылке
собирать лучше не только номер, но и "соритровочный номер" предназначенный для сортировки результата. к примеру
00002.00022.00001
00005.00002.00001
00007.00022.00001
и складывать потом все во временную табличку, из которой все отдается наружу при помощи банального order by по "сортировочному номеру"


 
Елена   (2006-03-09 12:51) [30]

РАскрывая дерево вниз..кажется..
я привела пример в самом начале - пример конечного результата
сижу, вспоминаю ,как с деревьями работать. Пока вспоминается плохо


 
msguns ©   (2006-03-09 12:52) [31]

>Sergey13 ©   (09.03.06 12:32) [26]
>Я рад, что тебе понравилось. 8-)

Я рад, что ты рад ;))

>Если не понравилось (ну вдруг) и это сарказм - объясни мне, как сортировать пункты одного уровня без сохраненной нумерации?

Ссылками. Нумерация идет автоматически. Или ты совсем не знаком с хатмелем ?


 
Sergey13 ©   (2006-03-09 12:57) [32]

2[31] msguns ©   (09.03.06 12:52)
>Ссылками. Нумерация идет автоматически. Или ты совсем не знаком с хатмелем ?
А речь уже однозначно про "хатмель"? Тогда я умываю руки, ибо не знаю его совсем. Я думал данные еще в БД. А там, что бы получить упорядоченный список, надо сортировать по какому то признаку. Признак последовательности кусков текста я знаю один - номер этого куска.


 
msguns ©   (2006-03-09 13:03) [33]

>Sergey13 ©   (09.03.06 12:57) [32]
>А речь уже однозначно про "хатмель"?

Ну почему же однозначно ? Это просто я советую делать через него, ибо он для этого (в т.числе) и был придуман.
Если же Алена предпочитает придумаьб себе проблему, а затем ее преодолевать с разной степенью успешности, то, как говорится, Бог в помощь.
Только вот гемора не оберется. При структурных правках в достаточно иерархически сложных документах будут "фокусы-покусы". Кроме того, в БД достаточно сложно реализовать ссылки, множественное использование одних и тех же кусков текста, контекстный поиск, будут проблемы с картинками, шрифтами и т.д.
Короче-муть голубая.


 
Елена   (2006-03-09 13:05) [34]

так. скриптом по номеру документа получаю массив,состоящий из
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:06) [35]

>Елена   (09.03.06 12:26) [25]
>понятно , ртфм

http://html.manual.ru


 
Sergey13 ©   (2006-03-09 13:12) [36]

2[34] Елена   (09.03.06 13:05)
>так. скриптом по номеру документа получаю массив,состоящий из
Каким скриптом?


 
Sergey13 ©   (2006-03-09 13:16) [37]

2[33] msguns ©   (09.03.06 13:03)
>Только вот гемора не оберется.
Вот это правда. Я с самого начала предлагал ей отказаться от "кусковщины". Есть документ - и хранить надо документ. Иначе (кстати) надо еще следить за подлинностью всех кусочков этого документа.


 
Елена   (2006-03-09 13:16) [38]

типа так
  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;


 
msguns ©   (2006-03-09 13:20) [39]

>Елена   (09.03.06 13:16) [38]

Флаг в руки.
Извиняйте, если что не так ;)


 
Sergey13 ©   (2006-03-09 13:26) [40]

2[38] Елена   (09.03.06 13:16)
Лена, таким способом с иерархией не работают. Это было бы слишком просто.
Рекомендую почитать про деревья в БД. Можно найти на http://ibase.ru/develop.htm
То, что это на сайте про ИнтерБейс - не важно. Суть важна.



Страницы: 1 2 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.028 c
15-1144346723
Gero
2006-04-06 22:05
2006.04.30
Метод решения уравнения


2-1145016343
Ezorcist
2006-04-14 16:05
2006.04.30
Как узнать аськи-код символа?


15-1144682254
rolex2002
2006-04-10 19:17
2006.04.30
помогите с информатикой


15-1144412299
xayam
2006-04-07 16:18
2006.04.30
Посоветуйте редактор


9-1128962305
JurMan
2005-10-10 20:38
2006.04.30
OnLine games