FTSearch с полями даты сбивает меня с толку

У меня есть пользовательский элемент управления с экраном поиска, который позволяет пользователям выбирать любое из шести различных полей для поиска. У меня не было проблем с тем, чтобы все остальные поля работали, за исключением двух полей даты. Они могут указывать как дату начала, так и дату окончания, или только одну или другую. Довольно стандартный материал, но я не могу понять, как написать код, чтобы запрос работал и выполнял поиск, когда он включает даты.

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 Control - Добавить полнотекстовый поиск - http://www-10.lotus.com/ldd/ddwiki.nsf/dx/XPagesViewControlAddFullTextSearch.htm


person RoyRumaner    schedule 28.04.2012    source источник


Ответы (5)


Строка 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
person Per Henrik Lausten    schedule 28.04.2012
comment
Пер, отсутствующий нуль был просто результатом плохой копии. Мне нравится то, что вы сделали, и добавили вторую часть в мой код, и все же это приводит к непонятному запросу. У меня такое чувство, что это во многом связано с форматом дат в форме и с представлением, которое он использует для поиска. - person RoyRumaner; 29.04.2012
comment
Нам нужно увидеть полный запрос :-) Попробуйте добавить запрос и в переменную sessionScope, а затем распечатать это значение, например, вычисляемое поле - person Per Henrik Lausten; 29.04.2012
comment
Я действительно хотел бы, чтобы у нас был отладчик для JS. У меня есть запрос как requestScope и показываю его как заголовок представления. Он прерывается перед установкой, поэтому ничего не отображается. - person RoyRumaner; 29.04.2012
comment
Когда он отображается как заголовок представления, вы также можете отобразить его в вычисляемом поле. Закомментируйте выполнение запроса и покажите нам только строку запроса. За исключением США все даты либо восходящие, либо нисходящие (гггг-мм-дд, дд-мм-гггг), так что это может быть источником проблем. Лишние цитаты или их отсутствие тоже. Поэтому, если вы получаете сообщение «запрос не понятен», ваш код выполняется до тех пор, пока не будет выполнен запрос. Так закомментируйте эту строку и покажите значение. Также вы можете добавить параметр --console в rparams при запуске дизайнера Domino - тогда у вас будет локальная консоль для локального предварительного просмотра. - person stwissel; 29.04.2012
comment
Рой, попробуйте добавить мою панель инструментов отладки из OpenNTF в свое приложение. Затем вы можете использовать вызовы dBar.debug (msg) для вывода операторов отладки в область сообщений на экране. - person Mark Leusink; 29.04.2012
comment
Рой, я протестировал ваш код из вопроса в сочетании с моим ответом, и я могу создать следующую qsstring: (FIELD Mnemonic = tes) AND (FIELD From = From test) AND (FIELD DeliveredDate ›= 04/16/2012 ) И (FIELD DeliveredDate ‹= 16.04.2012) AND (FIELD SourceFilename = исходный тест) AND (FIELD Filename = captiva test) - person Per Henrik Lausten; 29.04.2012
comment
Пер, это сработало отлично. Спасибо за помощь. Надеюсь, следующий человек, столкнувшийся с этой проблемой, увидит это, и это ему тоже поможет. - person RoyRumaner; 30.04.2012
comment
Просто замечание: вам не нужны cTerms, если вы используете tmpArray.push () - person D.Bugger; 01.05.2012
comment
Вы говорите, что синтаксис может быть tmpArray.push () = (FIELD From = \ + requestScope.edtFrom + \); - person RoyRumaner; 02.05.2012

Если я правильно прочитал, ваш запрос разрешает

FIELD DeliveredDate >= "xx/yy/zz"

Моим первым инстинктом было то, что вам нужно вместо этого:

FIELD DeliveredDate >= [xx/yy/zz]

Но в документации указано, что вам не нужны скобки или кавычки, поэтому это:

FIELD DeliveredDate >= xx/yy/zz
person Richard Schwartz    schedule 28.04.2012
comment
Он у вас точно есть. Это то, к чему я хочу, чтобы запрос разрешил. Я даже удалил кавычки и получил ту же ошибку, что и раньше. - person RoyRumaner; 28.04.2012

Дважды проверьте создаваемый здесь запрос. Возможно распечатать его на экране или взять из отладчика. Вы можете увидеть проблему в запросе, и я считаю, что вы сможете взять этот точный запрос и вставить его в окно поиска базы данных, которая была проиндексирована полнотекстовым индексом.

