Lotus Notes中文档查询的研究与实践
一、引言
近几年,网络技术得到飞速的发展,由此带动其它领域的相应快速发展,如WWW技术、办公自动化技术等,这些技术把以计算机网络为传输手段的信息交换技术大大向前推进一步,使人们收集、传输和共享信息的方式更加丰富多彩,由此对信息存储、共享和检索技术的要求进一步提高。
Lotus Notes/Domino是一种基于Internet/Intranet技术为构架的群件系统,它的主要功能是为各种不同类型的企业构造其Intranet提供全面的解决方案,是构造企业信息网主要工具之一。它的核心包括文档管理技术、邮件系统、文件检索技术、Web技术和复制技术,这些技术代表了当今信息领域的主流技术。LotusNotes/Domino还能使系统同时具有Client/Server和Browser/Server双重结构,使它更具生命力。信息检索技术作为 LotusNotes/Domino的一个主要技术,为用户提供了包括全文检索、按关键字查询、视图和文件夹等多种方式, 本文结合在实际开发中的经验体会,对Notes应用中文档查询进行讨论。
二、文档的查询
在LotusNotes中,信息是以文档的形式保存在数据库中的,文档是以非结构的形式存放的,一个文档相当于关系型数据库中的一个记录。 在NOTES应用中我们经常要编写许多类似于传统数据库应用程序开发系统中的查询和报告, 以便把用户所关心的信息展现出来.主要有以下几种方式:
1. 视图
视图是 LotusNotes中文档的主要浏览窗口,每一视图都包含符合一定条件的文档。当一个视图的选择条件给定以后,通过该视图所看到的文档就是符合条件的文档,如某一视图的选择条件为:Select form="请假单"; 则打开该视图后,我们所看到的文档都是请假单。视图除了有选择条件外,还可以按不同的特性将文档进行分类和排序,使得我们可以及其快捷地导航到要查找的文档。对于简单的查询,可以不编写任何程序,而通过把视图按合理的方式进行分类和排序就可以了。
Notes视图设计是应用程序设计过程中较快的一步.如果数据库第一次就设计正确,拥有在正确文档中可用的全部必需的字段,那么设计视图应是一个容易的过程,且对用户来说是直观的,可打印输出屏幕上显示的视图.
2. 文件夹
文件夹也是文档的浏览窗口之一,但是和视图不同的是,文件夹没有选择条件,它里面的文档是通过Putinfolder来方进的,必须通过RemoveFromFolder来将其中的文档移开(注意,移开不是删除).
3. 全文检索
全文检索是 LotusNotes提供的基于数据库全文索引的搜索工具,它能根据给定的检索关键字在整个数据库中搜索,并把搜索结果显示在该视图的顶端。
4. 按关键字查询
好的查询设计应是对用户的查询给于准确快速的响应,准确,灵活地显示用户所需的数据.为满足用户多条件的组合查询,开发人员一般为用户设计一种"按关键字查询"方式,需要写编程序使用户可以输入一个或多个查询条件进行组合条件查询,找满足条件的文档.但是由于NOTES无法直接显示结果,一般的解决方法是:将查询结果存放到文件夹中,最后,打开文件夹显示查询结果。
三、文件夹方式存在的缺陷及解决方法
由于LotusNotes的文档是可以共享的,文件夹也可以共享,也就是说,你可以用这个文件夹来存放你的检索结果,我也可以用这个文件夹来存放我的查询结果,而且LotusNotes应该保证互相不冲突。然而遗憾的是,LotusNotes不作这个保证,导致的结果是大家互相影响,产生存取冲突。
解决问题的方法:
1、建立私有文件夹
所谓私有文件夹,是指文件夹属于一人私有,其他人看不见这个文件夹。可以通过创建一个"启动后私有"文件夹,每个用户使用该文件夹后,系统立即根据这个启动后私有文件夹创建一个新的属于该用户的文件夹。这样,每个用户都有一个结构完全相同而且互相不干扰的文件夹。
这种解决方法保证冲突不会产生,但系统为每个用户保存一个文件夹,会导致系统维护上的困难。如果系统的用户太多,情况会更坏。如果用户注销,它的私有文件夹不会自动删除。
2、改进的视图方法
视图一般是大家共享的,我们可以通过改进视图的选择条件,将视图作为我们存储查询结果的地方,就能避免文件夹方式产生的问题.我们提出解决问题的思路是: 把满足某一用户查询条件的文档作选择标记; 创建一个共享视图,用视图选择公式来显示该用户的查询结果;显示或打印完成后,删除选择标记.需要说明的是:这种方法查询的速度会慢一些.具体实现方法如下:
(1) 在要查询的数据库文档表单上创建一个可编辑多值的隐含域"SelectedUserName"
用于存放查询该文档的用户名.
(2) 创建一个共享视图vwSelect,视图公式为:
SELECT Form = "frmFormName" & @Contains(SelectedUserName;@UserName)
用于显示该用户查到的文档
(3) 创建一个显示视图的导航器"nvgQueryResult",其初始视图为vwSelect.
(4) 用Sript语言,利用FTSearch函数进行组合条件查询,查找满足条件的文档.
程序流程如下:
图1
编程实现
(1) 查询显示
功能:完成按关键字条件查询,显示查询结果.
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim view As NotesView
Set db = session.CurrentDatabase
itemvalues=item1.values
Condition=itemvalues(0)
For i=Lbound(itemvalues)+1 to Ubound(itemvalues)
Condition=Condition+itemvalues(i) '记载用户输入的全部查询条件
Next
Count=view.FTSearch(Condition,0)'完成全文查找
If count〈〉0 Then
Messagebox"本数据库中共有:"+Str(Count) + "个记录满足条件!",0+64,"提示信息"
For j=1 To count
Set doc=dc.getnthdocument(j)
Set item = doc.GetFirstItem( "SelectedUserName" )
Call item.AppendToTextList( session.UserName ) '在域SelectedUserName中
Call doc.Save( True, True )'追加用户名
Next
ServerName = session.GetEnvironmentString("ServerName")
DirName = session.GetEnvironmentString("DirectionName")
DatabaseName=DirName+"DBName.nsf"
'打开导航器调用视图,即显示查询结果
Call workspace.OpenDatabase ( ServerName,DatabaseName,"nvgQueryResult" )
Else
Messagebox "没有满足条件的记录!",0 +48,"提示信息:"
End If
end
(2) 退出显示
功能:清除用户的选择标记
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim view As NotesView
Set db = session.CurrentDatabase
' ViewName = session.GetEnvironmentString("envViewNa")
Set view = db.GetView(vwSelect)
Set doc = view.GetFirstDocument
UserName=session.UserName '取现用户名到变量:UserName
While Not (doc Is Nothing )
TempValue=doc.SelectedUserName '清除文档域"SelectedUserName"中
doc.SelectedUserName="" '自己的用户名;
Call doc.save(True,False) '同时保留其他用户的用户名.
Set item=doc.getfirstitem("SelectedUserName")
Forall x In TempValue
If x〈〉 UserName Then
Call item.AppendToTextList(x )
Call doc.save(True,False)
End If
End Forall
Set doc = view.GetFirstDocument
Wend
end
主要技术要点:
以上应用设计主要运用了以下技术要点来保证显示结果的准确性和数据的共享性.
(1) 要查询的数据库文档表单上创建的可编辑多值的隐含域"SelectedUserName" .
域是构成表单的重要元素,对一个NOTES数据库来说,外部数据的录入要通过域, 库 内存放数据显示也要依靠域.我们这里创建域"SelectedUserName"的作用是:存放查询该文档的用户名作为选择标志.
选择标志的确定:
使用用户名作为选择标志主要因为在Notes中用户名是唯一的,不同的用户有不同的用户名,不会存在两个相同的用户名.这样,该域记住了有哪几个不同用户查询选择了此文档.为用视图显示文档做准备.
域的主要属性是:
可编辑:数据可以通过按钮执行Formulas或Script来产生.
隐含的:只作存储,没有显示作用.显示文档时不显示该域的数据准许多值:准许用户存入多个值,保证该域记录下选择该文档所有的用户名.因为在共享数据状态下,同一个文档同时可被多个用户查询选择,你必须记住所有选择该文档的用户名.这一点对于多用户下显示数据十分重要.
(2) 视图及视图选择公式:
我们设计了一个共享视图vwSelect,视图公式为:
SELECT @Contains(SelectedUserName;@UserName)
视图功能:显示所有域SelectedUserName中含有当前的用户名的文档.
@UserName:返回当前的用户名;
@Contains(SelectedUserName;@UserName): 用于判断是否文档域SelectedUserName中含有当前的用户名; 因为在查询时,那些满足条件文档的域"SelectedUserName"中已被加入了用户名作为选择标志,所以该视图选择显示那些域SELECTEDUSERNAME中包含用户名的文档.
在视图的设计时,使用"打开后废弃索引"选项。
四、小结
综上所述,LousNotes为查询应用程序开发提供了灵活快速的环境,本文所述的几种方式都能实现对数据文档的查询检索,但是,它们的实现方法和满足的目的要求不尽相同.尽管还有不足之出需要完善, 但是仍然说明了一些能结合到你的应用程序中去的Notes技术,同时,我们必须清醒地认识到它与传统关系型数据库应用程序开发系统有很大的差别,查询设计有其独特的方式,一个应用程序能很快地被设计出来并且达到可用状态.试图将传统的应用程序开发技术映射到Notes环境中的开发人员,将很难获得Notes应用程序的优点.
近几年,网络技术得到飞速的发展,由此带动其它领域的相应快速发展,如WWW技术、办公自动化技术等,这些技术把以计算机网络为传输手段的信息交换技术大大向前推进一步,使人们收集、传输和共享信息的方式更加丰富多彩,由此对信息存储、共享和检索技术的要求进一步提高。
Lotus Notes/Domino是一种基于Internet/Intranet技术为构架的群件系统,它的主要功能是为各种不同类型的企业构造其Intranet提供全面的解决方案,是构造企业信息网主要工具之一。它的核心包括文档管理技术、邮件系统、文件检索技术、Web技术和复制技术,这些技术代表了当今信息领域的主流技术。LotusNotes/Domino还能使系统同时具有Client/Server和Browser/Server双重结构,使它更具生命力。信息检索技术作为 LotusNotes/Domino的一个主要技术,为用户提供了包括全文检索、按关键字查询、视图和文件夹等多种方式, 本文结合在实际开发中的经验体会,对Notes应用中文档查询进行讨论。
二、文档的查询
在LotusNotes中,信息是以文档的形式保存在数据库中的,文档是以非结构的形式存放的,一个文档相当于关系型数据库中的一个记录。 在NOTES应用中我们经常要编写许多类似于传统数据库应用程序开发系统中的查询和报告, 以便把用户所关心的信息展现出来.主要有以下几种方式:
1. 视图
视图是 LotusNotes中文档的主要浏览窗口,每一视图都包含符合一定条件的文档。当一个视图的选择条件给定以后,通过该视图所看到的文档就是符合条件的文档,如某一视图的选择条件为:Select form="请假单"; 则打开该视图后,我们所看到的文档都是请假单。视图除了有选择条件外,还可以按不同的特性将文档进行分类和排序,使得我们可以及其快捷地导航到要查找的文档。对于简单的查询,可以不编写任何程序,而通过把视图按合理的方式进行分类和排序就可以了。
Notes视图设计是应用程序设计过程中较快的一步.如果数据库第一次就设计正确,拥有在正确文档中可用的全部必需的字段,那么设计视图应是一个容易的过程,且对用户来说是直观的,可打印输出屏幕上显示的视图.
2. 文件夹
文件夹也是文档的浏览窗口之一,但是和视图不同的是,文件夹没有选择条件,它里面的文档是通过Putinfolder来方进的,必须通过RemoveFromFolder来将其中的文档移开(注意,移开不是删除).
3. 全文检索
全文检索是 LotusNotes提供的基于数据库全文索引的搜索工具,它能根据给定的检索关键字在整个数据库中搜索,并把搜索结果显示在该视图的顶端。
4. 按关键字查询
好的查询设计应是对用户的查询给于准确快速的响应,准确,灵活地显示用户所需的数据.为满足用户多条件的组合查询,开发人员一般为用户设计一种"按关键字查询"方式,需要写编程序使用户可以输入一个或多个查询条件进行组合条件查询,找满足条件的文档.但是由于NOTES无法直接显示结果,一般的解决方法是:将查询结果存放到文件夹中,最后,打开文件夹显示查询结果。
三、文件夹方式存在的缺陷及解决方法
由于LotusNotes的文档是可以共享的,文件夹也可以共享,也就是说,你可以用这个文件夹来存放你的检索结果,我也可以用这个文件夹来存放我的查询结果,而且LotusNotes应该保证互相不冲突。然而遗憾的是,LotusNotes不作这个保证,导致的结果是大家互相影响,产生存取冲突。
解决问题的方法:
1、建立私有文件夹
所谓私有文件夹,是指文件夹属于一人私有,其他人看不见这个文件夹。可以通过创建一个"启动后私有"文件夹,每个用户使用该文件夹后,系统立即根据这个启动后私有文件夹创建一个新的属于该用户的文件夹。这样,每个用户都有一个结构完全相同而且互相不干扰的文件夹。
这种解决方法保证冲突不会产生,但系统为每个用户保存一个文件夹,会导致系统维护上的困难。如果系统的用户太多,情况会更坏。如果用户注销,它的私有文件夹不会自动删除。
2、改进的视图方法
视图一般是大家共享的,我们可以通过改进视图的选择条件,将视图作为我们存储查询结果的地方,就能避免文件夹方式产生的问题.我们提出解决问题的思路是: 把满足某一用户查询条件的文档作选择标记; 创建一个共享视图,用视图选择公式来显示该用户的查询结果;显示或打印完成后,删除选择标记.需要说明的是:这种方法查询的速度会慢一些.具体实现方法如下:
(1) 在要查询的数据库文档表单上创建一个可编辑多值的隐含域"SelectedUserName"
用于存放查询该文档的用户名.
(2) 创建一个共享视图vwSelect,视图公式为:
SELECT Form = "frmFormName" & @Contains(SelectedUserName;@UserName)
用于显示该用户查到的文档
(3) 创建一个显示视图的导航器"nvgQueryResult",其初始视图为vwSelect.
(4) 用Sript语言,利用FTSearch函数进行组合条件查询,查找满足条件的文档.
程序流程如下:
图1
编程实现
(1) 查询显示
功能:完成按关键字条件查询,显示查询结果.
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim view As NotesView
Set db = session.CurrentDatabase
itemvalues=item1.values
Condition=itemvalues(0)
For i=Lbound(itemvalues)+1 to Ubound(itemvalues)
Condition=Condition+itemvalues(i) '记载用户输入的全部查询条件
Next
Count=view.FTSearch(Condition,0)'完成全文查找
If count〈〉0 Then
Messagebox"本数据库中共有:"+Str(Count) + "个记录满足条件!",0+64,"提示信息"
For j=1 To count
Set doc=dc.getnthdocument(j)
Set item = doc.GetFirstItem( "SelectedUserName" )
Call item.AppendToTextList( session.UserName ) '在域SelectedUserName中
Call doc.Save( True, True )'追加用户名
Next
ServerName = session.GetEnvironmentString("ServerName")
DirName = session.GetEnvironmentString("DirectionName")
DatabaseName=DirName+"DBName.nsf"
'打开导航器调用视图,即显示查询结果
Call workspace.OpenDatabase ( ServerName,DatabaseName,"nvgQueryResult" )
Else
Messagebox "没有满足条件的记录!",0 +48,"提示信息:"
End If
end
(2) 退出显示
功能:清除用户的选择标记
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim view As NotesView
Set db = session.CurrentDatabase
' ViewName = session.GetEnvironmentString("envViewNa")
Set view = db.GetView(vwSelect)
Set doc = view.GetFirstDocument
UserName=session.UserName '取现用户名到变量:UserName
While Not (doc Is Nothing )
TempValue=doc.SelectedUserName '清除文档域"SelectedUserName"中
doc.SelectedUserName="" '自己的用户名;
Call doc.save(True,False) '同时保留其他用户的用户名.
Set item=doc.getfirstitem("SelectedUserName")
Forall x In TempValue
If x〈〉 UserName Then
Call item.AppendToTextList(x )
Call doc.save(True,False)
End If
End Forall
Set doc = view.GetFirstDocument
Wend
end
主要技术要点:
以上应用设计主要运用了以下技术要点来保证显示结果的准确性和数据的共享性.
(1) 要查询的数据库文档表单上创建的可编辑多值的隐含域"SelectedUserName" .
域是构成表单的重要元素,对一个NOTES数据库来说,外部数据的录入要通过域, 库 内存放数据显示也要依靠域.我们这里创建域"SelectedUserName"的作用是:存放查询该文档的用户名作为选择标志.
选择标志的确定:
使用用户名作为选择标志主要因为在Notes中用户名是唯一的,不同的用户有不同的用户名,不会存在两个相同的用户名.这样,该域记住了有哪几个不同用户查询选择了此文档.为用视图显示文档做准备.
域的主要属性是:
可编辑:数据可以通过按钮执行Formulas或Script来产生.
隐含的:只作存储,没有显示作用.显示文档时不显示该域的数据准许多值:准许用户存入多个值,保证该域记录下选择该文档所有的用户名.因为在共享数据状态下,同一个文档同时可被多个用户查询选择,你必须记住所有选择该文档的用户名.这一点对于多用户下显示数据十分重要.
(2) 视图及视图选择公式:
我们设计了一个共享视图vwSelect,视图公式为:
SELECT @Contains(SelectedUserName;@UserName)
视图功能:显示所有域SelectedUserName中含有当前的用户名的文档.
@UserName:返回当前的用户名;
@Contains(SelectedUserName;@UserName): 用于判断是否文档域SelectedUserName中含有当前的用户名; 因为在查询时,那些满足条件文档的域"SelectedUserName"中已被加入了用户名作为选择标志,所以该视图选择显示那些域SELECTEDUSERNAME中包含用户名的文档.
在视图的设计时,使用"打开后废弃索引"选项。
四、小结
综上所述,LousNotes为查询应用程序开发提供了灵活快速的环境,本文所述的几种方式都能实现对数据文档的查询检索,但是,它们的实现方法和满足的目的要求不尽相同.尽管还有不足之出需要完善, 但是仍然说明了一些能结合到你的应用程序中去的Notes技术,同时,我们必须清醒地认识到它与传统关系型数据库应用程序开发系统有很大的差别,查询设计有其独特的方式,一个应用程序能很快地被设计出来并且达到可用状态.试图将传统的应用程序开发技术映射到Notes环境中的开发人员,将很难获得Notes应用程序的优点.