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

  • Автор темы Автор темы DNT
  • Дата начала Дата начала
D

DNT

Ищу документы в БД при помощи 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, и ошибочно этот человек не находится.

Как победить? Спасибо.
 
Для: 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) )

но , имхо, можна даже исчо както проще зделать, просто щас в голову не приходить ниче
 
Для: Morpheus

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

С формулами понятно, а как это втиснуть в запрос?
 
Для: DNT
Код:
sQuery = { ( @Month(} & searchDoc.DateBegin(0) & { ) > @Month( Birthday ) > @Month( } & searchDoc.DateEnd(0) & { ) ) & ( @Day( } & searchDoc.DateBegin(0) & { ) > @Day( Birthday ) > @Day( } & searchDoc.DateEnd(0) & { ) ) }
 
Кстати, как вариант,
1. раз в год запускать агента который пишет например в поле CurYearBirthdayDate дату когда у этого человека в ЭТОМ году будет день рождения
2. Приводить Birthday, с помощью @Adjust , к нужному в запросе году , тоесть 1975 превращать в 2007.
 
Можно еще вот так попробовать сформировать запрос используя вот такую функцию
@Adjust
добавить к дате дня рождения определенное количество лет, что-бы был равен текущему
 
Для: Morpheus

почемуто ошибку Тайп мисматч выдаёт... может не понимает что Birthday это поле?
 
Для: DNT
Нет, ошибка возможно в построении самой строки разве что.... может, я ковычки забыл, или привести к Cstr:
Код:
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) ) & {" ) ) }
 
Для: 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) ???
 
Для: DNT
а, тьфу, кавычки оказались лишними
@Month( time­date )

Код:
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) ) & { ) ) }
 
для DNT

Попробуй создай view с твоей формулой и смотри какие доки вид отображает , потом вставищь готовую формулу в Search
 
Для: Ronchik
Для: Morpheus


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

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

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

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


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

Типа вот так
Search("(@Month(@TextToTime('01.05.2007')) < @Month(Birthday))")
 
Для: Ronchik

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

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

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

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

?
 
Для: Ronchik

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

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

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

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

?

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

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

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

sQuery = sQuery1 + sQuery2

Проверил - работает. Всем спасибо. :D
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab