Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
KirillovAV
4 / 4 / 0
Регистрация: 18.03.2017
Сообщений: 58
1

Посимвольный поиск в форме, VBA. Усовершествование кода

21.01.2018, 13:53. Просмотров 2996. Ответов 70
Метки нет (Все метки)

День добрый коллеги!

Пользуюсь в форме вот таким рабочим кодом.
Есть минусы:
- не работают пробелы (нужно при поиске контрагента - выхожу из положения подстановочными знаками * и ?)
- если случайно в английской раскладке набрать "Э", т.е. - ' что вызывает ошибку
- нужна возможность выбирать строки с пустыми полями (решение видится как группа переключателей над соответствующим полем - "пустые", "не пустые", "все")

Прошу помочь допилить код в этом направлении.
Заранее спасибо за ваше время и внимание!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Option Compare Database
Dim S0
Sub fpoisk()
Dim s1, s2
Me.Refresh
s1 = "true"
 
s2 = "" & Me.КонтрПоиск
If Len(s2) > 0 Then
s1 = s1 & " and  НаимКонтр like '*" & s2 & "*'"
End If
s2 = "" & Me.НомерДогПоиск
If Len(s2) > 0 Then
s1 = s1 & " and  НомерДог like '*" & s2 & "*'"
End If
 
s2 = "" & Me.ДатаДогПоиск
If Len(s2) > 0 Then
s1 = s1 & " and  ДатаДог like '*" & s2 & "*'"
End If
 
Me.Filter = s1
Me.FilterOn = True
End Sub
 
Private Sub Кнопка824_Click()
 
Me.ДатаДогПоиск = ""
Me.НомерДогПоиск = ""
Me.КонтрПоиск = ""
Me.Filter = ""
Me.FilterOn = True
End Sub
 
Private Sub КонтрПоиск_Change()
S0 = "" & Me.КонтрПоиск
Call fpoisk
Me.КонтрПоиск.SelStart = Len(S0) + 1
End Sub
 
Private Sub НомерДогПоиск_Change()
S0 = "" & Me.НомерДогПоиск
Call fpoisk
Me.НомерДогПоиск.SelStart = Len(S0) + 1
End Sub
Private Sub ДатаДогПоиск_Change()
S0 = "" & Me.ДатаДогПоиск
Call fpoisk
Me.ДатаДогПоиск.SelStart = Len(S0) + 1
End Sub
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2018, 13:53
Ответы с готовыми решениями:

Посимвольный поиск в форме
Добрый день! Помогите разобраться, как сделать посимвольный поиск в форме. Она представляет...

Посимвольный поиск в форме
Добрый день! В БД две формы: --"Заявки" создана на основе таблицы, --"Заказ" - на основе...

Сложный поиск в форме Access Средствами VBA
Здравствуйте, подскажите если есть возможность. Ситуация такая, есть форма, на ней отображаются...

Поиск значения в ленточной форме средствами VBA
Есть ленточная форма со списком товаров и их количеством. В одно поле формы считывается штрих код,...

Посимвольный поиск
Существует ленточная форма, в которой несколько полей: 1.&''&&''& 2.&''&&''&&''& 3. ...

70
shanemac51
Модератор
Эксперт MS Access
8660 / 3349 / 519
Регистрация: 07.08.2010
Сообщений: 9,337
Записей в блоге: 2
23.01.2018, 15:36 21
Цитата Сообщение от Capi Посмотреть сообщение
Второй вопрос остается в силе.
Я всегда пишу маску в одинарных апострофах
SQL
1
NAIM LIKE '*СТОЛ*'
поэтому мой вариант для кавычек
SQL
1
2
3
4
5
6
7
s2 = "" & Me.wДолжность
 
IF Len(s2) > 0 THEN
s2 = REPLACE(s2, Chr(34), "[\" & Chr(34) & "]")
s2 = Replace(s2, "'", "''")
s1 = s1 & " and  Должность like '*" & s2 & "*'"
End If
1
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
23.01.2018, 16:50 22
Цитата Сообщение от shanemac51 Посмотреть сообщение
Я всегда пишу маску в одинарных апострофах
......
поэтому мой вариант для кавычек
С Вашим вариантом интересно ознакомиться, но вопрос был о другом.

Вы писали: " по крайней мере исправьте ошибки(откомпилируйте модуль", при этом Вы сделали свои правки и написали
"может и еще есть --не проверяла на базе", и еще пишете
"причем заменяется только двойная кавычка, одинарная не обрабатывается".

