Формула поиска Notesdocument.search

dimat

Lotus team
31.07.2008
516
0
#1
на форме кнопка и 2 поля типа Дата/Время, в которых указывается период.
Как правильно в формуле поиска указать чтоб значение поля типа Дата/Время соответствовало указанному периоду?
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Концептуально так :rolleyes:
Код:
(@Today > Date1) & (@Today < Date2)
 

dimat

Lotus team
31.07.2008
516
0
#3
Код:
	Dim ws As New NotesUIWorkspace
Dim ns As New NotesSession
Dim db As NotesDatabase
Dim doccurr As NotesUIDocument
Dim st As NotesDateTime, en As NotesDateTime
Dim dc As NotesDocumentCollection
Set doccurr=ws.CurrentDocument
Set db=ns.GetDatabase("lotus/kodeks/ru","kodeks.nsf",False)
If db Is Nothing Then 
Msgbox("db not found")
Exit Sub
End If

Set st= New NotesDateTime(doccurr.FieldGetText("start"))
Set en= New NotesDateTime(doccurr.FieldGetText("end"))
Print st.DateOnly & " - " & en.DateOnly
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>start & ContactDateDemo<=en |,nohing,0)
Print dc.Count
Ошибка: несоответствие типов. на
Код:
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>start & ContactDateDemo<=en |,nohing,0)
Как првильно записать?
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 233
18
#4
dimat
правильно сначала откатать данную формулу на каком нибудь виде в селексе
за конструкции типа ContactDateDemo=>start нужно сразу рубить голову
в селексе как и в сече должны быть четко типизированные поля/переменные без конструкций на текст если у вас есть переменная то приводите её через функцию @Date но никак не в явном текстовом виде
 

TIA

:-)
Lotus team
15.05.2009
790
3
#6
Код:
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>start & ContactDateDemo<=en |,nohing,0)
заменить на
Код:
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>[| + st.LocalTime + |]& ContactDateDemo<=[| +en.LocalTime + |]| |,nohing,0)
Ваше первое выражение означает, что start - это поле в искомом документе. Если поля нет, Notes считает их пустой строкой. Потому при сравнении даты со строкой и возникает ошибка несоответствия типов.
Константная дата в @-формулах должна быть заключена в квадратные скобки.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 233
18
#7
TIA
ContactDateDemo=>[| + st.LocalTime + |]
это и к вам относится - рубить за это голову
вы вообще в курсе что подобная конструкция ведет к ошибке?
или вы наивно полагаете, что формат времени на клиента и на сервере всегда одинаков?
 

dimat

Lotus team
31.07.2008
516
0
#8
заменить на
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>[| + st.LocalTime + |]& ContactDateDemo<=[| +en.LocalTime + |]| |,nohing,0)
Language: auto avrasm


Ваше первое выражение означает, что start - это поле в искомом документе. Если поля нет, Notes считает их пустой строкой. Потому при сравнении даты со строкой и возникает ошибка несоответствия типов.
Константная дата в @-формулах должна быть заключена в квадратные скобки.
Сделал
Код:
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>[|+st.LocalTime+|] & ContactDateDemo<=[|+en.LocalTime+|] |,nohing,0)
Такая же ошибка :rolleyes:
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#9
TIA
ContactDateDemo=>[| + st.LocalTime + |]
это и к вам относится - рубить за это голову
вы вообще в курсе что подобная конструкция ведет к ошибке?
или вы наивно полагаете, что формат времени на клиента и на сервере всегда одинаков?
А какая разница? Код выполняется или на клиенте, или на сервере. Формат всегда одинаков.
Проверить, кстати, легко.

Сделал
Код:
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>[|+st.LocalTime+|] & ContactDateDemo<=[|+en.LocalTime+|] |,nohing,0)
Такая же ошибка :rolleyes:
Потому что пишется Nothing, а не nohing.
Добавь Option Declare, чтобы не было таких ошибок.
 

Omh

Lotus team
04.07.2007
2 210
1
#11
Я бы делал через @Date.
Т.е. что-то вроде
Код:
{Date1 > @Date(} + Cstr(Year(CheckDate)) + {; } + Cstr(Month(CheckDate)) + {;} + ...
Немного гормоздко, но я гарантированно избавлен от проблем с форматом даты.
 

TIA

:-)
Lotus team
15.05.2009
790
3
#12
TIA
ContactDateDemo=>[| + st.LocalTime + |]
это и к вам относится - рубить за это голову
вы вообще в курсе что подобная конструкция ведет к ошибке?
или вы наивно полагаете, что формат времени на клиента и на сервере всегда одинаков?
:rolleyes: Вот так вот сразу -- "рубить"? Без суда и следствия?
ToxaRat , а вы уверены, что поисковый запрос на сервер передаётся в нескомпилированном виде?
Если в скомпилированном, то где выполняется компиляция?
Как Вы думается, какая локаль используется при компиляции?
Эх, вашу бы энергию, да на изучение предмета...
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 233
18
#13
TIA
Medevic
вам обоим незачет

