domino+中编写公式的方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一个公式中含有一条或多条按顺序执行的语句。

根据与公式相关联的对象和其他标准的不同,公式可以在所选的文档上运行一次或多次(每个文档运行一次)。

除了从公式返回以外,公式中没有循环和控制跳转的语句。

公式中对条件执行路径也有限制。

代理公式将在选定的文档上多次地、有条件地执行。

您可以:
编写可得出计算结果的公式
以下公式都应该有最后结果:
复制公式必须得出结果为真 (1) 或假 (0),并且可以应用到数据库的每个文档上。

表单公式必须得出表单名称。

选择公式必须得出结果为真 (1) 或假 (0),并且可以应用到视图中的每个文档上。

列公式必须得出一个可以转换成文本字符串的值。

显示操作公式必须得出真 (1) 或假 (0)。

弹出式公式必须得出一个文本串。

窗口标题公式必须得出一个文本或数字值,除非公式由一个任意类型的单独的域组成。

区段存取公式必须得出一个姓名或姓名列表。

插入子表单公式必须得出一个子表单的名称的文本值。

区段标题公式必须得出一个文本或数字值,除非公式由一个任意类型的单独的域组成。

段落隐藏公式必须得出真 (1) 或者假 (0)。

缺省值公式必须得出一个可以存放在当前域中的值。

输入转换公式必须得出一个可以存放在当前域中的值。

缺省校验公式必须得出是成功 (1) 还是失败 (0)。

计算域公式必须得出一个可以存放在当前域中的值。

关键字公式必须得出一个可以存放在当前域中的值或值的列表。

这些公式可以简单到只有一个域、常量或者函数,也可以包含很多语句、使用临时变量、更改域的内容或者产生一些附加效果。

但不论如何,其最后一个语句必须是一个合适的值。

如果关键字 SELECT 没有显式指定的话,它会加在一个逻辑语句之前,这个逻辑语句用来终止复制或选择公式。

这些公式运行于数据库(复制公式)或视图(选择公式)的每一个文档上,以确定复制和查看过程中包括或不包括哪些文档。

函数 @All 返回一个真值因此公式“SELECT @All”将包括所有文档。

样例:编写得出结果的公式
1. 此样例是标准讨论数据库中“From”域的缺省值公式。

它只包含一个返回用户姓名的函数。

@UserName
2. 此样例是一个标准讨论数据库中“Subject”域的输入校验公式。

它含有一个@If 函数,如果“Subject”是空的(用户未输入任何值),它将返回一个失败的值,反之则返回成功值。

失败时还将显示一个消息。

@If(Subject = ""; @Failure("You must enter a subject for your document."); @Success)
3. 该样例是标准讨论数据库的“Memo”表单的窗口标题公式。

它只有一个语句,但包含有嵌套的 @If 命令。

如果当前文档是新的,则窗口标题是“New Memo”。

如果当前文档已经存在,并有一个“Subject”域,而且该域非空,则窗口标题将取“Subject”域中的内容(如果文档带有附件,则标题前还会出现“>>”)。

如果不存在“Subject”域或该域为空,则窗口标题为创建日期。

@If(@IsNewDoc; "New Memo"; @If(@IsAvailable(Subject) & Subject != ""; @If(@Attachments; "* "; "") + Subject; @Text(@Created)))
编写执行操作的公式
下列公式不产生一个最后的可用结果,但可以改变域值和产生附加动作:
便捷图标公式触发时执行一次。

代理公式触发时在一个数据库上执行。

一个代理公式运行在数据库中所选的每个文档上,这些文档由 UI 中指定的条件和公式中的 SELECT 关键字所决定。

SELECT 关键字缺省是 SELECT @All。

操作公式触发时在一个视图或表单中执行。

按钮公式触发时在一个表单、导航器或 RTF 域中执行。

操作热点触发时在一个表单、导航器或 RTF 域中执行。

样例:编写执行操作的公式
该代理样例将一个基于“Main”表单的文档中的“Address”域的“Wayside Street”替换成“Wayside Drive”。

有效的操作是 FIELD Address 赋值语句。

如果 Address 中含有“Wayside Street”,则新的 Address 的内容是将字符串“Wayside Street”左边的字符,加上字符串“Wayside Drive”,然后再加上 Address 中“Wayside Street”右边的字符。

否则,Address 将被重置为它的当前值。

SELECT Form = "Main Form";
ws := "Wayside Street";
wd := "Wayside Drive";
FIELD Address := @If(@Contains(Address; ws); @Left(Address; ws) + wd + @Right(Address; ws); Address)
处理列表
列表就是一个可以包含多个同类型值的命名实体。

