ОБСУЖДЕНИЕ

Связывание двух документов

11 ответов 8,1 тыс.
AI-выжимка обсуждения скоро
Довольно часто бывает необходимо "связать" документы двух типов. Назовем их A и B. Нужно, чтобы из документа типа A можно было увидеть список документов типа B через встроенное представление. А из документов типа B увидеть список документов типа A. Чтобы было более понятно, я это изобразил на рисунке.
Предполагается, что для связи будут использованы UNID (хотя, это не столь важно).
Вроде бы, сделать достаточно просто. В документе типа A создаем поле, которое содержит список UNID документов типа B. И наоборот. И чтобы связать два документа, нужно в соответствующие поля добавить их UNID.
Но тут возникают некоторые неудобства. А именно вероятность появления конфликта записи или репликации при добавлении ссылок. :) Частично этого можно избежать использованием функции блокировки документов, что тоже не совсем удобно.
Поэтому я хочу узнать, как вы решали эту проблему.
У меня есть метод и я опишу его чуть позже. :)
 

Вложения

  • 11.jpg
    11.jpg
    5,6 КБ · Просмотры: 562
...
Вроде бы, сделать достаточно просто. В документе типа A создаем поле, которое содержит список UNID документов типа B. И наоборот. И чтобы связать два документа, нужно в соответствующие поля добавить их UNID. Но тут возникают некоторые неудобства. А именно вероятность появления конфликта записи или репликации при добавлении ссылок.
...

1) А эти поля не должны быть статическими. Их достаточно вычислять при открытии документа.

2) Еще можно сделать вид с двумя категориями Тип "А" и Тип "Б" и ограничивать встроенный вид в отображении одной из них.
 
<!--QuoteBegin-Fossil Code+9:02:2007, 12:53 -->
<span class="vbquote">(Fossil Code @ 9:02:2007, 12:53 )</span><!--QuoteEBegin-->1) А эти поля не должны быть статическими. Их достаточно вычислять при открытии документа.
[snapback]55576" rel="nofollow" target="_blank[/snapback]​
[/quote]
Каким образом? Если через @DbLookUp, то все равно в других документах(которые мы должны показать в встроенном представлении) должна быть какая-то информация (UNID в нашем случае), связанная с открываемым документом. По-моему, от этого ничего не изменится.

<!--QuoteBegin-Fossil Code+9:02:2007, 12:53 -->
<span class="vbquote">(Fossil Code @ 9:02:2007, 12:53 )</span><!--QuoteEBegin-->2) Еще можно сделать вид с двумя категориями Тип "А" и Тип "Б" и ограничивать встроенный вид в отображении одной из них.
[snapback]55576" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно. Только задача не в том как показать, а как связать документы.
 
Извините, извините! Цитирую: Довольно часто бывает необходимо "связать" два типа документа. Назовем их A и B. Нужно, чтобы из документа типа A можно было увидеть список документов типа B через встроенное представление. А из документов типа B увидеть список документов типа A.

Т.е. "связываются" _типы_ документов, а цель "связывания" -- показ через встроенное представление. Вы ведь так писали? И говорили, что Юнид -- так, для примера. Другой хороший пример для _типа_ документа -- название его формы. Согласны, что такая трактовка допускается постановкой задачи, и при этом ее предельно упрощает?

1) Если делать поле динамическим, т.е. вычислять его при открытии документа, пользуясь для отбора нужным типом, а тогда информация о всех документах будет браться из актуальной БД, а задачи обновления полей по всем документам не будет. Тем самым уменьшится риск конфликта репликации и устранится риск конфликта сохранения, по крайней мере за счет устранения массовых операций перезаписи, связанных с этой процедурой.

2) Это решает поставленную задачу показа и устранения конфликтов (см.1). Иначе нужно определить, что бы означало "связывание" и его цель.
 
<!--QuoteBegin-Fossil Code+9:02:2007, 13:57 -->
<span class="vbquote">(Fossil Code @ 9:02:2007, 13:57 )</span><!--QuoteEBegin-->Согласны, что такая трактовка допускается постановкой задачи, и при этом ее предельно упрощает?
[snapback]55597" rel="nofollow" target="_blank[/snapback]​
[/quote]
Согласен. Извиняюсь. Под вечер правописание волнует меня меньше всего. :rolleyes:
Правильно будет: связать документы двух типов. Сейчас поправлю.
 
А почему обязательно надо в форме А иметь эмбеддед вью документов Б? Может просто поля типа список будет достаточно?
У нас сделано так: хотспот который при клике на этот список открывает маленький диалог с выбором названий этих документов, и потом открывает выбранный документ. А в форме Б ембеддед вью.
 
Для: K-Fire
Можно. Но это менее удобно и требует дополнительных телодвижений. К тому же лично мне не нравится, когда в одном месте используется встроенное представление, а в другом выбор из списка. Результат один и то же, а способы его получение разные.
 
