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

Тема в разделе "Lotus - Программирование", создана пользователем Medevic, 8 фев 2007.

  1. Medevic

    Medevic Что это ? :)
    Lotus team

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

    Вложения:

    • 11.jpg
      11.jpg
      Размер файла:
      10,8 КБ
      Просмотров:
      58
  2. Fossil Code

    Fossil Code Гость

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

    2) Еще можно сделать вид с двумя категориями Тип "А" и Тип "Б" и ограничивать встроенный вид в отображении одной из них.
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    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]
    Можно. Только задача не в том как показать, а как связать документы.
     
  4. Fossil Code

    Fossil Code Гость

    Извините, извините! Цитирую: Довольно часто бывает необходимо "связать" два типа документа. Назовем их A и B. Нужно, чтобы из документа типа A можно было увидеть список документов типа B через встроенное представление. А из документов типа B увидеть список документов типа A.

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

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

    2) Это решает поставленную задачу показа и устранения конфликтов (см.1). Иначе нужно определить, что бы означало "связывание" и его цель.
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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:
    Правильно будет: связать документы двух типов. Сейчас поправлю.
     
  6. K-Fire

    K-Fire Гость

    А почему обязательно надо в форме А иметь эмбеддед вью документов Б? Может просто поля типа список будет достаточно?
    У нас сделано так: хотспот который при клике на этот список открывает маленький диалог с выбором названий этих документов, и потом открывает выбранный документ. А в форме Б ембеддед вью.
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: K-Fire
    Можно. Но это менее удобно и требует дополнительных телодвижений. К тому же лично мне не нравится, когда в одном месте используется встроенное представление, а в другом выбор из списка. Результат один и то же, а способы его получение разные.
     
  8. K-Fire

    K-Fire Гость

    Ну тогда напишите агент, который ночью будет отрабатывать документы А, в которых проставлены ссылки на документы Б, и проставлять кросс-ссылки в док-ты Б. Конфликтов сохранения не будет.

    Можно еще придумать более извратно: ввести промежуточную сущность, и показывать ее в ембеддед вьюхах. А в самой вью на queryopendocument подсовывать уже либо док-ты А, либо Б :rolleyes:
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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) между собой я уже начал путаться. И метод сам по себе немного перегруженный. :)
     
  10. K-Fire

    K-Fire Гость

    <!--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]

    А вот тут можно поподробнее? Во встроенном представлении в форме А показываются документы Б. Для этого в документе Б должен быть айтем, по значению которого делаем отбор, правильно?
    Значит вы каким-то способом прописываете это значение в Б ? Как это вы делаете используя документ С ?
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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.
     
  12. Fossil Code

    Fossil Code Гость

    Ну просто удивительно, как разные товарищи, например, Medevic и Fossil Code, могут обсуждать что-то одно, говоря не вполне об одном предмете, или об одном предмете, но о разных его сторонах! :D

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

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

Поделиться этой страницей