列表出现在以下几种情况:允许多值的域可能包含一个列表而非一个单值。

某些函数返回一个列表。

常量可以被指定为一个列表或者是单值。

语法是多个单值用冒号分开;例如,"London":"New York":"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 个值:Blue Sedan、Blue Coupe、Blue Van、Blue Truck、Red Sedan 等等最后是 Yellow Truck。

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"; "No categories");
@Prompt([OKCANCELLIST]; "Categories"; ""; ""; Categories))
4 (@Explode) 该样例使用缺省的分隔符空格、逗号和分号,把一个字符串分离成一个列表。

结果列表中的值是:Paris、London、Chicago 和 Seoul。

cityList := @Explode("Paris London,Chicago;Seoul");
@Prompt([OKCANCELLIST]; "List of cities"; ""; ""; cityList)
5 (@Explode) 该样例使用分隔符逗号和分号将一个字符串常量分离成一个列表。

结果列表中的值为:Paris、London、New York 和 Hong Kong。

New York 和Hong Kong 没有分离成 New、York、Hong 和 Kong,这是因为没有将空格作为分隔符。

cityList := @Explode("Paris,London,New York;Hong Kong"; ",;");
@Prompt([OKCANCELLIST]; "List of cities"; ""; ""; cityList)
6 (@Explode) 该样例在 London 和 New York 之间有一个空条目。

如果第三个参数是 @False 或者被忽略,那么多个连续的分隔符将被看作一个。

请确信逗号是连续的,没有被空格分隔。

cityList := @Explode("Paris,London,,New York;Hong Kong"; ",;"; @True); @Prompt([OKCANCELLIST]; "List of cities"; ""; ""; cityList)
7 (@Implode) 该样例将一个列表常量组合到一个字符串变量中,用空格(缺省)作为分隔符。

结果字符串中的值为:Minneapolis Detroit Chicago。

city := "Minneapolis" : "Detroit" : "Chicago";
cityString := @Implode(city);
@Prompt([OK]; "Imploded string"; cityString)
8 (@Implode) 该样例将一个列表常量组合到一个字符串列表中,用逗号和空格作为分隔符。

结果字符串中的值为:Minneapolis, Detroit, Chicago。

city := "Minneapolis" : "Detroit" : "Chicago";
cityString := @Implode(city; ", ");
@Prompt([OK]; "Imploded string"; cityString)
9 (@Implode) 该样例使用冒号作为分隔符将一个列表域分离成一个字符串。

如果 Categories 域中的输入是 Minneapolis, Detroit, Chicago 则结果为:Minneapolis:Detroit:Chicago 。

@Prompt([OK]; "Categories"; @Implode(Categories; ":"))
10 (IsMember) 该代理样例检查所选的文档,看 Categories 列表中是否有Adjusted,如果有,Categories 将不变化。

如果没有,Adjusted 将被添加到Categories 列表中。

FIELD Categories := @If(@IsMember("Adjusted"; Categories); Categories; @Explode(@Implode(Categories; ";") + ";Adjusted"; ";"));
SELECT @All
11 (@IsNotMember) 该样例检查所选文档,看 Categories 列表中是否有Adjusted 和 Signed off。

如果没有,则两者都被加入到 Categories 列表中。

如果两者都已存在,则 Categories 维持原状。

