之前介绍过 domino 7.0.2 引入了一个新的功能:以 JSON 格式返回视图的内容。当时我只是做了简单的测试,并没有用于实际项目。最近我在一个项目中使用了这个功能,没想到遇到了一个棘手的问题:服务器返回的 JSON 内容是以 GB2312 编码的,但是却没有在 Http Header 中声明。由此带来的结果就是,xmlHttpRequest 对象将其以默认的 UTF-8 编码处理,最终导致乱码等错误。而同样的代码在 Domino 8.0 上就没有问题,因为它返回的 JSON 是以 UTF-8 编码的。

找到问题的来源后,我通过 800 联系了 IBM,得到的答复是:此功能是在 8.0 版正式引入的,没有任何正式文档说明在 7.0.2 版中有此功能,所以无法进行技术支持。我查来查去才想起来,这个功能是在 Lotusphere 08 的一个 PPT 上看到的,还真没啥官方文档的说明。对于各种非正式文档记载的功能,大家用之前也要三思啊。

基于 Domino 平台的开发过程中,我们经常会用到各种 ID,如 UNID、Note ID、复本 ID 等等。本文简要介绍各种 ID 的组成以及用途。

在开始之前,我们首先来分析一下文档属性对话框-标识符标签中的各部分。以如下数据为例:

OF0000039D:3836C29F-ON85255DC9:0056FB94
SD00255DF4:0057B8FA-SN00000003
DB85255CD9:00567287-NT0000C092

其中红色部分为数据名称的简写,其余部分才是数据本身。各部分含义如下:

OF : Originator ID.File
虽然名字叫 File,其实是个完完全全的随机数(唯一),与数据库文件没有任何关系 – –

ON : Originator ID.Note
Note(可理解为文档,实际为文档、设计元素、ACL等。下同)最初的创建日期及时间

SD : Sequence Datetime
Note 的修改日期及时间

SN : Sequence Number
Note 的修改序列号,每修改一次加一

DB : Database ID
数据库的创建日期及时间

NT : Note ID
Note 在 Record Relocation Vector (RRV) 中的位置,可以理解为在数据库文件中的位置偏移

接下来我们再介绍各种常见的 ID 由以上哪些部分组成。

UNID(Universal ID, Unique ID) = OF+ON。UNID 是我们最常用的文档标识,它不随着文档的修改而改变。同一个文档在各个复本中具有相同的 UNID,反过来它也是确定两个文档是否为复本的根据。新建数据库拷贝后 UNID 也不变。编程过程中可以通过 getDocumentByUNID 方法来获取文档,在浏览器中也可以通过 db.nsf/view/UNID 的方式访问文档。根据我的测试,@Created 公式返回的值就是 ON 这个部分。

Note ID = NT。它也不随着文档的修改而改变,但是在不同的副本、新建数据库拷贝中,Note ID 可能与原数据库中的不同。编程过程中可以通过 getDocumentByID 方法来获取文档。

Replica ID = DB。复本 ID 用来识别两个数据库是否具有复本关系,除此之外复本 ID 还经常用来作为数据库的唯一标识,如浏览器中可以用复本 ID 代替数据库路径来访问文档、视图等。

Originator ID(OID) = UNID + SD + SN。OID 我们一般很少接触,因为它是用于后台的复制任务。复制过程大概如下(以数据库 A 向具有复本关系的数据库 B 发起单向复制为例):

  1. 从 A 的复制历史中找到与 B 完成最后一次复制的时间
  2. 在 A 中搜索在此时间之后新建及修改的文档,返回一组 OID 值
  3. 使用上一步返回的 OID 中的 UNID 部分作为条件,在 B 中查找文档,返回 OID 值
    1. 如果查找不到,则该文档视为新建的,添加到 B 中
    2. 如果两个 OID 相同,则两个文档已经同步,视为不需要复制
    3. 如果两个 OID 不同,则两个文档不同步,通过分析 $Revisions 域值判断是否存在冲突,通过 $ConflictAction 域判断是否合并冲突,通过分析 SD 和 SN 决定哪个将作为冲突文档(此过程较复杂,如果大家感兴趣,可以另开一篇文章讨论)

请参考:Anatomy of a Note ID

有些时候,我们会通过不同的表单显示同一个文档,以实现针对不同用户或场景的展现。但是一旦进行保存操作,文档的 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

从前三章的公测版到完整版,今天终于通关了。从逆转一到检事,现在游戏的时间越来越少,不过还是把她给打穿了,毕竟系列作一直都没有错过。

游戏的素质就不多说了,见到通关后的合影环节,还是感慨颇多。不知道下一代的逆转,我是否还能通关呢?

通关合影

这几个月以来,在优博网托管的博客一直无法访问,原因是大家都知道的,和 cn 域名审查有关。这期间也有几位朋友询问此事,所以我才有了购买一个自己的域名这样的想法。

现在博客搬迁已经完成,麻烦大家更新收藏夹和订阅地址,也请大家继续支持咯。

另外还要感谢优博网,为我的旧域名设置了 301 重定向。其实几年来优博网的服务一直是不错的,只是这次可能要到五月份才能恢复,所以有些等不及了。

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

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

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

Notes/Domino 8.5.1 英文版将于10月12日发布。从版本号上看,本版应该是一个以 bug 修正为主的维护更新,但其实它带来的新特性完全可以看作是 8.6 之类的新版本。主要新特性如下:

Lotus Notes:

  • 与 Quick、 Protector 集成能力的增强

Lotus Notes Traveler

  • 增加对 Apple iPhone 的支持

Domino Designer

  • XPages 支持 Notes 客户端
  • XPage 性能和可伸缩性增强
  • XPage active content filtering(不知道干啥的)
  • Dojo 更新到 1.3.2 版(目前的最新版)
  • 改进了 XPages 中 Dojo 的应用
  • Designer 性能增强
  • 新的基于 LotusScript® and Java™ 编辑器(迟到的特性,本来是要在 8.5 推出的,现在终于来了)
  • Domino Designer 扩展 API
  • 用于构建 iWidgets 的新的设计元素
  • 复合应用支持 XPages
  • 提供 Notes User Interface 类的 Java API

除了以上新的特性,产品授权方式也发生了变化(好像价格也有变动),而开发工具变成了免费下载使用(听起来不错)。

请参考:IBM 8.5.1 Announcement Letter

代码如下:

_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