1

Тема: Сравнение дат в search formula

Существует агент, который отбирает документы и обрабатывает их неким образом. Проблема в том, что в отбор попадают ненужные документы. Привожу код:
...

Dim nw As New NotesUIWorkspace
Dim nses As New NotesSession
Dim db As NotesDatabase
Dim OtchetDoc As NotesDocument
Dim doc As NotesDocument
Dim doccol As NotesDocumentCollection
Dim begindata As NotesDateTime, enddata As NotesDateTime

Set OtchetDoc=nw.CurrentDocument.Document
Set db = nses.CurrentDatabase

Set begindata=New NotesDateTime(OtchetDoc.begin(0))
Set enddata=New NotesDateTime(OtchetDoc.end(0))

searchFormula$ = { Form = "Vhod" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_<> "" & @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) => [}+ begindata.Dateonly +{] & @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) =< [}+ enddata.Dateonly +{] } 

Set doccol = db.Search( searchFormula$, Nothing, 0)

...

Немного пояснений:
- на форме Отчета поля begin и end типа ДАТА/ВРЕМЯ
- на основной форме документа поле ДАТА_РАЗРЕШ_ОБРАЩ_ типа ТЕКСТ

Интересует:
- почему в коллекцию попадают документы, у которых ДАТА_РАЗРЕШ_ОБРАЩ_ выходит за рамки, установленные интервалом ?
- как правильно работать (сравнивать между собой) с текстовыми полями и полями дата/время в рамках написания формул отбора ?

Поделиться

2

Re: Сравнение дат в search formula

Все дело в том, что идет неверное сравнения поля с датой с типом ТЕКСТ с полем с датой типа ДАТА/ВРЕМЯ.
@TextToTime(@text(ДАТА_РАЗРЕШ_ОБРАЩ_)) или @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) - делать нельзя, потому что результат будет зависеть от системных настроек формата даты. У одних дата 5.1.2013 будет 5 января 2013, у других 1 мая 2013.
Правильно делать через @Date(year; month; day). Для этого из ДАТА_РАЗРЕШ_ОБРАЩ_ нужно выдернуть день, месяц и год.
Для проверки правильности выборки лучше для начала загнать формулу во вьюху, а потом оттуда перенсти все в код агента.

Сделал вьюхую с формулой отбора:

SELECT ( Form = "VhodStandart" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_!= "" & @Date( @TextToNumber(@Right(ДАТА_РАЗРЕШ_ОБРАЩ_;4)); @TextToNumber(@Right(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;5);2)); @TextToNumber(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;2)) ) >= @Date(2013;7;1) & @Date( @TextToNumber(@Right(ДАТА_РАЗРЕШ_ОБРАЩ_;4)); @TextToNumber(@Right(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;5);2)); @TextToNumber(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;2)) ) <= @Date(2013;7;31) )

Все необходимые документы благополучно отразились в представлении.

Далее уже по аналогии перегнал в код агента .. получилось:

searchFormula$ = { Form = "VhodStandart" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_!= "" & @Date( @TextToNumber(@Right(ДАТА_РАЗРЕШ_ОБРАЩ_;4)); @TextToNumber(@Right(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;5);2)); @TextToNumber(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;2)) ) >= [}+ begindata.Dateonly +{] & @Date( @TextToNumber(@Right(ДАТА_РАЗРЕШ_ОБРАЩ_;4)); @TextToNumber(@Right(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;5);2)); @TextToNumber(@Left(ДАТА_РАЗРЕШ_ОБРАЩ_;2)) ) <= [}+ enddata.Dateonly +{] }

Громоздко, но работает!!! Можно конечно чутка усовершенствовать (в местах @right, @left и т.п., чтоб значение бралось не по количеству цифр, а до точки или после точки в дате).. но эт уже мелочи!

Поделиться

3

Re: Сравнение дат в search formula

Вот еще пример поиска db.Search по полю "Date2" с датой. Сравниваем содержимое поля с полем в документе "datareg".

formula$ = { @ToTime (datareg)  <=  @TextToTime("} & uidoc.FieldGetText("Date2")   & {")}

Поделиться