Locator search (локатор поиск) по нескольким словам

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
gopstop2007
Ветеран
Сообщения: 1220
Зарегистрирован: 25 Март 2009, 21:55

Locator search (локатор поиск) по нескольким словам

Сообщение gopstop2007 » 02 Июнь 2019, 15:01

Стандартный browse со справочником товара.
Длина названия товара - 255 символов. Поиск товара осуществляется с помощью стандартного locator-а -> Filtered -> Find Anywhere.
Возможен ли поиск по нескольким словосочетаниям в названии товара, через пробел, сохранив использование вышеуказанных настроек локатора.

Спасибо за Ваше внимание.
С10 ABC, TPS
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Аватара пользователя
Губин Игорь
Ветеран
Сообщения: 1257
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение Губин Игорь » 03 Июнь 2019, 13:12

Я делал отдельное поле со вводом поля для фильтра. Т.е. И локатор И фильтр. А вот фильтр можно уже любой в меру фантазии, т.к. обработка фильтра делается отдельной процедурой, которая и раздраконивает поле (у меня в настройках выбор или через регулярные выражения, или просто наличие)
screen.jpg
Это я только кажусь дураком! На самом деле я полный идиот!

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение kreator » 03 Июнь 2019, 14:02

По сути filtered локатор это тот же фильтр. Надо посмотреть что там внутри класса и может добавить некую дополнительную обработку. Но легче просто не использовать локатор вообще, сделать свою обработку.
We are hard at work… for you. :)

Аватара пользователя
Губин Игорь
Ветеран
Сообщения: 1257
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение Губин Игорь » 03 Июнь 2019, 14:05

kreator писал(а):
03 Июнь 2019, 14:02
По сути filtered локатор это тот же фильтр
По сути, да не совсем. Можно, конечно, полностью переписать шаблон...
Это я только кажусь дураком! На самом деле я полный идиот!

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение kreator » 03 Июнь 2019, 15:15

Шаблон не нужно править. Там вот так:

