Lotus notes 我可以在另一个窗口中获取打开的uidoc的背景文档吗?

Lotus notes 我可以在另一个窗口中获取打开的uidoc的背景文档吗?,lotus-notes,lotusscript,Lotus Notes,Lotusscript,我试图避免在我的应用程序中保存冲突时,我发现了一些错误。。。问题:我可以用这个还是这是ack,邪恶代码?这是“众所周知的”,还是仅在我的配置说明8.5.3中才是正确的 我打开了一个ui-已保存的notes文档:main lotusscript代码在后台更新此文档。让我们从另一个表单执行此操作。会发生什么?Main应该在后台更新,如果我们最近试图从打开的主文档中(手动)保存它,我们应该得到一个保存冲突,对吗?如果main的postopen表单中存在以下代码,则不会 修改后,另一文档的代码会将Mai

我试图避免在我的应用程序中保存冲突时,我发现了一些错误。。。问题:我可以用这个还是这是ack,邪恶代码?这是“众所周知的”,还是仅在我的配置说明8.5.3中才是正确的

我打开了一个ui-已保存的notes文档:main

lotusscript代码在后台更新此文档。让我们从另一个表单执行此操作。会发生什么?Main应该在后台更新,如果我们最近试图从打开的主文档中(手动)保存它,我们应该得到一个保存冲突,对吗?如果main的postopen表单中存在以下代码,则不会

修改后,
另一文档的代码会将Main重置为磁盘版本。我的意思是打开的文档将被重新加载到后台文档。所有未保存的更改都将丢失,而不会发出任何警告。我说这很奇怪

Sub Postopen(Source As Notesuidocument)
    Dim UIDoc As NotesUIDocument
    Set UIDoc = source 
    Dim tmpDoc As NotesDocument
    Set tmpDoc=UIdoc.Document
End Sub
下面是进行更新的代码示例。我只是将此代码放在另一种形式的操作中。为了简化代码,我硬编码了主文档的UNID。将此UNID更新为主UNID

即使IsUIDocOpen也会返回true!我可以假定db.GetDocumentByUNID以第二个表单返回主打开文档的后台文档吗?如果是,为什么只有postopen中的代码存在时才起作用

Dim s As New NotesSession
Dim db As NotesDatabase
Dim ldoc As NotesDocument ' ,doc As NotesDocument

Set db = s.CurrentDatabase
Set ldoc = _
db.GetDocumentByUNID("028935D543C50A2AC2257E06004EFB7F") ' doc.LinkedDocID(0))

If ldoc.IsUIDocOpen Then
    If Messagebox ( "changing background doc will reset uidoc to disk version !",1, _
    "linked doc is open !") <> 1 Then Exit Sub
End If
ldoc.fakefield = "inserted changed on " + Cstr(Now)
Dim s作为新注释会话
Dim db As NotesDatabase
Dim ldoc As NOTES DOCUMENT',doc As NOTES DOCUMENT
设置db=s.CurrentDatabase
设置ldoc=_
db.GetDocumentByUNID(“028935D543C50A2AC2257E06004EFB7F”)“文件链接CID(0))
如果ldoc.IsUIDocOpen,则
如果Messagebox(“更改后台文档会将uidoc重置为磁盘版本!”,1_
“链接单据已打开!”)1然后退出子系统
如果结束
ldoc.fakefield=“插入更改日期”+Cstr(现在)
我可以在另一个窗口中获取打开的uidoc的背景文档吗

对。但让我们澄清一下:当您在UI中打开一个文档(比如双击或在视图中按Enter键)时,如果它已经在另一个窗口或框架中打开,notes将尝试将焦点更改为该窗口或框架(框架并不总是成功,但我偏离了主题)。除非调用NotesUIWorkspace.editDocument,否则通过脚本打开是不同的,在这种情况下,您模拟的是UI文档打开事件

但是“后端”文档只是磁盘上的文档,正如您已经知道的,UI只是显示加载的数据的表单。您可以使用表单公式使用多个表单显示一个文档,但上述行为仍然适用-如果文档在其他位置打开,则可能会发生保存冲突

只要您正确地管理事务以防止两个同时执行的操作保存到文档中,就不应该存在保存冲突。您可以通过多种方式实现这一点,如启用冲突管理、启用文档锁定或提供其他机制(如消息队列)

即使IsUIDocOpen也会返回true!我可以假设db.GetDocumentByUNID以第二种形式返回主打开文档的后台文档吗

是的,这永远是真的。UI不在乎,所有NotesDatabase方法GetDocumentByUNID知道要做的就是查阅主索引,并将document对象返回给您以获取该数据注释

如果是,为什么只有postopen中的代码存在时它才起作用

Dim s As New NotesSession
Dim db As NotesDatabase
Dim ldoc As NotesDocument ' ,doc As NotesDocument

Set db = s.CurrentDatabase
Set ldoc = _
db.GetDocumentByUNID("028935D543C50A2AC2257E06004EFB7F") ' doc.LinkedDocID(0))

If ldoc.IsUIDocOpen Then
    If Messagebox ( "changing background doc will reset uidoc to disk version !",1, _
    "linked doc is open !") <> 1 Then Exit Sub
End If
ldoc.fakefield = "inserted changed on " + Cstr(Now)
在这里澄清“仅”,您必须对后端对象有一些句柄,这是您的代码提供的。还有其他方法可以完成相同的任务,例如在另一个表单事件或操作按钮/热点单击事件中放置类似的代码


要记住的是,当您向NotesDatabase请求文档时,您会得到指向该文档的指针。您可以有多个指向同一文档的指针,如果您没有正确管理保存事件,通常会遇到保存冲突问题。

有趣的是,我将再次阅读。您的评论“您可以有多个指向同一文档的指针”完美地描述了这种情况。如果能够在不从磁盘读取文档的情况下访问指针,那就太好了。它可以允许两个屏幕与同一个文档交互,而无需恢复(重置)指向磁盘版本的第一个指针(从而丢失所有未保存的更改)。如果您想要一个文档句柄的副本,您可以创建一个按值返回它的函数,或者在内存中创建一个副本到辅助句柄。但在国际海事组织看来,这样做的价值超过了以这种方式管理解决方案的成本。如果您发现需要同时从两个不同上下文中更新或使用同一文档的用例,那么数据结构需要更加规范化(而不是Notes鼓励的设计),这是一个很好的指标。我打开了一个PMR,它涉及未保存数据的松散性。稍后我将更新此问题。感谢您的回答,我开始检查是否可以找到一个优雅的解决方案来处理指向同一文档的多个指针,而不会导致保存冲突和修改丢失(最后一点更加困难)。我想我将不得不处理虚拟/版本文档,以避免直接写入文档和代理重新复制主文档的更改,我很久以前就做过这样的事情,一点也不简单..很高兴提供一些输入。对于这种复杂性,我在过去使用的一种机制是实现一个消息队列,使用单独的视图和文档作为消息,并使用代理一次处理一个,为写入文档提供互斥体。这会将写入权限交给单个代理,但会在执行文档写入时引入延迟。相反,您应该将您的值写入单独的“消息”文档中,并让ag