Ну тогда напишите агент, который ночью будет отрабатывать документы А, в которых проставлены ссылки на документы Б, и проставлять кросс-ссылки в док-ты Б. Конфликтов сохранения не будет.

Можно еще придумать более извратно: ввести промежуточную сущность, и показывать ее в ембеддед вьюхах. А в самой вью на queryopendocument подсовывать уже либо док-ты А, либо Б :rolleyes:
 
<!--QuoteBegin-K-Fire+9:02:2007, 15:14 -->
<span class="vbquote">(K-Fire @ 9:02:2007, 15:14 )</span><!--QuoteEBegin-->Ну тогда напишите агент, который ночью будет отрабатывать документы А, в которых проставлены ссылки на документы Б, и проставлять кросс-ссылки в док-ты Б. Конфликтов сохранения не будет.
[snapback]55623" rel="nofollow" target="_blank[/snapback]​
[/quote]
Имхо, это как раз извращение. Ждать целый день. :rolleyes:

<!--QuoteBegin-K-Fire+9:02:2007, 15:14 -->
<span class="vbquote">(K-Fire @ 9:02:2007, 15:14 )</span><!--QuoteEBegin-->Можно еще придумать более извратно: ввести промежуточную сущность, и показывать ее в ембеддед вьюхах. А в самой вью на queryopendocument подсовывать уже либо док-ты А, либо Б
[snapback]55623" rel="nofollow" target="_blank[/snapback]​
[/quote]
А вот так сделал я. Через дополнительный документ. Правда без извращений с queryopendocument и остальным. Во встроенном представлении показываются нормальные документы. Т.е. для пользователей совершенно ничего не изменилось. Минус в том, что при связывании трех документов(A, B и C) между собой я уже начал путаться. И метод сам по себе немного перегруженный. :)
 
<!--QuoteBegin-Medevic+9:02:2007, 14:25 -->
<span class="vbquote">(Medevic @ 9:02:2007, 14:25 )</span><!--QuoteEBegin-->А вот так сделал я. Через дополнительный документ. Правда без извращений с queryopendocument и остальным. Во встроенном представлении показываются нормальные документы.
[snapback]55628" rel="nofollow" target="_blank[/snapback]​
[/quote]

А вот тут можно поподробнее? Во встроенном представлении в форме А показываются документы Б. Для этого в документе Б должен быть айтем, по значению которого делаем отбор, правильно?
Значит вы каким-то способом прописываете это значение в Б ? Как это вы делаете используя документ С ?
 
<!--QuoteBegin-K-Fire+9:02:2007, 15:52 -->
<span class="vbquote">(K-Fire @ 9:02:2007, 15:52 )</span><!--QuoteEBegin-->А вот тут можно поподробнее? Во встроенном представлении в форме А показываются документы Б. Для этого в документе Б должен быть айтем, по значению которого делаем отбор, правильно?
Значит вы каким-то способом прописываете это значение в Б ? Как это вы делаете используя документ С ?

[snapback]55637" rel="nofollow" target="_blank[/snapback]​
[/quote]
Документ C - это третий тип документа. Это у меня в реальности три типа документов. Для связывания используется другой. Да и связь можно сделать только типа один ко многих. Поэтому и спрашиваю, какие есть способы.
Для двух типов документа конструкция простая.
Пусть, нужно создать документ типа A (назовем его A) и два связанных с ним документа типа B (назовем их B1 и B2).
При первом сохранении A создается дополнительный(связующий) документ, которое содержит два поля. Одно - UNID A, второе потом будет содержать UNID'ы B1 и B2. В A записываем UNID это дополнительного документа.
Потом создаем документ B1 (у меня для этого есть кнопка в документе A). В момент создания B1 мы прописываем в определенное поле UNID связующего документа (который создали при сохранении A). И добавляем UNID B1 в соответствующе поле связующего документа.
Также делаем со вторым документом B2.
В результате имеем документ A, и два документа B1 и B2, которые содержат UNID общего связующего документа.
Теперь легко их отобрать во встроенном представлении друг у друга по этому UNID.
 
Ну просто удивительно, как разные товарищи, например, Medevic и Fossil Code, могут обсуждать что-то одно, говоря не вполне об одном предмете, или об одном предмете, но о разных его сторонах! :D

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

Как упомянутые значения в документы заносить -- вопрос тесно связанный с желаемым интерфейсом пользователя и логикой работы базы и процедурными связями между документами. Вот Вы показали, каким приемом для данной цели пользуетесь. Понятно. Своей методой, я, кажется, тоже сумел поделиться.
 

Статистика тем

Создано
Medevic,
Последний ответ от
Fossil Code,
Ответы
11
Просмотры
8 080