在关系型数据库中,我们可以使用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
函数接受的参数分别是要查询的视图名、关键字、合计所在的列的序号(从零开始)和数据库路径(如果不是当前数据库)。