问题

Notes应用程序在开发和使用过程中,因为测试、准备或修正数据,时常需要修改某些文档的某些字段值。这些字段或者因为在表单上不可见或不可编辑不能以通常编辑文档的方式修改,或者因为有多个文档需修改逐个进行太费时,都要求一种更直接方便地修改数据的途径。Notes数据库不像关系型数据库,有统一的查询和修改数据的SQL语言。要做同样的事,往往是建一个临时视图筛选出目标文档,或者在现有视图里手工选择,然后建一个应用公式@SetField或更复杂的LotusScript的简单代理。虽然不难,但是每次都重复这样的程序仍然麻烦,特别是仅仅为了修改几个文档就要修改应用程序的设计。要是有一个通用字段修改器就好了。
很多Notes开发人员或许已经知道和应用了国外这位仁兄的Edit Any Field SmartIcon。在Notes客户端的工具栏上创建一个按钮,粘贴链接文章里的代码。以后在任何数据库里,只要选中需修改的文档,单击该按钮,就能够经过一系列对话框后,修改任意字段的值,还能选择输入值的数据类型。这个看上去完美的解决方案仍有一些缺点。除了代码中有少数多馀无效的部分,使用时最大的问题一是选项复杂和所需步骤过多。在第一个对话框里选择了要修改的字段后,第二个选择数据类型的对话框里,选项多达Text、Date、Integer、Password、Name、Common Name、Remove Field、Text Multi Value、Date Multi Value、Name Multi Value、Common Name Multi Value,实际上Password和Remove Field都极少有需要;Name和Common Name则基本上可以与输入文本合并,因为修改字段值并不会改变该字段原有的NAMES标记,而且实际上原作者的代码里也并没有处理Common Name的情况。如果修改的是多值域,还会弹出第三个对话框选择分隔多值的字符,最后在第四个对话框中输入使用该分隔符的一串值。第二个大问题是一次只能修改一个文档。如果有五个文档,每个有两个字段去修改,一个是单值域,一个是多值域,就总共需要选择五次文档,弹出5*3+5*4=35次对话框。

方案

我们改进的方向是将前面提到的可以批量修改的简单代理与这个按钮中的选择字段这样的通用思路相结合,尽量简化用法减少操作步骤。结果就是一个Tools\Modify Item Turbo代理。因为工具栏上的按钮无法运行LotusScript,所以要使用该功能的应用程序内必须加入该代理。在任一视图内选择文档,从Notes客户端的Actions菜单内选择该代理或者如下图那样,在一个显示数据库内所有文档的视图里,建立一个调用该代理的Modify documents操作。

在弹出的对话框内选择已有字段(或者选择新建字段):

在随后最后一个对话框内,直接输入字段的值,无论它是文本、数字还是日期类型,也无论是单值还是多值,只要按照提示的格式输入即可。也就是多值用英文逗号分隔,文本值用英文双引号包围,数字直接输入,日期值用英文方框号包围,格式为LotusScript的CDat函数能转换的如下图格式:月/日/年 时:分:秒。

这样修改五个文档的一个多值域,只需选择一次文档和弹出两个对话框。

代码

该代理的代码如下:

