1. 程式人生 > >23. 在LotusScript中利用檢視的合計功能求和

23. 在LotusScript中利用檢視的合計功能求和

在關係型資料庫中,我們可以使用SQL語言中的SUM函式對某一列的結果求和。Notes因為基於的是非結構化的資料模型,動態地查詢文件集合,獲取它們的域值並且進行求和之類的運算,成本很高,效能會很差;所以Notes採取的是給靜態的檢視按需更新索引的方式。在檢視的列上,也提供了合計的功能。但是我們有時需要在程式裡獲取某個域值的加和。如果通過遍歷一個DocumentCollection或EntryCollection來手工加和,效率很低。我們可不可以在LotusScript裡利用檢視的合計功能呢?

檢視的合計值顯示在不同於一般文件的合計行上,因此不能通過View.GetFirstEntry之類的方法獲得。幸好Notes為我們提供了可以獲得包括分類、合計在內的各種ViewEntry的ViewNavigator。它有各種各樣的方法,可以在檢視的樹型結構中前進後退、上升下降,查詢和獲得我們需要的Entry,最後獲得合計列上的值。

%REM
	Function GetTotal
	Description: Use a viewNavigator to get the total number of a matched category
	Return the total number in a variant
%END REM
Public Function GetTotal(viewName As String, keys As Variant, colNum As Integer, dbPath As String)As Variant
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim result As Variant
	If (dbPath="") Then
		Set db=s.Currentdatabase
	Else
		Set db=s.Getdatabase(s.Currentdatabase.Server, dbPath)
	End If
	If Not db.Isopen Then
		Exit Function
	End If
	Dim view As NotesView
	Set view=db.Getview(viewName)
	Dim nav As NotesViewNavigator
	Set nav=view.Createviewnav()
	
	Dim entry As NotesViewEntry
	Set entry=view.Getentrybykey(keys, True )
	If entry Is Nothing Then Exit Function 
	
	Dim entryCat As NotesViewEntry
	Set entryCat=nav.Getprevcategory(entry)
	GetTotal=entryCat.Columnvalues(colNum)
End Function

函式接受的引數分別是要查詢的檢視名、關鍵字、合計所在的列的序號(從零開始)和資料庫路徑(如果不是當前資料庫)。