【IT168技术文档】Lotus Notes 是 Windows® 和 Macintosh® 计算机上功能强大且用途广泛的软件,在企业内部的办公应用领域,扮演了十分重要的角色。而 Excel® 表格也是企业办公领域的流行工具之一,经常作为统计数据的报表使用。Lotus Domino Designer 当中的 LotusScript 语言提供了丰富的编程功能,可以在 Notes 数据库当中实现对 Excel 文件的自动生成、操作和发送等等功能。本文结合本人在开发过程当中的实际经验,以一个具体的应用模块为例,介绍在 Lotus 平台下,用 LotusScript 语言实现 Excel 报表操作功能的原理、方法和一些实用技巧。
Lotus Notes 应用开发概念简介
Lotus Notes 是大型企业内部办公协作的首选工具之一,除了众所周知的电子邮件收发功能以外,Notes 也是一个强大的应用程序运行平台,可以通过运行各种 Notes 应用来实现各种各样的功能。
Notes 客户端上运行的应用被称为 Notes 数据库,如同网页浏览器(如Firefox)通过打开不同的 URL 访问功能各异的网络应用(网页)一样,Notes 客户端的强大功能,正在于通过打开不同的 Notes 数据库,从而实现千变万化的业务功能。从物理上看,Notes 数据库很简单,就是一个后缀名为“nsf”的文件,Notes 客户端只要打开本地或者远程服务器上的 nsf 文件,就可以访问这个 Notes 数据库了。从逻辑上看,Notes 数据库文件将数据库的设计和数据都集中在一起,便于访问和维护。
要理解 Notes 数据库的逻辑结构,就要理解 Notes 数据库独特的数据库类型-“文档数据库”。一提到“数据库”,人们都会想起通用的关系型数据库,其实,很多其他形式的数据库,如“文档数据库”也非常的有价值,便于实现某些特定的功能。文档数据库的概念很简单,就是在数据库当中没有关系型数据库那样复杂的结构和严格的规定,数据按照简单的“文档”形式来存储,一个“文档”当中包含很多内容字段,文档之间的关联不是很紧密。除开数据存储以外,Notes 数据库当中还储存了一些操作数据的应用程序,包括脚本程序、图形界面设计、数据表单设计等等。有了这些设计,Notes 数据库就不仅仅具有简单的数据存储功能,还可以实现丰富的应用逻辑功能了。关系型数据库虽然很通用,可以存储任何结构的数据,但是在存储结构不是很复杂,数据间关联不是很紧密的情况下,文档数据库的形式就更加容易设计和修改;而这种将数据和设计放在一个文件当中的形式,也更加便于部署和掌握。
一个很容易想到的文档数据库的例子就是电子邮件信箱:在邮箱里,每一封邮件都可以被认为是一个独立的文档,有着类似的结构和字段,而且相互之间关联程度不大。如果用关系型数据库来记录邮件内容,在开发过程中必须遵循很多的限制和约束,而且对于归类、排序、自动设置属性等等邮件文档的常用功能,必须按照关系型数据库的规范编写比较复杂的应用程序来实现。有了文档数据库,事情就变得简单了,由于文档的共同特性,文档数据库一般都有通用的归类、排序等功能,几乎不用写代码,就可以实现这些常规的操作功能。而且,当我们要迁移邮箱内容的时候,只要拷贝邮箱的 nsf 文件就可以了,不会像关系数据库那样需要复杂的导入导出和配置过程。所以,Lotus Notes 当中应用最为广泛的,就是邮件数据库,它充分体现了文档数据库的特点,另外,个人通讯录、日程安排管理、公司内部的文档管理系统等等企业办公协作应用,也可以用文档数据库很好的实现。
用 Domino Designer 开发简单脚本程序
开发一个 Notes 数据库应用,有专门的工具,那就是 Domino Designer。Domino Designer 是一种应用程序开发软件,一般可以跟 Lotus Notes 客户端一起安装。应用程序开发人员和 Web 站点设计人员通过它可以创建安全的、能够通过 Lotus Notes 或 Web 浏览器访问的协作应用程序。开发人员很容易使用表单、视图、网页、框架集、集成的即时消息、XML、Java、JavaScript 等来创建核心业务解决方案。
除开这些功能以外,Domino Designer 还提供了一种简单易用的脚本语言-“LotusScript” 来实现一些高级的应用功能。这种语言语法类似于 Basic 语言,可以调用 Domino 提供的丰富的函数库实现很多文档操作和处理功能。
使用 Domino Designer 开发文档数据库的方法很简单,只要运行 Domino Designer,创建或者打开一个 “nsf” 文件就可以开始开发了,如下图所示。
图中可见,Domino Designer 提供了丰富的开发功能,在这里我们重点介绍脚本程序的开发。脚本程序开发主要在上图中的“共享代码”项目当中的“代理”和“Script 库”当中实现。“代理”就是一个个独立的脚本程序,多用 LotusScript 来实现,可以定时触发,也可以用一定的事件触发;“Script 库”是一个用户自定义的脚本库,用 LotusScript 等方式写好的共享脚本就放在这里,由代理来调用。另外,脚本编程还常常用到视图。视图可以被理解成一个“搜索器”,每一个视图规定了一定的搜索条件,返回一个文档的集合。脚本程序当中,经常掉用视图来得到一定条件的文档,进而进行处理,就如同关系型数据库应用当中频繁使用 “select” 语句得到数据集一样。
点击“代理”导航项,弹出了如下图所示的新建代理设置界面。
如图,在 1 附近位置可以确定代理的名称,这里定为“AgentTest”。然后,我们在 2 附近的位置可以确定代理运行的方式,在“按事件”和“按日程安排”当中选择,这里,我们选择按照事件来触发,而且指定是在菜单当中选择一个菜单项来触发。随后,我们在 3 附近的位置指定脚本语言,这里,我们使用 LotusScript。选定了脚本语言,我们就可以看到图中 4 附近的位置出现了 LotusScript 语言的基本结构,其中在(Options)当中可以指定语言执行特性,例如是否允许使用未定义的变量等;在(Declarations)里面,我们可以指定一些引用脚本,定义一些全局变量,这里相当于 C 语言的头文件;在 Initialize 函数当中,是这个脚本的主要执行逻辑,这个函数相当于 C 语言的 main 函数,是执行的入口点;在 Terminate 函数当中,我们可以指定一些脚本执行完毕以后的资源释放工作。另外,如同 C 语言一样,这里也可以定义局部函数。
例如,我们在 Initialize 函数里面写下如下简单的语句:
Sub Initialize '定义界面工作空间 Dim workspace As New NotesUIWorkspace '弹出一个确认对话框 Call workspace.Prompt(PROMPT_OK, "Say Hello", "Hello") End Sub
然后,保存这个代理,用 Notes 打开这个数据库,由于我们刚才选择了用“操作”菜单来触发这个代理,所以我们发现在这个数据库的“操作”菜单下面有一个菜单项就是用这个代理的名称来命名的。我们点击这个 “AgentTest” 项目以后,就会看到代理运行的结果了。如下图。
