lotus-notes - 涉及日期字段的 FTSearch 让我感到困惑

标签 lotus-notes xpages xpages-ssjs

我有一个带有搜索屏幕的自定义控件,允许用户选择最多六个不同字段中的任何一个进行搜索。除了两个日期字段之外,我没有遇到任何其他字段工作的问题。他们可以填写开始日期和结束日期,也可以只填写其中之一。相当标准的东西,但我不知道如何编写代码来使查询工作并让它在涉及日期时进行搜索。

var tmpArray = new Array("");
var cTerms = 0;
if(requestScope.cmbSendTo != null & requestScope.cmbSendTo != "") {
    a = @Right(requestScope.cmbSendTo, "(");
    b = @Left(a,3);
tmpArray[cTerms++] = "(FIELD Mnemonic = \"" + b + "\")";
}
if(requestScope.edtFrom != & requestScope.edtFrom != "") {
tmpArray[cTerms++] = "(FIELD From = \"" + requestScope.edtFrom + "\")";
}
//**************************************************************************
if(requestScope.edtDateRangeFrom != null & requestScope.edtDateRangeFrom != "") {
tmpArray[cTerms++] = "(FIELD DeliveredDate >= \"" + requestScope.edtDateRangeFrom + "\")";
}
if(requestScope.edtDateRangeTo != null & requestScope.edtDateRangeTo != "") {
tmpArray[cTerms++] = "(FIELD DeliveredDate <= \"" + requestScope.edtDateRangeTo + "\")";
}
//**************************************************************************
if(requestScope.edtOriginal != null & requestScope.edtOriginal != "") {
tmpArray[cTerms++] = "(FIELD SourceFilename = \"" + requestScope.edtOriginal + "\")";
}
if(requestScope.edtCaptiva != null & requestScope.edtCaptiva != "") {
tmpArray[cTerms++] = "(FIELD Filename = \"" + requestScope.edtCaptiva + "\")";
}
qstring = tmpArray.join(" AND ").trim();
requestScope.queryString = qstring;
return qstring

如有任何帮助,我们将不胜感激

此屏幕背后的想法取自此视频: XPages View 控件 - 添加全文搜索 - http://www-10.lotus.com/ldd/ddwiki.nsf/dx/XPagesViewControlAddFullTextSearch.htm

最佳答案

if(requestScope.edtFrom != & requestScope.edtFrom != "") { 不完整。您错过了要测试的部分。我认为它缺少空检查,因此应该是:

if(requestScope.edtFrom != null & requestScope.edtFrom != "") {

此外,您需要格式化日期以返回您期望的查询内容(例如 MM/dd/yyyy)。 inputText 控件中的格式仅适用于视觉格式,而不适用于实际内容的格式。

最后,您需要删除日期周围的引号。

以下基于您的代码的代码示例将返回不带格式的日期,然后返回具有正确格式的日期:

<xp:button value="Label" id="button1">
    <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="computedField1"></xp:eventHandler>
</xp:button>

<xp:inputText id="edtDateRangeFrom" value="#{requestScope.edtDateRangeFrom}">
    <xp:this.converter>
        <xp:convertDateTime type="date"></xp:convertDateTime>
    </xp:this.converter>
    <xp:dateTimeHelper></xp:dateTimeHelper>
</xp:inputText>

<xp:text escape="true" id="computedField1">
    <xp:this.value><![CDATA[#{javascript:var tmpArray = new Array("");
    var cTerms = 0;
    if(requestScope.edtDateRangeFrom != null & requestScope.edtDateRangeFrom != "") {
        tmpArray[cTerms++] = "(FIELD DeliveredDate >= \"" + requestScope.edtDateRangeFrom + "\")";
        var dateFormatter = new java.text.SimpleDateFormat( "MM/dd/yyyy" );
        var formattedDate = dateFormatter.format( requestScope.edtDateRangeFrom );
        tmpArray[cTerms++] = "(FIELD DeliveredDate >= " + formattedDate + ")";
    }

    qstring = tmpArray.join(" AND ").trim();
    requestScope.queryString = qstring;

    return qstring}]]>
    </xp:this.value>
</xp:text>

它将返回以下内容,其中第二部分是您要查找的格式:

(FIELD DeliveredDate >= "Fri Apr 27 12:00:00 CEST 2012")
AND (FIELD DeliveredDate >= 04/27/2012)

这是包含所有这些更新的代码:

var tmpArray = new Array("");
var cTerms = 0;
var dateFormatter = new java.text.SimpleDateFormat( "MM/dd/yyyy" );
var formattedDate = "";
if(requestScope.cmbSendTo != null & requestScope.cmbSendTo != "") {
    a = @Right(requestScope.cmbSendTo, "(");
    b = @Left(a,3);
tmpArray[cTerms++] = "(FIELD Mnemonic = \"" + b + "\")";
}
if(requestScope.edtFrom != null & requestScope.edtFrom != "") {
tmpArray[cTerms++] = "(FIELD From = \"" + requestScope.edtFrom + "\")";
}

if(requestScope.edtDateRangeFrom != null & requestScope.edtDateRangeFrom != "") {
    formattedDate = dateFormatter.format( requestScope.edtDateRangeFrom );
    tmpArray[cTerms++] = "(FIELD DeliveredDate >= " + formattedDate + ")";
} 
if(requestScope.edtDateRangeTo != null & requestScope.edtDateRangeTo != "") {
    formattedDate = dateFormatter.format( requestScope.edtDateRangeTo );
    tmpArray[cTerms++] = "(FIELD DeliveredDate <= " + formattedDate + ")";
}


if(requestScope.edtOriginal != null & requestScope.edtOriginal != "") {
tmpArray[cTerms++] = "(FIELD SourceFilename = \"" + requestScope.edtOriginal + "\")";
}
if(requestScope.edtCaptiva != null & requestScope.edtCaptiva != "") {
tmpArray[cTerms++] = "(FIELD Filename = \"" + requestScope.edtCaptiva + "\")";
}
qstring = tmpArray.join(" AND ").trim();
requestScope.queryString = qstring; // this just displays the query
return qstring // this is what sets the search property

关于lotus-notes - 涉及日期字段的 FTSearch 让我感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364526/

相关文章:

java - 如何使用 Java 循环浏览 IBM Notes (NotesView) View 中的所有文档

java - 如何在保存之前访问新 Notes 电子邮件的基础文档

java - 在数据库中使用 DXL 导入 SSJS 脚本库

eclipse - 设置 XPage 扩展库开发环境

xpages - 如何检查字符串是否为有效日期?

javascript - 如何在页面内的 head 标签中添加资源?

css - 如何设置 dropDownButton 的样式?

javascript - 在 xpage 上使用传单时出现 404 错误添加标记

javascript - 如何在 xpages 中使用谷歌文本翻译 api

javascript - Xpages 如何计算客户端中 Xpage 的 URL