Omh
спасибо что понимаешь о чем я

Для тех кто плохо понимаем о чем я:
Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>[01.02.2009 00:00:00] & ContactDateDemo<=[17.12.2009 23:59:59] |,nohing,0)
Данный пример выполнится без ошибки только в случае если на сервер формат даты dd.mm.YYYY HH:MM:SS
Если допусти на сервере немецкий или американский формат даты, где сначала месяц а потом день(а такое часто бывает если сервак пришел предустановленный)
то сформированное выражение с клиента(у которого формат DD.MM.YYYY) для сервера(у которого MM.DD.YY) вызовет ошибку так как 17.12.2009 - у сервера нету 17-го месяца а именно сервер возвращает результаты

TIA
И причем тут локаль когда вы оперируете строкой, которую сервер должен обратно вернуть САМ в формат даты?!
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#14
А кто сказал, что на сервер дата [01.02.2009 00:00:00] отправится в виде строки?

Кстати, я могу проверить как раз на таком сервере.
Пишу кнопку:
Код:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection

Set db = session.CurrentDatabase
Set dc = db.Search({@Date(@Created) = [13.11.2009]}, Nothing, 0)
Ошибки нет, результат есть. :)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 233
18
#15
Medevic
как же с вами тяжко

А кто сказал, что на сервер дата [01.02.2009 00:00:00] отправится в виде строки?
вы и сказали, первый параметр СТРОКА - Set dc = db.Search({@Date(@Created) = [13.11.2009]}, Nothing, 0)

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#16
Менять я ничего не буду. Что за принудительная смена формата?
А причем здесь серверный агент? Мы говорим, что запуск кода на клиентской машине с форматом даты отличным от серверного не приведет к ошибке.
 

TIA

:-)
Lotus team
15.05.2009
790
3
#17
ToxaRat
В строке
Set dc = db.Search({@Date(@Created) = [13.11.2009]}, Nothing, 0)
ошибка есть. А в строке
Set dc = db.Search({@Date(@Created) = [} + st.LocalTime +{]}, Nothing, 0)
ошибки нет.
Дело в том, что LocalTime возващается в формате определяемой текущей локалью. Компиляция формулы происходит тоже под текущей локалью. В результате компиляции дата кодируется в формат не зависящий от локали и передаётся на сервер. Т.о. серверная локаль перестаёт иметь значение для данного способа передачи поискового запроса.

Выражение
Set dc = db.Search({@Date(@Created) = [13.11.2009]}, Nothing, 0)
компилируется под текущей локалью пользователя. Если по правилам текущей локали строка, представляющая дату не распознаётся как дата. Тогда будет ошибка.

Теперь прочитайте все свои посты в данной теме и примените выданные Вами другим рекомендации к себе, токсичный вы наш.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 233
18
#18
TIA
Set dc = db.Search({@Date(@Created) = [13.11.2009]}, Nothing, 0)
ошибка есть. А в строке
Set dc = db.Search({@Date(@Created) = [} + st.LocalTime +{]}, Nothing, 0)
ошибки нет.
вот жеж спорщик
дебагер запустите на клиенте и поглядите какая строка передаётся в функцию
st.LocalTime вернет локальное значение со стороны клиента и это будет та же 13.11.2009, которую сервер НЕ прохавает

единственное нормальное применение st.LocalTime
это конструкция типа if st.LocalTime<st2.LocalTime then

еще раз повторяю для клиент-сервер нельзя оперировать строковыми данными в которых хранится явно дата, только через функции типа @Date
 

TIA

:-)
Lotus team
15.05.2009
790
3
#20
ToxaRat, предполагаемое Вами единственно допустимое применение LocalTime не выдерживает критики. Достаточно вспомнить о типе данных, возвращаемых данным свойством. Сравнение строк в данном контексте не имеет смысла.

По поводу Вашего замечания скажу, что Вы не только не опровергли мои доводы, но даже не попытались понять. Потому предлагаю Вам перечитать повторно и переспросить что не понятно.