Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
Елена   (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
То, что это на сайте про ИнтерБейс - не важно. Суть важна.


 
Елена   (2006-03-09 13:28) [41]

Спасибо всем ) пересмотрю структуру хранения данных


 
paul_k ©   (2006-03-09 14:07) [42]

Струкртуру хранеия бесконечной влодженности кроме дерева что ещё?
Для начала, все же изучите

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


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

строим курсор по корневым веткам (parent_id is null)
и начинаем обрабатывать каждую запись собирать потомков и так далее. Пока не наступим на грабли ограничение количества вложенных вызовов.

Тоже самое можно проделать и на клиенте
Далее создаем временную табличку и собираем в нее данные.


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

>paul_k ©   (09.03.06 14:07) [42]

Зачем упорно советовать итти в могилу ?
Речь идет не о структурных данных, для хранения которых предназначены БД, а о документах произвольной формы.
Что будешь делать с договором, в котором есть таблицы или графики ? Как "объяснить" серверу БД, что в пункте 5.1.6 слева листа там, гле первый абзац, надо нарисовать картинку ? Или как "засунуть" в документ подпись или печать ? Про цвет, размер, шрифт, разметку, колонтитулы и т.д. вообще молчу.
Кто предпочтет такую БД обыкновенному ворду, влегкую справляющемуся со всем перечисленным, покажи мне такого идиота  ?


 
paul_k ©   (2006-03-09 14:24) [44]

> [43] msguns ©   (09.03.06 14:13)

хмм... показать? да легко.. хотя мою морду ты на фотках видел.:)
все от задачи зависит и от того что есть "документ свободного формата" в рамках оной задачи.
В некоторых задачах крайне удобно хранить в дереве куски документа. (в частности пункты, как у автора) В других задачах это верный путь в яму.


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

для каждого пункта будут поля - цвет , шрифт, отступы, а также признак - это текст или таблица.

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


 
paul_k ©   (2006-03-09 14:53) [46]

> [45] Елена   (09.03.06 14:49)

Лена, тогда проще образ документа в блоб поле держать. В MsWord вызвать в нем поправить/посмотреть и обратно в базу.


 
Romkin ©   (2006-03-09 14:56) [47]

Елена   (09.03.06 14:49) [45] Лучше сделать как у MS. Там отдельные структуры для всех типов данных. И есть отдельная структура для разметки.
То есть, хранить абзацы в одной таблице БД, таблицы - в другой и тд. И собирать когда надо.


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

Отдельные  структуры? Это было моим первым решением, но как быть с произвольным кол-ом пунктов?


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

2[45] Елена   (09.03.06 14:49)
А зачем все это? Ты пока так и не сказала - зачем хранить документ по пунктам, если каждый пункт относится только к одному документу?


 
Romkin ©   (2006-03-09 15:02) [50]

А если делать по-серьезному, есть стандарт, OpenDocument. Его рассмотреть и следовать. http://ru.wikipedia.org/wiki/OpenDocument


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

хорошо, таблицу пока можно не трогать.  Как организовать хранение  абзацев. ..


 
msguns ©   (2006-03-09 16:49) [52]

>paul_k ©   (09.03.06 14:24) [44]
>В некоторых задачах крайне удобно хранить в дереве куски документа. (в частности пункты, как у автора) В других задачах это верный путь в яму.

Давай все же как-то определяться, ЧТО мы хотим хранить: содержимое документа или сам документ в своем печатном виде. Если первое, то я неверно понял сабж, приношу уважаемому Собранию свои изменения и отправляюсь в ближайшую рюмочную, где и залью свое горе ;)
А если второе, то все равно придется иметь дело с документом (Word, html, OpenDoc и прочее), только "засунутым" в блоб. В этом случае надо говорить не о проблеме хранения структуры документа, а о системе хранения документов. Что совсем не обно и то же


 
msguns ©   (2006-03-09 16:58) [53]

Кстати, для хранения кусков одного целого с требованием сохранения заданной последовательности, но без привязки к некоторому базовому значению (главы документа) можно использовать принцип цепочки. i-й блок (глава) ссылается на i+1. i+1 на i+2 и т.д. Для получения дерева нужено еще добавить цепочку папа-дочка. Правда, извлечение исключительно "вручную" (т.е.позаписьно), зато легко переваривает любые перемещения блоков относительно друг друга. Нумерация определяется просто и легко - по принципу "котовым считан - таким и нумеруется"

Что-то вроде кластерной цепочки файловой системы, только "двухмерная" ;))

Написал и вспомнил старый добрый MUMPS, вся файловая система котрая была построена "от дерева".


 
Sergey13 ©   (2006-03-09 17:05) [54]

2[53] msguns ©   (09.03.06 16:58)
Это описание велосипеда с квадратными колесами? 8-)


 
Елена   (2006-03-10 08:25) [55]

Сделала ) всем спасибо за критику , предложения и полезные ссылочки


 
ANB ©   (2006-03-10 11:28) [56]


> Елена   (10.03.06 08:25) [55]

А MS SQL критично ? Просто оракл позоляет работать с деревьями, а 9 - еще и в легкую.

Хотя я бы таки целиком документ хранил.


 
paul_k ©   (2006-03-10 11:32) [57]

> [52] msguns ©   (09.03.06 16:49)

Вот и я про то же. Насколько я понял автора, необходимо хранить содержимое. Видимо понял неверно.


 
Sergey13 ©   (2006-03-10 11:32) [58]

2[56] ANB ©   (10.03.06 11:28)
Позволяет даже Парадокс. Оракл облегчает работу. 8-)


 
Елена   (2006-03-10 11:38) [59]

ага, mssql критично  - Оракел не тянет по ряду причин, не от меня зависящих


 
Sergey13 ©   (2006-03-10 11:42) [60]

2[59] Елена   (10.03.06 11:38)
>Оракел не тянет по ряду причин
Никто тебя за язык не тянул. Щас начнется. 8-)


 
paul_k ©   (2006-03-10 11:43) [61]

дусаю начнется с
> Оракел


 
Елена   (2006-03-10 11:45) [62]

))  это уже оффтоп


 
msguns ©   (2006-03-10 11:51) [63]

>Sergey13 ©   (10.03.06 11:42) [60]
>Никто тебя за язык не тянул. Щас начнется. 8-)

Ага, Серега будет уговаривать для посадки дерева пригласить шагающий экскаватор. Уракакл самый-самый именно для хранения документов ;))


 
Sergey13 ©   (2006-03-10 11:53) [64]

2[63] msguns ©   (10.03.06 11:51)
>Ага, Серега будет уговаривать для посадки дерева пригласить шагающий экскаватор.
Нет. Не буду. Мне пофиг. 8-)

>Уракакл самый-самый именно для хранения документов ;))
А че? Дешево и сердито. Ты не согласен? 8-)


 
msguns ©   (2006-03-10 12:06) [65]

>Sergey13 ©   (10.03.06 11:53) [64]
>А че? Дешево и сердито. Ты не согласен? 8-)

Серега, я с тобой завсегда и во всем согласен !
А если и спорю, то исключительно для солидности..
;))


 
Sergey13 ©   (2006-03-10 12:13) [66]

2[65] msguns ©   (10.03.06 12:06)
8-)))))))))))



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

Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.011 c
2-1144924527
Sybertron
2006-04-13 14:35
2006.04.30
работа с Exel


15-1144358901
Суслик
2006-04-07 01:28
2006.04.30
Ищу перевод лицензии MPL 1.1 на рОдный язык.


15-1144333412
oldman
2006-04-06 18:23
2006.04.30
Если память не изменят...


4-1139299249
Lucefer
2006-02-07 11:00
2006.04.30
Как писать в EventLog?


1-1141997474
Wolferio
2006-03-10 16:31
2006.04.30
управление внешней програмой





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский