首页 文章

在不同的Lotus Notes数据库中创建多个到多个文档之间的关系

提问于
浏览
1

我正在做“传统的”Lotus Notes编程(与R5相同),需要实现驻留在不同数据库中的2种文档类型(表单)之间的链接 .

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

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

客户希望能够在任何一方编辑这种关系,这样如果他在表格(A)中编辑它,表格(B)就会更新 . 表格(B)应该具有相同类型的嵌入视图或类型(A)的相关文档列表

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

客户端的基础设施是Lotus Domino 8.5.2 Lotus Notes 8.5.2,因此从理论上讲,复合应用程序方法可能是一种选择 .

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

3 回答

  • 1

    正如您已经听说的那样,Lotus Notes没有内置的引用完整性约束,您必须自己完成 .

    我不会依赖文档链接,因为它们适用于UNID,如果您剪切并粘贴相同的文档,可能会改变,从而丢失链接 . 试试这个,

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

    2/ 在每个数据库中创建一个查找视图,按新ID列出文档(不要忘记设置ID列的"sort order" .

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

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

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

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

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

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

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

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

  • 1

    主要问题是Notes不是为处理数据库之间的关系而设计的(也不是任何东西除了父母子女关系之外) . 所以解决方案必须是一个创造性的解决方案 .

    想到了几个(非常可怕的)想法 . 一种方法是将引用存储在文档中,并在保存文档时更新它们 . 这可以全部在LotusScript中完成,并且需要搜索其他数据库的文档来更新它们的引用 .

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

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

    另一个想法是在数据库A中打开文档时隐藏任何引用,但提供“显示”或“更新”引用的按钮 . 当您单击该按钮时,它将触发LotusScript以搜索数据库B并动态构建列表 . 这可能会在少于10,000个文档的情况下快速完成 . 该函数可以更新存储在同一数据库中的链接文档,该数据库为嵌入视图提供信息 .

    希望这可以帮助!

  • 1

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

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

    例如 .

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

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

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

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

    我个人通过XPages做到这一点 . 我个人发现通过经典风格笔记设计/ comp应用程序实现起来要容易得多 . 它还允许您在同一屏幕区域中显示设计元素 .

相关问题