本文主要是介绍96. 通用字段修改器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
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. 通用字段修改器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!