View 在多个数据库中创建视图和代理

View 在多个数据库中创建视图和代理,view,lotus-notes,lotus-domino,lotusscript,agent,View,Lotus Notes,Lotus Domino,Lotusscript,Agent,我遇到的问题是,用户ID文件无法访问某些消息,我希望跳过这些文件,而不是代理崩溃。收到的错误消息如下: 如果发生这种情况,我可以使用查看方法临时删除文档并重新运行代理,但是如果有一种方法可以跳过文档,那将是一个很大的帮助 谢谢你们的帮助 好的,我已经修改了代码,到了我几乎可以接受的程度 子初始化 Dim s As New notessession Dim db As notesdatabase Dim view As notesview Dim doc As notesdocument Di

我遇到的问题是,用户ID文件无法访问某些消息,我希望跳过这些文件,而不是代理崩溃。收到的错误消息如下:

如果发生这种情况,我可以使用查看方法临时删除文档并重新运行代理,但是如果有一种方法可以跳过文档,那将是一个很大的帮助

谢谢你们的帮助

好的,我已经修改了代码,到了我几乎可以接受的程度

子初始化

Dim s As New notessession
Dim db As notesdatabase 
Dim view As notesview
Dim doc As notesdocument
Dim nextdoc As notesdocument


Set db = s.currentdatabase
If view Is Nothing Then
    Set view = db.CreateView("Encrypted",{Encrypt="1"})
End If  
Set doc = view.getfirstdocument

On Error Goto ErrorHandler

While Not doc Is Nothing        
nextDocument:
    Set nextdoc = view.getnextdocument(doc)
            'The below loop is mandatory to ensure that all $File entries are unecrypted
    Forall i In doc.items
        If i.isencrypted Then
            i.isencrypted=False 
        End If 
    End Forall

        'Must have at least 1 field encrypted in order to call Encrypt method
    Dim temp As New NotesItem(doc,"tempjunk","temp")
    temp.IsEncrypted=True
    Call doc.encrypt
    Call doc.save(True, False)
        'This portion can now remove the fields relative to encrypting the
        'single token encrypted field.
    Call doc.removeitem("$Seal")
    Call doc.removeitem("$SealData")
    Call doc.removeitem("SecretEncryptionKeys")
    Call doc.removeitem("Encrypt")
    Call doc.removeItem("tempjunk")
    Call doc.save(True, False)
    Set doc = nextdoc 
Wend
Exit Sub

ErrorHandler:
On Error Resume nextDocument
Exit Sub
端接头

错误处理不是很好

在错误恢复下一个文档时显示为错误。
我已经尝试抑制所有的错误警告,这些警告似乎试图去除加密,但我认为它们的消息体正在被破坏

在容器数据库中创建一个代理并让该代理访问所有“目标”数据库中的文档并相应地修改它们是没有问题的-无需将该代理复制到所有数据库

唯一限制:如果数据库位于另一台服务器上,则必须在目标服务器的“服务器安全”选项卡上输入容器数据库作为受信任服务器的服务器

并且:如果您的代理运行的时间超过了服务器上代理允许的最大运行时间,那么它将被提前终止


无需在目标数据库中创建视图,您可以使用NotesDatabase.Search()获取数据库中相应的文档…

在容器数据库中创建代理并让该代理访问所有“目标”中的文档没有问题数据库并相应地修改它们-无需将该代理复制到所有数据库

唯一限制:如果数据库位于另一台服务器上,则必须在目标服务器的“服务器安全”选项卡上输入容器数据库作为受信任服务器的服务器

并且:如果您的代理运行的时间超过了服务器上代理允许的最大运行时间,那么它将被提前终止


无需在目标数据库中创建视图,您可以使用NotesDatabase.Search()获取数据库中相应的文档…

如果您必须处理每个数据库中的所有(或几乎所有)文档,则可以使用db.AllDocuments。它比在@All公式中使用db.Search()更有效

如果您想排除某些文档(可能是基于表单名称),我将构建一个要排除的表单列表,然后使用IsElement根据该列表检查正在处理的每个文档

Dim exclude List As Boolean
exclude("FormA")=True
exclude("FormB")=True

Set col = db.AllDocuments
Set doc = col.GetFirstDocument()
Do Until doc Is Nothing
    formname = doc.GetItemValue("Form")(0)
    If IsElement(exclude(formname))=False Then
        Call RemoveEncryption(doc)  '*** Your function to remove encryption
    End If
    Set doc = col.GetNextDocument(doc)
