### Lotus Notes Formula Language知识点详解
#### 一、@If 的用法
在Lotus Notes Formula Language中,`@If` 是一个非常强大的条件语句,它允许开发者根据不同的条件执行不同的命令。`@If`的基本格式是:`@If(条件表达式;真表达式;假表达式)`。
**示例1:**
```
@If(@IsDocBeingEdited;"";@Command([EditDocument]));
```
这段代码用于检查当前文档是否正在被编辑。如果是,则不做任何操作(即执行空字符串 `""`)。如果不是,则执行`@Command([EditDocument])`命令来打开文档进行编辑。
**示例2:**
```
@If(@IsDocBeingEdited;@True;@Command([EditDocument];1));
```
这个例子与上一个类似,但是当文档不在编辑状态时,它不仅会打开文档进行编辑,还会将文档锁定以防止其他用户同时编辑。这里`1`参数代表锁定文档。
**示例3:**
```
@If(@DocLock([Lock]);"";@Command([EditDocument]));
```
此代码检查文档是否已被锁定。如果文档未锁定,则允许用户进行编辑。这里的`@DocLock([Lock])`用于检查文档是否处于锁定状态。
**示例4:**
```
@If(@Prompt([YesNo];"提示";"确认")=1;"";@Return(""));
```
这段代码通过弹出一个“确认”对话框来询问用户是否继续某个操作。如果用户选择“是”,则不做任何操作。如果用户选择“否”,则终止当前操作。
**示例5:**
```
@If(((h>8&h<12)|(h>=14&h<17)|(h=8&m>=30&m<=60)|(h=17&m>=0&m<=30));@Do(@Prompt([Ok];"提示";"时间(8:30--12:00 14:00--17:30)外不允许编辑"));@Return(""));
```
此示例检查当前时间是否在指定的时间范围内。如果是,则允许编辑文档。否则,显示一条警告消息并阻止编辑操作。
**示例6:**
```
temp:=@Integer(@AttachmentLengths/(1024*1024));
@If(@Sum(temp)>30;@Do(@Prompt([Ok];"提示";"附件总大小超过30M"));@Return(""));
```
这段代码计算所有附件的总大小,并将其转换为兆字节(MB)。如果总大小超过30MB,则显示一条警告信息并停止后续操作。
**示例7:**
```
@If(@IsNewDoc;"新建文档";"编辑文档")
```
这段代码用于判断当前文档是否为新文档。如果是新文档,则显示“新建文档”。如果不是,则显示“编辑文档”。
**示例8:**
```
@If(yallreaders="";@Do(@Prompt([Ok];"提示";"未指定阅读者");@Return(""));@Success);
```
这段代码检查变量`yallreaders`是否为空。如果是,则显示一条提示信息,告知用户未指定阅读者,并停止后续操作。
#### 二、@Prompt 的用法
`@Prompt`用于显示对话框以获取用户的输入或反馈。基本格式是:`@Prompt([按钮类型];标题;信息)`。
**示例9:**
```
@Prompt([Ok];"计算结果";"3+4*5的值为:"@Text(3+4*5));
```
这段代码显示一个包含计算结果“3+4*5”的对话框。注意,这里使用了`@Text`函数将数值转换为文本形式。
#### 三、@PostedCommand 和 @Command 的用法
`@PostedCommand`和`@Command`都用于执行Lotus Notes中的各种命令。
**示例10:**
```
@PostedCommand([FileSave]);
```
这条命令用于保存当前文档。`@PostedCommand`与`@Command`的区别在于它不会立即执行命令,而是将其添加到命令队列中。
**示例11:**
```
@Command([FileCloseWindow])
```
这条命令用于关闭当前窗口。
**示例12:**
```
@Command([EditDocument];"1")
```
这条命令用于编辑文档,并且锁定文档以防止其他用户同时编辑。
**示例13:**
```
@Command([NavigatePrev])
```
这条命令用于导航至前一个文档。
**示例14:**
```
@Command([NavigateNext])
```
这条命令用于导航至下一个文档。
**示例15:**
```
@Command([Compose];@MialDbName:"Memo")
```
这条命令用于创建一个新的备忘录文档。
**示例16:**
```
@Command([ViewRefreshFields])
```
这条命令用于刷新视图中的字段数据。
**示例17:**
```
@Command([MailAddress];"yauditor1")
```
这条命令用于显示指定收件人的电子邮件地址。
**示例18:**
```
@Command([Compose];"";"MainTopic")
```
这条命令用于创建一个新的邮件,并设置其主题。
**示例19:**
```
@Command([Compose];"SALES//nyoffice":"Westchester\\REPS.NSF";"ClientInformation")
```
这条命令用于创建一个指向特定数据库的新邮件,并设置邮件的主题。
**示例20:**
```
@Command([FileOpenDatabase];@Subset(@DbName;1):"NEWOA\\officefixing.nsf")
```
这条命令用于打开指定的数据库。
#### 四、@Text 的用法
`@Text`用于将数字或其他类型的值转换为文本格式。
**示例21:**
```
salse:=800;
@Text(salse;"C,2")
```
这段代码将数值800转换为货币格式的文本,即“$800.00”。
**示例22:**
```
@Text(@Now;"D1S1")
```
这条命令将当前日期和时间转换为文本格式,显示为“04/93 10:43 AM”。
#### 五、@Unique 的用法
`@Unique`用于返回一组值中的唯一项。
**示例23:**
```
@Unique("red":"green":"blue":"green":"red")
```
这段代码返回一个字符串列表,其中只包含唯一的颜色名称:“red”、“green”和“blue”。
#### 六、@DbLookup 的用法
`@DbLookup`用于从另一个数据库中检索数据。
**示例24:**
```
@DbLookup("":"NoCache";yservername:"newoa\\db_renyuan.nsf";"v_renyuan";"20";11)
```
这条命令从名为`db_renyuan.nsf`的数据库中查找名为`v_renyuan`的视图中的数据。`20`表示返回第20行的数据,`11`表示返回该行第11列的数据。
**示例25:**
```
@DbLookup("":"NoCache";yservername:"bbk\\groups.nsf";"Groups";"#"+ydep;3)
```
这条命令用于从名为`groups.nsf`的数据库中查找与部门相关的组信息。`#`加上变量`ydep`用于构建查询字符串,`3`表示返回该行第3列的数据。
**示例26:**
```
@DbLookup("":"NoCache";@DbName;"v_renyuan";"4";3)
```
这条命令用于从当前数据库中查找名为`v_renyuan`的视图中的数据。`4`表示返回第4行的数据,`3`表示返回该行第3列的数据。
**示例27:**
```
@DbLookup("":"NoCache";@Subset(@Name([CN];@DbName);1):"names.nsf";@DbColumn("":"NoCache";@Subset(@Name([CN];@DbName);1):ymaindatabase;"v_systemvar";5);@Name([CN];@UserName);4)
```
这条命令用于从名为`names.nsf`的数据库中查找与当前用户名相关的数据。`@DbColumn`用于获取当前数据库中名为`v_systemvar`的视图中的第5列的数据。`ymaindatabase`是一个变量,其值为`@LeftBack(@Subset(@Name([CN];@DbName);-1);"\\")+"\\\\"+"OAMAIN.NSF"`。