Так вот и прошу это все пояснить, где Вы там в моем коде какие ошибки увидели и почему ожидаете,
чтобы в этом коде была еще и обработка апострофа.
0
shanemac51
Модератор
Эксперт MS Access
8660 / 3349 / 519
Регистрация: 07.08.2010
Сообщений: 9,337
Записей в блоге: 2
23.01.2018, 17:11 23
Цитата Сообщение от Capi Посмотреть сообщение
"причем заменяется только двойная кавычка, одинарная не обрабатывается".
может я не до конца поняла ваш код

----
я достаточно консервативна при написании кода, выбрав какой -то вариант --меняю редко

до сих пор(хотя прошло очень много лет)
--написала код в фохПро
--причем поэкспериментировала(обратилась к полям по индексам +... для уменьшения длины кода, получилось довольно компактно по сравнению с обычным вариантом)
--код нормально отработал 10 лет
--понадобились доработки

я не смогла вставить доработки в свой же код, после полученного стресса --за полчаса переписала проблемный блок с нуля(быстрее получилось)

это пожалуй единственный случай подобного типа
0
KirillovAV
4 / 4 / 0
Регистрация: 18.03.2017
Сообщений: 58
23.01.2018, 18:27  [ТС] 24
Цитата Сообщение от Capi Посмотреть сообщение
Попробуйте, пожалуйста.
Интересно, как у Вас пойдет
Вставил, поправил названия полей по инструкции, процедуры автоматом подтянулись к полям. после ввода значения в поиск - просит ввести значение параметра для поля в котором ищу (область данных), кнопка сброса работает.

Добавлено через 19 минут
Цитата Сообщение от shanemac51 Посмотреть сообщение
поэтому мой вариант для кавычек
Работает идеально.

Добавлено через 12 минут
Может нужно что бы имя поля поиск совпадало с именем поля в области данных + _flt?
0
23.01.2018, 18:27
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
23.01.2018, 18:36 25
Цитата Сообщение от shanemac51 Посмотреть сообщение
может я не до конца поняла ваш код
Ясно.
На всякий случай заявили про ошибки, значит.)))

Ага, вычеркнули, что не станете применять - это хорошо.
Применяйте, пожалуйста.

На самом деле там все очень просто:
а) сначала при Form_Open пробегаем по фильтрующим полям в заголовке формы
- делаем их пустой строкой "", чтобы потом не приходилось проверять на Null,
- назначаем им пользовательскую функцию для события Change
б) там же, в Form_Open, на всякий случай обнуляем фильтр формы, а также деактивируем кнопку сброса фильтров
в) когда идет ввод в фильтрующие поля, при вводе каждого символа формируем строку условия фильтрации
- сначала пробегаемся по тем полям, в которые не вводят сейчас
- затем добавляем вклад поля, в который идет ввод
- по результату либо устанавливаем, либо сбрасываем фильтр формы
- если фильтр установлен, активируем кнопку сброса.
г) при нажатии на кнопку сброса
- переводим фокус на другой контрол, чтобы можно было деактивировать кнопку
- вызываем процедуру Form_Open, так как там выполняются все нужные действия
- деактивируем кнопку

Все.

Добавлено через 6 минут
Цитата Сообщение от KirillovAV Посмотреть сообщение
Вставил, поправил названия полей по инструкции
Цитата Сообщение от KirillovAV Посмотреть сообщение
Может нужно что бы имя поля поиск совпадало с полем в области данных + _flt?
А говорите, сделали по инструкции...
Читайте - пункт б), даже примеры даны.
Цитата Сообщение от Capi Посмотреть сообщение
а) Поля для задания условий фильтрации должны располагаться в области Заголовка (как уже принято у Вас).
б) Названия этих поле должны состоять из названия соответствующего поля в области данных + _Flt, например,
для полей в области данных Id, FIO, Address будут поля фильтрации Id_Flt, FIO_Flt, Address_Flt.
Выходит - нужно.
0
KirillovAV
4 / 4 / 0
Регистрация: 18.03.2017
Сообщений: 58
23.01.2018, 18:37  [ТС] 26
Перечитал инструкцию, все понял.... завтра попробую. Проблема в названии полей. Невнимательно прочитал! Прошу прощения. Думаю что все будет в порядке.
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
23.01.2018, 18:39 27
Сообщайте о результатах.
0
shanemac51
Модератор
Эксперт MS Access
8660 / 3349 / 519
Регистрация: 07.08.2010
Сообщений: 9,337
Записей в блоге: 2
23.01.2018, 19:09 28
Capi,
работать заставила, но у меня не все поля текстбоксы
--есть комбобоксы
--и листбоксы
--флажки
--даты


