【问题标题】:creating many to many relationship between documents in different lotus notes databases在不同 Lotus Notes 数据库中的文档之间创建多对多关系
【发布时间】:2012-02-08 06:54:00
【问题描述】:

我正在做“传统”的 Lotus Notes 编程(自 R5 以来也是如此),需要实现驻留在不同数据库中的 2 种文档类型(表单)之间的链接。

数据库(A)中类型(A)的文档可以引用数据库(B)中的多个类型(B)的文档。 并且文档(B)也应该显示它与文档(A)的关系,因为文档(B)可以与不同的文档(A)相关。 我们有多对多关系。

目前它仅在一侧实现(一对多): 文档 (A) 的形式包含特殊的嵌入视图 驻留在数据库 A 中的“链接”文档。当用户从数据库 (B) 中选择文档时,此链接文档由 lotusScript 创建。当用户单击此嵌入视图中的某个项目时,它会打开文档 (B)。

客户希望能够在任何一侧编辑此关系,以便如果他在表格 (A) 中编辑它,表格 (B) 也会更新。 表单 (B) 应该具有相同类型的嵌入视图或类型 (A) 的关联文档列表

实现它的最佳方法是什么?

客户端的基础架构是 Lotus Domino 8.5.2 + Lotus Notes 8.5.2,因此理论上,复合应用程序方法可能是一种选择。

我问这个问题的原因是,据我了解,Notes 中没有嵌入来自另一个数据库的视图的好方法。 要求是数据库应该出现在工作区中,以便显示在某种狡猾的列表中。 能够通过服务器和replicaID为嵌入式视图指定目标数据库会很棒,但是我们有一个奇怪的随机工作区数据库列表。

