Форум: "Базы";
Текущий архив: 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.01 c