我真的很喜欢理查德的解决方案,但是我最近实现了一个我喜欢到目前为止的推导。基本上,将来自每个文档的元数据放入一个单独的数据库中,这是您的“索引”,当他们打开索引文档时,它会在alldocs.nsf中打开文档(并关闭索引文档)。
为此,请在alldocs.nsf中编写一个代理程序,以便在文档被修改或保存时创建索引文档。它应该只复制想要用于索引的字段(元数据)。示例代码要做到这一点(不包括子例程或函数调用)从我复制事件主剂:
Sub Initialize
Dim session As New NotesSession
Dim maindb As NotesDatabase ' Main SIR
Dim mainincidents As NotesView ' view in Main SIR
Dim maindoc As NotesDocument ' document in Main SIR
Dim projectdoc, nextprojectdoc As NotesDocument ' document in this database
Dim ndc As NotesDocumentCollection ' unprocessed documents in this database
Dim fieldItem As NotesItem
Dim reportnumber, value, formtype As Variant
Dim fieldsToCopy (10) As String
Dim reason As String
On Error GoTo errorhandler
Call StartAgentLogging (session)
Set thisdb = session.Currentdatabase
' find all unstamped documents
Set ndc = thisdb.Unprocesseddocuments
If ndc.Count = 0 Then
Call agentLog.LogAction ("No incidents to process")
Exit Sub
End If
maindbfilepath = DetermineKeyword("MAINSIR")
Set maindb = session.Getdatabase("","")
Call maindb.Open("", maindbfilepath)
If Not maindb.Isopen Then
reason = "Main Security database could not be found at " & maindbfilepath
Call agentLog.LogAction (reason)
MessageBox reason, 16, "Error"
Exit Sub
End If
Set mainincidents = maindb.Getview("(Incidents for Upload)")
Set projectdoc = ndc.Getfirstdocument()
fieldsToCopy (0) = "ReportType"
fieldsToCopy (1) = "ReportNumber"
fieldsToCopy (2) = "ReportDate"
fieldsToCopy (3) = "IncidentDate"
fieldsToCopy (4) = "ProjectName"
fieldsToCopy (5) = "ProjectCountry"
fieldsToCopy (6) = "ProjectLocation"
fieldsToCopy (7) = "ReporterName"
fieldsToCopy (8) = "ReporterPhone"
fieldsToCopy (9) = "ReporterEmail"
fieldsToCopy (10) = "Appointment"
While Not projectdoc Is Nothing
formtype = projectdoc.GetItemValue ("Form")
If formtype(0) = "Incident" Then
' check to see if that exists in the main SIR
reportnumber = projectdoc.GetItemValue("ReportNumber")
Call agentLog.LogAction ("Checking " & reportnumber(0))
Set maindoc = mainincidents.GetDocumentByKey(reportnumber(0), True)
Call agentLog.LogAction ("Accessing " & reportnumber(0))
If maindoc Is Nothing Then
Call agentLog.LogAction ("Main does not contain " & reportnumber(0) & " creating new document.")
' if not, create new document
Set maindoc = maindb.Createdocument()
maindoc.Form = "Incident"
ForAll fieldname In fieldsToCopy
Call agentLog.LogAction ("Field name: " & fieldname)
Set fieldItem = projectdoc.Getfirstitem(fieldname)
Call maindoc.Copyitem(fieldItem, fieldname)
End ForAll
Call maindoc.Save(True, False)
Call CreateNotice (maindoc)
Else
Call agentLog.LogAction ("Main contains " & reportnumber(0) & " updating document.")
' if it does, update data
ForAll fieldname In fieldsToCopy
Call agentLog.LogAction ("Field name: " & fieldname)
value = projectdoc.GetItemValue(fieldname)
Call maindoc.ReplaceItemValue(fieldname, value(0))
End ForAll
End If
'Path and filename
Call maindoc.Replaceitemvalue("Path", thisdb.Filepath)
Call maindoc.Save(True, False)
Call agentLog.LogAction ("Saved " & reportnumber(0))
Else
Call agentLog.LogAction ("Project form is " & projectdoc.Form(0))
End If
' stamp document as processed
Set nextprojectdoc = ndc.GetNextDocument(projectdoc)
Call session.Updateprocesseddoc(projectdoc)
Set projectdoc = nextprojectdoc
Wend
exiting:
Exit Sub
errorhandler:' report all errors in a messagebox
reason = "Error #" & CStr (Err) & " (" & Error & ") when creating incident in Main database, on line " & CStr (Erl)
Call agentLog.LogAction (reason)
MessageBox reason, 16, "Error"
Resume exiting
End Sub
然后,你需要添加代码到索引形式的onload事件在索引数据库。我把它放在一个由ToolsRunMacro调用的代理中,但你可以直接放入它。这是我的打开项目复制剂。现在
Sub Initialize
' this button opens the incident report in the project database
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim reportdb As NotesDatabase
Dim view As NotesView
Dim uidoc As NotesUIDocument
Dim thisdoc, reportdoc As NotesDocument
Dim filepath, reportnumber As Variant
Dim baseurl, opener, unid As String
Call StartAgentLogging (session)
Set thisdb = session.Currentdatabase
Set uidoc = ws.CurrentDocument
Set thisdoc = uidoc.Document
filepath = thisdoc.GetItemValue ("Path")
reportnumber = thisdoc.GetItemValue ("ReportNumber")
Set reportdb = session.GetDatabase (thisdb.Server, filepath (0), False)
If reportdb Is Nothing Then
MessageBox ("Could not find Project Security Incident Report database" & Chr$(10) & thisdb.Server & "\" & filepath(0))
Call agentLog.LogAction ("Could not find Project Security Incident Report database" & Chr$(10) & thisdb.Server & "\" & filepath(0))
Exit Sub
End If
If Not reportdb.Isopen Then
Call reportdb.Open(thisdb.Server, filepath (0))
End If
Set view = reportdb.GetView ("Incidents")
Set reportdoc = view.GetDocumentByKey (reportnumber(0))
If reportdoc Is Nothing Then
MessageBox ("Could not find Report #" & reportnumber(0))
Call agentLog.LogAction ("Could not find Report #" & reportnumber(0))
Exit Sub
End If
Call uidoc.Close
unid = reportdoc.UniversalID
baseurl = reportdb.NotesURL
opener = Left$ (baseurl, InStr (baseurl, "?") -1) & "/Incidents/" & unid & "?OpenDocument"
Call ws.URLOpen (opener)
Call agentLog.LogAction ("Opened Report #" & reportnumber(0))
End Sub
,你可能会限制索引数据库只针对文件最近一年或者看看它是如何工作的,当所有的文件都在里面。很大程度上取决于您需要在视图中提供多少数据。
在我的情况,索引数据库包含来自多个数据库中的文档索引文件,并作为“全数据”数据库中心接入点。它仍在测试中,所以我不确定它对我的工作有多好,但我认为我会为您提供它。
你不能有两个数据库服务器上有相同的副本ID。如果你这样做,你会有一段糟糕的时光。 –
西蒙是对的。不要这样做! –
我知道,这就是为什么我问的问题 –