Код: Выделить всё

    SN = CHOOSE(INSTRING('UPPER(',FN,1,1) = 0,QUOTE(SELF.Shadow),QUOTE(UPPER(SELF.Shadow)))
    IF SELF.FloatRight
      SELF.ViewManager.SetFilter(CHOOSE(SN='','','INSTRING('''&SN&''','&FN&',1,1) <<> 0'),'3 Locator')
    ELSE
    ...
Shadow - это то, что мы ввели. Как видим - создаётся строка с instring и запихивается в фильтр вьюхи. Надо разобрать это значение Shadow и запихнуть в фильтр что-то другое. ИМХО, легче это сделать без локатора.
К слову, я всегда использую инкрементный локатор для быстрого поиска с начала строки и отдельный фильтр типа QBE.
We are hard at work… for you. :)

Аватара пользователя
Губин Игорь
Ветеран
Сообщения: 1257
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение Губин Игорь » 03 Июнь 2019, 15:17

Согласен. QBE вылетел из головы, т.к. не пользуюсь
Это я только кажусь дураком! На самом деле я полный идиот!

gopstop2007
Ветеран
Сообщения: 1220
Зарегистрирован: 25 Март 2009, 21:55

Locator search (локатор поиск) по нескольким словам

Сообщение gopstop2007 » 03 Июнь 2019, 15:59

Предполагал, что кто то уже с такой ситуацией сталкивался. )
Без локатора, с помощью ValidateRecord, проверил - работает)

Код: Выделить всё

l_search_words"		! строка целиком
l_oneword"		! первое слово	
l_oneword"		! второе слово

    w# = INSTRING(' ',l_search_words",1,1) ! ищем пробел
    IF w# > 0	! более одного слова
        l_oneword" = SUB(l_search_words",1,w#-1)	 
        l_twoword "= SUB(l_search_words",w#,LEN(CLIP(l_search_words"))+1 - w#)
        IF ~INSTRING(UPPER(CLIP(l_oneword")), UPPER(CLIP(my:ProdName)),1,1) OR ~INSTRING(UPPER(CLIP(l_twoword")), UPPER(CLIP(my:ProdName)),1,1) then return(Record:Filtered) END 
    ELSE	! одно слово
        IF ~INSTRING(UPPER(CLIP(l_search_words")), UPPER(CLIP(my:ProdName)),1,1) then return(Record:Filtered) END 
    END        
Но дело в том, что пользователи привыкли искать (набирать символы для поиска) находясь на списке (?List), не становясь на поле локатора, в поле только отображаются введенные символы для поиска. (
Абидно :), не говоря уже про морфологию при поиске
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение kreator » 03 Июнь 2019, 16:11

gopstop2007 писал(а):
03 Июнь 2019, 15:59
Но дело в том, что пользователи привыкли искать (набирать символы для поиска) находясь на списке (?List), не становясь на поле локатора, в поле только отображаются введенные символы для поиска. (
Ну а как предполагалось разделять слова? Пробелом?
We are hard at work… for you. :)

gopstop2007
Ветеран
Сообщения: 1220
Зарегистрирован: 25 Март 2009, 21:55

Locator search (локатор поиск) по нескольким словам

Сообщение gopstop2007 » 03 Июнь 2019, 16:13

kreator писал(а):
03 Июнь 2019, 16:11
Ну а как предполагалось разделять слова? Пробелом?
да, пробелом. В моем примере так и сделано
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение kreator » 03 Июнь 2019, 16:24

Предлагаю вот как попробовать. В методе ТакеКеу нужного локатора до Parent Call разобрать этот Shadow, присвоить фильтру вьюхи и резетнуть очередь. Вот выразился :mrgreen: ! Не забыть правильно выйти из метода:

Код: Выделить всё

     ...
     ReturnValue = Level:Benign
  end  
  
  ! End of "Locator Method Executable Code Section"
  RETURN ReturnValue
Я писал в TakeKey свою обработку инкрементного локатора для больших списков. Стандартный механизм плохо дружит с большими списками ФБ, пошёл альтернативным путём.
We are hard at work… for you. :)

Аватара пользователя
finsoftrz
Ветеран
Сообщения: 1182
Зарегистрирован: 06 Ноябрь 2014, 12:48

Locator search (локатор поиск) по нескольким словам

Сообщение finsoftrz » 03 Июнь 2019, 17:02

Учтите, что такой фильтр будет работать медленно в стандартном броузе для tps. Поэтому у меня используется специальный режим Поиск фиксированный. Там вводятся через пробел фрагменты наименования товара для отбора (если фрагмент с "-", то это исключение), формируется кьюшка с id отобранных товаров, создается курсор для нее (если записей больше, чем строк в броузе, то будут активированы кнопки прокрутки). А отбор в броузе выполняется по этой кьюшке. В ШВС это такой стандартный механизм есть. По факту в фильтр пихается id=значение 1 or id=значение 2 и т.д., а движек вьюхи делает декомпозицию для быстрого поиска. Поскольку есть ограничение по длине этого фильтра, то для больших списков и предусматривается курсор с прокруткой. Ну и не забыть еще защиту на минимальную длину строки поиска. Очень востребованный механизм у некоторых пользователей.
1.jpg
Кстати, у меня и стандартный фильтр по строковым колонкам во всех броузах также работает по фрагментам строк. Это специальный шаблон, который активирует ввод значений для поиска при щелчке правой кнопкой мыши по заголовку колонки. Понимает отдельно строки, числа и даты, вызывая разные диалоги ввода значений. Плюс там тема по сохранению отборов и быстрому их выбору в дальнейшем, кнопки управления на тулбаре и т.п.
Рязань решает.

gopstop2007
Ветеран
Сообщения: 1220
Зарегистрирован: 25 Март 2009, 21:55

Locator search (локатор поиск) по нескольким словам

Сообщение gopstop2007 » 03 Июнь 2019, 17:26

finsoftrz писал(а):
03 Июнь 2019, 17:02
...Ну и не забыть еще защиту на минимальную длину строки поиска. Очень востребованный механизм у некоторых пользователей.
Кстати, у меня и стандартный фильтр по строковым колонкам во всех броузах также работает по фрагментам строк. Это специальный шаблон, который активирует ввод значений для поиска при щелчке правой кнопкой мыши по заголовку колонки.
насчет длины согласен, посмотрел, в shadow ctring(40), но из-за лени в основном пишут не более 10-15 символов )
насчет щелчка по заголовку, это для "сильно продвинутых" пользователей )))
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Locator search (локатор поиск) по нескольким словам

Сообщение kreator » 03 Июнь 2019, 17:49

Я, наверно, погорячился со своей идеей. Что-то у меня Filtered locator не работает. На ФБ. gopstop2007, как он должен работать?
We are hard at work… for you. :)

Аватара пользователя
finsoftrz
Ветеран
Сообщения: 1182
Зарегистрирован: 06 Ноябрь 2014, 12:48

Locator search (локатор поиск) по нескольким словам

Сообщение finsoftrz » 03 Июнь 2019, 17:51

Щелчек по заголовку колонки - это лайт вариант qbe фильтра. В нем возможностей меньше, но работать намного проще и понятнее. Дает наиболее часто используемый функционал. Сама идея не моя, кто-то из коллег рассказал.
Рязань решает.

gopstop2007
Ветеран
Сообщения: 1220
Зарегистрирован: 25 Март 2009, 21:55

Locator search (локатор поиск) по нескольким словам

Сообщение gopstop2007 » 03 Июнь 2019, 19:01

kreator писал(а):
03 Июнь 2019, 17:49
Я, наверно, погорячился со своей идеей. Что-то у меня Filtered locator не работает. На ФБ. gopstop2007, как он должен работать?

Код: Выделить всё

l_search_words  STRING(20)
l_oneword       STRING(10) ! первое словосочетание
l_twoword       STRING(10) ! второе словосочетание
l_words_used	BYTE	! вкл. мою фильтрацию
l_manywords	BYTE ! 
l_search_words - поле используемое вместо локатора для поиска

на кнопку обновить (пока для теста в ручную ) вешаю

Код: Выделить всё

    l_manywords = INSTRING(' ',l_search_words,1,1)
    l_oneword = SUB(l_search_words,1,l_manywords-1)
    l_twoword = SUB(l_search_words,l_manywords,LEN(CLIP(l_search_words))+1 - l_manywords)
    l_words_used = 1
    BRWx.ResetFromBuffer()
в ValidateRecord после Parent нужного Browse

Код: Выделить всё

IF l_words_used 
    IF l_manywords > 0
        IF ~INSTRING(UPPER(CLIP(l_oneword)), UPPER(CLIP(My:ProductName)),1,1) OR ~INSTRING(UPPER(CLIP(l_twoword)), UPPER(CLIP(My:ProductName)),1,1) then return(Record:Filtered) END 
    ELSE
        IF ~INSTRING(UPPER(CLIP(l_search_words)), UPPER(CLIP(My:ProductName)),1,1) then return(Record:Filtered) END 
    END
    l_words_used = 0        
END 
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Ответить