技术开发 频道

定制Lotus Notes的通讯录的高级技巧

   【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)”

  ‘根据视图($Company)确定单位

  CodeProcess ’调用分类过程

  Categorytxt=“(”+Right(orgcode,3)

  +“)”+txtname+“\”+Categorytxt

  orgcode=Left(codename,2)

  viewname=“($Organize)”

  ‘根据视图($Organize)确定系统

  CodeProcess ’调用分类过程

  Categorytxt=“(”+orgcode+“)”+txtname+

  “\”+Categorytxt

  Case 7

  orgcode=Left(codename,5)

  viewname=“($Company)”

  ‘根据视图($Company)确定单位

  CodeProcess ’调用分类过程

  Categorytxt=“(”+Right(orgcode,3)

  +“)”+txtname+“\”+Categorytxt

  orgcode=Left(codename,2)

  viewname=“($Organize)”

  ‘根据视图($Organize)确定系统

  CodeProcess ’调用分类过程

  Categorytxt=“(”+orgcode+“)”+txtname+

  “\”+Categorytxt

  Case 5

  orgcode=Left(codename,2)

  viewname=“($Organize)”

  ‘根据视图($Organize)确定系统

  CodeProcess ’调用分类过程

  Categorytxt=“(”+orgcode+“)”+txtname+

  “\”+Categorytxt

  Case Else

  orgcode=codename

  viewname=“($Organize)”

  ‘根据视图($Organize)确定系统

  CodeProcess ’调用分类过程

  Categorytxt=“(”+orgcode+“)”+txtname+

  “\”+Categorytxt

  Messagebox “这是一个组织类型的用户!”

  End Select

  Call uidoc.FieldSetText(“Categories”,

  Categorytxt)

  ‘确定Categories域值

  End Sub

  ’确定系统、单位、部门分类

  Sub CodeProcess

  Dim doc As NotesDocument

  Dim view As NotesView

  Dim item As NOTESITEM

  Dim found As Integer

  Dim prgcode As String

  Set view=db.GetView(viewname)

  Set doc=view.GetFirstDocument

  txtname=“”

  found=False

  ‘根据Code域值确定分类名称

  Do Until doc Is Nothing Or found

  Set item=doc.GETFIRSTITEM(“Code”)

  prgcode=item.Text

  If prgcode=orgcode Then

  Set item=doc.GETFIRSTITEM(“ListName”)

  txtname=“(”+orgcode+“)”+item.text

  found=True

  End If

  Set doc=view.GetNextDocument(doc)

  Loop

  End Sub

  2、定制视图

  定制视图主要是对地址对话框数据来源--通讯录中的视图($People Groups Flat)和($People Groups Hier)进行定制。

  首先将($PeopleGroupsFlat)视图中首列的列公式改为“Categories”,并设置其排列属性为“升序”“分类”。再在视图中追加新列,列公式为“Code”,并为“升序”排列。

  同样对视图($PeopleGroupsHier)中首列的列公式改为“Categories”,并设置其排列属性为“升序”“分类”。再在视图中追加新列,列公式为“Code”,并为“升序”排列。经这样定制后,地址对话框的界面就基本达到设计目的:

  3、更换公用通讯录设计

  定制完成后,在桌面上单击公用通讯录,选择“文件/数据库/更换设计”。在更换设计提示窗口单击“显示高级模板”,选择定制公用通讯录模板,选择“继承未来的设计变化”复选框,然后单击“更换”。完成该操作以后,系统中使用的就是定制的公用通讯录了。

  四、定制通讯录模板的几点说明

  首先应对原通讯录数据库作好备份,以防操作后有意外发生。定制通讯录绝对不能直接对通讯录数据库进行操作,也不能对系统原有的缺省模板进行改动,定制时要创建通讯录模板的新拷贝,可以为模板拷贝取一个与单位相关的名称,如SWBNAME.NTF。

  定制之前,先查阅一下定制规则。本文中定制视图中提及的对原有两个视图($PeopleGroupsFlat)和($PeopleGroupsHier)进行定制是实现实际界面的关键。虽已突破了定制规则,但经反复比较测试,这一改动没有影响系统运行,属可行性方案。

  本文只简述了定制通讯录数据库的几个主要过程,对其它功能部件的定制,在遵循定制原则前提,可根据实际设计要求利用LotusNotes开发平台实现。

  本文介绍的方法已在实际办公自动化应用(OA)系统得到应用,运行环境为:

  服务器端:中文Windows NT4.0,Lotus Notes Domino Server 4.5

  客户端:中文Windows 95,Lotus Notes Client 4.5

0
相关文章