Loop
差不多吧。顺便说一下,您可以将列表创建为任何数据类型。我只选择Boolean,因为它是一种小数据类型,而且它使代码更易于阅读。IsElement()函数只检查元素是否存在,它不使用您设置的值

您可以将上面的代码封装在一个函数中,并对每个数据库调用一次

根据原始问题中的附加信息附加答案:

这应该不难,只需在代码中添加错误处理

在开始循环浏览文档之前:

On Error Goto errHandler
在获取循环中的下一个文档之前:

nextDocument:
在代码末尾:

    Exit Sub
    errHandler:
    Resume nextDocument
End Sub

试试看。

如果必须处理每个数据库中的所有(或几乎所有)文档,可以使用db.AllDocuments。它比在@All公式中使用db.Search()更有效

如果您想排除某些文档(可能是基于表单名称),我将构建一个要排除的表单列表,然后使用IsElement根据该列表检查正在处理的每个文档

Dim exclude List As Boolean
exclude("FormA")=True
exclude("FormB")=True

Set col = db.AllDocuments
Set doc = col.GetFirstDocument()
Do Until doc Is Nothing
    formname = doc.GetItemValue("Form")(0)
    If IsElement(exclude(formname))=False Then
        Call RemoveEncryption(doc)  '*** Your function to remove encryption
    End If
    Set doc = col.GetNextDocument(doc)
Loop
差不多吧。顺便说一下,您可以将列表创建为任何数据类型。我只选择Boolean,因为它是一种小数据类型,而且它使代码更易于阅读。IsElement()函数只检查元素是否存在,它不使用您设置的值

您可以将上面的代码封装在一个函数中,并对每个数据库调用一次

根据原始问题中的附加信息附加答案:

这应该不难,只需在代码中添加错误处理

在开始循环浏览文档之前:

On Error Goto errHandler
在获取循环中的下一个文档之前:

nextDocument:
在代码末尾:

    Exit Sub
    errHandler:
    Resume nextDocument
End Sub

试试看。

您可以通过从另一个数据库复制视图来创建视图。假设您使用代理在数据库中创建了一个“加密”视图

然后添加一段代码以获取此视图的句柄作为NotesDocument:

Dim dbThis As NotesDatabase 
Dim viewTemplate As NotesView
Dim docView As NotesDocument

Set dbThis = s.currentDatabase
Set viewTemplate = dbThis.getView("Encrypted")
Set docView = dbThis.Getdocumentbyunid(viewTemplate.Universalid)
在代理循环中,测试是否存在加密视图,如果不存在,则复制“视图模板”:

最后,如果您坚持,可以使用类似的过程将代理复制到所有数据库,但对我来说,在一个数据库中运行代理的想法听起来更好

编辑:在完全公开的视图中-当然你可以创建一个视图(我想这是最初的问题)

或者做Torsten建议的一次性dbSearch,带有Richard的良好重新标记-如果你打算多次运行你的代码-比如加密文档是否会被再次创建或重新加密,而不是去查看

我的方法有点过时(早于createView的可用性),如果您需要的不仅仅是选择公式,那么它可以很好地工作,因此您可以预先构建一个复杂的视图以供重用

性能方面:无论您选择使用createView创建视图还是从其他数据库复制或执行dbSearch的任何方法,在构建视图或执行dbSearch时都会有一定的速度减慢。Karl Henry的方法将避免这种搜索/视图构建,但如果没有太多加密文档,则相对较慢

无论您选择哪种方法-这里有一个小提示,以提高性能。让你的循环像这样释放记忆;例如,假设卡尔·亨利的方法:

Dim doc1 as NotesDocument
Set doc = col.GetFirstDocument()
Do Until doc Is Nothing
    Set doc1 = col.GetNextDocument(doc)
    formname = doc.GetItemValue("Form")(0)
    If IsElement(exclude(formname))=False Then
        Call RemoveEncryption(doc)  '*** Your function to remove encryption
    End If
    ' releasing memory when processing thousands of documents improves performance and avoids crashes
    Delete doc
    Set doc = doc1
Loop
现在再次说明,由于您只讨论了20多个数据库的迁移(所以是一次性的),t