запрос для Ftsearch: подскажите как выкрутиться

Тема в разделе "Lotus - Программирование", создана пользователем DNT, 25 апр 2007.

Наш партнер Genesis Hackspace
  1. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Ищу документы в БД при помощи Set dc = db.FTSearch(FTQuery, 0, 64,16384), где FTQuery довольно таки большая строка в которой указываю поля и соответствующие им значения для поиска.
    Всё бы ничего, но столкнулся с полем "День рождения" (БД предствляет собой адресную книгу) в котором указывается день/месяц/год. При построении запроса пользователь в поисковой форме указывает период за который нужно найти всех именинников.
    Так вот чёто не соображу никак: как бы мне сравнивать поля без учета года?
    Вот в таком виде (написан без включения мозга :) ):

    FTQuery = FTQuery + { And [Birthday] >= } + Cstr(searchDoc.DateBegin(0))
    FTQuery = FTQuery + { And [Birthday] <= } + Cstr(searchDoc.DateEnd(0))

    скрипт отрабатывает естественно неправильно т.к поле Birthday (например) равно 15.04.1975, а для поиска используется диапазон 01.04.2007-30.04.2007, и ошибочно этот человек не находится.

    Как победить? Спасибо.
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: DNT
    а почему именно FT сёрч?
    я пользуюсь обычным серчем и строка выглядет проще
    { Birthday >= } + Cstr(searchDoc.DateBegin(0)) ...

    ну так разложите на Month и Day
    @Month( searchDoc.DateBegin(0) ) > @Month( Birthday ) > @Month( searchDoc.DateEnd(0) )
    @Day( searchDoc.DateBegin(0) ) > @Day( Birthday ) > @Day( searchDoc.DateEnd(0) )

    но , имхо, можна даже исчо както проще зделать, просто щас в голову не приходить ниче
     
  3. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Morpheus

    Использование db.FTSearch в коде оправдано скоростью работы. Но согласен можно использовать Search.

    С формулами понятно, а как это втиснуть в запрос?
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: DNT
    Код (Text):
    sQuery = { ( @Month(} & searchDoc.DateBegin(0) & { ) > @Month( Birthday ) > @Month( } & searchDoc.DateEnd(0) & { ) ) & ( @Day( } & searchDoc.DateBegin(0) & { ) > @Day( Birthday ) > @Day( } & searchDoc.DateEnd(0) & { ) ) }
     
  5. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Кстати, как вариант,
    1. раз в год запускать агента который пишет например в поле CurYearBirthdayDate дату когда у этого человека в ЭТОМ году будет день рождения
    2. Приводить Birthday, с помощью @Adjust , к нужному в запросе году , тоесть 1975 превращать в 2007.
     
  6. Ronchik

    Ronchik Гость

    Можно еще вот так попробовать сформировать запрос используя вот такую функцию
    @Adjust
    добавить к дате дня рождения определенное количество лет, что-бы был равен текущему
     
  7. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Morpheus

    почемуто ошибку Тайп мисматч выдаёт... может не понимает что Birthday это поле?
     
  8. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: DNT
    Нет, ошибка возможно в построении самой строки разве что.... может, я ковычки забыл, или привести к Cstr:
    Код (Text):
    sQuery = { ( @Month("} & Cstr( searchDoc.DateBegin(0) ) & {" ) > @Month( Birthday ) > @Month( "} & Cstr( searchDoc.DateEnd(0) ) & {" ) ) & ( @Day( "} & Cstr( searchDoc.DateBegin(0) ) & {" ) > @Day( Birthday ) > @Day( "} & Cstr( searchDoc.DateEnd(0) ) & {" ) ) }
     
  9. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Morpheus

    понимаю что наглею , но опять Тайп мисматч выдаёт... :blink:

    в дебаггере sQuery:

    " ( @Month(""01.04.2007"" ) > @Month( Birthday ) > @Month( ""30.04.2007"" ) ) & ( @Day( ""01.04.2007"" ) > @Day( Birthday ) > @Day( ""30.04.2007"" ) ) "

    а может я вызываю неправильно: Set dc = db.Search(sQuery,Nothing,0) ???
     
  10. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: DNT
    а, тьфу, кавычки оказались лишними
    @Month( time­date )

    Код (Text):
    sQuery = { ( @Month(} & Cstr( searchDoc.DateBegin(0) ) & { ) > @Month( Birthday ) > @Month( } & Cstr( searchDoc.DateEnd(0) ) & { ) ) & ( @Day( } & Cstr( searchDoc.DateBegin(0) ) & { ) > @Day( Birthday ) > @Day( } & Cstr( searchDoc.DateEnd(0) ) & { ) ) }
     
  11. Ronchik

    Ronchik Гость

    для DNT

    Попробуй создай view с твоей формулой и смотри какие доки вид отображает , потом вставищь готовую формулу в Search
     
  12. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Ronchik
    Для: Morpheus


    тайп мисматч.

    уже упростил задачу дабы уйти от лишних вопросов и ошибок:

    (@Month(@TextToTime("01.05.2007")) < @Month(Birthday))

    в представлении отбирает, при db.Search - тайп мисматч. :D


    /ушел пить йад/
     
  13. Ronchik

    Ronchik Гость

    Когда переносиш формулы в скрипт очень важно что-бы вместо " стояло '

    Типа вот так
    Search("(@Month(@TextToTime('01.05.2007')) < @Month(Birthday))")
     
  14. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Ronchik

    проверил, исправил:

    (@Month(@TextToTime('01.05.2007')) < @Month(Birthday))

    всё по старому

    Birthday - поле в документе тип Data

    ?
     
  15. Ronchik

    Ronchik Гость

    попробуй тогда сделать вот на основе такого примера
    Код (Text):
    sSer = sSer & |(@TextToTime(@text(AList_ListStructDTo):@Text(AList_ListPersDTo))>[01.01.1980])|
    это как раз сто процентово рабочий код
     
  16. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Путем проб и ошибок родились следущие строки для формирования запроса:

    sQuery1={(@TextToTime('} + searchDoc.DateBegin(0) + {') <[email protected](Birthday;@Year(@Today) - @Year(Birthday);0;0;0;0;0)) & }

    sQuery2={(@TextToTime('} + searchDoc.DateEnd(0) + {') >[email protected](Birthday;@Year(@Today) - @Year(Birthday);0;0;0;0;0))}

    sQuery = sQuery1 + sQuery2

    Проверил - работает. Всем спасибо. :D
     
Загрузка...

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