在 Domino 应用开发中,有很多方法可以对数据进行查询。@dblookup 和 NotesView.getAllDocumentsByKey 利用了预先建好的视图索引,所以在各种查询数据的方法中,它们的性能是最出色的,也是我们最常用的。

最近在工作中遇到了一个于此相关的问题,请大家也注意:如果查询的视图具有多层分类,那么 @dblookup 和 getAllDocumentsByKey 只能返回第一个子分类下的结果。以如下数据为例:

分类1
  分类1.1
    文档1.1.1
  分类2.2
    文档1.1.2
分类2

如果以“分类1”作为查询条件,则只有“文档1.1.1”会返回,同样符合条件的“文档1.1.2”则丢失。

请参考:Troubleshooting @DbLookup, @DbColumn, GetAllDocumentsByKey

有些时候,我们会通过不同的表单显示同一个文档,以实现针对不同用户或场景的展现。但是一旦进行保存操作,文档的 form 域就会发生改变。以如下场景为例:

  1. 用户 A 通过 Form1 新建一个文档并保存,此时 form 的值为”Form1″
  2. 用户 B 通过 Form2 打开此文档并保存,此时 form 域的值则变为”Form2″

这样的话,本来应该属于同一类的文档,却有着不同的 form 域值。考虑到建立视图时的选择公式、搜索时的搜索条件的可维护性,我们希望将这些文档的 form 域值统一为”Form1″。

首先想到的方法是在 Form2 上建立 form 计算域,将其计算公式写为”Form1″,但是经测试此方法无效。可行的方法为将 Form2 的 WebQuerySave 公式写为 @SetField(“Form”;”Form1″)。

请参考:Fix for modified Form field value is ignored when document is submitted from the Web

昨天同事提交了一个奇怪的问题,两个选择条件一样的视图 A 和 B,却有一部分文档在 A 中莫名的丢失。

排查了半天,试过新建视图,但只要把某个列加入进去,文档就开始丢失。这也把问题定位在这个列公式上:这一列包含了一个大列表的处理,其计算结果超过了 32k 限制,最终与此文档相关的视图条目就丢失了。

所以在视图列中处理大列表时,请一定要小心谨慎。

代码如下:

_forward := "ANY_TEXT/" + @Implode(myorderedlist; "/");
REM {将list连接为字符串,并在最前面添加一级(由于第一级会被去掉)};
_reverse := @Name([ToKeyword]; _forward);
REM {反序然后在将字符串切割为list};
_reverselist := @Explode(_reverse; "");

关于@Name([ToKeyword]; name)的帮助文档:

[TOKEYWORD]
Reverses the order in which the naming components are displayed, and replaces slashes with backslashes: CountryOrganizationOrganization Unit… This is useful when you want to categorize a view by the components of a user’s hierarchical name (backslashes represent subcategories in views). The [TOKEYWORD] option does not return the Common Name portion of the user name.

参考链接:Reversing the order of a list in formula language

有时候我们需要获得一个群组中的成员列表,一般都是直接去 Names 查找,如果遇到嵌套群组则更加麻烦。其实有个简单的方法,通过如下的函数:

Syntax

@ExpandNameList(servername : notesdatabase ; groupname)

Parameters

    * servername

Text. Specify the target Domino Server for your query.

    * notesdatabase

Text. Specifiy the target NotesDatabase for your query.

    * groupname

Text. Specify the target Group, by name, for your query.

Return value

   * valuelist

Text list. A multi-value text list containing members of the queried Domino Directory Group. No value is returned for unmatched Groups. To display the return values in a dialog box using @Prompt, enclose this function in an @Text function.

Usage

@ExpandNameList cannot be used in form selection and view column formulas.

举例说明,以下公式就可以获取在 Domino/Server 服务器上 names.nsf 库中定义的 LocalDomainAdmins 群组的成员列表:

@ExpandNameList(“Domino/Server”:”names.nsf”; “LocalDomainAdmins”)

最后有一点需要说明的是,这个函数在文档中并没有注明,所以有可能会有不稳定、或者未来版本会不可用等可能性,大家请自行评估其中的风险。

参考链接:Undocument Command Documented: ExpandNameListUndocumented @functions in Notes/Domino

如果在MIME格式邮件的正文中包含附件,那么直接使用@Attachments公式是无法计算到的。我们在项目中发现了这个问题,而且Notes邮件模板同样存在。

Designer help中有如下说明:

Syntax
@Attachments( excludeMIMEBody )
Parameters
excludeMIMEBody
Boolean. Optional.
         Specify True (1) to exclude large MIME parts that are stored as attachments (but displayed in-line). This is the default.
         Specify False (0) to include large MIME parts that are stored as attachments (but displayed in-line).

实验证明,其实通过指定参数 excludeMIMEBody = 0 是可以计算到MIME邮件正文的附件的。不知道这样用是否有什么问题,Notes的邮件模板为什么不这样使用。

类似的公式还有@AttachmentNames、@AttachmentLengths。

如果在Domino的页面中使用了@username公式(还有@UserRoles),会发现即使每次使用不同的用户来访问这个页面,公式计算的结果一直是之前的某个人。不知道是Domino对页面作了缓存还是什么其它的原因。目前我的解决方法是,在某处加一个@now的公式,每次访问的时候Domino好像就会重新计算了。