одной обработкой не получится
---
п.с. по числовым данным у меня выборки нет(имею ввиду дробные значения и выбор больше/меньше )
не всегда выбор только по LIKE
0
KirillovAV
4 / 4 / 0
Регистрация: 18.03.2017
Сообщений: 58
23.01.2018, 20:37  [ТС] 29
Цитата Сообщение от Capi Посмотреть сообщение
Сообщайте о результатах.
Не выдержал вернулся попробовать.
На основной базе так и не запустил. просит ввода параметра и все тут. Создал новую. Форма+ таблица. Заработало :-). Но когда стираешь последний символ, выдает ошибку: невозможно обратиться к элементу управления пока на элемент не установлен фокус ввода
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
23.01.2018, 23:44 30
shanemac51,

А "работать заставила" можете расшифровать?
Пожалуйста, поясните.

Что касается того, что "не все поля текстбоксы", все решается.
Выполнением анализа типа контрола, соответствующим видоизменением выражения в фильтре.
И характер сравнения (больше/меньше и т.д) задается ведь каким-то признаком (например, группой переключателей,),
и соответственно можно формировать выражение.

Но это мы уже далеко заходим.
Все началось с того, что ТС рассказал о затруднениях, связанных с необходимостью иметь в условии фильтра символ пробела,
а также о проблемах, связанных со случайным занесением апострофа.
Я и предложила вариант, как безболезненно вводить в поле фильтрации хоть пробел, хоть апостроф.

Дальше уж вопрос применения этого способа.

А построить за полдня универсальнейший поисковик не планировалось,
задачи такой я перед собой, отвечая в этой теме, не ставила.
Хотя, думаю, при надобности можно было бы что-то такое придумать.

Если не сложно, ответьте, пожалуйста, про "работать заставила".

Добавлено через 10 минут
Цитата Сообщение от KirillovAV
Форма+ таблица. Заработало :-). Но когда стираешь последний символ, выдает ошибку:
невозможно обратиться к элементу управления пока на элемент не установлен фокус ввода
Интересно.
А Вы не могли бы выложить эту пробную базу и описать последовательность действий,
чтобы мне попробовать повторить.

Вот я Вас напрягла с этим всем, да?)))
Но надо же разобраться-то.

И просьба - выложить в формате не новее 2007.
Завтра у меня другого не будет.
Послезавтра, может, в 2010 смогу посмотреть.
Но лучше в 2007.
0
KirillovAV
4 / 4 / 0
Регистрация: 18.03.2017
Сообщений: 58
24.01.2018, 08:05  [ТС] 31
Вот я Вас напрягла с этим всем, да?)))
Но надо же разобраться-то.

Не много не так: очень заинтересован допилить этот поисковый движок, поскольку это то что мне нужно! Очень прошу Вас не бросить. Хорошая вещь будет: и пробелы работают и спецзнаки, ну а то что этот движок можно встроить без переделки в любую поисковую форму умножает его «стоимость» на два, а то что можно быстро добавлять или удалять поля из формы ещё на пять!
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
24.01.2018, 13:20 32
Лучший ответ Сообщение было отмечено KirillovAV как решение

Решение

KirillovAV,

Не надо пока базу выкладывать.
Да Вы, собственно, и не торопитесь это делать.

Я подготовила примерчик с одной таблицей и формой.
Добавила туда еще выбор "с начала поля"/"с любой частью поля".
Просто для разнообразия.

Там одно поле текстовое, другое числовое.
Сделала несколько значений с пробелами в тексте, для демонстрации выбора.

Посмотрите.
1
Вложения
Тип файла: zip База данных11.zip (38.3 Кб, 16 просмотров)
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
24.01.2018, 13:45 33
Цитата Сообщение от KirillovAV Посмотреть сообщение
очень заинтересован допилить этот поисковый движок, поскольку это то что мне нужно!
Очень прошу Вас не бросить. Хорошая вещь будет: и пробелы работают и спецзнаки,
ну а то что этот движок можно встроить без переделки в любую поисковую форму умножает его «стоимость» на два,
а то что можно быстро добавлять или удалять поля из формы ещё на пять!
То есть, в общей сложности, умножается на десять...
Ну, тогда ладно.
А то смотрю, я уже больше дюжины сообщений настрочила, и ни одного "плюсика" от Вас, а за критику ставите.
"Вот пристала к человеку", - думаю.

