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

Тема в разделе "Lotus - Программирование", создана пользователем dimat, 12 ноя 2009.

  1. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    на форме кнопка и 2 поля типа Дата/Время, в которых указывается период.
    Как правильно в формуле поиска указать чтоб значение поля типа Дата/Время соответствовало указанному периоду?
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Концептуально так :rolleyes:
    Код (Text):
    (@Today > Date1) & (@Today < Date2)
     
  3. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Код (Text):
        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
    Ошибка: несоответствие типов. на
    Код (Text):
    Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>start & ContactDateDemo<=en |,nohing,0)
    Как првильно записать?
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    dimat
    правильно сначала откатать данную формулу на каком нибудь виде в селексе
    за конструкции типа ContactDateDemo=>start нужно сразу рубить голову
    в селексе как и в сече должны быть четко типизированные поля/переменные без конструкций на текст если у вас есть переменная то приводите её через функцию @Date но никак не в явном текстовом виде
     
  5. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Селекс это что? поле "Найти в данном представлении"?
     
  6. TIA

    TIA :-)
    Lotus team

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    TIA
    ContactDateDemo=>[| + st.LocalTime + |]
    это и к вам относится - рубить за это голову
    вы вообще в курсе что подобная конструкция ведет к ошибке?
    или вы наивно полагаете, что формат времени на клиента и на сервере всегда одинаков?
     
  8. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Сделал
    Код (Text):
    Set dc=db.Search(|form="ContactFormDemo" & ContactDateDemo=>[|+st.LocalTime+|] & ContactDateDemo<=[|+en.LocalTime+|] |,nohing,0)
    Такая же ошибка :rolleyes:
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    А какая разница? Код выполняется или на клиенте, или на сервере. Формат всегда одинаков.
    Проверить, кстати, легко.

    Потому что пишется Nothing, а не nohing.
    Добавь Option Declare, чтобы не было таких ошибок.
     
  10. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Блин точно! ;) , простите меня за мою не внимательность :rolleyes: . Спасибо всем за помощь!
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я бы делал через @Date.
    Т.е. что-то вроде
    Код (Text):
    {Date1 > @Date(} + Cstr(Year(CheckDate)) + {; } + Cstr(Month(CheckDate)) + {;} + ...
    Немного гормоздко, но я гарантированно избавлен от проблем с форматом даты.
     
  12. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    :rolleyes: Вот так вот сразу -- "рубить"? Без суда и следствия?
    ToxaRat , а вы уверены, что поисковый запрос на сервер передаётся в нескомпилированном виде?
    Если в скомпилированном, то где выполняется компиляция?
    Как Вы думается, какая локаль используется при компиляции?
    Эх, вашу бы энергию, да на изучение предмета...
     
  13. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    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
    И причем тут локаль когда вы оперируете строкой, которую сервер должен обратно вернуть САМ в формат даты?!
     
  14. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    А кто сказал, что на сервер дата [01.02.2009 00:00:00] отправится в виде строки?

    Кстати, я могу проверить как раз на таком сервере.
    Пишу кнопку:
    Код (Text):
    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)
    Ошибки нет, результат есть. :)
     
  15. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Medevic
    как же с вами тяжко

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Менять я ничего не буду. Что за принудительная смена формата?
    А причем здесь серверный агент? Мы говорим, что запуск кода на клиентской машине с форматом даты отличным от серверного не приведет к ошибке.
     
  17. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    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)
    компилируется под текущей локалью пользователя. Если по правилам текущей локали строка, представляющая дату не распознаётся как дата. Тогда будет ошибка.

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    TIA
    вот жеж спорщик
    дебагер запустите на клиенте и поглядите какая строка передаётся в функцию
    st.LocalTime вернет локальное значение со стороны клиента и это будет та же 13.11.2009, которую сервер НЕ прохавает

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Да за такое сразу голову рубить. :)
     
  20. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    ToxaRat, предполагаемое Вами единственно допустимое применение LocalTime не выдерживает критики. Достаточно вспомнить о типе данных, возвращаемых данным свойством. Сравнение строк в данном контексте не имеет смысла.

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

Поделиться этой страницей