【IT168 技术】 Lotus Notes4.5是一个很好的群件工作平台,它拥有集成的客户服务器信息环境、便于使用、可移动性、应用的开发能力和编程能力、适应于企业级的管理和与互联网络的集成等性能,并且它有很好的电子邮件系统,领先的全文检索和复制功能。它还具有极强的安全机制,可以可靠地保证信息安全性。但它必竟是国外公司的产品,在实际应用开发中,我们经常会碰到系统所实现的操作流程、数据形式等与现实的应用有很大的距离,特别是那些不符合实际习惯的一些人机界面。而LotusNotes所提供的开发工具又由于其本身功能模块或宏命令函数已封装,呈半封闭或完全封闭形式,使得实际应用常常不尽人意。本文要简述的定制通讯录数据库就是这类问题的一个实例。
一、Lotus Notes的通讯录数据库
LotusNotes工作平台在系统安装时提供两个通讯录数据库(Names.nsf):公共通讯录和个人通讯录。公共通讯录数据库是由Notes服务器提供,个人通讯录数据库是安装在Notes客户端。
1、通讯录数据库数据来源
公共通讯录数据库的数据主要来自LotusNotes系统安装配置和用户注册等过程;而个人通讯录数据库的数据来源主要有个:一是来自客户端安装配置和用户注册等过程,二是从公共通讯录数据库中拷贝。
2、通讯录数据库数据形式
通讯录数据库的一些表单、视图不符合我们的习惯,如个人表单中有关人的姓名,它提供“FirstName”(名)、“MiddleInitial”(中间名)、“LastName”(姓)这样的域,这不符合中国姓名格式。
再者,数据库采用简单的按照英文字母或Soundex码(Notes语音拼写)等排列方法,这又与我们通常使用的按姓氏笔画、部门分类、职位大小排列方法不同。
其中最明显的是,在用地址对话框选择姓名或地址数据类型的域值时系统只是简单地提供选值,没有分类,在众多的用户地址中选择甚感不便。地址选择对话框如下图(姓名选择对话框也类似)。
3、开发中的问题
由于许多OA系统应用单位的需求很实际,如符合用户习惯的数据格式,需对某些数据进行分类、排序等,而分类、排序的准则又是按行规、业务关系确定的,没有也无法套用现成的算法或模板。并且LotusNotes的系统配置、用户注册等过程是封闭的,部分模块又封装成宏。因此,实际开发中无法或很困难对这些功能模块或宏命令函数进行定制。经过摸索,我们设计了一个折中的方案,即避开封闭的系统功能或过程,对提供数据的Notes数据库或数据格式进行定制。
二、定制Lotus Notes通讯录数据库的原理
Lotus Notes并不建议对通讯录数据库进行定制,特别是对公用通讯录数据库,因为公用通讯录对于Notes的正常运行是非常重要的。它包含了控制功能的重要信息,如邮件、服务器程序、存取控制等。它也为服务器任务提供了用来确定连接、邮件发送和Notes系统配置的方法。虽然如此,系统没有规定不允许定制,只是对定制通讯录制定了以下原则:
隐藏视图不要改变视图名称、选择公式、列公式或缺省视图的列位置。不要插入或删除列。
新的隐藏视图可以增加新的隐藏视图。然而,新的隐藏视图可能会对通讯录和服务器的执行产生不利的影响。
可见视图可以改变任意的可见视图。然而在替换或刷新设计时,对可见视图所做的改变可能会丢失。
域不要改变缺省模板中的域。不要改变公式、数据类型、多值设定和关键字选择。可以改变域的格式,如字体、大小、颜色等。
新增的域可以在现存的表单中增加新的域。
表单名称不要改变缺省表单的名称。
新表单可以创建新表单。
图标和存取控制表可以改变图标和存取控制表。
在遵循以上原则的基础上,我们可以对系统通讯录数据库的表单、视图等进行定制。
三、定制Lotus Notes通讯录数据库的方法
由于个人通讯录数据库定制与公用通讯录数据库定制类似,并且公用通讯录较个人通讯录复杂,因此本文以定制公用通讯录为例。
1、定制表单
对通讯录中部分表单的域进行调整,隐去(不能删除)没有实际意义的域,添加新域。如个人表单中的“MiddleInitial”(中间名)和“FirstName”(名)域可以隐去;保留“LastName”(姓)域,因为该域值必录;添加“Categories”(分类)和“Code)”(代码)域,当然也可以添加其它域。
对部分表单的提示文本进行调整,这基本不受限制。
比较一下定制前后的表单(部分):
原有个人表单:定制后个人表单:
表单中代码是由系统分类代码(2位)、单位代码(3位)、部门代码(2位)和部门内部顺序码(3位)组成。新增域“Categories”根据“Code”域值在Notes文档的Querysave事件发生时自动确定域值,这用LotusScript实现,具体程序如下:
‘定义Notes类对象和部分全局变量
Dim session As NotesSession
Dim db As NotesDatabase
Dim workspace As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim orgcode As String
Dim txtname As String
‘文档Querysave事件发生时运行的过程
Sub Querysave(Source As
Notesuidocument, Continue As Variant)
Dim codelenth As Integer ’代码长度变量
Dim codename As String ‘代码域值变量
Dim Categorytxt As String ’分类域值变量
Set workspace=New NotesUIWorkspace
Set session=New NotesSession
Set db=session.CurrentDatabase
Set uidoc=workspace.CurrentDocument
codename=uidoc.FieldGetText(“Code”)
‘取得Code域值
codelenth=Len(codename)
If codelenth=0 Then Exit Sub
Select Case codelenth
Case 10 ’当代码长度为10位,该用户为个人用户
orgcode=Left(codename,7)
viewname=“($Department)”
‘根据视图($Department)确定部门
CodeProcess ’调用分类过程
Categorytxt=“(”+Right(orgcode,2)+“)”+txtname
orgcode=Left(codename,5)
viewname=“($Company)”