`

Lotus开发之Lotus Notes中域的验证

阅读更多

一:介绍
      
Lotus中的域主要有以下的类型:文本,日期/时间,对话框列表,复选框,单选按钮,RTF等等。Lotus中域的验证方式有很多种公式,lotusscript,javascript等。如果你使用notes开发c/s的程序,使用公式,ls会很方便,但是如果你是一个b/S的程序员,你会发现notes所有的公式和ls都是运行在服务器端的,此时你在使用公式,ls不但会占用server的资源,而且给用户的体验也是不好的,所以我们推荐使用js来做验证.

二:Domino对域的解析
      
对于LotusScript,除了Rich-Text域外的元素,如文本、单选框、列表框、复选框等,你可以用几乎相同的代码取得它们的值。例如:如果有一个“Location”域,不论它是何种类型,你都可以用下面的LotusScript代码取得它的值:
fieldVals = doc.Location
或者这样:
fieldVals = doc.GetItemValue("Location")
在LotusScript中,域的类型对于你要取值(值数组)的代码并不重要。但是在JavaScript中,不同类型的域除了显示选项(比如单选框、复选框或者文本)外,并不像在Notes里那样,它们是不同的类型的对象,每一个都要用不同的方式去引用。其实,那也不是绝对的,有些对象是相似的,但是引用过程并不像在LotusScript里那么流畅。

      在JavaScript中,没有所谓的Rich-Text域,在HTML中更没有。Notes里提供了一个可以放在浏览器里的富文本Java(不是JavaScript)小程序,从而可以得到富文本的一些功能,但是你并不能用JavaScript来对它编程,而且它也不是一个真正的HTML对象类型。
更让Notes开发人员惊讶的是,在Web上还没有数字型或时间型的域。HTML的域都是文本型的。尽管你能用它们来收集数字信息,如数量或单价,而保存的数据依然是文本。为了像数字一样使用它,你必须把它转换成数字类型。另一个区别是在Web上没有计算域,但并不意味着你不能在你的表单里加入计算域。你可以加入计算域,计算值将会在Web页中显示,除非域是隐藏的。关键是即使域就在那里显示,而HTML通常的处理是没有定义域。如果你把test域改成计算域而不是可编辑的,在测试时你会发现其值是取不到的,我们可以对比下计算域和可编辑域生成的html代码:

计算域的时候生成的代码(js是取不到值的):
<form method="post"
 action="/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">dddddddd
<br>
<input type="button" onclick="alert(document.forms[0].test.value);
" value="test">
</form>

非计算域时候客户端生成的代码:
<form method="post"
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">
<input name="test" value="dddddddd">
<br>
<input type="button" onclick="alert(document.forms[0].test.value);
" value="test"></form>

多值域
      
HTML的域没有Notes的域那样的多值属性。可以试一下:在表单上加入第二个按钮和第二个域。把域命名为“Letters”,类型为可编辑文本,选中“允许多值(Allow multiple values)”复选框。将默认值写成如下的字母列表:
"A":"B":"C":"D":"E":"F":"G"
把按钮命名为“Get multiple values”并键入如下的JavaScript代码:
alert(document.forms[0].Letters.value);
你可以用不同的分隔符来改变此域的值,但是当你单击按钮时,你会注意到,不论你用什么分隔符,提示你的总是域的所有值。这和在Notes客户端中运行的@Formulas和LotusScript形成了对比。用@Prompt,你得到的提示只是域的第一个值:“A”。你用LotusScript同样也只能显示一个值,但是你要指定数组下标,否则将得到一个错误提示。公式和LotusScript都不能在提示语句中得到多值域的所有值。
原因就是,在Notes的语言中,确实有多个值在域中。对于HTML和JavaScript来说,只有一个值。再次看Web页面的源代码你会发现和下面类似的代码:
<input name="Letters" value="A;B;C;D;E;F;G">
注意它的值是用“一对”双引号引起来的带分隔符的值。

单选按钮
      
另一个有趣的地方是单选按钮,就Notes和Web页面而言,Notes里的单选按钮是一个有多个值的单个域,在Web上是同名的输入文本框的数组。为了理解以上所述,请看下面的例子:
在表单上,加入另一个新域,名字为“RadioButtn”。正像它的名字一样,把它改成单选框类型的域。在域属性窗口的第二个标签中,输入下列选项和别名
One | A
Two | B
Three | C
Four | D
把此域的缺省值设成第一个选项的别名,也就是带引号的字母“A”。现在在浏览器里预览表单,再看源文件,你会看到单选按钮的代码和正常域的代码有很大区别。HTML代码看起来将和下面的类似:
<input type="radio" name="RadioButtn" value="A" checked>One<br>
<input type="radio" name="RadioButtn" value="B">Two<br>
<input type="radio" name="RadioButtn" value="C">Three<br>
<input type="radio" name="RadioButtn" value="D">Four
      在这里你要注意一些要点。首先,所有的4个单选按钮对象有同一个名字:RadioButtn,这样一来,HTML和JavaScript就知道它们是同一个数组里的对象。其次,每个选项的值是选项的别名,并不是看到的文字(例如“One”、“Two”等)。这和在Notes中保存的是别名是一样的,保存的不是看到的文本(当然如果没有别名的话,保存的值和文本就是一样的了)。      最后,你选中第一个选项的方法是在HTML语句中用的“checked”单词,它被加在了第一个单选按钮的语句里。
如果你再加入另外的一个按钮,用和取其他两个域值同样的方法来取RadioButtn的值的话,你会得到一个奇怪的错误,也就是用下面的代码:
alert(document.forms[0].RadioButtn.value);
你将会看到一个提示“undefined”的错误对话框
这里的问题并不是没有定义它的值。毕竟如上面所示,单选按钮的代码中共有4个值。也就是说,问题出在RadioButtn本身,至少是现在用在这里的那个。单选按钮是一个输入选项的数组,如果你想要知道其中一个元素的值,必须指定是哪一个,试试下面的代码:
alert(document.forms[0].RadioButtn[0].value);
好,返回的是当前域的值“A”,但是当你选择其他的选项时再单击按钮,你得到的依然是“A”,而不是你所选择的值,还是不太妙。
为了得到选择的选项的值,首先要知道哪个选项被选中了,然后在alert语句中,用那个选中的选项的下标值来正确地引用当前选项的值。也就是说,如果第一个选项被选中,你应该取RadioButtn[0].value,如果第二个选项被选中,你就应该取RadioButtn[1].value,依此类推。
在JavaScript中,某些类型的域具有selectedIndex属性,代表当前选中选项的数组下标值。然而单选按钮并不是那么幸运,同样,复选框也没能逃脱厄运。要想得到当前选中的单选按钮的值,你必须在RadioButtn数组元素中查找“checked”属性。和LotusScript相比,LotusScript就能像操作其他类型的域一样来取得单选按钮当前被选中的值。这是一件非常麻烦的事,但是,它就是那样的。
下面是按钮的代码:
var doc = document.forms[0];
for(i = 0; i <
doc.RadioButtn.length; i++){
if(doc.RadioButtn[i].checked){
alert(doc.RadioButtn[i].value);
break;
}
}

复选框
      
复选框和单选按钮类似。在此就不多做说明.

三:编写通用函数来验证

      上面就是notes基本的域,也是使用频率最高的域值,我们可以写一个通用的函数来验证这些域值,下面以验证域的非空为例
function checkField(fieldType,fieldName,tip)

switch (fieldType){
   case "radio":
      var  radionum=0; 
      var  a  =  document.getElementsByName(fieldName); 
        for  (var  i=0;  i<a.length;  i++)
    { 
            if  ((a[i].type  ==  "radio")&&(a[i].checked))
            {
    radionum++;
    }
                 
        } 
        if  (radionum==0) 
             { 
                 alert(tip+'不能为空'); 
                 return  false; 
             } 
  return  true; 
   case "checkbox":
        var  checkboxNum=0; 
      var  a  =  document.getElementsByName(fieldName); 
        for  (var  i=0;  i<a.length;  i++)
    { 
            if  ((a[i].type  ==  "checkbox") && (a[i].checked)==true)
            {
    checkboxNum++;
    }
                 
        } 
        if  (checkboxNum==0) 
             { 
                 alert(tip+'不能为空'); 
                 return  false; 
             } 
   
    return true;
   case "select":
     var objcheck = document.getElementById(fieldName);
     var selectedValue = objcheck[objcheck.selectedIndex].text;
     if(selectedValue=="")
     {
   alert(tip+'不能为空'); 
           return  false; 
  }
    return true;
   case "text":
     var objtext = document.getElementById(fieldName);
     if(objtext.value=="")
     {
   alert(tip+'不能为空'); 
           return  false; 
  }
    return true;
   default:
   return false;
} //end switch
}

RTF文本
      
 Lotus的域中是一个比较特殊的域,他可以包含附件,对象等等,自然他的验证也就比较特殊,RTF域用js也是可以取到的,可以对其进行空的校验,但是用js却不能校验其里面有没有附件,嵌入式对象,一般我用就使用ls来校验
验证的富文本中,只包含一个附件、嵌入式对象或者链接的输入是允许的,即使它不包含相应的文本。同样,还是使用包含域的表单的 Querysave 事件:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
 
 Dim rtitem As NotesRichTextItem
 Set doc = Source.Document
 Set rtitem = doc.GetFirstItem( "rtfield" )
 Dim text As String
 
 text$ = Source.FieldGetText("rtfield")
 trimmed$ = Trim(text)
 
 If(doc.Hasembedded)  Then
  Continue = True
    
 Elseif ( trimmed$ = "") Then
  Msgbox "Please enter some text."
  Continue = False
  source.GotoField("rtfield")
  source.Refresh(True)
 Else
  Continue = True 
            End If
End Sub

如果文档的任何地方有一个附件,即使它不在所验证的域中,该代码也会工作.
就说到这吧~~~

 

 

 


 

分享到:
评论

相关推荐

    Notes关于组文档中域大小局限的问题

    此外, Lotus Notes 的开发团队已经注意到了这个问题,并在 SPR #EAD4DRM8M 中记录了增加 64K 限制的请求,以供质量工程部门进一步研究和改进。这表明,尽管当前存在局限,但 Lotus Notes 的未来更新可能会提供更大...

    win2008加入2003域控之尝试解析加入域中域控制器的dns名称失败解决办法_

    win2008加入2003域控之尝试解析加入域中域控制器

    Word中域的应用.doc

    Word是文字处理软件,我们在日常处理一些文字时经常遇到一些问题,如:各种公式的录入,尽管Word都提供了“公式编辑器”,但其插入的却是“对象”,有时排版会感觉不方便,而且也不适合大量、重复的公式录入。...

    完善AD中域信息

    综上所述,"完善AD中域信息"涉及的不仅仅是简单地添加或修改用户属性,还包括了对AD架构的理解、数据管理、脚本编写以及安全策略的实施。这两个VBScript文件是实现这一目标的重要工具,通过它们,管理员可以高效地...

    局域网中域的建设与管理

    ### 局域网中域的建设与管理 #### 一、引言 随着信息技术的快速发展,局域网(LAN)的管理和维护变得日益重要。在局域网内建立“域”并通过域组策略来管理各个工作站已成为一种有效的管理手段。通过这种管理方式,...

    word中域的应用详解

    Word 中域的应用详解 在 Word 中,域是指一种特殊代码,用来指导 WORD 在文档中自动插入文字、图形、页码和其他资料。域相当于文档中可能发生变化的数据或邮件合并文档中套用信函、标签中的占位符。域有三种类型:...

    中域公司人力资源部规范管理手册.doc

    《中域公司人力资源部规范管理手册》是一份详尽阐述公司人力资源管理的文档,旨在确保组织内部的人力资源管理规范化、高效化。手册分为七大章节,涵盖了人力资源管理的各个方面,旨在支持公司战略目标的实现,强化...

    Python-语义分割中域自适应的对抗熵最小化

    在Python开发环境中,我们可以使用深度学习框架,如TensorFlow或PyTorch,来实现这一方法。`valeoai-ADVENT-1a4ce29`这个压缩包很可能是包含了一个名为ADVENT(Adversarial Domain Adaptation with Variational ...

    win2003中域控制器建立教程

    在Windows Server 2003中建立域控制器是企业网络管理的重要步骤,它允许集中管理用户账户、安全策略以及资源访问。在这个过程中,我们将详细解释如何将一台成员服务器升级为域控制器,创建AD(Active Directory)域...

    Go中域驱动设计技术体系结构模式的简单实现。-Golang开发

    Go中域驱动设计技术体系结构模式的简单实现。 DDD技术架构模式:Golang Go中DDD技术架构模式的简单实现。 图v 0.1.0组件A.接口层(复合接口)REST API-使用Echo Framework B.模块:地理位置-使用CRUD架构模式(GORM...

    执业医师中域题库 —— 执业医师,执业药师,考研,建造师培训领域题库

    【执业医师中域题库】是一款专门为执业医师、执业药师、考研以及建造师等专业资格考试提供培训题库的应用。这款题库集成了多种类型的考试资源,旨在帮助备考者通过模拟练习,提升对专业知识的掌握程度,从而提高考试...

    论MYSQL中域完整性约束的实现.pdf

    MySQL数据库是关系型数据库系统,其核心功能之一是确保数据的完整性,这包括实体完整性、参照完整性和域完整性。在MySQL中,实体完整性通常通过设置主键约束来实现,主键是一个或多个字段的组合,确保每条记录的唯一...

    已验证-活动目录域FSMO五种角色查看转移规划图文.doc

    Domain Naming Master 负责管理森林中域的添加或者删除。如果需要在现有森林中添加或删除一个域,必须与 Domain Naming Master 进行联系。如果 Domain Naming Master 处于 Down 机状态,添加和删除操作将失败。 ...

    WD-40蛋白中域重复检测的更有效方法

    8. 蛋白质结构研究的现实意义:在生物学和医学研究中,了解蛋白质的具体三维结构对于疾病的诊断、药物的开发以及治疗方法的研究都有着至关重要的作用。因此,发展快速准确的蛋白质结构预测方法是当前生物信息学研究...

    开发设计规范.pdf

    标识符命名规范是JAVA代码规范的基础之一,它规定了JAVA代码中标识符的命名规则。标识符是指JAVA代码中的变量、方法、类、包等名称。 #### 1.1 概述 标识符命名规范的目的是为了提高JAVA代码的可读性和可维护性,...

    ADVENT:语义分割中域自适应的对抗熵最小化

    ADVENT:语义分割中域自适应的对抗熵最小化 更新 02/2020 :使用CycleGAN翻译的图像,AdvEnt模型在GTA5-2-Cityscapes上实现( 46.3% ) 09/2019 :查阅我们的新论文(ICCV 2019接受)。 借助深度感知的UDA框架,...

    COMSOL在科研中的应用

    它通过提供一个交互式的建模环境,使科研工作者能够验证理论、优化设计和探究各种物理现象。 COMSOL在科研中的应用通常涵盖以下几个方面: 1. 研究与开发:科研人员可以使用COMSOL来创建科研中的新理论和模型。它...

    软件测试详细计划步骤

    测试工作量的估计需考虑效率假设(如测试团队的工作效率)、测试假设(验证测试需求所需的测试动作数量)、应用的复杂度(如记录中域的数量)以及测试周期的阶段(设计阶段还是执行阶段)。 测试资源包括人力资源和...

    ssh项目源码(学习ssh的非常好的实例项目)

    该项目为本人亲手制作,内涵源码和数据库,导入到IDE即可运行,但注意源码中域模型中有个字段(sex)和数据库中类型不一致,应把数据库中的sex类型作相应修改 本代码主要功能是模仿QQ和论坛的功能(增/删/改/查/验证),充分...

Global site tag (gtag.js) - Google Analytics