Сравнение Дат В Search Formula

Тема в разделе "Lotus - Программирование", создана пользователем juk-777, 7 окт 2013.

  1. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    Доброго времени суток уважаемые. Проблемка нарисовалась ...
    Существует агент, который отбирает документы и обрабатывает их неким образом. Проблема в том, что в отбор попадают ненужные документы. Привожу код:

    ...
    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. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Поищите по форуму пожалуйста. Здесь не то, чтобы много, а очень много было подобных тем.
     
  3. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    В том-то и дело, что я бы не писал сюда, если бы нашел на форуме здесь что-либо похожее. Есть темы, но они мне не подходят.
    Меня интересует, как в searchformula правильно преобразовать текстовое поле в дату и далее сравнить его с другим полем даты или с переменной типа дата. Пробовал различные конструкции, остановился на приведеннйо выше,

    @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) => [}+ begindata.Dateonly +{] & @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) =< [}+ enddata.Dateonly +{]

    но она не работает корректно, почему-то проскальзывают (не все, но некоторые и непонятно почему) документы, которые не удовлетворяют этому условию.
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Смотрите какие проскальзывают, что хранится в полях, что хранится в критериях, только ли там дата, а может еще и время есть.
    Чудес все же не бывает...
     
  5. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    { Form = "Vhod" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_<> "" & ДАТА_РАЗРЕШ_ОБРАЩ_ => [}+ cstr(doc.begindata(0)) +{] & ДАТА_РАЗРЕШ_ОБРАЩ_ =< [}+ cstr(doc.enddata(0)) +{] }
     
  6. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    такая конструкция не работает .. не находит вообще ничего .. наверно из-за того что надо еще правильно конвертнуть поле ДАТА_РАЗРЕШ_ОБРАЩ_ в дату .. так как оно текстовое
     
  7. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    К примеру интервал у меня с 01.07.2013 по 31.07.2013
    Кроме нужных доков, у меня в коллекцию попадают документы у которых в поле, по которому критерий отбора, есть цифра 07 например. То есть в коллекции у меня документы с датой (поле текстовое) 07.08.2013. Хотя их тут быть не должно ))
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Ответ на вопрос, в первом же посте: http://codeby.net/forum/threads/51881s0.html?...mp;#entry240773
    Посмотри на пример запроса, который указал автор.
    У него поле изначально date - time, а даты текстом.
    У тебя же ситуация наоборот, границы ты преобразовал, а поле кто будет?
    Сравнивать надо в едином формате, преобразуй все в формат даты.
     
  9. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    Мой главный вопрос: Как правильно на собаках в контексте searchformula преобразовать текстовое поле (из документов для отбора) в тип ДАТА/ВРЕМЯ ?
    Потому как перечитал кучу постов на форуме, но везде примеры где сравнение идет именно поля типа ДАТА с необходимым диапазоном, а у меня поле в документах ТЕКСТОВОЕ, и не могу его побороть((

    Дело в том, что я пытался уже делать так как писали в приведенном Вами посте. результат такой же. Вот мой код:
    searchFormula$ = { Form = "VhodStandart" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_<> "" & @ToTime(@text(ДАТА_РАЗРЕШ_ОБРАЩ_)) => [}+ begindata.Dateonly +{] & @ToTime(@text(ДАТА_РАЗРЕШ_ОБРАЩ_)) =< [}+ enddata.Dateonly +{] }
    Или же все равно что-то не так?
    Очень прошу помочь с этой темой разобраться,.. я подозреваю что тут какая-то мелочь, а вот не могу понять какая ...

    Кстати, не пойму почему теперь не попадают в коллекцию документы, явно входящие в интервал. Ну и осталась проблема с тем, что в коллекцию попадают документы где есть цифра из интервала .. по примеру моего предыдущего поста
     
  10. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Я при непонятках с отбором вывожу на статусбар переменную, в которой хранится запрос. Как правило все становится ясно :D
     
  11. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    явно что-то вы еще недоговариваете или же какие-то еще условия у вас стоят, про которые вы не знаете.
    ту конструкцию что я привел - всегда у меня все правильно отбирало(специально даже протестировал с тестовой формой где даты в виде текста)
    для вас наверное самый простой способ будет открыть дизайнер-создать представление и в формулу отбора документов подставлять различные формулы и смотреть какие документы они возвращают. Как-только найдете формулу для представления - копируйте ее в код и заменяйте своими данными. Результат должен будет совпасть
     
  12. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @ToTime @TextToTime( string )
     
  13. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Все нормально отбирается... "01.07.2013" < "07.08.2013" & "07.08.2013" < "31.07.2013" - есть истина, ибо "01"<"07"<"31".
     
  14. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    Может быть глупый вопрос сейчас задам: но как это сделать?
    как например вытащить в переменную значение поля, по которому строится запрос? В моем случае - это на основной форме документа поле ДАТА_РАЗРЕШ_ОБРАЩ_ типа ТЕКСТ

    Как посмотреть значения полей begin и end типа ДАТА/ВРЕМЯ на открытой форме, то есть в uidoc - это понятно, а вот куда присвоить и как значения поля из тех документов, которые надо отобрать? Вся загвоздка как я понимаю в конвертации текстового поля в дата, в моем запросе, потому как эта конструкция [}+ enddata.Dateonly +{] } у меня правильно написана (уже кучу примеров нашел на форуме с такими конструкциями). НО, как я уже говорил, нет на форуме примера, где с этим [}+ enddata.Dateonly +{] } надо сравнить текстовое поле из документов.

    Буду благодарен за любые советы.
     
  15. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    довели...

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

    Сделать представление (View) с данной формулой отбора, посмотреть результаты.
    Если все верно юзать в поиске, если нет. Править формулу.
     
  16. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    как я могу не знать про условия, которые у меня есть, если я собственноручно пишу код запроса) И договариваю я все- так как не люблю вводить людей в заблуждение .. вырвал кусок из кода и запостил сюда .. в пером своем вопросе. Существует только одна searchformula по которой я хочу сделать db.Search. Но почему-то наткнулся на непонятки)
     
  17. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Сдается мне, ДАТА_РАЗРЕШ_ОБРАЩ_<> "" можно смело опустить.
     
  18. juk-777

    juk-777 Active Member

    Регистрация:
    5 авг 2013
    Сообщения:
    38
    Симпатии:
    0
    :sorry: Вы меня конечно простите, но и подобную конструкцию я делал - результат - тот же что и при
    searchFormula$ = { Form = "VhodStandart" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_<> "" & @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) => [}+ begindata.Dateonly +{] & @ToTime(ДАТА_РАЗРЕШ_ОБРАЩ_) =< [}+ enddata.Dateonly +{] }

    Документы отбираются теже самые - прям один в один совпадают. :)
     
  19. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    ок... результат вот этого выкладывайте:
    Код (LotusScript):
    msgbox searchFormula$
    вставить после формулы, но до search
     
  20. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Есть дебаггер, есть Print
     
Загрузка...
Похожие Темы - Сравнение Дат Search
  1. k85
    Ответов:
    2
    Просмотров:
    1.149
  2. Реник
    Ответов:
    0
    Просмотров:
    1.080
  3. alb
    Ответов:
    36
    Просмотров:
    10.672
  4. Erlan
    Ответов:
    8
    Просмотров:
    1.637
  5. clas
    Ответов:
    3
    Просмотров:
    1.602

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