Locator search (локатор поиск) по нескольким словам
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Locator search (локатор поиск) по нескольким словам
Стандартный browse со справочником товара.
Длина названия товара - 255 символов. Поиск товара осуществляется с помощью стандартного locator-а -> Filtered -> Find Anywhere.
Возможен ли поиск по нескольким словосочетаниям в названии товара, через пробел, сохранив использование вышеуказанных настроек локатора.
Спасибо за Ваше внимание.
С10 ABC, TPS
Длина названия товара - 255 символов. Поиск товара осуществляется с помощью стандартного locator-а -> Filtered -> Find Anywhere.
Возможен ли поиск по нескольким словосочетаниям в названии товара, через пробел, сохранив использование вышеуказанных настроек локатора.
Спасибо за Ваше внимание.
С10 ABC, TPS
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2335
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Поблагодарили: 18 раз
Locator search (локатор поиск) по нескольким словам
Я делал отдельное поле со вводом поля для фильтра. Т.е. И локатор И фильтр. А вот фильтр можно уже любой в меру фантазии, т.к. обработка фильтра делается отдельной процедурой, которая и раздраконивает поле (у меня в настройках выбор или через регулярные выражения, или просто наличие)
Это я только кажусь дураком! На самом деле я полный идиот!
-
- ✯ Ветеран ✯
- Сообщения: 4989
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Locator search (локатор поиск) по нескольким словам
По сути filtered локатор это тот же фильтр. Надо посмотреть что там внутри класса и может добавить некую дополнительную обработку. Но легче просто не использовать локатор вообще, сделать свою обработку.
We are hard at work… for you.
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2335
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Поблагодарили: 18 раз
Locator search (локатор поиск) по нескольким словам
По сути, да не совсем. Можно, конечно, полностью переписать шаблон...
Это я только кажусь дураком! На самом деле я полный идиот!
-
- ✯ Ветеран ✯
- Сообщения: 4989
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Locator search (локатор поиск) по нескольким словам
Шаблон не нужно править. Там вот так:
Shadow - это то, что мы ввели. Как видим - создаётся строка с instring и запихивается в фильтр вьюхи. Надо разобрать это значение Shadow и запихнуть в фильтр что-то другое. ИМХО, легче это сделать без локатора.
К слову, я всегда использую инкрементный локатор для быстрого поиска с начала строки и отдельный фильтр типа QBE.
Код: Выделить всё
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
...
К слову, я всегда использую инкрементный локатор для быстрого поиска с начала строки и отдельный фильтр типа QBE.
We are hard at work… for you.
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2335
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Поблагодарили: 18 раз
Locator search (локатор поиск) по нескольким словам
Согласен. QBE вылетел из головы, т.к. не пользуюсь
Это я только кажусь дураком! На самом деле я полный идиот!
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Locator search (локатор поиск) по нескольким словам
Предполагал, что кто то уже с такой ситуацией сталкивался. )
Без локатора, с помощью ValidateRecord, проверил - работает)
Но дело в том, что пользователи привыкли искать (набирать символы для поиска) находясь на списке (?List), не становясь на поле локатора, в поле только отображаются введенные символы для поиска. (
Абидно , не говоря уже про морфологию при поиске
Без локатора, с помощью 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
Абидно , не говоря уже про морфологию при поиске
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 4989
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Locator search (локатор поиск) по нескольким словам
Ну а как предполагалось разделять слова? Пробелом?gopstop2007 писал(а): ↑03 Июнь 2019, 15:59 Но дело в том, что пользователи привыкли искать (набирать символы для поиска) находясь на списке (?List), не становясь на поле локатора, в поле только отображаются введенные символы для поиска. (
We are hard at work… for you.
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Locator search (локатор поиск) по нескольким словам
да, пробелом. В моем примере так и сделано
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 4989
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Locator search (локатор поиск) по нескольким словам
Предлагаю вот как попробовать. В методе ТакеКеу нужного локатора до Parent Call разобрать этот Shadow, присвоить фильтру вьюхи и резетнуть очередь. Вот выразился ! Не забыть правильно выйти из метода:
Я писал в TakeKey свою обработку инкрементного локатора для больших списков. Стандартный механизм плохо дружит с большими списками ФБ, пошёл альтернативным путём.
Код: Выделить всё
...
ReturnValue = Level:Benign
end
! End of "Locator Method Executable Code Section"
RETURN ReturnValue
We are hard at work… for you.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Locator search (локатор поиск) по нескольким словам
Учтите, что такой фильтр будет работать медленно в стандартном броузе для tps. Поэтому у меня используется специальный режим Поиск фиксированный. Там вводятся через пробел фрагменты наименования товара для отбора (если фрагмент с "-", то это исключение), формируется кьюшка с id отобранных товаров, создается курсор для нее (если записей больше, чем строк в броузе, то будут активированы кнопки прокрутки). А отбор в броузе выполняется по этой кьюшке. В ШВС это такой стандартный механизм есть. По факту в фильтр пихается id=значение 1 or id=значение 2 и т.д., а движек вьюхи делает декомпозицию для быстрого поиска. Поскольку есть ограничение по длине этого фильтра, то для больших списков и предусматривается курсор с прокруткой. Ну и не забыть еще защиту на минимальную длину строки поиска. Очень востребованный механизм у некоторых пользователей.
Кстати, у меня и стандартный фильтр по строковым колонкам во всех броузах также работает по фрагментам строк. Это специальный шаблон, который активирует ввод значений для поиска при щелчке правой кнопкой мыши по заголовку колонки. Понимает отдельно строки, числа и даты, вызывая разные диалоги ввода значений. Плюс там тема по сохранению отборов и быстрому их выбору в дальнейшем, кнопки управления на тулбаре и т.п.
Кстати, у меня и стандартный фильтр по строковым колонкам во всех броузах также работает по фрагментам строк. Это специальный шаблон, который активирует ввод значений для поиска при щелчке правой кнопкой мыши по заголовку колонки. Понимает отдельно строки, числа и даты, вызывая разные диалоги ввода значений. Плюс там тема по сохранению отборов и быстрому их выбору в дальнейшем, кнопки управления на тулбаре и т.п.
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Locator search (локатор поиск) по нескольким словам
насчет длины согласен, посмотрел, в shadow ctring(40), но из-за лени в основном пишут не более 10-15 символов )finsoftrz писал(а): ↑03 Июнь 2019, 17:02 ...Ну и не забыть еще защиту на минимальную длину строки поиска. Очень востребованный механизм у некоторых пользователей.
Кстати, у меня и стандартный фильтр по строковым колонкам во всех броузах также работает по фрагментам строк. Это специальный шаблон, который активирует ввод значений для поиска при щелчке правой кнопкой мыши по заголовку колонки.
насчет щелчка по заголовку, это для "сильно продвинутых" пользователей )))
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 4989
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 21 раз
Locator search (локатор поиск) по нескольким словам
Я, наверно, погорячился со своей идеей. Что-то у меня Filtered locator не работает. На ФБ. gopstop2007, как он должен работать?
We are hard at work… for you.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Locator search (локатор поиск) по нескольким словам
Щелчек по заголовку колонки - это лайт вариант qbe фильтра. В нем возможностей меньше, но работать намного проще и понятнее. Дает наиболее часто используемый функционал. Сама идея не моя, кто-то из коллег рассказал.
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Locator search (локатор поиск) по нескольким словам
Код: Выделить всё
l_search_words STRING(20)
l_oneword STRING(10) ! первое словосочетание
l_twoword STRING(10) ! второе словосочетание
l_words_used BYTE ! вкл. мою фильтрацию
l_manywords BYTE !
на кнопку обновить (пока для теста в ручную ) вешаю
Код: Выделить всё
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()
Код: Выделить всё
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 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп