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



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

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

Наверх





Память: 0.55 MB
Время: 0.013 c
2-1145012129
abhtr
2006-04-14 14:55
2006.04.30
TLabel.Create


2-1145039380
_Iton_
2006-04-14 22:29
2006.04.30
Компоненты похожий на ТрееВью


2-1144770126
ViktorZ
2006-04-11 19:42
2006.04.30
сложить два столбца...


2-1144998437
nastyok::
2006-04-14 11:07
2006.04.30
Table1.FindKey


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