notesViewEntry.ColumnValues属性有这样一个特性:当某一列的列公式是一个常量时,他的列值是不会包含在ColumnValues数组里面的。所以如果想要让他能包含在ColumnValues数组里面,就需要在公式中和某个域扯上关系,如:@If(@Text(fldCbsj)="";114;114) 就可以了。

先看看下面的一点代码:

问题是三次msgbox打出来的都应该是什么?我们先来分析以下这段代码,答案在最后揭晓。

继续阅读

使用byKey查找视图有GetDocumentByKey、GetAllDocumentsByKey、GetEntryByKey、GetAllEntriesByKey四种方法。前面两个方法获得的是符合条件的文档/文档集,后面两个方法获得的则是符合条件的视图的一行/多行。

这四个方法使用方法基本一致,第一个参数是查找的key(多个key使用数组);第二个参数是是否精确匹配,这个参数我们一般都用true,除非在你想在检索“三”的时候,将“三毛”也一起检索出来。这就是第一个要注意的地方:精确匹配。

第二个要注意的是,使用GetAllDocumentsByKey方法获得的文档集并不是按照视图排序的,想要获得和视图顺序一样的文档集,应该使用GetAllEntriesByKey,然后再用NotesViewEntry的document属性。

Domino代理可以设定以web用户身份执行或者以签名者身份运行。但有时也会有这样的情况:代理需要以web用户的身份来处理一些东西,但是其中又有部分代码web用户的权限可能不够,需要以签名者身份执行。比如在myview的翻页修正处理中,需要以web用户身份来获取有权限查看的文档,又可能需要创建视图,而普通的用户是无法创建视图的。

最后采用这种方案:代理A还是以web用户身份运行,将创建视图的代码写到另外一个代理B中,代理B以签名者身份运行;然后在代理A中调用代理B,完成创建视图的操作。具体实现是使用notesAgent的run方法:

status = notesAgent.Run( [ noteID$ ] )
Parameter
noteID$
String. Optional. The note ID of a document. The value is passed to the ParameterDocID property of the called agent.

调用之前先将参数写到一个文档中,然后将这个文档的noteID传给代理B,代理B使用ParameterDocID属性获得noteID,获得参数、执行完操作、删除临时的参数文档,再返回代理A继续执行。

在国华项目中曾经遇到这样一个问题:

需要将OA系统中完整的发文处理单导入到档案系统中。考虑到OA系统中的处理单并不是独立存在的,而是文档的数据+表单的样式,决定将样式写死在代理中,然后用文档数据填充。

这样难点就在于怎样把其中的手写批示图片文件传输过去,经过分析发现MS的MHT格式恰好能满足这个要求,他将网页相关的所有文件都存在一个文件里,其中图片等二进制文件采用Base64编码存储。
我们使用Ls将手写批示图片剥离到服务器的临时目录,再进行Base64编码,与处理单的HTML保存在一个MHT文件中。至此,问题得到了解决。

此处有一个高性能的实现,处理大文件每秒几MB。

浏览器的请求的地址在交给服务器前会对其进行编码,像空格、%、汉字都会被编码成%XX的格式,我们在服务器端如果要取得原来的字符就要进行解码。

Domino提供了一个query_string_decoded域用来获得解码过的字符,但是在使用中发现有些字符通过这个域无法获得(我遇到的是“砚”字,听说还有其他字也获取不到)。

解决方法是用query_string获得未解码的字符,在用一个函数自己来解码。下面就是一个解码函数,在国华项目中使用没有问题。

继续阅读