lotus domino notes公式语言.docx
《lotus domino notes公式语言.docx》由会员分享,可在线阅读,更多相关《lotus domino notes公式语言.docx(33页珍藏版)》请在冰豆网上搜索。
lotusdominonotes公式语言
公式编码指南一
编写公式的方法
一个公式中含有一条或多条按顺序执行的语句。
根据与公式相关联的对象和其他标准的不同,公式可以在所选的文档上运行一次或多次(每个文档运行一次)。
除了从公式返回以外,公式中没有循环和控制跳转的语句。
公式中对条件执行路径也有限制。
代理公式将在选定的文档上多次地、有条件地执行。
您可以:
编写可得出计算结果的公式
以下公式都应该有最后结果:
复制公式必须得出结果为真
(1)或假(0),并且可以应用到数据库的每个文档上。
表单公式必须得出表单名称。
选择公式必须得出结果为真
(1)或假(0),并且可以应用到视图中的每个文档上。
列公式必须得出一个可以转换成文本字符串的值。
显示操作公式必须得出真
(1)或假(0)。
弹出式公式必须得出一个文本串。
窗口标题公式必须得出一个文本或数字值,除非公式由一个任意类型的单独的域组成。
区段存取公式必须得出一个姓名或姓名列表。
插入子表单公式必须得出一个子表单的名称的文本值。
区段标题公式必须得出一个文本或数字值,除非公式由一个任意类型的单独的域组成。
段落隐藏公式必须得出真
(1)或者假(0)。
缺省值公式必须得出一个可以存放在当前域中的值。
输入转换公式必须得出一个可以存放在当前域中的值。
缺省校验公式必须得出是成功
(1)还是失败(0)。
计算域公式必须得出一个可以存放在当前域中的值。
关键字公式必须得出一个可以存放在当前域中的值或值的列表。
这些公式可以简单到只有一个域、常量或者函数,也可以包含很多语句、使用临时变量、更改域的内容或者产生一些附加效果。
但不论如何,其最后一个语句必须是一个合适的值。
如果关键字SELECT没有显式指定的话,它会加在一个逻辑语句之前,这个逻辑语句用来终止复制或选择公式。
这些公式运行于数据库(复制公式)或视图(选择公式)的每一个文档上,以确定复制和查看过程中包括或不包括哪些文档。
函数@All返回一个真值因此公式“SELECT@All”将包括所有文档。
样例:
编写得出结果的公式
1.此样例是标准讨论数据库中“From”域的缺省值公式。
它只包含一个返回用户姓名的函数。
@UserName
2.此样例是一个标准讨论数据库中“Subject”域的输入校验公式。
它含有一个@If函数,如果“Subject”是空的(用户未输入任何值),它将返回一个失败的值,反之则返回成功值。
失败时还将显示一个消息。
@If(Subject="";@Failure("Youmustenterasubjectforyourdocument.";@Success)
3.该样例是标准讨论数据库的“Memo”表单的窗口标题公式。
它只有一个语句,但包含有嵌套的@If命令。
如果当前文档是新的,则窗口标题是“NewMemo”。
如果当前文档已经存在,并有一个“Subject”域,而且该域非空,则窗口标题将取“Subject”域中的内容(如果文档带有附件,则标题前还会出现“>>”)。
如果不存在“Subject”域或该域为空,则窗口标题为创建日期。
@If(@IsNewDoc;"NewMemo";@If(@IsAvailable(Subject)&Subject!
="";@If(@Attachments;"*";""+Subject;@Text(@Created)))
编写执行操作的公式
下列公式不产生一个最后的可用结果,但可以改变域值和产生附加动作:
便捷图标公式触发时执行一次。
代理公式触发时在一个数据库上执行。
一个代理公式运行在数据库中所选的每个文档上,这些文档由UI中指定的条件和公式中的SELECT关键字所决定。
SELECT关键字缺省是SELECT@All。
操作公式触发时在一个视图或表单中执行。
按钮公式触发时在一个表单、导航器或RTF域中执行。
操作热点触发时在一个表单、导航器或RTF域中执行。
样例:
编写执行操作的公式
该代理样例将一个基于“Main”表单的文档中的“Address”域的“WaysideStreet”替换成“WaysideDrive”。
有效的操作是FIELDAddress赋值语句。
如果Address中含有“WaysideStreet”,则新的Address的内容是将字符串“WaysideStreet”左边的字符,加上字符串“WaysideDrive”,然后再加上Address中“WaysideStreet”右边的字符。
否则,Address将被重置为它的当前值。
SELECTForm.="MainForm";
ws:
="WaysideStreet";
wd:
="WaysideDrive";
FIELDAddress:
=@If(@Contains(Address;ws);@Left(Address;ws)+wd+
@Right(Address;ws);Address)
处理列表
列表就是一个可以包含多个同类型值的命名实体。
列表出现在以下几种情况:
允许多值的域可能包含一个列表而非一个单值。
某些函数返回一个列表。
常量可以被指定为一个列表或者是单值。
语法是多个单值用冒号分开;例如,"London":
"NewYork":
"Tokyo"就是一个由三个元素构成的字符串列表常量。
由于列表的连接运算具有最高的优先级,所以如果列表元素中的表达式是一个仅用于其自身的表达式的话,它就必须用括号括起来。
例如,如果3为负数而4不是负数的话就应该写成1:
2-3):
4,而不是1:
2:
-3:
4。
并列运算或交叉运算时的列表组合。
列表限制了操作的范围,因为列表操作仅限于每一个列表元素。
就象在一个循环中处理数组一样。
以下函数是列表所特有的。
函数描述
@Elements(list)确定列表元素的数量。
@Explode(string)将文本字符串转换成一个文本列表。
空格、逗号和分号用于分隔字符串的元素。
@Explode(string;separator)与上面的函数一样,但第二个参数指定了字符串中的元素的分隔符。
@Explode(string;separator;empties)与上面的函数一样,但是返回值为@True,因为第三个参数包含空的列表元素,其中出现了连续的分隔符。
@Explode(date-range)将一个日期范围转换成一个日期列表。
参数必须是一个时间-日期值;返回值是文本列表。
@Implode(list)将文本列表转换成文本字符串,用空格分隔各个元素。
@Implode(list;separator)与上面的函数一样,但是第二个参数指定了字符串中每个元素之间的分隔符。
@IsMember(string;list)确定一个字符串是否为一个列表的成员。
返回真
(1)或假(0)。
@IsMember(list1;list2)确定一个列表是否被包含在另一个列表中。
返回真
(1)或假(0)。
@IsNotMember(string;list)确定一个字符串是否不是一个列表的成员。
返回真
(1)或假(0)。
@IsNotMember(list1;list2)确定一个列表是否不被包含在另一个列表中。
返回真
(1)或假(0)。
@Keywords(list1;list2)在list1中找到与list2中的单词相匹配的单词。
单词分隔符有",?
!
;:
[]{}<>。
@Keywords(list1;list2;separator)与上面的函数一样,但第二个参数指定了单词的分隔符。
@Member(value;list)确定一个值在字符串列表中的位置。
@Replace(list1;list2;list3)将list1中与list2相匹配的值用list3中对应的值替换。
@Subset(list;n)从列表中提取出n个值。
用-n表示从右到左提取。
@Unique(list)从字符串列表中删除重复的值。
@Unique返回一个随机的,唯一的文本值。
公式编码指南二
样例:
使用列表
1(并列运算)该样例用并列算法把两个数字列表相加。
结果列表中有四个值11、22、27和44。
list1:
=10:
20:
30:
40;
list2:
=1:
2:
(-3):
4;
list3:
=list1+list2;
result:
=@Text(list1)+"+"+@Text(list2)+"="+@Text(list3);
@Prompt([OKCANCELLIST];"Result";"";"";result)
2(交叉运算)该样例用交叉算法将两个列表连接起来。
结果列表中有12个值:
BlueSedan、BlueCoupe、BlueVan、BlueTruck、RedSedan等等最后是YellowTruck。
cars:
="Sedan":
"Coupe":
"Van":
"Truck";
colors:
="Blue":
"Red":
"Yellow";
result:
=colors+""*+cars;
@Prompt([OKCANCELLIST];"Result";"";"";result)
3(@Elements)如果“Categories”域中没有元素,此例将显示一条消息,如果有的话则显示列表。
@If(@Elements(Categories)=0;@Prompt([OK];"Categories";"Nocategories";
@Prompt([OKCANCELLIST];"Categories";"";"";Categories))
4(@Explode)该样例使用缺省的分隔符空格、逗号和分号,把一个字符串分离成一个列表。
结果列表中的值是:
Paris、London、Chicago和Seoul。
cityList:
=@Explode("ParisLondon,Chicago;Seoul";
@Prompt([OKCANCELLIST];"Listofcities";"";"";cityList)
5(@Explode)该样例使用分隔符逗号和分号将一个字符串常量分离成一个列表。
结果列表中的值为:
Paris、London、NewYork和HongKong。
NewYork和HongKong没有分离成New、York、Hong和Kong,这是因为没有将空格作为分隔符。
cityList:
=@Explode("Paris,London,NewYork;HongKong";",;";
@Prompt([OKCANCELLIST];"Listofcities";"";"";cityList)
6(@Explode)该样例在London和NewYork之间有一个空条目。
如果第三个参数是@False或者被忽略,那么多个连续的分隔符将被看作一个。
请确信逗号是连续的,没有被空格分隔。
cityList:
=@Explode("Paris,London,,NewYork;HongKong";",;";@True);
@Prompt([OKCANCELLIST];"Listofcities";"";"";cityList)
7(@Implode)该样例将一个列表常量组合到一个字符串变量中,用空格(缺省)作为分隔符。
结果字符串中的值为:
MinneapolisDetroitChicago。
city:
="Minneapolis":
"Detroit":
"Chicago";
cityString:
=@Implode(city);
@Prompt([OK];"Implodedstring";cityString)
8(@Implode)该样例将一个列表常量组合到一个字符串列表中,用逗号和空格作为分隔符。
结果字符串中的值为:
Minneapolis,Detroit,Chicago。
city:
="Minneapolis":
"Detroit":
"Chicago";
cityString:
=@Implode(city;",";
@Prompt([OK];"Implodedstring";cityString)
9(@Implode)该样例使用冒号作为分隔符将一个列表域分离成一个字符串。
如果Categories域中的输入是Minneapolis,Detroit,Chicago则结果为:
Minneapolisetroit:
Chicago。
@Prompt([OK];"Categories";@Implode(Categories;":
")
10(IsMember)该代理样例检查所选的文档,看Categories列表中是否有Adjusted,如果有,Categories将不变化。
如果没有,Adjusted将被添加到Categories列表中。
FIELDCategories:
=@If(@IsMember("Adjusted";Categories);Categories;@Explode(@Implode(Categories;";"+";Adjusted";";");
SELECT@All
11(@IsNotMember)该样例检查所选文档,看Categories列表中是否有Adjusted和Signedoff。
如果没有,则两者都被加入到Categories列表中。
如果两者都已存在,则Categories维持原状。
FIELDCategories:
=@If(@IsNotMember("Adjusted":
"Signedoff";Categories);@Explode(@Implode(Categories;";"+";Adjusted;Signedoff";";";Categories);
SELECT@All
12(@Keywords)该样例查找在Cities域中用到了哪个关键字。
keywords:
=@Keywords(Cities;"Paris":
"Moscow":
"Tokyo":
"Boston";
@Prompt([OK];"Keywords";keywords)
13(@Member)该样例让用户从一个列表中选择一个值,并显示该值在列表中的编号。
cars:
="Sedan":
"Coupe":
"Van":
"Truck";
car:
=@Prompt([OKCANCELLIST]:
[NOSORT];"Cars";"Pickone";"Sedan";cars);
n:
=@Member(car;cars);
@Prompt([OK];"Yourselectionis...";"Number"+@Text(n))
14(@Replace)该样例将colors列表中的“red”替换成“scarlet”并将“blue”替换成“turquoise”。
colors:
="red":
"blue":
"yellow":
"blue":
"black":
"red";
from:
="red":
"blue";
to:
="scarlet":
"turquoise";
result:
=@Replace(colors;from;to);
@Prompt([OKCANCELLIST]:
[NoSort];"Replacementlist";"";"";result)
15(@Subset)该样例将NewOrleans,London和Frankfurt放到first3中,并将Singapore和Sydney放到last2中。
cities:
="NewOrleans":
"London":
"Frankfurt":
"Singapore":
"Sydney";
first3:
=@Subset(cities;3);
last2:
=@Subset(cities;-2);
@Prompt([OKCANCELLIST]:
[NoSort];"Firstthree";"";"";first3);
@Prompt([OKCANCELLIST]:
[NoSort];"Lasttwo";"";"";last2)
16(@Unique)该样例返回一个有四个元素的列表:
red,blue,yellow和black。
colors:
="red":
"blue":
"yellow":
"blue":
"black":
"red";
result:
=@Unique(colors);
@Prompt([OKCANCELLIST]:
[NoSort];"Uniquelist";"";"";result)
公式编码指南三
使用条件语句
@If可以使您根据条件的真假执行不同的语句。
这个条件通常是值和值的比较,但也可以是一个常量、一个变量或者一个函数的结果。
例如:
如果当前视图是“ByAuthor”,则@ViewTitle="ByAuthor"为真。
如果Categories至少有一个元素,@Elements(Categories)>0为真。
1用在条件中时表示真。
@True和@Yes都返回1。
如果条件为真,则比较运算和判断条件的函数返回1。
0用在条件中时表示假。
@False和@No都返回0。
如果条件为假,则比较运算和判断条件的函数返回0。
@If语句有奇数个参数,必须至少有三个,例如:
条件为第一个参数,如果@If有多个条件的话,此后每隔一个参数就是一个条件。
条件为真时,执行的是第二个参数中的语句,如果@If有多个条件,则第二个参数以后的每隔一个参数都是一个可执行的语句。
条件为假时执行最后一个参数中的语句。
最简单的@If语句有如下的形式:
@If(condition;truestatement;falsestatement)
三个条件的@If语句有如下形式:
@If(condition1;true1;condition2;true2;condition3;true3;false)
@If函数从左到右依次计算,遇到第一个为真的条件就执行对应的语句(也就是接下来的那个参数中的语句)。
此后就不再执行任何@If中的语句了。
如果没有一个条件为真,则执行最后一个参数中的语句。
真值语句和假值语句的形式根据其前后关系的不同而有些变化:
如果@If语句是公式中最后一条需要得出结果的语句,则真值和假值语句必须得出一个计算结果。
如果@If语句是赋值语句右边的部分,则真值和假值语句必须能得出一个可以存放在左边的域或临时变量中的值。
否则,真值和假值语句必须产生一个操作。
@If中的真值和假值语句不能包含一个赋值语句。
赋值语句左边的部分只能出现在一个公式的最外层。
以下语法形式是错误的:
@If(condition;variable:
=value1;variable:
=value2)
必须写成:
variable:
=@If(condition;value1;value2)
@If语句是可以嵌套的。
嵌套的@If语句对于解决公式语言有限的逻辑结构问题是很有帮助的,但它会导致复杂的语法表达。
@Do函数可以使您在一个条件下执行多条语句。
样例:
使用条件语句
1.该代理的例子将Categories中元素的数量与0比较。
如果域中有元素,则不作任何改变(设置成自己的值)。
如果域中没有元素,则设置成一个常量字符串。
FIELDCategories:
=@If(@Elements(Categories)>0;Categories;"Tobesupplied...";
SELECT@All
2.此窗口标题的样例首先检查@IsNewDoc的返回值。
如果文档是新的,则窗口标题设置成文本常量“NewTopic”。
如果文档已经存在,并且当前视图是“AuthorView”的话,窗口标题设置为“Subject”域中的内容。
否则,窗口标题就是“Subject”域的内容加上一个表示答复文档数目的字符串。
StandardTitle:
=Subject+@DocDescendants("(NoResponses)";"(1Response)";"(%Responses)";
@If(@IsNewDoc;"NewTopic";@ViewTitle="AuthorView";Subject;StandardTitle)
公式编码指南四
编写消息和取得用户输入的方法
您可以通过以下技术与用户进行交互:
使用@Prompt编写消息
用以下形式的@Prompt编写消息,与用户交流。
@Prompt([OK];title;prompt)显示一个信息对话框,标题文本在对话框的顶部,提示文本在对话框的主体部分。
@Prompt([OKCANCELLIST]:
[NOSORT];title;prompt;default;choices)将显示一个对话框,标题文本在对话框的顶部,提示文本在对话框的主体部分,选择文本列表在提示文本的下面。
这种形式的@Prompt主要用于取得输入信息,但也可以用于显示。
最后一个参数必须是一个文本列表。
prompt和default可以为空。
然而,如果该语句不是公式的最后一条语句,而且用户单击了“Cancel”的话,则接下来的公式便不再执行了。
如果您想将列表排序的话就不要指定[NOSORT]。
非文本值必须用@Text转换成文本才能用作@Prompt的参数。
文本值可以是常量、临时变量、域或者表达式。
样例:
使用@Prompt编写消息
1.该样例在对话框中编写一个作为标题的文本常量和一个文本表达式。
表达式是文本常量和已转换成文本的日期-时间值的组合。
@Prompt([OK];"Currenttimeanddate";"Thedateis"+@Text(@Now;"D0S0"+"."+"Thetimeis"+@Text(@Now;"T0S1"+"."
2.该样例编写一个文本常量作为标题。
而对话框的内容是一个文本常量,后面跟一个多值域中的值。
@Prompt([OKCANCELLIST]:
[NoSort];"Fieldoffices";"Currentfieldofficesarelocatedinthefollowingcities:
";"";Field_offices)