我真的很喜歡理查德的解決方案,但是我最近實現了一個我喜歡到目前爲止的推導。基本上,將來自每個文檔的元數據放入一個單獨的數據庫中,這是您的「索引」,當他們打開索引文檔時,它會在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。如果你這樣做,你會有一段糟糕的時光。 –
西蒙是對的。不要這樣做! –
我知道,這就是爲什麼我問的問題 –