Решено Поиск в окне выбора

A

alexas

#41
Смотря что искать, на мой взгляд такой механизм удобен не для поиска документов по базе, а для выбора справочных значений....
Поиск доков по базе тоже можно: при формировании поисковой строки производится контроль ее длины. Если строка может получится больше 32К - добавление данных к строке прекращается и выводится сообщение "Найдено слишком много данных, не все результаты поиска показаны. Введите дополнительные символы" (прямо на форму, msgbox, как показала практика, юзеров раздражает).
Поиск, у меня, начинается с 2 символов и предупреждение выскакивает крайне редко, а коллекции обрабатываются достаточно большие - больше 100К доков (в основном применяется "Нечеткий поиск")
 

anna

Lotus team
03.06.2014
400
7
#42
Pardon Me
P.S. поправил Баг
Убрал кнопку "OK". Список с выбором теперь закрывается при потери фокуса на леере (Табом, как все привыкли, или мышкой)
Все, это релиз :) . Больше ничего делать не буду.
А что делать, если список контрагентов очень большой (скажем, 10000), хотят искать по любому совпадению части счета названия и выводить сортируя по дате? И пиклист не пойдет, и такой, как у Вас, поиск не сработает - у textlist ограничения. а?
 

savl

Lotus team
28.10.2011
2 136
105
#43
Full text index построить для базы.
Далее прямо в представлении, в верхнем меню View -> Search in this view
в панели, которая появилась вводим запрос и ждем
Затем смотрим результаты.
 

erdi

Well-known member
20.08.2008
265
17
#44
касательно предложенной формы поиска...
не обязательно весь список всех возможных значений засовывать сразу в 1 поле. у меня, например за это отвечает функция, которая уже ищет некий массив значений, сортирует, фильтрует и т.д. и на выходе помещает некий список уже в поле возможных значений
для большого кол-ва документов поиск идет через FTSearch( query$, maxdocs). maxdocs я ограничил 40 или 60 позиций. Больше нет смысла, т.к. на экране не влезет и листать на клавиатуре дольше нежели ввести еще 1-2 новых символа
на 5000 поиск почти мгновенный
 

alexas1

Lotus team
10.04.2014
739
151
#45
А что делать, если список контрагентов очень большой (скажем, 10000), хотят искать по любому совпадению части счета названия и выводить сортируя по дате? И пиклист не пойдет, и такой, как у Вас, поиск не сработает - у textlist ограничения. а?
Предложенное - ускорение ввода инфы из справочников.
Потом, поиск глазьями, что в листбоксе, что в виде, в списке из 1000 напр. записей - тот ещё изврат.
В вашем случае я бы делал так (примерно, как поиск в Гугле, только удобней):
Разбить задачу на 2
1 предварительный поиск (FTSearch, GetColumnValues + Like, или чо хочется, с кешированием источника (колонки значений) и\или коллекции-результата в глобале. ) с показом кол-ва найденных доков и, одновременно, показом первых найденных (к примеру, десяток) в SPOFU (не в листбоксе) или в обычной таблице (со скрытием пустышек. Акции по строкам - хотспотами)
Это на лету, в процессе ввода. Всё будет шустро (только в папку записывать сразу ВСЕ доки, а не как в примере хелпа - последовательно)

2 юзверь видит, сколько нашлось и решает, что это его удовлетворяет и давит ентер - всё найденное попадает в тот же SPOFU (опять ВСЮ коллекцию чохом).
FTSearch даст коллекцию, сортированную по релевантности (это плохо, в вашем случае), а показ её в папке автоматом отсортирует как надо, что хорошо. ColumnValues или беготня по энтрисам даст ту же сортировку, что и в виде.
Дальше обрабатывается ентер или двойной клик на доке в папке (View|Queryopendocument\Continue = False\и чо надо ...)
Что и требовалось. Никаких ограничений нет.
 
Последнее редактирование модератором:

alexas1

Lotus team
10.04.2014
739
151
#46
Хотелось, всё же заканчивать поиск энтером. Поэтому сабж обновился.
Что нового:
ENTER в поле поиска - ввод нового значения (не из найденного)
Переход к списку найденного - стрелка вниз.
ENTER и LeftDblClick в списке найденного - записать выбор.
Показ кол-ва найденного.
Упростил логику.
Больше JS (для быстродействия)
Х - отменяет выбор и восстанавливает строку выбора, с которой перешли в листбокс.

Теперь, кто любит клаву, может работать без мыша.
Эмуляция события EnterDown & DblClick - хуком в винде. Такшта - вин онли.
Хук оформлен экзешником и приаттачен в эбаут датабазе (детачится туда же, где и сама база, при открытии формы, если его ещё нет).
Управление хуком - командная строка (хелп - при запуске экзешника без параметров).
Хук работает только в том окне, в котором его запустили (т.е. не мешает одновременно работать в других доках).
Имя может быть любым. Такшта может быть запущено несколько экземпляров - работают независимо.
Приятный ключик NoEnter - игнорировать энтер в редактируемых полях (сильно раздражает перевод строки, где не надо).
В примере, подгрузка данных (из 32768 доков) через GetColumnValues. Такшта работает только в Notes 8 и 9.
Подгрузка ПОСЛЕ показа формы (чтоб не раздражать юзверя возможной задержкой открытия)
Лимит - 32768 доков в виде (больше в массив не запихнуть). Эт всяко лучше, чем FTsearch с его лимитом в 5000.
Загрузка макс. кол-ва доков около 2с.
Первоначальный поиск (1 - 2 символа, 32768 доков) - около 0,5 с. Дальше на порядок шустрее (поиск кешируется).

Пример показа доп инфы из дока для выбранной строки.
Строка выбора может иметь префикс, заканчивающийся на {` } (без кавычек, т.е префикс, апостроф, пробел, строка для поиска). Напр.для показа даты (или ещё чего). В листбоксе показывается, а в выбор не попадает.
Поиск - по совпадению с начала любого слова в строке.
Легко модифицируется для поиска с начала строки или в любом месте любого слова.

Код до конца не причёсан (можно, кое где, заменить бэкэндные методы на уишные).
На первом старте надо чуть подождать, пока построится индекс вида. Потом шустро.
 

Вложения

alexas1

Lotus team
10.04.2014
739
151
#48
если проверять платформу, то можно сделать кроссрешение
для Win хук, для остальных как было
Ну да, несложно.
Мож кто подскажет мысль, как подойти к никсам (я там практически валенок) - тогда мак и льнь добью.
 

alexas1

Lotus team
10.04.2014
739
151
#51
Сорри :(, в JS Header, вторая строчка сверху: var f = document.forms[0];
- надо так: var f = window.document.forms[0];