Option Public
Option Declare
Use "Commons"
Sub InitializeDim s As New NotesSession Dim ws As New NotesUIWorkspaceDim uiview As NotesUIViewSet uiview=ws.CurrentviewDim dc As NotesDocumentCollectionSet dc=uiview.DocumentsIf dc.Count=0 ThenMsgBox "Please select the documents to be modified."Exit Sub End IfDim doc As NotesDocumentSet doc=dc.Getfirstdocument()Dim fields As New NArray()ForAll item In doc.ItemsCall fields.Add(item.Name)      End ForAllCall fields.Add("**** ADD A NEW FIELD ****")Dim field As String field = ws.Prompt(PROMPT_OKCANCELLIST, "Select Field To Update", "Select the field you wish to update:", "", QuickSort(fields.ToArray()))If field = "**** ADD A NEW FIELD ****" Thenfield = ws.Prompt(PROMPT_OKCANCELEDIT, "Enter Field Name", "Enter the name of the new field:", "")End IfIf Field="" ThenExit Sub End IfDim hint As String 'Inputbox can only show 5 lines of prompt'hint=|Enclose string values with "", date values with [] and enter numbers directly.
Separate multipe values with "," and they must be of the same data type.
For example: "apple", "orange", "banana"
1, 2.0, -3.1
[07/12/2007 02:29:48], [04/18/2010 12:29:48]|Dim valuesvalues=InputBox(hint, "Enter the values for the item")If values="" Then Exit Subvalues=Split(values,",")values=ArrayMap(values, "Trim()")Dim v As String 'The first value in multi-valuesv=values(0)If StartsWith(v, {"}) Thenvalues=ArrayMap(values, {StrRight(,|"|)}) '{StrRight(,"""")}values=ArrayMap(values, {StrLeftBack(,|"|)})ElseIf StartsWith(v, {[}) Thenvalues=ArrayMap(values, {StrRight(,|[|)})values=ArrayMap(values, {StrLeftBack(,|]|)})values=ArrayMap(values, {CDat()})Elsevalues=ArrayMap(values, {CDbl()})End If'Modify the documentsDo Until doc Is NothingCall doc.Replaceitemvalue(Field, values)Call doc.save(True,False)Set doc=dc.Getnextdocument(doc)Loop
End Sub

为了能够分析输入字段值的不同情况,上面代码的最后部分频繁用到ArrayMap函数。该函数是在LotusScript里模拟函数式编程,对一个数组的每个元素调用传入的“函数”。以后会专门介绍这种方法。MarkDown编辑器对BASIC的语法着色不准确,大家不要把上面大段注释视为注释。

不足和改进方向

上述通用字段修改器仍然有改进空间。文章最开头提到,要修改的目标文档有时需要建建一个临时视图筛选,也就是在普通视图上不便于选择到所需文档或者目标数量太大的时候。数据库如果建了全文索引,可以在视图的搜索栏里用全文查询的语法搜索满足诸如[Form]=fmLog AND [LogBody]=error条件的文档集合,但如果搜索条件更复杂,还是需要利用和视图的选择公式一样的过滤。
现在的修改器代理在完成后会取消对界面文档的选择,所以对多个文档如果要修改另一个字段,就须再选择一次。
这些改进都可以通过创建一个专用表单实现,在表单上可以输入和视图选择条件一样的公式,在一个界面上完成字段选择和值的输入,然后分别设OK按钮——修改文档并关闭表单,Cancel按钮——关闭表单,Apply按钮——修改字段。
有兴趣的朋友可以自己完成!

96. 通用字段修改器相关推荐

  1. 游戏修改器的基本工作原理

    所谓游戏修改器,主要是通过修改游戏程序的内存数据或存盘文件来修改游戏中的相关数据,使之达到"无敌"等效果. 游戏修改器主要分为两类:单一游戏的修改器和通用游戏修改器.顾名思义,前者 ...

  2. root的游戏修改器,手游root修改器

    有什么好用的游戏修改器? 有<金山游侠>.<梦幻魔盒修改器>.<星云修改器>.<CE游戏修改器>. <金山游侠> 名称:金山游侠修改器下载v ...

  3. thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)

    thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...

  4. 梦幻默认服务器文件夹修改器,【梦幻仙境V3.96服务端】梦幻最新完美开心版带存档与修改器时代梦幻最新5.2版本...

    [梦幻仙境V3.96服务端]梦幻最新完美开心版带存档与修改器时代梦幻最新5.2版本 梦幻仙境这个版本智能玩到109级.玩过这个梦战系列改版的都知道.就不介绍了.因为作者太垃圾了.但是游戏可玩性还是很高 ...

  5. 自由枪骑兵修改服务器端口,自由枪骑兵存档修改器(全版本通用)

    这是自由武器骑兵存档修改器(全版本通用),自由武器骑兵存档修改器一个,这是一个很强大的存档修改器,直接修改存档,让您在游戏中变得更加的强大,可以更好的体验游戏,下面为大家附上详细的使用方法. 游戏说明 ...

  6. 饥荒服务器怎么修改器,饥荒通用修改器TestTools

    不知道怎么下载?点我 游戏介绍 饥荒通用修改器TestTools适用于游戏21版和22版,不但通用,还包含多种功能,而且非常实用,像刷出物品.刷出食物.刷出怪物.刷出魔法物品等,有此一项修改器,足以你 ...

  7. 发布新版本,以后专用游戏修改器通用框架不做了。

    现在发布的是:专用游戏修改器制作工具.NET版 V1.0.0.0 该制作工具下载地址:http://download.csdn.net/source/195988 专用游戏修改器制作工具完整说明文件: ...

  8. MongoDB update修改器: 针对Fields的$修改器 $inc $set $unset

    MongoDB update修改器: $inc $set $unset $push $pull $pop 针对Fields的$修改器 $set: { $set: { key: value } } $s ...

  9. MongoDB修改器的使用1

    为什么要使用修改器?     通常我们只会修改文档的一部分,这时候更新整个文档就显得很麻烦,通常是通过原子性的更新修改器来完成. 1."$set"修改器    "$set ...

最新文章

  1. Angular应用提高打包速度
  2. 入门 Python GUI 开发的第一个坑
  3. 【译】为何我们要写super(props)?
  4. Apache Camel日志组件示例
  5. 区块链100讲:不做码农做矿工,该怎么和爹妈解释
  6. 如何用VMware搭建HA和DRS环境(第一篇;序)
  7. Java 设计模式之 Observer 模式
  8. POJ 1050 To the Max (最大子矩阵和)
  9. clickhouse语句_Siem落地方案:初识clickhouse
  10. Photoshop(PS)CC2020安装教程【64位】
  11. 【图像重建】基于Split Bregman实现稀疏图像重建附matlab代码
  12. Confluence: A Robust Non-IoU Alternative to Non-Maxima Suppression in Object Detection 论文阅读翻译
  13. 面试总结 -记周六校招笔试
  14. Java中double转String
  15. 水星路器服务器无响应,联想M720Q、光网卡、Pon stick、Openwrt我的完美软路由折腾记...
  16. ubuntu9.10 添加bones7456源
  17. 考研高数——积分中值定理证明
  18. android老人字体变大,适合老年人用的安卓手机软件 一键让Android字体变大
  19. 全网最全关闭小米手机MIUI系统广告教程
  20. 最新Swift4打造今日头条实战

热门文章

  1. 思科交换机如何根据MAC地址查所在交换机的端口
  2. 数据揭示疫情期间电力需求变化,电力企业巧用人工智能应对
  3. java长方体的父类_java的多级继承程序(题目:创建超类cuboid(长方体),其成员有height,width,length和计算机长方体的体积...
  4. 零数科技受邀加入中国信通院隐私计算联盟
  5. PMSM的simulink模型搭建
  6. Android 高德地图绘制线、添加图钉、添加线段纹理
  7. node使用express+multer文件上传和下载的问题
  8. 常见浏览器以及对应驱动的下载与使用
  9. BREAKING CHANGE: webpack < 5 used to include polyfills
  10. 在列表前方插入一个数据_jQuery实现在列表的首行添加数据