FIELD Categories := @If(@IsNotMember("Adjusted" : "Signed off"; Categories); @Explode(@Implode(Categories; ";") + ";Adjusted;Signed off"; ";"); 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"; "Pick one"; "Sedan"; cars);
n := @Member(car; cars);
@Prompt([OK]; "Your selection is ..."; "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]; "Replacement list"; ""; ""; result) 15 (@Subset) 该样例将 New Orleans, London 和 Frankfurt 放到 first3 中,并将 Singapore 和 Sydney 放到 last2 中。

cities := "New Orleans" : "London" : "Frankfurt" : "Singapore" :"Sydney"; first3 := @Subset(cities; 3);
last2 := @Subset(cities; -2);
@Prompt([OKCANCELLIST] : [NoSort]; "First three"; ""; ""; first3);
@Prompt([OKCANCELLIST] : [NoSort]; "Last two"; ""; ""; last2)
16 (@Unique) 该样例返回一个有四个元素的列表:red, blue, yellow 和black。

colors := "red" : "blue" : "yellow" : "blue" : "black" : "red";
result := @Unique(colors);
@Prompt([OKCANCELLIST] : [NoSort]; "Unique list"; ""; ""; result)
使用条件语句
@If 可以使您根据条件的真假执行不同的语句。

这个条件通常是值和值的比较,但也可以是一个常量、一个变量或者一个函数的结果。

例如:
如果当前视图是“By Author”,则 @ViewTitle = "By Author" 为真。

如果 Categories 至少有一个元素,@Elements(Categories) > 0 为真。

1 用在条件中时表示真。

@True 和 @Yes 都返回 1。

如果条件为真,则比较运算和判断条件的函数返回 1 。

0 用在条件中时表示假。

@False 和 @No 都返回 0。

如果条件为假,则比较运算和判断条件的函数返回 0 。

@If 语句有奇数个参数,必须至少有三个,例如:
条件为第一个参数,如果 @If 有多个条件的话,此后每隔一个参数就是一个条件。

条件为真时,执行的是第二个参数中的语句,如果 @If 有多个条件,则第二个参数以后的每隔一个参数都是一个可执行的语句。

条件为假时执行最后一个参数中的语句。

最简单的 @If 语句有如下的形式:
@If(condition; true statement; false statement)
三个条件的 @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 比较。

如果域中有元素,则不作任何改变(设置成自己的值)。

如果域中没有元素,则设置成一个常量字符串。

FIELD Categories := @If(@Elements(Categories) > 0; Categories; "To be supplied ...");
SELECT @All
2. 此窗口标题的样例首先检查 @IsNewDoc 的返回值。

如果文档是新的,则窗口标题设置成文本常量“New Topic”。

如果文档已经存在,并且当前视图是“AuthorView”的话,窗口标题设置为“Subject”域中的内容。

否则,窗口标题就是“Subject”域的内容加上一个表示答复文档数目的字符串。

StandardTitle := Subject + @DocDescendants(" (No Responses)"; " (1 Response)"; " (% Responses)");
@If(@IsNewDoc; "New Topic"; @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]; "Current time and date"; "The date is " + @Text(@Now; "D0S0") + ". " + "The time is " + @Text(@Now; "T0S1") + ".")
2. 该样例编写一个文本常量作为标题。

而对话框的内容是一个文本常量,后面跟一个多值域中的值。

@Prompt([OKCANCELLIST] : [NoSort]; "Field offices"; "Current field offices are located in the following cities:"; ""; Field_offices)
使用 @Prompt 和 @PickList 取得用户的输入
用以下形式的 @Prompt 和 @PickList 交互的取得用户输入:
@Prompt([YesNo]; title; prompt) 显示一个对话框,其中有标题文字、提示文本以及“是”和“否”按钮。

如果用户单击“是”,则 @Prompt 返回真 (1),如果用户单击“否”,则返回假 (0)。

@Prompt([YesNoCancel]; title; prompt) 显示一个对话框,其中有标题文字、提示文本以及“是”、“否”和“取消”按钮。

如果用户单击“是”,则 @Prompt 返回真 (1),如果用户单击“否”,则返回假 (0),如果用户单击“取消”,则返回 -1 。

@Prompt([OkCancelEdit]; title; prompt, default) 显示一个对话框,其中有标题文字、提示文本和一个用户可以键入信息的方框。

@Prompt 将以文本值的形式返回用户的键入信息。

如果用户单击“取消”,公式将立即终止。

@Prompt([Password]; title; prompt) 与上面的公式作用一样,只是在用户键入时方框中显示 X ,而不是用户所输入的内容,这是出于保密的考虑。

@Prompt([OkCancelList] : [NoSort]; title; prompt; default; choices) 将显示一个方框,标题文字在框的顶部,提示文本在框的主体部分,文字列表选项在提示文本的下面,并且突出显示缺省选项。

最后一个参数必须是文本列表。

@Prompt 将返回用户选择的列表元素。

如果用户单击了“取消”,该公式将立即终止。

如果您想让列表排序的话,请不要指定 [NoSort] 。

@DbColumn 可以根据指定数据库中的当前视图的内容来生成一个列表。

@Prompt([OkCancelCombo]; title; prompt; default; choices) 与上面的公式作用一样,但使用的是一个下拉式列表,框中缺省项目位于列表最顶部。

@Prompt([OkCancelEditCombo]; title; prompt; default; choices) 与上面的公式作用一样,但是允许用户在列表上的方框中输入值或者从列表中选取一个值。

@Prompt([OkCancelListMult]; title; prompt; default; choices) 与OkCancelList 一样,但是允许用户选择多个列表元素并返回一个列表。

@Prompt[(LocalBrowse]; title; filetype) 显示一个对话框,允许用户从本地文件系统中选择名称。

标题文本位于对话框的顶部,在对话框主体部分的左边显示一个选择文件的列表框,在它下面是一个文件类型的列表框,在右边是一个选择目录的列表框。

对话框中包含“选择”、“取消”和“网络”或“帮助”按钮。

filetype 参数是一个文本值,从数字 1 到 3,指定初始化显示的文件类型:"1" 表示 .nsf 文件,"2" 表示 .ntf 文件;"3" 表示全部文件。

@PickList([Custom]:[Single]; server : file; view; title; prompt; column) 显示一个对话框,其中包含标题文本、提示文本以及选项列表。

列表中是指定数据库的视图。

用户可以选择一个(如果指定了 [Single])或任意数量的元素(如果未指定 [Single])。

@PickList 返回所选列表元素的指定列中的值。

这有点象用 @DbColumn 来生成一个列表给 @Prompt 的过程。

@PickList([Name]:[Single]) 与上面公式的作用类似,只是数据库是一个通讯录,而视图是“个人”视图。

用户可以在 @PickList 对话框中选择通讯录。

当把非文本值用作 @Prompt 和 @PickList 的参数时,必须先通过 @Text 转换成文本。

文本值可以是常量、临时变量、域或者表达式。

如果返回值要用作非文本值的话,它还必须再加以转换。

样例:使用 @Prompt 和 @PickList 取得用户的输入
1 (YesNo) 这个输入校验公式向用户查询的 TotalAmount 域。

如果用户单击“否”,则出现一个错误消息。

@If(@Prompt([YesNo]; "Is this total within budget?"; @Text(TotalAmount; "C")); @Success; @Failure("Total not within budget"))
2 (OkCancelEdit) 此按钮公式要求用户指定一个服务器和数据库,并打开此数据库。

如果用户没有向编辑框中输入信息而直接单击“是”,则返回值是一个空字符串。

server := @Prompt([OkCancelEdit]; "Server"; "Enter the name of a server"; "");
database0 := @Prompt([OkCancelEdit]; "Database"; "Enter the name of a database on " + @If(server = ""; "your workstation"; server); ""); database := @If(@Contains(database0; "."); database0; database0 + ".nsf");
@Command([FileOpenDatabase]; server : database)
3 (Password) 这个域输入校验公式从用户那里取得一个口令。

并将此口令与文档中“Password”域的内容相比较。

pass := @Prompt([Password]; "Password"; "What is the password?");
@If(pass = Password; @Success; @Failure("Password incorrect"))
4 (OkCancelList) 此便捷图标公式向用户展示数据库目录中的数据库列表,并打开用户所选的数据库。

第一个 @DbColumn 将 Databases by _Replica ID 视图的第 4 列的值的列表放入临时变量 titles 中。

第二个 @DbColumn 将Databases by _Replica ID 视图的第 2 列的值的列表放入临时变量 servers 中。

第三个 @DbColumn 将 Databases by _Replica ID 视图的第 3 列的值的列表放入临时变量 databases 中。

临时变量 list 将 titles,servers 和
databases 组合起来在 @Prompt 中呈现给用户。

然后,该公式将 @Prompt 的返回值分解成服务器和数据库的名称以用在 FileOpenDatabase 命令中。

titles := @DbColumn(""; "doc":"catalog.nsf"; "Databases by _Replica ID";
4);
servers := @DbColumn(""; "doc":"catalog.nsf"; "Databases by _Replica ID";
2);
databases := @DbColumn(""; "doc":"catalog.nsf"; "Databases by _Replica ID"; 3);
list := titles + " *-* " + servers + " *:* " + databases;
member := @Prompt([OkCancelList]; "Open Database"; "Select a database"; ""; list);
server := @Left(@Right(member; " *-* "); " *:* ");
database := @Right(member; " *:* ");
@Command([FileOpenDatabase]; server:database)
5 (OkCancelListMult) 此按钮公式向用户展示了一个部门名称及销售总额的列表。

用户可以从列表中选择任意数量的元素,公式计算其总和。

departments := @DbColumn(""; "" : "sales.nsf"; "Main View"; 1); totalSales := @DbColumn(""; "" : "sales.nsf"; "Main View"; 2); totalsList := @Text(totalSales; "C") + " " + departments;
sumList := @Prompt([OkCancelListMult]; "Total sales by department"; "Select the ones you want to sum"; ""; totalsList);
sum := @Sum(@TextToNumber(sumList)); @Prompt([OK]; "Sum"; @Text(sum)) 6 (Custom) 此按钮公式向用户展示 DOC 服务器上的 CATALOG.NSF 中的Databases by Replica ID 视图。

用户从列表(视图)中选择一个元素(行),此公式将打开该行中第 3 列所指定的数据库。

name := @PickList([Custom]; "doc" : "catalog"; "Databases by Replica ID"; "Open database"; "Select a database that is on server Doc"; 3);
@Command([FileOpenDatabase]; "doc" : name)
使用 @DialogBox 填写表单
@DialogBox 将在一个对话框中显示一个设计的表单,其中有“确定”和“取消”按钮。

当用户单击“确定”时,对话框中的某个域的内容将被传递到当前文档同名的域中。

@DialogBox 不传递 RTF 文本。

在设计时要注意不能包含 RTF 文本。

出现在对话框中的表单最好使用一个区域布局来创建,而且 @DialogBox 应该使用[AutoVertFit] 和 [AutoHorzFit] 选项。

样例:使用 @DialogBox 填写表单
假如您有一个包含很多域的表单,但用户通常在创建文档时只填写其中很少的几个域。

这时您可以创建另一个叫做“Dialog”的隐藏表单,在这个表单中包含一个区域布局,其中有用户通常填写的域。

在主表单的最上面,您可以创建一个包含下列公式的按钮。

当用户单击此按钮时,此公式将使用“Dialog”表单显示一个对话框。

用户可以在对话框中填写域然后单击“确定”,于是填写的内容便被传递到主表单中。

@DialogBox("Dialog"; [AutoVertFit] : [AutoHorzFit])
取得和设置环境变量
您可以从 NOTES.INI 文件中设置和提取环境变量(Windows,OS/2 和 UNIX 都适用)。

@SetEnvironment(variable; value) 将一个已命名的变量设置成指定的值。

您也可以用 ENVIRONMENT 关键字和双参数形式的 @Environment。

@Environment(variable) 提取一个已命名变量的值。

环境变量的值是文本。

非文本值必须在设置值之前和提取值之后转换成文本。

用户环境变量是以 $ 字符开头的。

如果您用编辑器或者 LotusScript 添加一个环境变量,此后您还想用 @Environment 提取的话,那么它的第一个字符必须是$。

请了确信您已经清楚了您的公式将会影响到哪个 NOTES.INI 文件。

如果公式在一个服务器数据库中,则以下几种情况下公式是运行在服务器上的:复制公式、由“当一个新邮件到来时执行”和定时执行触发的代理、选择公式或者列公式。

否则,公式将运行于用户的工作站上。

复本拷贝将根据其所在的服务器或工作站决定访问不同的 NOTES.INI 文件。

服务器访问服从于管理限制(请参阅在“Notes 管理帮助”中的“限制服务器上的代理”或者“管理员指南”)。

环境变量的作用有:
在不同的公式和数据库之间传递临时数据。

为一个用户生成连续的数字。

样例:取得和设置环境变量
1. 该样例将一个数字转换成文本并将其保存在一个环境变量中。

ENVIRONMENT OrderNumber := @Text(NewOrderNumber);
以下公式是等效的。

@Environment("OrderNumber"; @Text(NewOrderNumber);
@SetEnvironment("OrderNumber"; @Text(NewOrderNumber);
2. 该样例提取一个环境变量的值,并将其转换成一个数字并存放在局部变量中。

OldOrderNumber := @TextToNumber(@Environment("OrderNumber");
3. 该样例适用于“创建时计算”域。

该公式保留有一个叫“OrderNumber”的环境变量。

每当创建了一个新文档时,此公式从环境变量中取得该值然后加一。

这种计算法对于一个要进行复制的数据库是不适用的,数据库必须存在于单个服务器或工作站上,而且公式必须运行在相同的机器上。

OldOrderNumber := @Environment("OrderNumber");
NewOrderNumber := @TextToNumber(@If(OldOrderNumber = ""; "0"; OldOrderNumber)) + 1;
ENVIRONMENT OrderNumber := @Text(NewOrderNumber);
NewOrderNumber;
4. 第一个公式被每个销售人员运行一次。

该公式提示用户输入销售地区,并将其存放在一个叫“SalesArea”的环境变量中。

在销售文档的表单中,您将第二个公式用作 SalesArea 域的缺省值公式。

该公式从环境变量中取得值。

这样销售人员便不再需要为每个新文档输入销售地区的信息了,而且也避免了在缺省值公式中硬性规定一个销售区域。

ENVIRONMENT SalesArea := @Prompt([OKCANCELLIST]; "Sales Area"; "What is your sales area?"; "Central"; "East" : "Central" : "West");
@Environment("SalesArea");
处理错误的方法。

相关文档
最新文档