Xpages 验证字段中的值

Xpages 验证字段中的值,xpages,lotus-notes,xpages-extlib,xpages-ssjs,Xpages,Lotus Notes,Xpages Extlib,Xpages Ssjs,当您键入某个字段时,是否仍要检查该字段中是否已存在使用该值保存的文档。例如,如果您键入projectno,我想检查是否有其他文档已经包含该projectno。有什么建议我将如何验证这一点吗 关于您需要数据库中的视图,该视图在第一列中按您使用的字段排序。我假设它是一个隐藏视图,称为“(lookupUnique)”。构建并测试它,以确保它在第一列中显示所需的字段,并对值进行排序 现在需要一种方法来查找此视图。理想情况下,您希望查找失败——因为没有具有相同值的文档,在这种情况下,您允许继续保存。但是,

当您键入某个字段时,是否仍要检查该字段中是否已存在使用该值保存的文档。例如,如果您键入projectno,我想检查是否有其他文档已经包含该projectno。有什么建议我将如何验证这一点吗


关于

您需要数据库中的视图,该视图在第一列中按您使用的字段排序。我假设它是一个隐藏视图,称为“(lookupUnique)”。构建并测试它,以确保它在第一列中显示所需的字段,并对值进行排序

现在需要一种方法来查找此视图。理想情况下,您希望查找失败——因为没有具有相同值的文档,在这种情况下,您允许继续保存。但是,在另一种情况下,您可能希望允许继续保存。这种情况下,查找会成功,因为查找找到了您当前正在处理的文档,该文档以前保存过,因此在视图中找到,并且用户现在正在再次编辑它

带有[RETURNDOCUMENTUNIQUEID]和[FAILSILENT]参数的@DbLookup函数是IBM推荐的解决方案。即

foundId := @DbLookup("Notes":"NoCache";"":"";"(lookupUniqe)";theUniqueFieldNameGoesHereWithoutQuotes;1;[RETURNDOCUMENTUNIQUEID]);
如果此公式返回“”,则找不到匹配项,因此代码应返回@Success以继续保存。如果它返回任何其他内容,则将结果与@DocumentUniqueId进行比较。如果它们匹配,那么代码应该返回@Success以继续保存。如果它们不匹配,那么您在字段中找到了另一个具有相同值的文档,因此您的代码应该返回@Failure并显示相应的错误消息

现在需要注意的是:在某些版本的Domino中,[RETURNDOCUMENTUNIQUEID]存在已知的问题,包括一个错误,如果一个名为ComputeWithForm的代理对一个基于使用此功能的表单的文档进行处理,则会导致Domino6服务器崩溃。还有一个bug导致它只返回多个匹配中第一个匹配的unid,因此如果您的代码中有重复项,此策略将允许用户重新保存已经不唯一的旧文档,而不是强制用户更改它们以使其唯一,这可能是您想要的,也可能不是您想要的


如果这些已知问题中的任何一个可能会给您带来问题,那么您最好不要使用[RETURNDOCUMENTUNIQUEID],而是像Notes和Domino程序员在IBM首先添加[RETURNDOCUMENTUNIQUEID]选项之前所做的那样:向(lookupUnique)视图添加另一列,并将列值设置为@Text(@DocumentUniqueId)。将上述@DbLookup公式中的1更改为您添加的列的编号,并编写验证代码以预测您可能会返回空字符串、单个值或值列表的可能性。

如果类型45678返回值,因为已经存在具有该值的文档。我不知道如何返回该值我来验证一下

    var dbname = session.getServerName() + "!!" + "proj\\webno.nsf";
    getFieldValue = getComponent("oNo").getValue();
    tmp = @DbLookup(dbname, "(webNo)", getFieldValue, ”obNo”);

    if (tmp == getFieldValue)
    {
 Here i will do a validate. If value i return are the same as in the getFieldValue
and tmp or just getFieldValue is empty.
 }
 else
{
Here is it OK
}

获取并修改您的代码。假设我们在创建文档的数据库中,只需使用@DbName()不要试图从会话和一些硬编码中构建名称。使用验证时,只需使用value即可访问控件的值。然后,只需获取列中的所有值,然后查看您的值是否在其中

我认为下面的方法应该有效

<xp:inputText id="projectNumber" value="#{doc.ProjectNumber}">
    <xp:this.validators>
        <xp:validateExpression message="Value already in use">
            <xp:this.expression><!CDATA[#{javascript:var usedValues = @DbColumn(@DbName(), "(webNo)", 1);
            if ( @IsMember ( value, usedValues ) ) { return false };
            return true;
            </xp:this.expression>
        </xp:validateExpression>
    </xp:this.validators>
</xp:inputText>


为什么不直接为他们生成一个值呢?最简单的方法是使用@Unique,但除了让他们创建一个值之外,还有很多其他方法……

当您键入现有名称时,是否收到任何错误消息或其他反馈?请提供您迄今为止尝试过的代码。您有两个部分:何时验证和如何验证。每个字符之后的时间、离开字段的时间、按下按钮的时间等取决于您的应用程序流。最有可能使用@DbLookUp的情况如何问题被标记为XPages,因此Richard的答案需要一些修改才能使用XPages和SSJSI建议您不要使用“getFieldValue”作为一个变量名。它看起来像一个函数名,肯定会让任何阅读代码的人感到困惑。最好使用oNoValue或更具描述性的东西。我对字段名很恼火——我希望它们是描述性的,不要使用缩写,因为如果它们太短,以至于有人不得不使用它们,那么很容易拼写错误或混淆它们ss字段的用途。