Кроме того, ознакомьтесь с этим документом, в котором рассматривается синтаксис запросов Notes, он может помочь вам в устранении неполадок. Однако я не увидел в вашем коде ничего плохого.

person Ken Pespisa    schedule 28.04.2012

comment
Я думаю, ты упустил мою точку зрения, Кен. Запрос работает для четырех вариантов текста. Это не работает для двух вариантов даты. - person RoyRumaner; 28.04.2012
comment
Верно. Как выглядит запрос, когда он включает параметры даты? Вы можете привести пример? - person Ken Pespisa; 28.04.2012
comment
он возвращает запрос непонятно - person RoyRumaner; 28.04.2012
comment
Рой, как выглядит запрос с датами? Какой формат даты вы используете? - person Per Henrik Lausten; 28.04.2012
comment
Он терпит неудачу, как только я отправляю запрос, поэтому я не могу получить результат запроса, кроме непонятного. Я использую средство выбора даты, чтобы выбрать дату. Даты форматируются как мм / дд / гг во всех связанных полях. Это поле даты на экране поиска ‹xp: inputText id = edtDateRangeFrom value = # {requestScope.edtDateRangeFrom}› ‹xp: this.converter› ‹xp: convertDateTime type = date dateStyle = short› ‹/ xp: convertDateTime› ‹ /xp:this.converter ›‹ xp: dateTimeHelper ›‹ / xp: dateTimeHelper ›‹ / xp: inputText › - person RoyRumaner; 28.04.2012
comment
Рой, добавьте sessionScope.queryString = qstring; а затем посмотрите на эту переменную sessionScope после этого, чтобы увидеть, имеет ли смысл запрос. Дайте нам знать, как это выглядит - person Per Henrik Lausten; 28.04.2012
comment
Даже при использовании панели инструментов отладки из OpenNTF этого недостаточно. Он прерывается перед установкой каких-либо переменных области в параметре даты - person RoyRumaner; 29.04.2012
comment
Он прерывается перед установкой любых переменных области видимости в параметре даты и sessionScope.queryString = tmpArray, который я установил сразу после строки, которая устанавливает его, возвращает [0] ?? - person RoyRumaner; 29.04.2012

даты всегда (по моему опыту) должны быть записаны в формате мм / дд / гггг, например,

[deliverydatemin]> = 1 января 2012 г. и [deliverydatemax] ‹= 30 января 2012 г.

Легкий способ узнать, какой запрос вы генерируете, - использовать следующий фрагмент кода, чтобы выдать ошибку при сгенерированном запросе.

//youre own code  
throw new java.lang.exception(queryvariable);

Или вы можете просто выполнить print (), чтобы отобразить запрос в консоли сервера.

person jjtbsomhorst    schedule 28.04.2012
comment
К сожалению, у меня нет доступа к консоли сервера, и ваш код выдал следующую ошибку Ошибка при выполнении вычисленного выражения JavaScript Ошибка интерпретатора сценария, строка = 26, col = 21: [ReferenceError] 'java' не найден 25: requestScope.queryString = qstring; // это просто отображает запрос 26: throw new java.lang.exception (qstring); 27: 28: return qstring // это то, что устанавливает свойство поиска - person RoyRumaner; 28.04.2012
comment
@rrumaner: К сожалению, у меня нет доступа к консоли сервера ... всегда есть способ отладки для производственной среды. отлично протестированное и работающее приложение может иметь проблемы из-за данных или некоторых свойств среды. когда у меня были проблемы с FT, каждый запрос FT регистрировался в OpenLog. Если это не вариант для вас, сохраните его в фиктивном документе в своей базе данных (регулярно очищайте). - person Frantisek Kossuth; 29.04.2012
comment
Франтишек, у меня здесь есть полная среда Dev, QA, Prod. У меня нет доступа к консоли сервера, потому что серверы находятся в другом состоянии, и я как консультант не уполномочен получать к ним удаленный доступ. Я использую множество инструментов отладки, включая DebugToolbar от Марка Леусинка на OpenNTF. Я также использую код Logger для записи в файл журнала (почти) каждого шага процесса. Эти приложения не попадают в Prod, пока они не пройдут как минимум месяц контроля качества, который имитирует настоящую производственную среду. Думаю, я справился, а вы? - person RoyRumaner; 02.05.2012

As of my concern The best way to handle the date field is that converting our date value for one specific format using NotesDateTime., Because this is the best date conversion for xpage.

Dim dateTime As New NotesDateTime ("строка даты")

or

Уменьшить dateTime как новые NotesDateTime (NotedateTime.getDtaeOnly ())

person Ramkumar    schedule 02.05.2012