如果在该字段中已经存储了具有该值的任何文档,则无论如何都要检查您何时输入字段。例如,如果您键入projectno,我想检查是否有任何其他文档已经有该项目。任何建议我将如何验证
此致
答案 0 :(得分:2)
您需要数据库中的视图,该视图在您使用的字段的第一列中排序。我将假设它是一个隐藏的视图,称为"(lookupUnique)"。构建并测试它以确保它在第一列中显示您想要的字段,并且值已经过排序。
现在您需要一种方法来查看此视图。理想情况下,您希望查找失败 - 因为没有具有相同值的文档,在这种情况下,您允许继续保存。但是在另一种情况下,您可能希望允许保存继续。这是查找成功的情况,因为查找找到了您正在处理的文档,该文档之前已保存,因此可以在视图中找到,用户现在再次编辑它。
带有[RETURNDOCUMENTUNIQUEID]和[FAILSILENT]参数的@DbLookup函数是IBM推荐的解决方案。即,
foundId := @DbLookup("Notes":"NoCache";"":"";"(lookupUniqe)";theUniqueFieldNameGoesHereWithoutQuotes;1;[RETURNDOCUMENTUNIQUEID]);
如果此公式返回"",则未找到匹配项,因此您的代码应返回@Success以继续保存。如果它返回任何其他内容,则将结果与@DocumentUniqueId进行比较。如果它们匹配,那么您的代码应返回@Success以继续保存。如果它们不匹配,那么您在该字段中找到了具有相同值的另一个文档,因此您的代码应该返回@Failure并附带相应的错误消息。
现在请注意:在某些版本的Domino中存在已知的[RETURNDOCUMENTUNIQUEID]问题,包括如果代理在基于表单的文档上调用ComputeWithForm导致Domino 6服务器崩溃的错误使用此功能。还有一个错误导致它只返回许多匹配中第一个匹配的unid,因此如果你有重复,你的代码中的这个策略将允许用户重新保存已经非独特而不是强迫他们改变它们以使它们独一无二,这可能是也可能不是你想要的。
如果这些已知问题中的任何一个可能会给您带来问题,那么最好不要使用[RETURNDOCUMENTUNIQUEID],而只是在IBM首先添加[RETURNDOCUMENTUNIQUEID]选项之前执行Notes和Domino程序员所做的工作。 :在(lookupUnique)视图中添加另一列,并将列值设置为@Text(@DocumentUniqueId)。将上面的@DbLookup公式中的1更改为您添加的列的编号,并编写验证代码以预测可能会返回空字符串,单个值或值列表。
答案 1 :(得分:0)
如果类型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
}
答案 2 :(得分:0)
获取代码并进行修改。假设我们在数据库中创建了文档,只需使用@DbName()而不是尝试从会话中构建名称和一些硬编码。使用验证时,只需使用值即可访问控件的值。然后,只需获取列中的所有值,并查看您的值是否在那里。
我认为以下内容应该有效。
<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,但除了让他们必须创建一个之外还有很多其他方法......