Что касается "этот движок можно встроить без переделки в любую поисковую форму".
Думаю, что можно даже и не встраивать, а сделать соответствующий стандартный (общий) модуль
и использовать его во всех поисковых формах базы.
Вызов, конечно, нужно будет переделать и вообще подумать, как это устроить.
4
MrShin
263 / 228 / 60
Регистрация: 18.06.2015
Сообщений: 489
25.01.2018, 08:54 34
Цитата Сообщение от Capi Посмотреть сообщение
сделать соответствующий стандартный (общий) модуль
Для подобных вещей лучше делать класс, а не стандартный модуль. Тогда подключить функционал к любой форме можно будет двумя-тремя строками кода в форме.
1
KirillovAV
4 / 4 / 0
Регистрация: 18.03.2017
Сообщений: 58
25.01.2018, 12:10  [ТС] 35
Цитата Сообщение от Capi Посмотреть сообщение
То есть, в общей сложности, умножается на десять...
Ну, тогда ладно.
А то смотрю, я уже больше дюжины сообщений настрочила, и ни одного "плюсика" от Вас, а за критику ставите.
"Вот пристала к человеку", - думаю.
Что касается "этот движок можно встроить без переделки в любую поисковую форму".
Думаю, что можно даже и не встраивать, а сделать соответствующий стандартный (общий) модуль
и использовать его во всех поисковых формах базы.
Вызов, конечно, нужно будет переделать и вообще подумать, как это устроить.
Спасибо Вам огромное!
Думаю, тему можно закрыть! Рабочий вариант в сообщении #32 от Capi полностью соответствует поставленной задаче и даже превосходит (примерно в 10 раз :-)
Полтора года пользовался кодом от shanemac51 (в шапке) - надежен и стабилен как молоток - послужил отлично!
Но вчера переделал все свои формы на движок Capi. Очень понравился своей встраиваемостью и опциями в виде пробелов, кавычек и переключениями между видами поиска!
Спасибо Вам (Capi) за неоценимый вклад, я думаю усовершенствованный посимвольный поиск многим пригодится! КЛАСС!
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
25.01.2018, 12:52 36
Цитата Сообщение от "KirillovAV
Спасибо Вам огромное!
Думаю, тему можно закрыть!
Зачем же закрывать такую хорошую тему?
Вдруг еще кто впечатлениями поделится...

К тому же тут еще есть простор для совершенствования,
хотя бы добавить возможность искать символы типа * или ?, то есть те символы,
которые являются служебными для Like.

То, что Вам подошло, это хорошо.
Но вдруг какие шероховатости выявятся, сообщайте.
Будем считать, что пока продукт сдан в опытную эксплуатацию.)))
2
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
27.01.2018, 13:05 37
KirillovAV,

Цитата Сообщение от Capi Посмотреть сообщение
тут еще есть простор для совершенствования,
хотя бы добавить возможность искать символы типа * или ?, то есть те символы,
которые являются служебными для Like
Сделано. Включены символы "[", "#", "?", "*".
Выкладываю дополненную редакцию.
3
Вложения
Тип файла: zip База данных11.zip (39.1 Кб, 16 просмотров)
Stalker73i
127 / 25 / 1
Регистрация: 07.02.2016
Сообщений: 238
28.01.2018, 11:53 38
Цитата Сообщение от Capi Посмотреть сообщение
Выкладываю дополненную редакцию.
а в mdb формате нет случайно?
0
mobile
Эксперт MS Access
24344 / 13382 / 2831
Регистрация: 28.04.2012
Сообщений: 14,663
28.01.2018, 11:58 39
Цитата Сообщение от Stalker73i Посмотреть сообщение
а в mdb формате нет случайно?
Я думаю Capi не будет протестовать, если я выложу ее БД в другом формате
2
Вложения
Тип файла: rar База данных11.rar (32.0 Кб, 10 просмотров)
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,720
28.01.2018, 14:05 40
Цитата Сообщение от mobile
думаю Capi не будет протестовать, если я выложу ее БД в другом формате
Нет, конечно. Спасибо.

Но и спасибо от Stalker73i мне за оригинал тоже не помешало бы.
0
28.01.2018, 14:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2018, 14:05

Посимвольный поиск в выпадающем списке
Добрый вечер, подскажите как правильно искать значения в списке по мере ввода символов?Private Sub...

Отображение HTML кода в форме VBA
Уважаемые гуру vba. Есть ли у формы функция, чтобы он отображал html код как браузер?

Посимвольный поиск из файла
Как сделать программу, которая будет искать в файле по введенным символам с клавиатуры и выводить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru