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

Clarion, Clarion 7

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

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

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

Сообщение gopstop2007 »

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

Спасибо за Ваше внимание.
С10 ABC, TPS
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

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

Сообщение Губин Игорь »

Я делал отдельное поле со вводом поля для фильтра. Т.е. И локатор И фильтр. А вот фильтр можно уже любой в меру фантазии, т.к. обработка фильтра делается отдельной процедурой, которая и раздраконивает поле (у меня в настройках выбор или через регулярные выражения, или просто наличие)
screen.jpg
Это я только кажусь дураком! На самом деле я полный идиот!
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

По сути filtered локатор это тот же фильтр. Надо посмотреть что там внутри класса и может добавить некую дополнительную обработку. Но легче просто не использовать локатор вообще, сделать свою обработку.
We are hard at work… for you. :)
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

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

Сообщение Губин Игорь »

kreator писал(а): 03 Июнь 2019, 14:02По сути filtered локатор это тот же фильтр
По сути, да не совсем. Можно, конечно, полностью переписать шаблон...
Это я только кажусь дураком! На самом деле я полный идиот!
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

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

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

    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. :)
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

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

Сообщение Губин Игорь »

Согласен. QBE вылетел из головы, т.к. не пользуюсь
Это я только кажусь дураком! На самом деле я полный идиот!
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

Предполагал, что кто то уже с такой ситуацией сталкивался. )
Без локатора, с помощью 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
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

gopstop2007 писал(а): 03 Июнь 2019, 15:59 Но дело в том, что пользователи привыкли искать (набирать символы для поиска) находясь на списке (?List), не становясь на поле локатора, в поле только отображаются введенные символы для поиска. (
Ну а как предполагалось разделять слова? Пробелом?
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

kreator писал(а): 03 Июнь 2019, 16:11 Ну а как предполагалось разделять слова? Пробелом?
да, пробелом. В моем примере так и сделано
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

Предлагаю вот как попробовать. В методе ТакеКеу нужного локатора до 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
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Учтите, что такой фильтр будет работать медленно в стандартном броузе для tps. Поэтому у меня используется специальный режим Поиск фиксированный. Там вводятся через пробел фрагменты наименования товара для отбора (если фрагмент с "-", то это исключение), формируется кьюшка с id отобранных товаров, создается курсор для нее (если записей больше, чем строк в броузе, то будут активированы кнопки прокрутки). А отбор в броузе выполняется по этой кьюшке. В ШВС это такой стандартный механизм есть. По факту в фильтр пихается id=значение 1 or id=значение 2 и т.д., а движек вьюхи делает декомпозицию для быстрого поиска. Поскольку есть ограничение по длине этого фильтра, то для больших списков и предусматривается курсор с прокруткой. Ну и не забыть еще защиту на минимальную длину строки поиска. Очень востребованный механизм у некоторых пользователей.
1.jpg
Кстати, у меня и стандартный фильтр по строковым колонкам во всех броузах также работает по фрагментам строк. Это специальный шаблон, который активирует ввод значений для поиска при щелчке правой кнопкой мыши по заголовку колонки. Понимает отдельно строки, числа и даты, вызывая разные диалоги ввода значений. Плюс там тема по сохранению отборов и быстрому их выбору в дальнейшем, кнопки управления на тулбаре и т.п.
C6/C11, ШВС, tps/btrieve.
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

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

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

Сообщение kreator »

Я, наверно, погорячился со своей идеей. Что-то у меня Filtered locator не работает. На ФБ. gopstop2007, как он должен работать?
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Щелчек по заголовку колонки - это лайт вариант qbe фильтра. В нем возможностей меньше, но работать намного проще и понятнее. Дает наиболее часто используемый функционал. Сама идея не моя, кто-то из коллег рассказал.
C6/C11, ШВС, tps/btrieve.
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

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 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить