现在的位置: 首页 > 综合 > 正文

23. 在LotusScript中利用视图的合计功能求和

2013年11月17日 ⁄ 综合 ⁄ 共 1186字 ⁄ 字号 评论关闭

在关系型数据库中,我们可以使用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

函数接受的参数分别是要查询的视图名、关键字、合计所在的列的序号(从零开始)和数据库路径(如果不是当前数据库)。

抱歉!评论已关闭.