我正在做“传统的”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中没有很好的方法可以嵌入来自另一个数据库的视图。 要求是数据库应该出现在工作空间中,以便在某种狡猾的列表中显示。 能够通过server和replicaID为嵌入式视图指定目标数据库会很棒,但我们有一个奇怪的随机工作区数据库列表。
答案 0 :(得分:1)
实施它的最佳方法是什么?
正如您所提到的,创建复合应用程序可能允许您执行此操作,但仅限于窗口,而不是表单中的设计级别。
例如。
[窗口A] ---触发---> [窗口B]
如果您不熟悉这个系统,我做了一个解释基础知识的教程。
http://www-10.lotus.com/ldd/compappwiki.nsf/dx/ibm-my-first-wire
虽然教程回调到同一个数据库,但很容易指向另一个数据库。
我个人通过XPages这样做。我个人发现通过经典风格笔记设计/ comp应用程序实现起来要容易得多。它还允许您在同一屏幕区域内显示设计元素。
答案 1 :(得分:1)
主要问题是Notes并非旨在处理数据库之间的关系(除了父子关系之外的任何事情)。所以解决方案必须是创造性的。
想到了几个(非常可怕的)想法。一种方法是将引用存储在文档中,并在保存文档时更新它们。这可以在LotusScript中完成,并且需要搜索其他数据库的文档来更新它们的引用。
好处是阅读文档时的表现非常好。如果数据库B不可用,则在读取数据库A时没有问题。它将数据保存在每个数据库的本地。缺点包括保存冲突的可能性以及如果文档没有“保存”而是通过代理等更新,引用可能会失去同步的危险。
另一个想法是使用代理按计划管理链接。如果您不需要实时的最新引用,则可以运行扫描数据库B的代理并更新数据库A中的引用。使用此方法,您可以选择更新数据库A文档本身 - 或 - 听起来你已经完成了,创建一组显示在嵌入视图中的链接文档。后者消除了保存冲突问题。
另一个想法是在数据库A中打开文档时隐藏任何引用,但提供“显示”或“更新”引用的按钮。当您单击该按钮时,它将触发LotusScript以搜索数据库B并动态构建列表。这可能会在少于10,000个文档的情况下快速完成。该函数可以更新存储在同一数据库中的链接文档,该数据库为嵌入视图提供信息。
希望这有帮助!
答案 2 :(得分:1)
正如您已经听说的那样,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对数据进行分类。嵌入式视图是可以的,只要它们所基于的视图不是太大,否则它可能会影响它嵌入的表单的性能。