【问题讨论】:

    标签: lotus-notes lotusscript


    【解决方案1】:

    主要问题是 Notes 并非旨在处理数据库之间的关系(也不是除父子关系之外的任何其他关系)。所以解决方案必须是有创意的。

    脑海中浮现出几个(非常规,可能很糟糕)的想法。一种是将引用存储在文档本身中,并在保存文档时更新它们。这一切都可以在 LotusScript 中完成,并且需要搜索其他数据库的文档以更新它们的引用。

    好处是阅读文档时的性能会非常好。如果数据库 B 不可用,则读取数据库 A 时不会出现问题。它将数据保存在每个数据库的本地。缺点包括保存冲突的可能性以及如果文档没有“保存”而是通过代理更新等情况下引用可能会不同步的危险。

    另一个想法是使用代理来按计划管理链接。如果您不需要实时更新参考,您可以运行一个代理来扫描数据库 B 并更新数据库 A 中的参考。使用这种方法,您可以选择自己更新数据库 A 文档 - 或 -听起来您已经完成了,创建一组显示在嵌入视图中的链接文档。后者消除了保存冲突问题。

    另一个想法是在您打开数据库 A 中的文档时隐藏所有引用,但提供一个按钮来“显示”或“更新”引用。当您单击该按钮时,它会触发 LotusScript 以搜索数据库 B 并动态构建一个列表。对于少于 10,000 个文档,这可能会很快奏效。该功能可以更新您存储在提供嵌入式视图的同一数据库中的链接文档。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      实现它的最佳方法是什么?

      正如您提到的,创建复合应用程序可能允许您执行此操作,但仅限于窗口,而不是表单中的设计级别。

      例如。

      [窗口 A] --- 触发 ---> [窗口 B]

      如果你不熟悉这个系统,我做了一个解释基础的教程。

      http://www-10.lotus.com/ldd/compappwiki.nsf/dx/ibm-my-first-wire

      虽然本教程回调到同一个数据库,但指向不同的数据库很容易。

      我个人会通过 XPages 来完成。我个人发现通过经典风格的笔记设计/合成应用程序更容易实现。它还允许您在同一屏幕区域内显示设计元素。

      【讨论】:

      • 为您使用 XPages 的缺点是您的客户使用的版本。
      • 谢谢西蒙,我不能使用 xpages,因为这些是传统的笔记数据库。我查看了有关 myfirstwire 的教程,怀疑它是否会有所帮助。可能会坚持一些传统的编码。我希望有一个技巧可以嵌入来自不同数据库的视图
      【解决方案3】:

      您已经听说过,Lotus Notes 没有内置的参照完整性约束,您必须自己做。

      我不会依赖文档链接,因为它们是针对 UNID 的,如果您剪切和粘贴相同的文档,它可能会发生变化,从而丢失链接。试试这个,

      1/ 在每个文档上创建一个“ID”字段。您可以通过在计算字段中使用 @Unique 来填充它以生成 ID,并将其保存到两个数据库中的文档中。您可以在 lotusScript (LS) 或公式中创建一个代理来执行此操作。 (如果在 LS 中做,请考虑使用 evaluate 语句)

      2/ 在每个数据库中创建一个查找视图,按新 ID 列出文档(不要忘记设置 ID 列的“排序顺序”。

      3/ 使用可以为两个数据库配置的操作按钮,您可以创建一个 LS 函数,该函数将打开相对的数据库视图并返回 ID 字段。 (NotesUIWorkspace.pickliststrings 将是选择文档的最简单方法,否则您可以构建一个 dialogbox。将结果列表存储在名为“linkedID”的字段中作为多值列表。

      4/ 您可能想要存储更多信息,例如文档标题或作者,因此您需要使用 getdocumentbykey 获取这些文档的句柄,然后查询字段您需要在屏幕上显示信息。

      5/ 然后您还可以在您引用的目标文档上添加一个新字段,称为“referrerID”,它是引用当前文档的文档列表。这将保持双向关系。

      存储链接的字段必须是多值字段,否则循环遍历链接文档ID列表并管理它们会很麻烦。

      此方法使用静态键,因此您可以复制数据库,而不会丢失用户投入时间制作的文档之间的关系。如果您依赖文档通用 ID(在 @documentUniqueID 文档中进行了很好的描述),如果您剪切并粘贴文档,或者将数据库复制到其他地方,您可能(并且可能会)失去这些关系,尽管复制相同,它们仍会成为新文档字段,并将被分配一个新的通用 ID,旧文档的任何文档链接都将无效。

      如果您从其他数据库中显示的信息发生更改,您需要能够定期刷新该数据,因此请考虑编写一个可以查找和刷新相关字段的计划代理。

      如果用户打算取消链接或更改文档之间的关系,那么您需要添加循环遍历关键字段的函数,并使列表与用户正在执行的操作保持一致。所以,就像我说的,Lotus Notes 的扁平数据结构需要您自己管理所有完整性约束。

      如果您想花点心思,可以使用嵌入式视图,因为它们确实支持来自同一服务器上另一个数据库的引用。关于在 LotusScript here 中处理它的一些提示。并使用附加视图按引用 ID 对数据进行分类。嵌入视图是可以的,只要它们基于的视图不是太大,否则可能会影响它嵌入的表单的性能。

      【讨论】:

      • 对 UNID 的好想法。但是,您可以使用访问控制(删除删除)来控制剪切和粘贴,并可能添加一个在粘贴文档时做出响应的代理。
      • 嵌入式视图支持对另一个数据库的引用。但是如果用户的工作空间中没有这样的数据库,那么该引用会发生什么?如果我在模板中设置参考,然后将设计刷新到目标数据库怎么办。该参考文献也会被刷新吗?有人经常使用它吗?如果你真的可以嵌入另一个数据库的视图,那么就不需要这么繁琐的实现了,因为在这种情况下很容易用这种方式实现:
      • 数据库 A 的表单 A 具有包含特殊“链接”文档的单一类别嵌入视图 evA。这些链接文档包含文档 A 的 ID 和文档 B 的 ID,以及文档 A 和 B 的公共字段。数据库 B 包含来自 db A 的单类别嵌入式视图 evB,列出了由文档 B 的 ID 分类的链接文档。我希望我可以实现以这种方式,但我怀疑我能否可靠地嵌入来自另一个数据库的视图。
      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多