1、LotusScript Notes 课程指导欢迎来到 LotusScript 和 Notes 的世界。“LotusScript Notes 课程指导”由三节课程组成,介绍如何在 Notes 中使用 LotusScript 语言。每节课程包括:1.指导您通过创建和测试的 Script 的一系列步骤。2.在线式解答 Script。3.一个挑战,要求您用刚刚学到的知识创建一段新的 Script。4.一个方案,提供一个可能解决挑战的方案。每节课程都使您学习到一些 Notes 应用开发的经验,使您完成上一节课程的内步骤0:准备工作每节课程都使用一个简单的讨论数据库,现在创建它:1. 选择 “文件”“数据
2、库”“新建”。2. 在“服务器”选项中,选择“本地”。3. 输入标题。例如可以输入“学习 LotusScript”。4. 输入文件名。例如可以输入 “LEARNING.NSF”。5. 如果在列表中没有发现模板,选择模板服务器并且选择一个包含这些模板的服务器。6. 选择“讨论数据库(R4)”模板。7. 使 “继承未来的设计变化”选项无效。8. 单击“确定”。9. 在 Notes 完成创建新数据库时,关闭“关于此数据库”文档。现在准备开始第一课。目录:第一课:打印数据库标题第二课:统计 视图中文档的数量第三课:发送电子邮件消息第一课:打印数据库标题第一课指导您用 Script 创建一个按钮,无论何
3、时用户单击此按钮便可以打印出数据库的标题。先创建一个示例的讨论数据库叫做“学习 LotusScript”。 然后:1.创建一个按钮2.书写一个按钮的 Script ,无论何时用户单击此按钮便可以打印出数据库的标题。3.编译和测试该 Script。步骤 A:创建按钮用户单击按钮时运行 Script,所以首先创建一个按钮。1. 打开创建好的“学习 LotusScript”数据库。2. 选择“创建”“讨论主题”在数据库中创建一个新的主题文档。3. 输入一个简单的文档主题,例如“Scripting in Notes is a joy”。4. 输入一个分类,例如“Script”。5. 把光标移动到文档正
4、文域中并选择“创建”“热点”“按钮”。程序员的设计窗格出现在屏幕底部,同时出现了属性框。6. 在按钮属性框中,编写按钮的标签,例如“打印标题”,然后单击绿色确认标志保存它。关闭属性框。7. 在程序员的设计窗格中,如果该按钮没有被选中,则从定义好的可编程对象中选择“打印标题” 按钮。8. 选择 Script 可选按钮。9. 如果按钮事件没被选中的话,从按钮事件列表中选择“Click”。当“Click”事件发生时,本 Script 将运行。步骤 B:使用浏览器浏览器包含了在 Notes 中使用 LotusScript 的信息。1. 在程序员的设计窗格中选择显示浏览器。2. 如果您希望窗格大一些的话
5、,将浏览器窗格的边缘向左拖动。3. 选定“Notes:Classes”,浏览器显示可用的类。4. 滚动滚动条查找在 Notes 中可用的类。您可以发现很多类似在 Notes 使用过的名字。5. 单击三角形展开 NotesDatabase 类。6. 展开 NotesDatabase 类下面的“Properties”(属性),属性是类的一个特性。例如,所有数据库都有标题,所以 NotesDatabase 类拥有一个 Title 属性。7. 展开 NotesDatabase 类下面的“Methods”(成员函数),成员函数是类的一个行为或操作。例如,一个数据库可以和其他数据库进行复制,所以 Note
6、sDatabase 类拥有 Replicate 成员函数。当您使用一个严格的类,就可以使用它的所有属性和成员函数。8. 现在选择 LotusScript 语言。浏览器显示 LotusScript 语言的不同部分。LotusScript 语言和 Notes 的类是相关的,但不一样。语言提供给您一定的语法来声明变量、创建条件和循环以及进行某种操作例如计算。类提供给您 Script 同 Notes 的接口。没有 Notes 的类,LotusScript 不能访问 Notes 中的任何东西。9. 展开所有条目并滚动遍历 LotusScript 函数列表。找出 Dim 和 Messagebox。10.
7、如果您想隐藏该窗格的话,拖动浏览器窗格的边缘到右边让其消失。步骤 C:输入 Script准备好输入 Script。编辑象下面这样的子程序 Sub Click(Source As Button)Dim db As NotesDatabaseSet db = New NotesDatabase( “, “learning.nsf“ )Messagebox( db.Title )End Sub步骤 D:编译和测试 Script本 Script 已经准备好运行。当您关闭和保存该文档时,Notes 编译该按钮 Script。编译是一个把 Script 翻译成可执行代码的过程。1. 选择“文件”“关闭”。
8、2. 单击“确定”保存该文档。如果在下面的程序员设计窗格中出现错误,仔细检查您所输入的程序必须完全和步骤 C 中的示例一样。3. 从视图中打开文档。4. 单击“打印标题”按钮,Notes 显示一个对话框写着“学习 LotusScript”,这就是本数据库的标题。成功了!5. 单击“确定”关闭本文档。步骤 E:编辑 Script 需要做什么您也许不必在保存 Script 以后再编辑它,但如果需要,可以这样做。1. 打开包含该按钮的文档并进入编辑模式。2. 单击按钮一次。3. 选择“按钮”“编辑按钮”。程序员设计窗格出现在屏幕底部同时属性框也出现。检查:Script 如何工作 ?您所输入的 Scr
9、ipt 的意义是:“我想在本地盘上访问数据库 LEARNING.NSF,希望使用 db 代表该数据库。然后我想在对话框中打印该数据库的标题。”第 1 行:开始子程序Sub Click(Source As Button) 定义子程序或子进程的开头。Notes 为您创建本行。第 2 行:声明对象变量Dim db As NotesDatabase 声明一个变量叫做 db,它是 NotesDatabase 类的实例。一个变量被声明成为一个类的实例,叫做对象。Dim 告诉 LotusScript 您声明了一个变量。您可以使用 Dim(和 As)在任何时候声明变量。例如:Dim x As IntegerD
10、im name As StringDim view as NotesViewdb 是一个对象的名称。NotesDatabase 是一个类的名称。第 3 行:设置对象的值Set db = New NotesDatabase( “, “learning.nsf“ ) 设置 db 的数值为本地计算机上的 LEARNING.NSF 数据库。Set db = 告诉 LotusScript 您希望设置 db 等于 New 的返回值。New 告诉 LotusScript 希望建立一个新的对象。NotesDatabase 告诉 LotusScript 新对象应是 NotesDatabase 类的实例。“ 和
11、“learning.nsf“ 是告诉 New 的参数,如何来创建对象。第一个参数 “,服务器的名字,空字符串是因为数据库在您本地计算机上。第二个参数 “learning.nsf“ 是数据库的文件名。第 4 行:在对话框中打印对象的属性Messagebox( db.Title ) 取得 db 所代表的数据库的标题,并在对话框中打印它。Messagebox 是一个 LotusScript 函数,把一个字符串打印在对话框中。它是 LotusScript 语言的一部分。db.Title 返回一个包含 LEARNING.NSF 数据库标题的字符串。Title 是在 NotesDatabase 类中定义的
12、属性。在 Script 中访问或修改属性,需要做三件事:1.对象名称,如 db。2.句点 (.)。3.属性名称,如 Title。属性只有在您知道为什么一个对象需要和适合使用它时才有意义。 例如,Title 属性只有您知道哪一个数据库需要用它才有意义,这就是为什么使用 db 对象来访问它。如果具有不同的 NotesDatabase 对象,可以采用同样的方法使用 Title 属性,但得到不同的结果:Dim coolDb As NotesDatabaseSet coolDb = New NotesDatabase( “Frankenserver“, “mailjyip.nsf“ )Messagebo
13、x( coolDb.Title )本 Script 在对话框中可能打印“Joann Yips Mail”。第 5 行:结束子程序End Sub 定义子程序的结尾。这是 Script 结束的标志。Notes 为您创建该行。准备好对付挑战。挑战:打印数据库的文件名用您所学过的知识,编写一段 Script 来打印“学习 LotusScript”数据库的文件名。1. 在“学习 LotusScript”数据库中创建一个新的文档。2. 在 Body 域中放置一个按钮,并给它一个按钮标题。3. 标明该按钮运行 Script。4. 在程序员设计窗格中,选择显示浏览器。5. 在 NotesDatabase 类中
14、找出一个属性使您可以访问数据库文件名。6. 使用您学过的内容,编写 Script。方案:打印数据库的文件名NotesDatabase 类中的 FileName 属性可以提供您所需的信息。可以用访问 Title 属性一样的方式来访问该属性:一个对象、跟一个句点,后面是属性名。其中一种方法是这样:Sub Click(Source As Button)Dim db As NotesDatabaseSet db = New NotesDatabase( “, “learning.nsf“ )Messagebox( db.FileName )End Sub第二课:统计视图中文档的数量本节是三节课中的第二
15、课,介绍您在 Notes 中使用 LotusScript 语言。必须已经完成第一节课的内容。第二课指导您在视图中创建一段 Script 来统计文档的数量。该 Script 在代理中运行。您必须:在“学习 LotusScript”数据库中增加一些文档。创建一个代理。编写一段 Script,无论代理何时启动时该 Script 都运行。该 Script 在“按作者”视图中统计“学习 LotusScript”数据库中的文档数量。编译和测试 Script。步骤 A:在测试数据库中创建文档为了使您的代理 Script 能够工作,在测试数据库中增加三个文档。1. 打开在第一课创建的“学习 LotusScri
16、pt”数据库。2. 创建和保存三个新文档。步骤 B:创建代理本 Script 在代理运行时运行,所以开始创建一个代理。1. 选择 “创建”“代理”。2. 输入代理的名字,例如“我的第一个代理”。3. 选择共享代理。4. 在“运行此代理的时间”下面选择“从菜单中选择执行”。这是代理被启动的方式。5. 在“指定代理操作的文档”下面选择“数据库中的全部文档”。6. 在“此代理要执行的操作”下面选择 Script。7. 在事件框选择 Initialize。所有的代理 Script 都必须响应一个叫做 Initialize 的事件。步骤 C:使用浏览器1. 在程序员的窗格中,选择显示浏览器。2. 选择“
17、Notes:Classes”接下来选择 NotesDatabase 类。3. 在 NotesDatabase 中,选择“Methods”(成员函数)。在您应用成员函数以前,必须已经做好了在 Script 中使用它们的准备。4. 滚动滚动条直到发现 GetView 成员函数。成员函数返回的数值类型在后面有一个“As.”作为标志。GetView 成员函数返回一个 NotesView 对象。5. 在 Notes Classes 中,选择 NotesView 类。该类代表数据库视图。6. 在 NotesView 中,选择成员函数,滚动滚动条直到发现 GetFirstDocument 成员函数。该成员函
18、数返回一个 NotesDocument 对象。7. 滚动滚动条直到发现 GetNextDocument 成员函数;同样该函数返回一个 NotesDocument 对象。8. 做完这些以后,关闭浏览器。步骤 D:输入 Script准备好输入 Script。编辑象下面这样的子程序 。Sub InitializeDim db As NotesDatabaseDim view As NotesViewDim doc As NotesDocumentDim count As IntegerSet db = New NotesDatabase( “, “learning.nsf“ )Set view =
19、db.GetView( “By Author“ )Set doc = view.GetFirstDocumentcount = 0 begin counting documents stop when there are no more documentsDo Until doc Is Nothingcount = count + 1Set doc = view.GetNextDocument( doc )LoopMessagebox( count )End Sub 步骤 E:编译和测试 Script1. 选择“文件”“关闭”。如果有错误信息,仔细检查和确认所键入的 Script 是否和步骤
20、D 中显示的一样。然后再试。2. 单击“确定”保存代理。3. 选择“操作”“我的第一个代理”运行该代理。Notes 运行该 Script 并显示“By Author”视图中文档的数量。单击“确定”。步骤 F:编辑 Script 需要做什么您也许在保存 Script 以后不必再编辑它,但如果需要,可以这样做。1. 在导航窗格中,单击代理,代理的视图将出现。2. 双击“我的第一个代理”条目。3. 在事件框中选择 Initialize。检查:Script 如何工作 ?您所输入的 Script 行的意义是:“我想在本地盘上访问数据库 LEARNING.NSF,希望使用 db 代表该数据库。下一步,我想
21、访问数据库的 By Author 视图,希望使用 view 代表该视图。Note 使用 Script 在磁盘上访问 By Author 视图。而且,当您运行代理时与用户界面上正在打开的视图无关。下一步,我想访问 By Author 视图中的第一个文档,希望使用 doc 代表该文档。下一步,我想把整数 0 赋给变量 count。我想统计在 By Author 视图中有多少文档,采用统计一个文档 count 加一直到每个文档均被统计的方法来实现。最后,我希望在屏幕上的对话框中显示统计结果。”第 1 行:开始子程序 (sub)子程序 Initialize 定义子程序或子进程的开头。Notes 为您创
22、建本行。第 2 到 5 行:声明变量Dim db As NotesDatabase 声明一个对象叫做 db。它是 NotesDatabase 类的实例。Dim view As NotesView 声明一个对象叫做 view。它是 NotesView 类的实例。Dim doc As NotesDocument 声明一个对象叫做 doc。它是 NotesDocument 类的实例。Dim count As Integer 声明一个变量叫做 count。它是整数。第 6 到 9 行:设置变量值Set db = New NotesDatabase( “, “learning.nsf“ ) 设置 db
23、的数值为本地计算机上的 LEARNING.NSF 数据库。Set view = db.GetView( “By Author“ ) 设置 view 等于 GetView 返回的值。GetView 是 NotesDatabase 类中定义的成员函数,它返回一个 NotesView 对象。参数 “By Author“ 指向您想指定的视图。因为使用 db 来调用它,GetView 返回一个代表 LEARNING.NSF 数据库中的视图的对象。Set doc = view.GetFirstDocument 设置 doc 等于 GetFirstDocument 返回的值。GetFirstDocument
24、 是 NotesView 类中定义的返回 NotesDocument 对象的成员函数,它没有参数。count = 0 设置 count 等于 0。必须使用 Set 来设置一个对象的值,但不必使用 Set 来设置整数或其他的纯数字类型。在第一课中,您学习使用代表一个对象的属性。在本课程中,同样使用成员函数来表示对象的行为。在 Script 中使用成员函数,需要做四件事情:对象的名称,如 db 或 view句点 (.)成员函数的名称,例如 GetView 或 GetFirstDocument成员函数所需的所有参数和对象属性一样, 一个成员函数只有您知道为什么一个对象需要和适合使用它才有意义。例如,
25、 GetView 成员函数只有您知道哪一个数据库需要用它才有意义,这就是为什么使用 db 对象来访问它。相似的,GetFirstDocument 成员函数只有您知道哪一个视图需要用它才有意义,这就是为什么使用 View 对象来访问它。本样例中,hotView 代表 By Category 视图;hotDoc 代表 By Category 视图中的第一个文档。本 Script 看起来非常象您所输入程序,因为它是用同样的成员函数,但是 NotesView 对象代表不同的视图和 NotesDocument 对象代表不同的文档:Dim hotDb As NotesDatabaseDim hotView
26、 As NotesViewDim hotDoc As NotesDocument Set hotDb = New NotesDatabase( “, “learning.nsf“ )Set hotView = hotDb.GetView( “By Category“ )Set hotDoc = hotView.GetFirstDocument与属性不同,成员函数通常有返回值,一些成员函数有而一些成员函数没有。第 10 到 11 行;注释 begin counting documents stop when there are no more documents这些是解释 Script 将要做什
27、么的行中注释。编译器忽略任何一单引号( )开头的语句。第 12 到 15 行:统计视图中的文档Do Until doc Is Nothing 定义循环开始直到指定循环停止的条件。循环将执行 0、1 或多次,直到 doc 对象为空停止。Loop 定义循环的结尾。在 Do Until doc Is Nothing 和 Loop 两行之间叫做循环体:count = count + 1 按步长 1 累加 count。Script 每做一次该操作便取得一个新文档,所以可以保证它是当前视图中文档的统计数。Set doc = view.GetNextDocument( doc ) 指定视图中下一个文档给 d
28、oc。如果没有更多的文档,指定 Nothing 给 doc。Nothing 是一个 LotusScript 关键字,表示是空的、空白的对象。例如,在声明时 doc 对象是 Nothing,直到您指定一个值给它。GetNextDocument 成员函数返回 Nothing,并且您把视图中最后一个文档作为一个参数,因为在最后一个文档后面没有任何文档。在此 Script 中,意味着停止统计。如果在 By Author 视图中根本没有文档,该循环体根本不运行。如果视图中只有一个文档,循环体只运行一次;如果视图中有两个文档,循环体只运行两次,依此类推。第 16 行:在对话框中打印结果Messagebox
29、(count) 在屏幕上的对话框中显示 count 的数值。Messagebox,是一个在对话框中显示指定内容的 LotusScript 语言中的函数,您可以在其他 Lotus 产品中使用,而不仅仅在 Notes 中。第 17 行:结束子程序End Sub 定义子程序的结尾。这是 Script 结束的标志。Notes 为您创建该行。准备好对付挑战。挑战:在视图中统计文档(从最后到第一个)使用您所学到的知识,编写一段 Script 来统计“学习 LotusScript”数据库中的 By Author 视图中的文档。但是从视图中最后一个文档开始。该 Script 将从最后一个文档开始统计然后是它上
30、一个文档,直到没有可统计的文档时停止。使用 LotusScript 浏览器找到所需的成员函数和属性。方案:在视图中统计文档(从最后到第一个)有两个成员函数需要使用:GetLastDocument 和 GetPrevDocument,(previous 先前的)它们都在 NotesView 类中。一种正确的方案如下:Sub InitializeDim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument Dim count As Integer Set db = New NotesDatabase( “, “lear
31、ning.nsf“ ) Set view = db.GetView( “By Author“ ) Set doc = view.GetLastDocument(赋值到最后的文档)count = 0 begin counting documents stop when there are no more documents Do Until doc Is Nothing (从最后的文档开始做循环)count = count + 1 Set doc = view.GetPrevDocument( doc ) LoopMessagebox( count )End Sub第三课:发送电子邮件消息本节是
32、三节课中的第三课,向您介绍如何在 Notes 中使用 LotusScript 语言。必须已经完成第一、二节课的内容。第三课指导您创建一段 Script 来创建和发送一段电子邮件消息。本 Script 在用户从表单的操作中选取时运行,接下来:1.创建一个表单操作。2.编写一段公式在本操作被击活时运行。本 Script 创建和发送一个电子邮件消息。3.编译和测试该 Script。步骤A:创建表单操作用户可以在任何时候使用该表单显示文档中的操作。1. 在第一节课创建的“学习 LotusScript”数据库中的导航窗格中单击“设计”工具箱前面的三角。2. 单击“表单”工具。3. 打开“讨论主题”表单。
33、4. 选择“创建”“操作”。5. 在操作属性框中给出操作的名称,如“向作者申请详细信息”,关闭属性框。6. 如果本操作没有被选中,选择定义好的“向作者申请详细信息”操作。7. 选择 Script 可选按钮。8. 如果事件没有被选中,选择“Click”事件。步骤:输入Script准备好输入 Script。编辑象下面这样的子程序。Sub Click(Source As Button)Dim db As NotesDatabaseDim doc As NotesDocument get the databaseSet db = New NotesDatabase( “, “learning.nsf“
34、 ) create a new document in the databaseSet doc = New NotesDocument( db ) set the new documents form so itll be readable as a mail memodoc.Form = “Memo“ set the new documents Subjectdoc.Subject = “Request“ set the new documents Bodydoc.Body = “Please send me more information about this“ send the new
35、 document to the recipientCall doc.Send( False, “Reuben Jordan“ )End Sub在 Script 的第二到最后一行, 将 Send 成员函数的第二个参数 Reuben Jordan 改变为您的名字。步骤C:编译和测试Script所有使用“讨论主题”表单创建的文档都拥有一个叫做“向作者申请详细信息” 操作。在所有的“讨论主题”文档中,从操作条上单击执行该操作,或从菜单中选择执行。1. 选择“文件”“关闭”,选择“确定”保存该表单。2. 在“学习 LotusScript”讨论数据库中,打开“讨论主题”文档。3. 在操作条中单击“向作者
36、申请详细信息”。4. 该 Script 发送一个电子邮件消息给您。(请检查您的邮件数据库)。步骤D:编辑Script需要做什么您也许在保存 Script 以后不需要再编辑它,但如果需要,可以这样做。.1. 打开“讨论主题”表单。2. 在程序员设计窗格中,选择定义的“向作者申请详细信息”操作 。检查;Script如何工作?刚刚创建的 Script 的意义是:“我希望在数据库中创建一个新文档,设置文档中的一些条目,并发送它。”本 Script 在步骤 B 中已经说明,另外,注意以下内容:本 Script 根据表单中的操作的“Click”事件来运行。用户从菜单中选择操作来响应操作。使用 New 和
37、NotesDocument 类创建一个新的文档。本行为和 NotesDatabase 的区别是,New 并不创建一个数据库。本 Script 创建和设置 doc 对象的几个条目,象 doc 的属性一样对待它们。例如, doc.Form = “Memo“ 在新的文档中创建一个叫做 Form 的条目,并置其值为 “Memo”。因为“Memo”是一个字符串,所以本条目的类型是文本型的。如果 Form 条目在文档中已经存在,本行改变其值为“Memo”。Send 是用来发送一个文档的 NotesDocument 类的成员函数。不象其他的成员函数,该成员函数没有返回值。挑战:给当前前文档的作者发送电子邮件
38、消息刚刚写好的 Script 会根据数据库中正在打开的文档给您发送一个电子邮件。修改本 Script 使其可以把邮件发送给当前文档的作者。这样做,需要访问当前文档的方法(在工作台打开的用户单击操作条的“向作者申请详细信息”按钮)。所以,使用 NotesDocument 类代表数据库中的文档。本类可用来访问数据库中保存的老文档。Notes 使用不同的类(不同的属性和成员函数)来代表当前工作台打开的文档。使用 LotusScript 浏览器,查找如下要求的类、成员函数和属性:访问当前文档访问当前文档中的 From 域(文档的作者)。如果需要提示,查看 NotesUIWorkspace 类。方案:给
39、当前文档的作者发送一段电子邮件消息一种正确的写法如下:Sub Click(Source As Button) NEW: access the document thats currently open on the workspaceDim workspace As New NotesUIWorkspaceDim uidoc As NotesUIDocumentSet uidoc = workspace.CurrentDocument UNCHANGED from previous Script:Dim db As NotesDatabaseDim doc As NotesDocument g
40、et the databaseSet db = New NotesDatabase( “, “learning.nsf“ ) create a new document in the current databaseSet doc = New NotesDocument( db ) set the new documents form so itll be readable as a mail memodoc.Form = “Memo“ set the new documents Subjectdoc.Subject = “Request“ set the new documents Bodydoc.Body = “Please send me more information about this.“ NEW: use the NotesUIDocument object to get the value of the From field, which holds the authors nameCall doc.Send( False, uidoc.FieldGetText( “From“ ) )End Sub