• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы juk-777
  • Дата начала
J

juk-777

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

...
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 типа ДАТА/ВРЕМЯ
- на основной форме документа поле ДАТА_РАЗРЕШ_ОБРАЩ_ типа ТЕКСТ

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

Заранее благодарю!
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Поищите по форуму пожалуйста. Здесь не то, чтобы много, а очень много было подобных тем.
 
J

juk-777

Поищите по форуму пожалуйста. Здесь не то, чтобы много, а очень много было подобных тем.

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

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

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
но она не работает корректно, почему-то проскальзывают (не все, но некоторые и непонятно почему) документы, которые не удовлетворяют этому условию.
Смотрите какие проскальзывают, что хранится в полях, что хранится в критериях, только ли там дата, а может еще и время есть.
Чудес все же не бывает...
 

erdi

Green Team
20.08.2008
264
17
BIT
0
{ Form = "Vhod" & @Left(ТИП_ДОКУМЕНТА;6)="Жалобы" & ДАТА_РАЗРЕШ_ОБРАЩ_<> "" & ДАТА_РАЗРЕШ_ОБРАЩ_ => [}+ cstr(doc.begindata(0)) +{] & ДАТА_РАЗРЕШ_ОБРАЩ_ =< [}+ cstr(doc.enddata(0)) +{] }
 
J

juk-777

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

такая конструкция не работает .. не находит вообще ничего .. наверно из-за того что надо еще правильно конвертнуть поле ДАТА_РАЗРЕШ_ОБРАЩ_ в дату .. так как оно текстовое
 
J

juk-777

Смотрите какие проскальзывают, что хранится в полях, что хранится в критериях, только ли там дата, а может еще и время есть.
Чудес все же не бывает...

К примеру интервал у меня с 01.07.2013 по 31.07.2013
Кроме нужных доков, у меня в коллекцию попадают документы у которых в поле, по которому критерий отбора, есть цифра 07 например. То есть в коллекции у меня документы с датой (поле текстовое) 07.08.2013. Хотя их тут быть не должно ))
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Ответ на вопрос, в первом же посте: https://codeby.net/threads/51881
Посмотри на пример запроса, который указал автор.
У него поле изначально date - time, а даты текстом.
У тебя же ситуация наоборот, границы ты преобразовал, а поле кто будет?
Сравнивать надо в едином формате, преобразуй все в формат даты.
 
J

juk-777

У тебя же ситуация наоборот, границы ты преобразовал, а поле кто будет?
Сравнивать надо в едином формате, преобразуй все в формат даты.

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

Ответ на вопрос, в первом же посте: https://codeby.net/threads/51881
Посмотри на пример запроса, который указал автор.
У него поле изначально date - time, а даты текстом.

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

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

Anatoly

Я при непонятках с отбором вывожу на статусбар переменную, в которой хранится запрос. Как правило все становится ясно :D
 

erdi

Green Team
20.08.2008
264
17
BIT
0
явно что-то вы еще недоговариваете или же какие-то еще условия у вас стоят, про которые вы не знаете.
ту конструкцию что я привел - всегда у меня все правильно отбирало(специально даже протестировал с тестовой формой где даты в виде текста)
для вас наверное самый простой способ будет открыть дизайнер-создать представление и в формулу отбора документов подставлять различные формулы и смотреть какие документы они возвращают. Как-только найдете формулу для представления - копируйте ее в код и заменяйте своими данными. Результат должен будет совпасть
 
A

Anatoly

К примеру интервал у меня с 01.07.2013 по 31.07.2013
Кроме нужных доков, у меня в коллекцию попадают документы у которых в поле, по которому критерий отбора, есть цифра 07 например. То есть в коллекции у меня документы с датой (поле текстовое) 07.08.2013. Хотя их тут быть не должно ))
Все нормально отбирается... "01.07.2013" < "07.08.2013" & "07.08.2013" < "31.07.2013" - есть истина, ибо "01"<"07"<"31".
 
J

juk-777

Я при непонятках с отбором вывожу на статусбар переменную, в которой хранится запрос. Как правило все становится ясно :)

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

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

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
довели...

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

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

juk-777

явно что-то вы еще недоговариваете или же какие-то еще условия у вас стоят, про которые вы не знаете.

как я могу не знать про условия, которые у меня есть, если я собственноручно пишу код запроса) И договариваю я все- так как не люблю вводить людей в заблуждение .. вырвал кусок из кода и запостил сюда .. в пером своем вопросе. Существует только одна searchformula по которой я хочу сделать db.Search. Но почему-то наткнулся на непонятки)
 
A

Anatoly

довели...

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

Сделать представление (View) с данной формулой отбора, посмотреть результаты.
Если все верно юзать в поиске, если нет. Править формулу.
Сдается мне, ДАТА_РАЗРЕШ_ОБРАЩ_<> "" можно смело опустить.
 
J

juk-777

довели...

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

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

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

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
ок... результат вот этого выкладывайте:
Код:
msgbox searchFormula$
вставить после формулы, но до search
 
A

Anatoly

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

Есть дебаггер, есть Print
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!