1.关于InStr函数
InStr函数是一个字符串函数,它的作用是返回某字符串在另一字符串中第一次出现的位置。
InStr函数的格式为:InStr([start, ]string1, string2[, compare])
InStr函数的语法参数含义如下:
start
可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。
string1
必要参数。接受搜索的字符串表达式。
string2
必要参数。被搜索的字符串表达式。
Compare
可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。
compare 参数设置为常数或者值:
返回值:返回0、1、2、-1或Null等。
返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中,从start开始找string2,省略start时从string1头开始找。找不到时,函数值为0。
如果 InStr 返回
string1 为零长度
0
string1 为 Null
Null
string2 为零长度
Start
string2 为 Null
Null
string2 找不到
0
在 string1 中找到string2
找到的位置
start > string2
0
例如
使用 InStr 函数来查找某字符串在另一个字符串中首次出现的位置:
Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP" ' 被搜索的字符串。
SearchChar = "P" ' 要查找字符串 "P"。
' 从第四个字符开始,以文本比较的方式找起。返回值为 6(小写 p)。
' 小写 p 和大写 P 在文本比较下是一样的。
MyPos = Instr(4, SearchString, SearchChar, 1)
' 从第一个字符开使,以二进制比较的方式找起。返回值为 9(大写 P)。
' 小写 p 和大写 P 在二进制比较下是不一样的。
MyPos = Instr(1, SearchString, SearchChar, 0)
' 缺省的比对方式为二进制比较(最后一个参数可省略)。
MyPos = Instr(SearchString, SearchChar) ' 返回 9。
MyPos = Instr(1, SearchString, "W") ' 返回 0。
2.Left 函数
返回指定数目的从字符串的左边算起的字符。
Left(string, length)
参数
string
字符串表达式,其最左边的字符被返回。如果 string 参数中包含 Null,则返回 Null。
3.Length
数值表达式,指明要返回的字符数目。如果是 0,返回零长度字符串 ("");如果大于或等于 string 参数中的字符总数,则返回整个字符串。
说明
可使用 Len 函数确定 string 参数中的字符数目。
下面的示例利用Left 函数返回MyString 的左边三个字母:
Dim MyString, LeftString
MyString = "VBSCript"
LeftString = Left(MyString, 3) 'LeftString 包含 "VBS"。
注意 LeftB 函数与包含在字符串中字节数据一起使用。length 不是指定返回的字符串数,而是字节数。
4.search方法
lotus本身的搜索就是模糊的搜索,比如你要搜索db.search("标题"),结果不会只是标题域中只有标题两个域值的文档被搜索出来。凡是标题域中的域值包含“标题”的文档都会被搜索出来的。
例子:
1.db.search({@contains(title;"标题")},true,0)返回所有title域值包含标题的文档;
2.
query$="form="+"'"+"表单名"+"'"+"&"+ "作者="+"'"+doc.作者(0)+"'"+"&"+ "标题 contains "+"'"+doc.标题(0)+"'"
DC = DB.Search(Query)
DC = DB.FTSearch(搜索字)
详细解析search()的思路与方法:
searchFormula$ = {Form = "formname" & starttime>"开始时间" & endtime<"结束时间"}
Set collection = db.Search(searchFormula$, dateTime,0)
Set doc=collection.getfirstdocument
While Not(doc Is Nothing)
print '打印文档
Set doc = collection.GetNextDocument(doc)
Wend
经过那么多曲折以后,有了一些感概,供和我一样的新手参考:)
1、search及ftsearch里的查询条件均为字符串,它是不能再在里面进行其它计算的
所以
set collection=db.ftsearch([date1] > doc.date2(0),0)
这样是得不到正确结果的
最好的办法就是设一字符串集中所有的条件,安全简便
search=[date1] > +doc.date2(0)+……
set collection=db.ftsearch(search,0)
2、也是别人告诉我的,field和[]只要用一个就可以了
3、在所有的运算符两边加空格,虽然notes并没有强调,但你会发现这样能避免一些出错的可能。
LotusScript方法
Lotus测试来确定在获得一组文档方面,谁是表现最好的最常使用的LotusScript 方法-实际上在LotusScrip任何部分程序代码中最常运行的任务。在这一小节,我们比较以下常用的LotusScript方法:
db.FTSearch
db.Search
view.GetAllDocumentsByKey
view.GetDocumentByKey
在这类测试过程中,使用不同大小的数据库(10,000、100,000和1,000,000份文档)来了解每种方法是如何很好地运行的。
db.FTSearch方法
在对数据库的全文检索后,db.FTSearch返回文档集合。它运行良好,但需要当前的全文索引,也许对语法更深入的了解。此外,根据服务器的Notes.ini 设置,对返回的文件集合的大小施加了限制。当然,如果您的查找是基于多文本字段的内容,那么这是您唯一切实可行的选择。
db.Search方法
在使用视图选择公式进行数据库查找之后,db.Search返回文档集合。对于大数据库中的小规模集合来说这是相对低效率的执行程序。例如, 如果您的数据库中有100,000份文档并且您只需查找5或10份文档,您可能希望避免使用db.Search。在另一方面,它不需要全文索引和预先创建的视图,因此它是一种非常方便的查询方法。例如,如果您对几乎不能控制的数据库进行查询,这可能是您唯一可靠的选择。
view.GetAllDocumentsByKey方法
从Release 5开始,这种方法成为检索文件集合最快的方式。唯一的缺点是需要建立相关的视图。但是,只要您精简了您的视图设计和不使用昂贵的时间/日期敏感的公式(正如第一部分所讨论),这些视图对性能和磁盘空间的影响应可以降低以最小,程序使用view.GetAllDocumentsByKey从这些视图获得文件集合的速度将非常迅速。
通常,当遍历使用任何这些方法检索到的大量文件时,您的程序应使用
set doc = DocumentCollection.GetNextDocument ( doc )
而不是
set doc = DocumentCollection.GetNthDocument ( i )
其中i从1增加到DocumentCollection.count。 对于文档小集合来说-和对于单独运行的程序来说,如预定的代理-性能下降为最小,但对于文档大集合来说-或者许多用户同时运行的程序来说会影响性能,它使GetNth成为不明智的选择。GetNth方法通常适用于您想要从集合中挑选文档的情形,而不是简单地遍历整个集合。
view.GetDocumentByKey方法
这是唯一一种不将一组文档保存到内存中的方法。view.GetDocumentByKey而是使用已经构建的视图索引作为其集合并且一次只把一份文档放到视图中。这种方法与view.AutoUpdate = False一同使用,它非常迅速且不需要内存来保存可能的大文件集合。
注:如果前一份文档已经从视图中删除,当有机会访问视图中的下一文档时,view.AutoUpdate = False主要用于避免错误信息,但它还可以显著提升性能以便运行代理。当更改文档中的数据时,使用view.AutoUpdate = False您会看到视图中有显著的改进。
事件、共享的要素和其它
以下是必须记住的一些编程注意事项:
注意表单中事件的数量,不要"overcode"
当删除程序时,注意完全删除它。不要只是重新标记它为删除,或者部分删除程序。您可以根据circle/squiggle是填满还是清空来告诉事件是否有程序代码。
共享的要素是低效率的执行程序,但是它们可以在多个位置使用,从而弥补了其糟糕的性能。
使用共享的元素来保存某些工作以及重复一个要素来提升性能时仔细考虑。
如果您实施了错误检测,确保当遇到错误时检测停止。
在精心编程的情形下,通过当它逻辑上应结束时使其继续运行,这可以确保您的程序不会"漏掉"。
大规模的子表单是低效率的执行程序。
大规模的子表单会影响应用程序的性能。如果您在应用程序中未多次使用大规模的子表单,考虑在每个表单中重复这类字段,而不是使用子表单。
使用较少的字段。
在文档中使用较少的字段与性能相关,而不是文档的大小。使用具有较多数据的较少字段,如多值字段,而不是使用较少数据的比较多的字段可以提升应用程序的性能。由于许多传统的编程人员对Notes/Domino应用程序开发不熟悉,这可能一些概念直观,但实际测试很明显地验证了这一概念。
使用view.Autoupdate=False 来阻止视图刷新。
正如前面介绍,同时使用view.GetDocumentByKey方法和这一属性可以是高效率的执行程序。
使用StampAll方法来立即修改大量文档。
当您需要使用静态值来标记大量文档时这种方法极其有效,如当前日期/时间或值的标记集。
ForAll 语句是遍历循环的最快方法。
固定数组是比动态数组更卓越的执行性能。
动态数组是比固定数组稍微低效率的执行性能,但动态数组的规模恰如其分,在您选择固定还是动态数组之前请预以权衡。
InStr函数是一个字符串函数,它的作用是返回某字符串在另一字符串中第一次出现的位置。
InStr函数的格式为:InStr([start, ]string1, string2[, compare])
InStr函数的语法参数含义如下:
start
可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。
string1
必要参数。接受搜索的字符串表达式。
string2
必要参数。被搜索的字符串表达式。
Compare
可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。
compare 参数设置为常数或者值:
返回值:返回0、1、2、-1或Null等。
返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中,从start开始找string2,省略start时从string1头开始找。找不到时,函数值为0。
如果 InStr 返回
string1 为零长度
0
string1 为 Null
Null
string2 为零长度
Start
string2 为 Null
Null
string2 找不到
0
在 string1 中找到string2
找到的位置
start > string2
0
例如
使用 InStr 函数来查找某字符串在另一个字符串中首次出现的位置:
Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP" ' 被搜索的字符串。
SearchChar = "P" ' 要查找字符串 "P"。
' 从第四个字符开始,以文本比较的方式找起。返回值为 6(小写 p)。
' 小写 p 和大写 P 在文本比较下是一样的。
MyPos = Instr(4, SearchString, SearchChar, 1)
' 从第一个字符开使,以二进制比较的方式找起。返回值为 9(大写 P)。
' 小写 p 和大写 P 在二进制比较下是不一样的。
MyPos = Instr(1, SearchString, SearchChar, 0)
' 缺省的比对方式为二进制比较(最后一个参数可省略)。
MyPos = Instr(SearchString, SearchChar) ' 返回 9。
MyPos = Instr(1, SearchString, "W") ' 返回 0。
2.Left 函数
返回指定数目的从字符串的左边算起的字符。
Left(string, length)
参数
string
字符串表达式,其最左边的字符被返回。如果 string 参数中包含 Null,则返回 Null。
3.Length
数值表达式,指明要返回的字符数目。如果是 0,返回零长度字符串 ("");如果大于或等于 string 参数中的字符总数,则返回整个字符串。
说明
可使用 Len 函数确定 string 参数中的字符数目。
下面的示例利用Left 函数返回MyString 的左边三个字母:
Dim MyString, LeftString
MyString = "VBSCript"
LeftString = Left(MyString, 3) 'LeftString 包含 "VBS"。
注意 LeftB 函数与包含在字符串中字节数据一起使用。length 不是指定返回的字符串数,而是字节数。
4.search方法
lotus本身的搜索就是模糊的搜索,比如你要搜索db.search("标题"),结果不会只是标题域中只有标题两个域值的文档被搜索出来。凡是标题域中的域值包含“标题”的文档都会被搜索出来的。
例子:
1.db.search({@contains(title;"标题")},true,0)返回所有title域值包含标题的文档;
2.
query$="form="+"'"+"表单名"+"'"+"&"+ "作者="+"'"+doc.作者(0)+"'"+"&"+ "标题 contains "+"'"+doc.标题(0)+"'"
DC = DB.Search(Query)
DC = DB.FTSearch(搜索字)
详细解析search()的思路与方法:
searchFormula$ = {Form = "formname" & starttime>"开始时间" & endtime<"结束时间"}
Set collection = db.Search(searchFormula$, dateTime,0)
Set doc=collection.getfirstdocument
While Not(doc Is Nothing)
print '打印文档
Set doc = collection.GetNextDocument(doc)
Wend
经过那么多曲折以后,有了一些感概,供和我一样的新手参考:)
1、search及ftsearch里的查询条件均为字符串,它是不能再在里面进行其它计算的
所以
set collection=db.ftsearch([date1] > doc.date2(0),0)
这样是得不到正确结果的
最好的办法就是设一字符串集中所有的条件,安全简便
search=[date1] > +doc.date2(0)+……
set collection=db.ftsearch(search,0)
2、也是别人告诉我的,field和[]只要用一个就可以了
3、在所有的运算符两边加空格,虽然notes并没有强调,但你会发现这样能避免一些出错的可能。
LotusScript方法
Lotus测试来确定在获得一组文档方面,谁是表现最好的最常使用的LotusScript 方法-实际上在LotusScrip任何部分程序代码中最常运行的任务。在这一小节,我们比较以下常用的LotusScript方法:
db.FTSearch
db.Search
view.GetAllDocumentsByKey
view.GetDocumentByKey
在这类测试过程中,使用不同大小的数据库(10,000、100,000和1,000,000份文档)来了解每种方法是如何很好地运行的。
db.FTSearch方法
在对数据库的全文检索后,db.FTSearch返回文档集合。它运行良好,但需要当前的全文索引,也许对语法更深入的了解。此外,根据服务器的Notes.ini 设置,对返回的文件集合的大小施加了限制。当然,如果您的查找是基于多文本字段的内容,那么这是您唯一切实可行的选择。
db.Search方法
在使用视图选择公式进行数据库查找之后,db.Search返回文档集合。对于大数据库中的小规模集合来说这是相对低效率的执行程序。例如, 如果您的数据库中有100,000份文档并且您只需查找5或10份文档,您可能希望避免使用db.Search。在另一方面,它不需要全文索引和预先创建的视图,因此它是一种非常方便的查询方法。例如,如果您对几乎不能控制的数据库进行查询,这可能是您唯一可靠的选择。
view.GetAllDocumentsByKey方法
从Release 5开始,这种方法成为检索文件集合最快的方式。唯一的缺点是需要建立相关的视图。但是,只要您精简了您的视图设计和不使用昂贵的时间/日期敏感的公式(正如第一部分所讨论),这些视图对性能和磁盘空间的影响应可以降低以最小,程序使用view.GetAllDocumentsByKey从这些视图获得文件集合的速度将非常迅速。
通常,当遍历使用任何这些方法检索到的大量文件时,您的程序应使用
set doc = DocumentCollection.GetNextDocument ( doc )
而不是
set doc = DocumentCollection.GetNthDocument ( i )
其中i从1增加到DocumentCollection.count。 对于文档小集合来说-和对于单独运行的程序来说,如预定的代理-性能下降为最小,但对于文档大集合来说-或者许多用户同时运行的程序来说会影响性能,它使GetNth成为不明智的选择。GetNth方法通常适用于您想要从集合中挑选文档的情形,而不是简单地遍历整个集合。
view.GetDocumentByKey方法
这是唯一一种不将一组文档保存到内存中的方法。view.GetDocumentByKey而是使用已经构建的视图索引作为其集合并且一次只把一份文档放到视图中。这种方法与view.AutoUpdate = False一同使用,它非常迅速且不需要内存来保存可能的大文件集合。
注:如果前一份文档已经从视图中删除,当有机会访问视图中的下一文档时,view.AutoUpdate = False主要用于避免错误信息,但它还可以显著提升性能以便运行代理。当更改文档中的数据时,使用view.AutoUpdate = False您会看到视图中有显著的改进。
事件、共享的要素和其它
以下是必须记住的一些编程注意事项:
注意表单中事件的数量,不要"overcode"
当删除程序时,注意完全删除它。不要只是重新标记它为删除,或者部分删除程序。您可以根据circle/squiggle是填满还是清空来告诉事件是否有程序代码。
共享的要素是低效率的执行程序,但是它们可以在多个位置使用,从而弥补了其糟糕的性能。
使用共享的元素来保存某些工作以及重复一个要素来提升性能时仔细考虑。
如果您实施了错误检测,确保当遇到错误时检测停止。
在精心编程的情形下,通过当它逻辑上应结束时使其继续运行,这可以确保您的程序不会"漏掉"。
大规模的子表单是低效率的执行程序。
大规模的子表单会影响应用程序的性能。如果您在应用程序中未多次使用大规模的子表单,考虑在每个表单中重复这类字段,而不是使用子表单。
使用较少的字段。
在文档中使用较少的字段与性能相关,而不是文档的大小。使用具有较多数据的较少字段,如多值字段,而不是使用较少数据的比较多的字段可以提升应用程序的性能。由于许多传统的编程人员对Notes/Domino应用程序开发不熟悉,这可能一些概念直观,但实际测试很明显地验证了这一概念。
使用view.Autoupdate=False 来阻止视图刷新。
正如前面介绍,同时使用view.GetDocumentByKey方法和这一属性可以是高效率的执行程序。
使用StampAll方法来立即修改大量文档。
当您需要使用静态值来标记大量文档时这种方法极其有效,如当前日期/时间或值的标记集。
ForAll 语句是遍历循环的最快方法。
固定数组是比动态数组更卓越的执行性能。
动态数组是比固定数组稍微低效率的执行性能,但动态数组的规模恰如其分,在您选择固定还是动态数组之前请预以权衡。