IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
为了解决这个问题,可以在便捷图标对象、操作或其他可以运行@PromPt 的
对象中编写公式。测试完指定的公式以后,删除调试语句,并将公式拷贝粘贴到
希望放置的对象中去。
另一种方法是在公式处理文档的表单中设计一个用于调试的域。该公式在测
试时加载调试域,打开处理的文档即可检测该域。测试完以后,从表单中删除调
试域并删除公式中的调试语句。
6.2.3.2 不同的应用范围
下面列出了在每个函数的适用范围。 X 表示该函数可以用于此环境中。空白
则表示该函数不能用于此环境中。
星号表示在某个特别的环境中使用该函数时需要特别注意。值得注意的是,
当公式运行于服务器上时,有些函数的返回值是不同的。
下表指出每个函数在环境 1 中的适用范围。其中,环境 1 包括下面内容:便
捷图标公式、按钮公式、选择公式、列公式、代理 1 (从菜单中手动执行)、代
理 2(当文档被邮寄、粘贴或者修改时执行)、代理 3(定时执行)、条件隐藏公
式和区段编辑公式等。
不同函数在环境 1 中适用范围
函数名称 便捷图标 按钮 选择 列 代理 1 代理 2 代理 3 条件隐藏 区段编辑
@ AbS X X X X X X X X X
@ Abstract X X X X X
@ Accessed X X X X X X X X
@ Acos X X X X X X X X X
@ Adjust X X X X X X X X X
@ All X X X X X X X X X
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 47
49.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
函数名称 便捷图标 按钮 选择 列 代理 1 代理 2 代理 3 条件隐藏 区段编辑
@ AllChildren X
@ AllDescendants X
@ Ascii X X X X X X X X X
@ Asin X X X X X X X X X
@ Atan X X X X X X X X X
@ Atan2 X X X X X X X X X
@ AttachmentLengths X X X X X X X X X
@ AttachmentNames X X X X X X
@ Attachments X X X X X X X
@ Author X X X X X X X X X
@ Begins X X X X X X X
@ Certificate
@ CheckAlarms X X X X X X X X
@ Char X X X X X X X X X
@ ClientType X X X X X X X X
@ Command X X X X X X
@ Contains X X X X X X X X X
@ CoS X X X X X X X X X
@ Created X X X X X X X
@ Date X X X X X X X
@ Day X X X X X X X
@Dbcolumn(Notes 数据库) X X X X X X X
@ DbColumn ( ODBC ) X X X X X
@ DbCommand ( ODBC ) X X X X X X X
@ DbExists X X X X X X
@DbLookup(Notes 数据库) X X X X X X X
@ DbLookup ( ODBC ) X X X X X
@ DbManager X X X X X X X
@ DbName X X X X X X X X X
@ DbTitle X X X X X X X X X
@ DDEExecute etal. X X X X X X X
@ DDEInitiate X X X X X
@ DDEPoke X X X X X
@ DDETenllinate X X X X X
函数名称 便捷图标 按钮 选择 列 代理 1 代理 2 代理 3 条件隐藏 区段编辑
DEFAULT X X X X X X X X X
@ DeleteDocument X X X
@ DeleteField X X X X X X X
@ DialogBox X X X X X X
@ Do X X X X X X X
@ DocChildren
@ DocDescendants
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 48
50.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
@ DocFields X X X X X X X
@ DocLength X X X X X X X X X
@ DocLevel X
@ DocMark X X X
@ DocNumber X
@ DocParentNumber X
@ Docsiblings X
@ DocumentUniqueID X X X X X X X X X
@ Domain X X X X X X X X X
@ EditECL X X X X X
@ EditUserECL X X X X X
@ Elements X X X X X X X X X
@ EnableAlarms X X X X X
@ Ends X X X X X X X X X
@ Environment X X X X X X X
ENVIRONMENT X X X X X X
@ Error X X X X X X X X X
@ Exp X X X X X X X X X
@ Explode X X X X X X X X X
@ Failure X X X
@ False X X X X X X X X X
FIELD X X X X X X
@ GetDocField X X X X X X X
@ GetPortsList X X X X X X X X X
@ GetProfileField X X X X X
@ Hour X X X X X X X X X
@ If X X X X X X X X X
@ Implode X X X X X X X X X
@InheritedDocument X X X X X X X X X
UniqueID
@ Integer X X X X X X X X X
@ lsAgentEnabled X X X X X X X
@ IsAvailable X X X X X X X X X
@ IsCategory X X X X
@ IsDocBeingEdited X X X X
@ IsDocBeingLoaded X
@ IsDocBeingMailed X X X X
@lsDocBeingRecalcu X X X X
lated
函数名称 便捷图标 按钮 选择 列 代理 1 代理 2 代理 3 条件隐藏 区段编辑
@IsDocBeingSaved X X X X
@IsDocTruncated X X X X X X X X X
@IsError X X X X X X X X X
@IsExpandable X
@IsMember X X X X X X X X X
@IsModalHelp X X X X X X X X X
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 49
51.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
@IsNewDoc X X X X
@IsNotMember X X X X X X X X X
@IsNumber X X X X X X X X X
@IsResponseDoc X X X X X X X X X
@IsText X X X X X X X X X
@IsTime X X X X X X X X X
@IsUnavailable X X X X X X X X X
@IsValid X X X X X
@Keywords X X X X X X X X X
@Left X X X X X X X X X
@LeftBack X X X X X X X X X
@Length X X X X X X X X X
@Like X X X X X X X X X
@Ln X X X X X X X X X
@Log X X X X X X X X X
@LowerCase X X X X X X X X X
@MailDbName X X X X X X X X X
@MailEncryptSavedP X X X X X X X
erence
@MailEncryptSentPe X X X X X X X
rence
@MailSavedPerence X X X X X X X
@MailSend X X X X X X X
@MailSignPerference X X X X X X X
@Matches X X X X X X X X X
@Max X X X X X X X X X
@Member X X X X X X X X X
@Middle X X X X X X X X X
@MiddleBack X X X X X X X X X
@Min X X X X X X X X X
@Minute X X X X X X X X X
@Modified X X X X X X X X
@Modulo X X X X X X X X X
@Month X X X X X X X X X
@Name X X X X X X X X X
@NewLine X X X X X X
@No X X X X X X X X X
@NoteID X X X X X X X X X
@Now X X X X X X X X X
@OptimizeMailAddress X X X X X X X
函数名称 便捷图标 按钮 选择 列 代理 1 代理 2 代理 3 条件隐藏 区段编辑
@Password X X X X X X X X X
@Pi X X X X X X X X X
@PickList X X X X X X X X X
@Platform X X X X X X X X X
@PostedCommand X X X X X
@Power X X X X X X X X X
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 50
52.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
@Prompt X X X X X
@ProperCase X X X X X X X X X
@Random X X X X X X X X X
REM X X X X X X X X X
@RefreshECL X X X X X
@Repeat X X X X X X X X X
@Replace X X X X X X X X X
@ReplaceSubsting X X X X X X X X X
@Return X X X X X X X X X
@Right X X X X X X X X X
@RightBack X X X X X X X X X
@Round X X X X X X X X X
@Second X X X X X X X X X
@Select X X X X X X X X X
SELECT X X X X
@Set X X X X X X X X X
@SetDocField X X X X X X X
@SetEnvironment X X X X X X X
@SetField X X X X X X
@Sign X X X X X X X X X
@Sin X X X X X X X X X
@Soundex X
@Sqrt X X X X X X X X X
@Subset X X X X X X X X X
@Success X X X X
@Sum X X X X X X X X X
@Tan X X X X X X X X X
@Text X X X X X X X X X
@TextToNumber X X X X X X X X X
@TextToTime X X X X X X X X X
@Time X X X X X X X X X
@Today X X X X X X X X X
@Tomorrow X X X X X X X X X
@Trim X X X X X X X X X
@True X X X X X X X X X
@Unavailable X X X X X X
@Unique X X X X X X X X X
@UpperCase X X X X X X X X X
函数名称 便捷图标 按钮 选择 列 代理 1 代理 2 代理 3 条件隐藏 区段编辑
@URLGetHeader X X X X X
@URLHistory X X X X X
@URLOpen X X X X X X
@UserAccess X X X X X X X X X
@UserName X X X X X X X X X
@UserPrivieges X X X X X X X X X
@UserRoles X X X X X X X
@V2If X X X X X X X X X
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 51
53.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
@V3UserName X X X X X X X X X
@Version X X X X X X X X X
@ViewTitle X X X X
@Weekday X X X X X X X X X
@Word X X X X X X X X X
@Year X X X X X X X X X
@Yes X X X X X X X X X
@Yesterday X X X X X X X X X
@Zone X X X X X X X X X
下表指出了每个函数在环境 2 中适用范围。其中,环境 2 包括下面内容:窗口标
题公式、热点公式 1(操作)、热点公式 2(弹出式文本)、域公式、表单操作公
式、视图操作公式、导航器和布局区域等环境中适用范围。
函数在环境 2 中适用范围
函数名称 窗口标题 热点 1 热点 2 域 表单 表单操作 视图操作 导航器 布局区域
@Abs × × × × × × × × ×
@Abstract × × × × × × ×
@Accessed × × × × × × × ×
@Acos × × × × × × × × ×
@Adjust × × × × × × × × ×
@All × × × × × × × × ×
@Ascii × × × × × × × × ×
@Asin × × × × × × × × ×
@Atan × × × × × × × × ×
@Atan2 × × × × × × × × ×
@AttachmentLengths × × × × × × × ×
@AttachmentNames × × × × × × × ×
@Attachments × × × × × × × ×
@Author × × × × × × × ×
×
@Begins × × × × × × × ×
@Certificate × ×
@Char × × × × × × × ×
×
@CheckAlarms × × × × ×
@ClienType × × × × × × ×
函数名称 窗口标题 热点 1 热点 2 域 表单 表单操作 视图操作 导航器 布局区域
@Comrmand × × × × × × ×
@Contains × × × × × × × × ×
@Cos × × × × × × × × ×
@Created × × × × × × × ×
@Date × × × × × × × × ×
@Day × × × × × × × × ×
@DbColumn Notes数据库)
( × × × × × × × × ×
@DbColumn(ODBC) × × × × × × × ×
@DbCommand(ODBC) × × × × × × × ×
@DbExists × × × × × × × ×
@DbLookup Notes数据库)
( × × × × × × × × ×
@DbLookup(ODBC) × × × × × × × × ×
@DbManager × × × × × × × ×
@DbName
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 52
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
注意两点:
1.使用 check box 和 radio box,一打开文档,公式总要计算,即使仅仅打算阅
读而不是修改文档,看起来是合理的,因为需要计算出各个项目供阅读嘛
2.已经有数据的,使用对话框格式的编辑域,打开时候也要重新计算,这个就不
太合理了。
当使用复杂的@dblookup 时,性能有很大影响。隐藏公式域没有作用,因为仍
然会发生计算。按照下面方法解决
1)创建一个隐藏的多值‘显示时计算’域:kwDataHidden,计算公式是原来的@d
blookup 公式,但仍然要做如下处理,值公式写成这样:
rem "Do not run formula during doc save";
@if (@IsDocBeingSaved; @Return("");"");
rem "Only run if doc is in edit mode";
@if (@IsDocBeingEdited;@DBColumn(............);"")
2)在表单的 PostModeChange 中,写:@If(@IsDocBeingEdited;@Command([ViewR
efreshFields]);""),(实际上,如果觉得公式的值的修改频率不是太快的话,
这里也可以不写)
3)真正操作那个域的公式写:kwDataHidden;并且该域属性选择‘刷新文档时刷
新选项’。
6.3.2 脚本语言优化
1.使用 For loop,不使用 Do loop 或者 while loop 的循环
前者比后者快 60%(不计算循环内部时间的情况下)
2.引用数组元素的时候,使用 Forall 比 for 快
一维数组,前者快 75%,二维以上,也可以快 50%
3.简化 if 语句
LotusScript 不会象 c 那样进行逻辑语句优化,所以
If a=x and b=y then
应该写成
If a=x then
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 111
113.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
if b=y then
后者快 40%
4.避免混合变量类型(计算)(也就是不要隐式造型)
dim a as single
dim z as long
z = 3
a = 1.0
z = z+a
上面这一段使用了 implied casting,z=z+(long)a 会比较快
1.对整数结果,使用整数除法:z& = x& y& 比 z& = x& / y& 快 60%
2.仅在有必要的时候才使用 variant 类型,lotus 使用更多的时间处理 variant
3.读取文件的时候,一次读取一块,而不是一行,下面的例子 A 比 B 快接近 5 倍!
而且读取的文件越大,越明显。
example A
Open fName$ for input as #fNum
buff$ = Input$(Lof(fNum),fNum)
stPos = 1
lineNo = 1
eoFile = false
While Not eoFile
nlPos = Instr(stPos,buff$,Chr$(13))
If (nlPos) > 0) then
fData$(lineNo) = Mid$(buff$,stPos,nlPos - stPos)
stPos = nlPos + 1
else
fData$(lineNo) = Mid$(buff$,stPos)
eoFile = true
end if
lineNo = LineNo + 1
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 112
114.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
wend
close #fNum
example B
Open fName$ for Input as #fNum
lineNo = 1
while Not Eof(fNum)
Line Input #fNum , fData$(lineNo)
lineNo = lineNo + 1
wend
close #fNum
注意,R4.6 以及之前的版本,string 变量有 64k 的限制,所以一上例子 a 需要
再增加一些东西(不能一次读取,而是要分次读取文件),但块读取的好处仍然
是显而易见的。 开始,
R5 string 变量可以最大达到 2G,足够读取非常大的文件了。
例子 A 虽然增加了代码量,但是可以大大加快速度,某些场合非常有用
5.避免无谓地使用数组,下面例子 A 比例子 B 快两倍
Example A
For i = 1 to 100
sum = sum + x(i)
Next
t(1)=sum
Example B
For i = 1 to 100
t(1) = t(1) + x(i)
Next
Domino R5 引入了新的数组处理函数:ArrayAppend , ArrayGetIndex ,
ArrayReplace , FullTrim,使用这些函数比自己写相同的功能快
6.有一个不使用字符串数组的替代方法
把所有数组中的字符串元素构造成一个字符串,用特殊分隔符分开(例如回
车符),然后用 Instr 来取各个元素
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 113
115.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
7.优化字符串的处理
字符串的处理非常消耗资源,例如下面这句很常见
X$= X$ & "a"
这个语句非常消耗资源(java 中有类似现象,因为涉及到重新生成字符串),下
面这句缩短字符串也是很消耗资源的
x$ = Right$(x$ , currentLength% - lengthStrippeddOff%)
8.创建一个新的字符串有时候更加快
下面例子 A 比 B 快 25%
A
str$ = stringA$ & stringB$
B
str$ = stringA$
str$ = str$ & stringB$
9.反复处理字符串时,记住处理位置
比不断修改字符串长度快(其实是不断生成新的字符串),下面例子 A 比 B
快 85%
A
strPiece$ = Mid$(str$ , startPos% , pieceLength%)
startPos% = startPos% + pieceLength%
B
strPiece$ = Left$(str$ , pieceLength)
strLength% = strLength% - pieceLength%
str$ = Right$(str$ , strLength%)
10.谨慎是用 redim 命令
可以理解,每次 redim 是内存堆数据的乾坤大挪移,所以尽可能事先决定数组
大小。实在没有办法,也千万不要在循环中 redim。以下例子 A 比 B 快 20%
A
For i = 1 to 10000
If ( i> iMax) then
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 114
116.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
iMax = iMax + 100
redim Preserve sArray(1 to iMax)
end if
sArray(i) = ""
Next
B
For i = 1 to 10000
Redim Preserve sArray(1 to i)
sArray(i)=""
Next
以上实际是减少 redim 的次数,每次增加多些,循环后可能还需要一次 redim,让
数组空间和实际一致
11.在多维数组中循环
应使用正确的顺序。在外循环中操作后面的维数,在内循环中操作前面的维
数,下面的例子 A 比例子 B 快 400%!
A
For y = 0 to 2
for q = 0 to 5000
z = z + x(q,y)
Next
Next
B
For q = 0 to 5000
For y = 0 to 2
z = z + x(q,y)
next
next
12.比较整数,而不是比较字符串
下面的例子 A 比例子 B 快 50%,例子 C 比例子 D 快 30%
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 115
117.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
A If(Asc(x$) = Asc("A")) then
B If(Left$(X$,1) = "A") then
C If(Asc(Mid$(x$ , 1, 1) = "A") then
D If(Mid$(x,1,1) = "A") then
下面比较空串的例子 E 也比例子 F 快 30%
E If (Len(x$) = 0) then
F If (x$="") then
13.将数字转为字符串的时候使用自动造型,不用手工转换
例如 s2$ = "Text" & iNum 比 s2$="Text & Cstr(iNum%) 稍微快一点,不过
不明显。
14.重要:避免过多使用环境变量
环境变量要读取 notes. 文件,
ini 对性能造成影响,替代办法是使用 profile。
如果一定要使用环境变量,将多个环境变量合并成一个,用特殊符号分隔,取出
来后再分析成多个。取 10 个单独的环境变量要比取一个长的环境变量多花 10 倍
时间!
6.3.3 Java & JavaScriptino应用程序优化
Java 需要装入 JVM,client 端第一次运行的时候装入,server 端,随着 http
装入的时候装入(所以不用 http 就不要装入了,估计慢也是受到 jvm 影响 :) )
有关 java 没有什么好说,就说两点。
1.将需要的 java 类,尽可能放在类列表前面,尽可能接近 base 类,可以加快搜
索速度;
2.周期性调用回收函数,java 本身是自动进行垃圾收集的,但是该书的意思似乎
说 java 的垃圾回收,不能回收相关 lotus objects 用掉的内存;
3.JavaScript,没有什么好说的,用于 web 页面,域校验,和输入转换,可以避
免 browser 和 web server 来回交换数据,减少网络流量;
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 116
118.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
6.3.4 DOMINO对象模型优化
利用后期初始化和对象重用技术来最大限度地利用资源
1.后期初始化(lazy initialization)。学习到一定地步的 lotus 程序员,为
了程序结果清晰,往往喜欢事先将一些对象如 db , view , doc 等初始化,然后
每个函数都可以使用。从提高效率的角度,可以改进为使用后期初始化(自己翻
译的,不知道是否准确,应用期初始化?),下面是后期初始化的方法
' *** Globals
' *** Declare the global data we share
Public gDb As NotesDatabase
Public gVwCustomerType As NotesView
'*** Functions
'*** Get the customer type view (lazy initialization)
'*** Do account validation
Sub Initialize
'*** Set up the database (NOT lazy)
Dim ss As New NotesSession
Set gDb = ss.CurrentDatabase
End Sub
Function GetCustomerTypeView() As NotesView
'*** Only get it the 1st time it is used
If (gVwCustomerType Is Nothing) Then
Set gVwCustomerType = gDb.GetView("Customer Type")
End If
Set GetCustomerTypeView = gVwCustomerType
End Function
Function ValidateAccount(custName As String, _
accountType As String) As Integer
'*** Return True if account is valid
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 117
119.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
Dim vw As NotesView
Dim doc As NotesDocument
Dim aKeys(0 To 1) As String
Select Case AccountType
Case “New”
'*** New accounts are always valid
ValidateAccount% = True
Case Else
'*** Is customer allowed the specified account type?
Set vw = GetCustomerTypeView()
aKeys(0) = custName$
aKeys(1) = accountType$
Set doc = vw.GetDocumentByKey(aKeys, True)
If (doc Is Nothing) Then
ValidateAccount% = False
Else
ValidateAccount% = True
End If
End Select
End Function
以上 GetCustomerTypeView 函数中使用了 lazy initialization 方法,当该
函数第一次被调用,它调用 getview 取得视图,以后只要直接取 public 的 vw 即
可,其他程序的结构不会受到影响(如果将全局变量的 vw 封装在 class 中,则更
加符合面向对象的规则)
6.3.5 最大限度重用对象
1.打开数据库时的动作
a.创建数据库,涉及到内存分配和初始化
b.定位数据库,涉及到目录查找,或者存取其他服务器
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 118
120.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
c.初始化对象属性,需要从数据库读取 ACL 等属性
由于打开数据库如此耗费资源,所以应该尽量重复利用打开的 db,作为参数传递,
或者全局变量(或者类变量)而不是在每个函数中重新打开。
2.使用已有对象,比较下面,A 比 B 快
A
dbTitle$ = doc.ParentDatabase.Title
B
set session = new NotesSession
set db = session.CurrentDatabase
dbTitle = db.Title
3.使用 back-end 类,比用 front-end 类快,并且 back-end 类可以添加任何数据
类型和新域
4.使用 NotesUIDocument 类时,如果需要大量修改文档域,禁止 AutoReload 属
性
修改前:source.AutoReload = false
修改后:source.AutoReload = true
source.Reload
5.如果从视图存取文档,使用 ColumnValues 访问域,比直接访问要快,但只有
从视图存取文档才能利用这点,还有就是要注意 columnNumber 这个列数的计算,
不是视图上的每个列都算在里面
A
var = doc.ColumnValues(columnNumber%)
x = var(0)
B x =doc.fieldname
6. 如何在不同应用中选择合适的编码语言
4
在具体的开发过程中,根据需求性质,DOMINO 可以有多种编码语言的选择。
主要有公式、LotusScript、java、javaScript 等语言:
其中 javaScript 是跨平台面向对象的描述性语言,可以附加到诸如 ONCLICK
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 119
121.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
的特定事件或被附加到诸如 ONCLICK 的特定事件上,但不能在代理中编写;
LotusScript 则是完全面向对象的,通过他我们可以访问系列 DOMINO 服务;
而 JAVA 方面,
系统内置 20 多个 JAVA 与 DOMINO 的接口是通过预定义的 DOMINO
JAVA 类实现,在代理方面的使用方法类似于 LotusScript,但不能附加到 DOMINOUI
的事件中。
比较起来,特别简单的功能和逻辑,用公式实现比较快;复杂的功能和逻辑,
用 LotusScript 比较快。
而 java 语言可以实现多线程,完全面向对象,处理大量文档时,如果程序利
用到多线程,比不能利用多线程的 LotusScript 快。
另外针对于底层开发,LOTUS 还有专门的 Toolkits 支持,按 Lotus 产品系列
来分,Lotus 提供下列产品的工具包: Notes/Domino 、Sametime 、QuickPlace 、
Discovery Server 、Other。其中,Notes/Domino 和 Sametime 的工具包比较多,
C、C++、Java 语言的都有,其他产品的则很少。从这个角度,也可以看出文档数
据处理、协同工作是 Lotus 系列产品的核心价值所在。其中,Notes/Domino 的工
具包有:
Lotus C API toolkit Lotus C++ API toolkit
Lotus Domino Toolkit for Java/CORBA Lotus and Notes Toolkit for COM
Lotus Domino Driver for JDBC (简称 LDDJ) NotesSQL
Lotus XML Toolkit(简称 DXL) Custom Tag Converion kit(简称 DCT)
LotusScript Extensions toolkit(简称 LSX)
在 Domino/Notes 的 Toolkit 中,C API 的功能最为强大:可以操纵 notes 数据
库中几乎所有的数据对象:数据库及 ACL、文档和域、表单、视图和文件夹、代理、
可以为 Notes 客户端的增加附加菜单、可以用来创建附加的 Domino 服务任务、可
以用来扩展 Domino/Notes 的事件管理。而其主要限制如下:不能修改已有的
Domino/Notes 软件,不能去除其已有的功能、特性,或者改变其工作机理、不能
修改安全特性、不能修改用户活动记录。
支持的操作系统:WindowsNT/2000, Linux,
Solaris SPARC/Intel, HP-UX, MacOS, AIX, AS/400, S/390 等。
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 120
122.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
6.4.1 使用公式和LOTUSSCRIPT的前提
一般,公式最好用于用户当前处理的对象(如返回域的默认值)或者确定视
图的选择标准。脚本最好用于访问已存在的对象,如基于其他文档的值来修改这
个文档的值。脚本提供了公式没有的功能,如操作 RichText 域的能力。在一些
情况下,公式提供了更好的效率,而且比小应用程序更方便。
可以使用 LotusScript 中的 Evaluate 函数将公式语言与 LotusScript 结
合起来。这样在完成相同任务的情况下,函数比 LotusScript 使用更少的行数。
通过使用同一表单的不同部分,可以在应用程序中将 LotusScript 和公式结合起
来。在脚本中包含公式可以使脚本更容易编写,但不能提高效率。
除了直接与 Notes 用户界面相互作用的函数外, 你可以使用 Evaluate 包
含任何函数,例如@Prompt 、@DialogBox 、@PickList 和@Command 。下面是与
LotusScript 结合的特别有用的函数:
l ) @ Name :允许你操作层级名。
2 ) @ RePlace :从文本列表中取值,而不需要像 LotusScript 要求的循环
3 ) @ Unique :从文本列表中删除复本。
4 ) @ subset :从左到右读取列表。
当两者都用时,对于一个给定的任务,究竟使用 LotusScript 还是 Domino 公
式语言,主要取决于任务的复杂性。当做决策时,考虑以下几个问题:
l )需要处理大量数据吗?
如果一个公式通过函数需要涉及多个数据库或文档,那么必须依赖于 Notes
用户界面来访问每个文档,然而 LotusScript 可以更有效更快地访问文档。
例如,LotusScript 是一个创建代理的好工具,它可以查看工作台上所有的
文档,并返回诸如数据库大小、已使用空间、文档数等的信息。 LotusScript 是
在多个文档中运行全文本搜索的好工具,并可以利用搜索结果执行活动。
2 )使用 Domino 对象模型 front 一 end 或 back 一 end 吗?
Domino 对象模型( front 一 end 类)与相对应的@ commands 有相同的
Domino 代码,因此当使用这些类时, LotusScript 不可能比公式语言更好。然
而数据库( Back 一 end 类)使用不同的代码,所以比相对应的函数更好。
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 121
123.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
例如,执行修改多个域时,避免使用 NotesuIDocument Front 一 end 类。
NotesDocument Back - end 类更快,并允许赋予数据类型(包括 rich text ) ,
以及增加新(隐藏)域。 Front 一 end 类只允许你修改表单中已存在的域,并
允许你在域中增加文本,就像@ command ( [ EditlnsertText]) 一样。
另外, Front 一 end 类不能在由服务器运行的计划代理中工作,只能在由
用户工作台运行的代理中有效(如从菜单中)。
3 )使用 CoRBA applets 吗?
Domino 对象模型( Back 一 end )支持 CORBA 小应用程序。如果你打算利
用 COBRA 小应用程序开发 Web 应用程序,用于向浏览器用户显示信息。
4 )需要操作当前选中的对象吗?
使用公式语言,而不是 LotusScript
5 )需要在 Action 栏上编写按钮吗?
考虑使用公式语言,而不是 LotusScript 。按钮活动一般比较简单,而且直
接通过 Notes 用户界面完成任务,例如保存或关闭文档.
6 )需要返回域的默认值吗?
使用公式语言,而不是 LotusScript
7 )需要返回窗口标题吗?
使用公式语言,而不是 LotusScript
8 )需要从表单控制工作流程吗?
LOTUSSCRIPT 是用表单事件控制工作流的最好选择,特别是 Query Save 事件,
因为它能处理更复杂的任务,如循环和设置多个变量。
例如,你可以通过操作输入和退出域事件,来事先确定的顺序,并要求用户
按照此顺序填写表单中的域。或者你可以防止用户打开、保存或编辑文档,直到
满足一定的条件。
9 )在一个公式中是否包含了太多的函数?
如果一个公式中包含了许多函数,尝试将公式转换成 LotusScript 。然而,
在只需要一个函数的公式情况下,例如@ Command [ FilePrint ] ,采用公式比
采用脚本更有效。
10 )需要使用大量 if - then 一 else 或 for 一和 while 一循环吗?
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 122
124.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
使用 LOTUSSCRIPT 而不是公式语言,因为这样易于维护代码。而且,公式不支
持循环。
6.4.2 执行LOTUSSCRIPT和公式顺序分析
( l )在单一表单中 LotusScript 和 Domino 公式在一系列活动中的执行顺序
如果你的应用程序包含了 LotusScript 和公式语言的结合体,这将有助于了
解表单中的事件和公式执行的顺序。
下面这个样例列出了在单一表单中 LotusScript 和 Domino 公式在一系列活
动中的执行顺序。这个列表是通过内嵌信息框命令或将@ prompt 公式嵌人各种
事件和公式生成的,这些事件和公式在一张包含各种不同域类型的表单中。这张
表单并不包含所有域的类型或评价结合体。然而,通过了解这个例子中的结果,
你也许能更好的理解应用程序表单中的执行顺序。假定测试表单包含 5 个域,从
高到低顺序如下:
subject : Editable / Text 域(缺省值、输入转换、输入合法值校验公式)
From :创建时计算/“作者”域(值计算公式)
Counter :计算。数字域(值计算公式)
DisplayNum :显示时/数字域(值计算公式)
Body :可编辑/RTF 域(缺省值公式)
l ) 表 l 一 11 说明 了 各 种 不 同的 活 动( 如 编写 文 档)以 及 每个 活 动中
LotusScript 事件和 Domino 公式的执行顺序。
编写文档活动执行顺序
对象 公式或事件
表单 Initialize 事件
表单 Window Title
表单 Query Open 事件/WebQuery Open 事件
Subject 域 Default Value 公式
Subject 域 Initialize 事件
From 域 Value 公式
From 域 Initialize 事件
Counter 域 Value 公式
Counter 域 Initialize 事件
Body 域 Value 公式
Body 域 Initialize 事件
Subject 域 Entering 事件
表单 PostOpen 事件
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 123
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
13.DOMINO-B/S 模式下常见应用功能
开发指南及分析(例程参见随书附赠
的 CHINALOTUSVIPFTP)
13.3 DOMINO与EXECL交互的多种方式
在 DOMINO 的日常应用中,将数据导出为 EXECL 以便再处理是经常遇见的需求,
那么接着我们就一起看看具体的实现方式有哪些。
1)LS+VBA
以前在 windows Domino 环境中的 B/S 应用操作 EXCEL,相对来说,比较简单,
只要操作系统上装了 Office 套件,利用 LS+VBA 就可以了。大致代码如下:
Dim obj As Variant
Dim apli As Variant
Set obj = CreateObject("Excel.Application")
Set apli = obj.Application
apli.Visible=True
Dim workb As Variant
Dim works As Variant
Set workb= apli.Workbooks.Add()
Set works = workb.Worksheets(1)
Call workb.Activate
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 129
131.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
Call works.Activate
With works
.Cells(1,1).Formula="=SUMA(E1:E2)"
End With
但是如果在 AIX 上操作的话,没法安装 office 套件,就没有
Excel.Application,不能创建相应的对象。
1) html+print 的方法
利用用 html+print 的方法可以将输出的信息转化为 excel 文件。
Print {Content-type:application/vnd.ms-excel}
Print {Content-Disposition:attachment;filename=excelData.xls}
Print "Hello, this is the LotusScript web agent. I've been triggered
by the form's WebQuerySave event.<BR>Now the UNID is <P>"
Print "<TABLE border=1><TR><TD>测试 1 /TD><TD>测试 1</TD></TR>"
Print "<TR><TD>测试 1</TD><TD>测试 1</TD></TR></TABLE><P>"
这样就可以直接产生 excel 格式文件。但是在使用的过程中发现 EXCEL 的字符
集选项有时候会有变化,所以需要在代码中将字符集给固定下来。只需要增加一
句就好了。如下:
Print {Content-type:application/vnd.ms-excel}
Print {Content-Disposition:attachment;filename=excelData.xls}
Print {<META HTTP-EQUIV="Content-Type"
CONTENT="text/html;charset=gb2312">}
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 130
132.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
Print "Hello, this is the LotusScript web agent. I've been triggered
by the form's WebQuerySave event.<BR>Now the UNID is <P>"
Print "<TABLE border=1><TR><TD>测试 1 /TD><TD>测试 1</TD></TR>"
Print "<TR><TD>测试 1</TD><TD>测试 1</TD></TR></TABLE><P>"
3)通过 js,FSO 去操作本地的文件系统
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.createtextfile("c:myjstest.xls",true");
4)通过 OFFICE 自带的 excel 控件处理,但受制于 EXECL 的版本
考虑到性能和目前大多数客户的实际环境,我们接着还是以 LS+VBA 为例子分
析看下我们的 DOMINO 数据是如何跑到 NSF 里去的。
1) 设计一个后台代理,让它定期自动运行,例如一个礼拜运行一
次,将这个
礼拜当中新添加的文档的摘要内容取出来放到一个 Excel 文件里面,然
后对这个报表进行单元格的自动对齐等操作,最后将这个 Excel 文件以电
子邮件附件的形式发送到特定的若干地址当中去。
运行这样 的程序, 必须在机器上安装 Excel,这样 LotusScript 才可以操作
Excel。这里,Notes 数据库只需要在一台机器(服务器)上运行即可,也就是说,
只需要在服务器上面装上 Excel 程序就可以了。
要打开一个 Excel 对象,需要用到 LotusScript 里面的 CreateObject 方
法,这个方法打开一个 OLE 对象,我们可以在方法调用的时候指定对象类型:
xlApp As Variant
'创建一个新的 Excel 应用实例,对应一个 Excel 文件
Set xlApp = CreateObject("Excel.application")
'在这个 Excel 文件当中添加一个 Sheet
xlApp.Workbooks.Add
xlApp.Visible = True
LotusScript 是一种语法比较松散的脚本语言,类似于 VB,为了避免代码的
逻辑混乱,我们可以利用 LotusScript 里面的面向对象的特性,将处理 Excel 操
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 131
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
xlApp 变量的特定方法来实现的。
我们都知道,Excel 文件的基本数据单元就是一个个的“单元格”,由于所
有单元格默认都是为空且存在的,所以对单元格没有“添加”和“删除”操作(要
删除一个单元格的内容,只要写入一个空字符串即可)。所以,简单说来,操作
Excel 文件,就是对单元格的定位与读写,而不是“增删改”模式。要定位一个
单元格,只要知道 “sheet”、“row” 和 “column” 三个参数就可以了;而
简单说来,单元格的内容可以统一认为是一个字符串。下面的函数实现了对一个
单元格的读写:
Function insertData(intSheet As Integer,row As Integer,column As
Integer,value As String)
'1.定位单元格,在第一个 Excel 文件的第 intSheet 个(从 1 开始)
' sheet 里面的行列号为 row 和 column 的单元格
'2.用字符串 value 来填充单元格
xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row ,
column ).Value = value
End Function
Function getData( intSheet As Integer , row As Integer , column As Integer )
As String
'得到第一个 Excel 文件的第 intSheet 个(从 1 开始)sheet 里面的行列号
为 row 和 column 的单元格的值
getData = xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row ,
column ).Value
End Function
上述代码很简单,仅仅调用了一句 xlApp 对应 OLE 对象的方法就实现了定
位与读写。当然,我们还需要对以上方法添加错误处理代码,具体关于错误处理
的内容介绍超出了本文的范围,请参考 LotusScript 的相关资料。
此外,我们应该注意到,通过上述方法创建的 Excel 对象还是在内存当中的,
并没有保存为文件,我们需要添加一个保存文件的方法 “saveFile” 来保存它。
最后,我们还应该为这个 ExcelReport 类实现一个退出的方法 “doQuit”,用
来关闭和释放 Excel 对象的资源。
这样,我们就得到了如下完整的 ExcelReport 类:
Class ExcelReport
Private xlApp As Variant
Sub new()
'创建一个新的 Excel 应用实例,对应一个 Excel 文件
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 133
135.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
Set xlApp = CreateObject("Excel.application")
'在这个 Excel 文件当中添加一个 Sheet
xlApp.Workbooks.Add
xlApp.Visible = True
End Sub
Function saveFile(strFilePath As String)
'保存 Excel 文件到硬盘指定位置
xlApp.ActiveWorkbook.SaveAs( strFilePath )
End Function
Function insertData(intSheet As Integer,row As Integer,column
As Integer,value As String)
On Error Goto err_hdl
'1.定位单元格,在第一个 Excel 文件的第 intSheet 个(从 1 开始)
sheet 里面的
' 行列号为 row 和 column 的单元格
'2.用字符串 value 来填充单元格
xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row ,
column ).Value = value
Exit Function
err_hdl:
Print Error$ + "in cls: ExcelReport , method: insertData ,
at line " + Cstr( Erl )
Exit Function
End Function
Function getData( intSheet As Integer , row As Integer , column
As Integer ) As String
On Error Goto err_hdl
'得到第一个 Excel 文件的第 intSheet 个(从 1 开始)sheet 里面
的行列号为 row 和 column 的单元格的值
getData =
xlApp.Workbooks(1).Worksheets( intSheet ).Cells( row , column ).Value
Exit Function
err_hdl:
Print Error$ + "in cls: ExcelReport , method: getData ,
at line " + Cstr( Erl )
getData = ""
Exit Function
End Function
Function doQuit
'关闭资源
xlApp.Quit
'资源释放
Set xlApp = Nothing
End Function
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 134
136.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
End Class
业务逻辑实现
在业务逻辑方面,首先,我们需要在这个 Notes 数据库里面新建一个视图
(NotesView)
,名为 “byTime”,按照文档的创建时间从晚到早的排序所有的文
档,这个视图的创建很简单,不用任何代码;随后,我们可以借助这个视图来得
到按照创建时间排序的文档(NotesDocument),从最近的文件开始遍历,对所有
一周以内创建的文档进行处理,将它们的内容写入新建好的 Excel 对象的对应单
元格;完成以后将这个文件保存在硬盘,然后发送给指定的地址列表当中;最后
在 本地 删 除 这个 文 件。 这 个简 单 业 务逻 辑的代 码 如 下( 关 于 NotesView 和
NotesDocument 的概念和具体用法请参考相关资料):
Sub Initialize
'定义 ExcelReport 类的实例,表示一个 Excel 对象
Dim report As ExcelReport
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim iRow As Integer
Dim author As String
'调用构造函数,初始化
Set report = New ExcelReport
'写入 Excel 标题行(第一行)
Call report.insertData(1,1,1,"创建时间")
Call report.insertData(1,1,2,"题目")
Call report.insertData(1,1,3,"作者")
'得到按照日期排序的视图
Set db = session.CurrentDatabase
Set view = db.GetView("byTime")
Set doc = view.GetFirstDocument
iRow = 2
While Not(doc Is Nothing)
'按照创建日期排序,处理一周以内的所有文档
If (doc.Created > Today-7 ) Then
'用 Cstr 函数转换时间到字符串
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 135
137.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
Call
report.insertData(1,iRow,1,Cstr(doc.Created))
'GetItemValue 返回的是一个字符串数组,我们要其中的第
一个
Call
report.insertData(1,iRow,2,doc.GetItemValue("Subject")(0))
'从 From 当中得到作者名字,然后转成简称
author = doc.GetItemValue("From")(0)
Call
report.insertData(1,iRow,3,session.CreateName(author).Abbreviated)
'找到下一个文档
Set doc = view.GetNextDocument(doc)
iRow = iRow + 1
Else
'发现不是本周内的文档,退出循环
Goto BreakLoop
End If
Set doc = view.GetNextDocument(doc)
Wend
BreakLoop:
'保存文件
Call report.saveFile ("C:Docs Report This Week.xls")
'释放资源
Call report.doQuit
'发送邮件
Call SendMail("Rui R Hu/China/IBM","C:Docs Report This
Week.xls")
'还可以发送更多地址......
'删除本地文件
Kill "C:Docs Report This Week.xls"
End Sub
用邮件发送报表
其中,代码用到了一个自定义的方法 “SendMail”,它可以向一个地址发送
一封带附件的邮件,两个参数分别是收件人地址和附件文件地址。代码如下
Sub SendMail(target As String,attachment As String)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim ritme As NotesRichTextItem
Set db = session.CurrentDatabase
Set doc = New NotesDocument( db )
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 136
138.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
doc.Form = "Memo"
doc.SendTo = target
doc.Subject = "Here's the document you wanted"
Set ritem = doc.CreateRichTextItem("Attachment")
ritem.EmbedObject EMBED_ATTACHMENT, "", attachment
Call doc.Send( False )
End Sub
设置自动运行
写好了代码,我们就可以让这个代理运行了,不同于本文前面提到的简单例
子,这里,我们希望让这个代理在每周五下午运行,生成一周的报表发送给一些
收件人,设置如下图所示:
这样,每周五下午,相关收件人就会收到一封信,其中的附件就是一个 Excel 报
表,如下图所示:
用 Excel 宏取得更多操作代码
读者一定对上图当中的 Excel 报告很不满意,因为这个 Excel 报表格式很
难看,需要读者手工在每一列的分界处双击一下,来对齐单元格内容。有没有办
法可以自动实现这个烦人的操作呢?
答案当然是肯定的,而且我们可以不用参考任何书籍或者资料就开发出需要
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 137
139.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
的代码。 一般地,关于 Excel 报表的更多操作,我们可以通过翻阅参考资料来
学习更多功能代码的实现方法,就如同其他技术的学习一样。不过,现在我们有
另一种更加方便、巧妙和快速的方法可以得到我们需要的操作代码,那就是利用
Excel 的宏。在相关参考资料不太充足的情况下,这个方法尤为有用。
我们就拿当前需要的“对齐单元格”的需求为例子,看看如何用宏来取得代码。
如下图所示:
首先,我们打开 Excel 程序,新建一个文件,点击“工具”-“宏”-“录制
新宏”,开始录制新的宏。
然后,我们只要简单的在 B 列和 C 列中间双击一下对其单元格,就可以按
“停止录制”的按钮以停止录制了。
最后,我们打开“工具”-“宏”-“Visual Basic 编辑器”,见到在“模块
1”当中,有一个 VBA 的函数。这个函数正是我们刚才录制的宏操作,当中只有
一句代码,就是对其单元格的代码。
这样,我们就取得了这个操作的 VBA 代码。在 “ExcelReport” 类当中,
我们“照葫芦画瓢”地添加这个功能的方法如下:
'对齐单元格,col 表示列名称,接受 “A” “B” 等列名
Function autoFit(intSheet As Integer, col As String)
xlApp.Workbooks(1).Worksheets(intSheet).Columns(col+":"+col).
EntireColumn.AutoFit
End Function
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 138
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
具体例程如下:
Sub Initialize
On Error Goto ErrorRoutine
Dim doc As notesdocument
Dim cdoc As notesdocument
Dim view As notesview
Dim session As New notessession
Dim db As notesdatabase
Dim Num As Integer
Dim NewNum As Integer
Dim exapp As Variant
Dim workbook As Variant
Dim worksheet As Variant
Dim Readerstr As String
Dim Stautsstr As String
Dim bodyitem As NotesRichTextItem
Dim ReCommenditem As NotesRichTextItem
Set db=session.currentdatabase
Set cdoc=session.documentcontext
Forall v In cdoc.Reader
Readerstr =Readerstr+v+" "
End Forall
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 140
142.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
If cdoc.Stauts(0) = "1" Then
Stautsstr = "已完成"
Else
Stautsstr = "未完成"
End If
Set bodyitem = cdoc.GetFirstItem("station")
Set ReCommenditem = cdoc.GetFirstItem("ReCommend")
Dim tempstr As String
'tempstr = ReCommenditem.text
'Print ReCommenditem.text
'%REM
Dim temp As String
Dim bodystr As String
Dim i As Double
temp = ReCommenditem.GetFormattedText(False,0)
bodystr=temp
'/替换 chr$(13)
i=1
While i>0
i=Instr(i+1,temp,Chr$(13),5)
If i>0 Then
bodystr=Left$(temp,i-1)+","
bodystr=bodystr+Right$(temp,Len(temp)-i)
temp=bodystr
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 141
143.
IBM 官方推荐用书-CHINALOTUS 之DOMINO7 开发大百科
End If
Wend
'/替换 chr$(10)
i=1
While i>0
i=Instr(i+1,temp,Chr$(10),5)
If i>0 Then
bodystr=Left$(temp,i-1)+","
bodystr=bodystr+Right$(temp,Len(temp)-i)
temp=bodystr
End If
Wend
'%END REM
'/定义 excel 变量
Print |<script>|
Print |var exapp = new ActiveXObject("Excel.Application");|
Print |if (exapp!=null){|
Print |exapp.statusbar ="正在创建工作表,请稍等……";|
Print |exapp.visible=true;|
Print |exapp.ScreenUpdating=true;|
Print |var workbook=exapp.workbooks.add;|
Print |var worksheet =exapp.workbooks(1).worksheets(1);|
Print |exapp.caption ="正在将当前日程安排导出为EXCEL表" |
WebSite:www.chinalotus.com E-mail:cndragonws@hotmail.com
TEL:86-0731-5817822 FAX:5159795-608 142