MS Access - как указать - в каком поле делать поиск

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

MS Access - как указать - в каком поле делать поиск

Сообщение AndreyMust19 » 16.10.2009 (Пт) 12:19

Здравствуйте.
Нужно сделать на форме поиск данных в БД по первым буквам фамилии / имени / отчества. Для этого есть 3 радиокнопки, к-ми выбирается - где искать - в "Фамилия", "Имя", "Отчество", поле для ввода искомого фрагмента и кнопка "Найти далее". Нашел функции FindRecord и FindNext, но чтобы поиск шел в конкретных полях, а не во всех, надо выбрать это поле. Как это сделать? В FindRecord можно указать искать только в текущем поле, но как его сделать текущим?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: MS Access - как указать - в каком поле делать поиск

Сообщение alibek » 16.10.2009 (Пт) 12:48

Используй метод Find рекордсета, а не формы.
Lasciate ogni speranza, voi ch'entrate.

AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

Re: MS Access - как указать - в каком поле делать поиск

Сообщение AndreyMust19 » 16.10.2009 (Пт) 12:53

Похоже, придется использовать FindFirst, а не FindRecord, так как последний привязывается к элементу управления, у к-го был фокус.
Используй метод Find рекордсета, а не формы.

RecordSet.Find? Попробую, о результатах сообщу.

AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

Сообщение AndreyMust19 » 16.10.2009 (Пт) 13:43

Не работает:

Код: Выделить всё
Dim rst As Recordset
Dim strCriteria As String

strCriteria = "[Фамилия] = 'Юрьева'"
Set rst = CurrentDb.OpenRecordset("Поступление и выписка").   'больных
rst.Find strCriteria

говорит - "Type mismatch" на второй строке.

На rst.FindFirst strCriteria ругается "Метод или функция не найден". У меня MS Access 2000.
На Set rst = CurrentDb.OpenRecordset("SELECT Имя, Фамилия FROM "Поступление и выписка"") ругается ошибкой компиляции.
Как, блин, сделать? В помощь идут статьи из гугла, но использованные фрагменты не работают.

Evans
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 22.08.2008 (Пт) 11:27

Re: MS Access - как указать - в каком поле делать поиск

Сообщение Evans » 16.10.2009 (Пт) 17:04

Так на FindFirst ругается или на Find ?

А запрос правильно писать так: "SELECT Имя, Фамилия FROM [Поступление и выписка]"
И на будущее. Называть объекты в базе MS Access по-русски и с пробелами - дурной тон. Но коли назвал, то в запросах бери имена в квадратные скобки.

AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

Re: MS Access - как указать - в каком поле делать поиск

Сообщение AndreyMust19 » 16.10.2009 (Пт) 20:15

Так на FindFirst ругается или на Find

На FindFirst, но в таблице объектов такого объекта нет. Значит правильно ругается.
А с Find во время выполнения ругается "Type mismatch" на второй строке.
"SELECT Имя, Фамилия FROM [Поступление и выписка]"

Вон как? То есть надо указать не таблицу, а названия записей и откуда они берутся. С квадратными скобками пробовал:
Код: Выделить всё
Set rst = CurrentDb.OpenRecordset([Поступление и выписка]).

решил что неправильно, раз на несовпадение типов ругается. Попробую так, как Вы сказали.

Добавлено:
Код: Выделить всё
Set rst = CurrentDb.OpenRecordset("SELECT Имя, Фамилия FROM [Поступление и выписка]")

не работает. Ругается точно также ("Type mismatch").
Вот это тоже не работает:
Код: Выделить всё
Set rst = CurrentDb.OpenRecordset([Поступление и выписка].[Фамилия])

Пишет:
Приложению 'Microsoft Access' не удается найти поле '|', указанное в выражении.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: MS Access - как указать - в каком поле делать поиск

Сообщение alibek » 16.10.2009 (Пт) 23:02

Не нужно использовать DAO (у которого, к тому же, синтаксис для Find другой).
Используй Me.Recordset. Ну а если простых путей не ищешь, то CurrentProject.ActiveConnection.
Lasciate ogni speranza, voi ch'entrate.

Evans
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 22.08.2008 (Пт) 11:27

Re: MS Access - как указать - в каком поле делать поиск

Сообщение Evans » 17.10.2009 (Сб) 23:26

Код: Выделить всё
"SELECT Имя, Фамилия FROM [Поступление и выписка]"

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

Нет. Можно указать просто имя таблицы, и тогда из нее будут выбраны все поля и все записи. Можно указать текст запроса - "SELECT поле1, поле2, ..., полеN FROM [Таблица]"

Код: Выделить всё
Set rst = CurrentDb.OpenRecordset([Поступление и выписка]).

решил что неправильно, раз на несовпадение типов ругается. Попробую так, как Вы сказали.

В этом случае скобки не надо, а кавычки надо: Set rst = CurrentDb.OpenRecordset("Поступление и выписка")


Код: Выделить всё
Set rst = CurrentDb.OpenRecordset("SELECT Имя, Фамилия FROM [Поступление и выписка]")

не работает. Ругается точно также ("Type mismatch").

Вот здесь нужно обратить внимание на то, как задекларирована переменная rst. Попробуйте вместо
Код: Выделить всё
Dim rst as Recordset
написать
Код: Выделить всё
Dim rst as DAO.Recordset

Это происходит когда ссылка на класс, имеющий также объект Recordset, имеет более высокий приоритет, чем DAO, и получается, что создавая DAO.Recordset, мы пытаемся засунуть его в переменную с типом, например, ADO.Recordset. Так что пишем принудительно: Dim rst as DAO.Recordset

Вот это тоже не работает:
Код: Выделить всё
Set rst = CurrentDb.OpenRecordset([Поступление и выписка].[Фамилия])

Пишет:
Приложению 'Microsoft Access' не удается найти поле '|', указанное в выражении.

[/quote]
Ну это уж совсем... )

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Re: MS Access - как указать - в каком поле делать поиск

Сообщение dormouse » 19.10.2009 (Пн) 8:27

как вариант с использованием встроенного поиска со стандартным диалогом (Ctrl+F). оно какбэ дружелюбно к пользователю..
Код: Выделить всё
    Me.поле.SetFocus
    DoCmd.FindRecord "искомый текст*", acStart, False, , False, , True

'повторный вызов диалога с тем же запросом (в мса97 работает точно)
    DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70
VBA, MSA97

Evans
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 22.08.2008 (Пт) 11:27

Re: MS Access - как указать - в каком поле делать поиск

Сообщение Evans » 22.10.2009 (Чт) 23:37

dormouse, могли бы просто написать "а чё, западло контрол-эф нажать?" ))

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Re: MS Access - как указать - в каком поле делать поиск

Сообщение dormouse » 23.10.2009 (Пт) 9:52

а чем плох стандартный поиск акцесса? я часто сам пользуюсь своими программками. и лично мне удобно пользоваться этим диалогом. а для юзера можно на splash-скрине настроить этот диалог для большего удобства. поиск с начала слова, по всем направлениям, только в текущем поле
VBA, MSA97

Evans
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 22.08.2008 (Пт) 11:27

Re: MS Access - как указать - в каком поле делать поиск

Сообщение Evans » 26.10.2009 (Пн) 11:19

dormouse писал(а):а чем плох стандартный поиск акцесса? <...>

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

AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

Re: MS Access - как указать - в каком поле делать поиск

Сообщение AndreyMust19 » 05.11.2009 (Чт) 22:46

Извиняюсь что так долго молчал, решил отложить. Отложил (яйца) поиск, но все таже проблема с RecordSet'ом:

Код: Выделить всё
Private Sub Button1_Click()
Dim RS As Recordset
Dim fldNotes As Field
Dim N As Integer
Set RS = CurrentDb.OpenRecordset("[Поступление и выписка]")
Set Field = RS![Выписка]
Do Until RS.EOF
    N = N + 1
    RS.MoveNext
Loop
End Sub

пишет:
Run-time error '3078':
Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос '[Поступление и выписка]'. Проверьте правильность имени.

Проверил, так и записано. Если убрать кавычки, то пишет:
Run-time error '2465':
Приложению 'Microsoft Access' не удается найти поле '|', указанное в выражении.

Без квадратных скобок тоже что-то пишет, вот только не записал жалко.

Я думаю, проблема в ANSI и UNICODE. Когда я скопировал макрос в блокнот, то на месте русских букв появились вертикальные полоски. Замена имени таблицы на латинские символы ничего не поменяла.

Evans
Dim rst as DAO.Recordset

Вот здесь, брал за образец, никаких DAO не используется:
http://www.realcoding.net/article/view/2269
dormouse
как вариант с использованием встроенного поиска со стандартным диалогом (Ctrl+F). оно какбэ дружелюбно к пользователю..

Вот только там нельзя выбрать - в каком поле искать.

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Re: MS Access - как указать - в каком поле делать поиск

Сообщение dormouse » 06.11.2009 (Пт) 7:58

AndreyMust19 писал(а):
Код: Выделить всё
Set RS = CurrentDb.OpenRecordset("[Поступление и выписка]")


надо написать полное выражение в синтаксисе SQL. а одно поле из неизвестно какой таблицы - это, как грится, на деревню к дедушке.


AndreyMust19 писал(а):dormouse
как вариант с использованием встроенного поиска со стандартным диалогом (Ctrl+F). оно какбэ дружелюбно к пользователю..

Вот только там нельзя выбрать - в каком поле искать.


я там же написал, что перед вызовом диалога поиска, надо выполнить команду Поле.SetFocus. А диалог настроить на поиск в текущем поле
VBA, MSA97

AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

Re: MS Access - как указать - в каком поле делать поиск

Сообщение AndreyMust19 » 06.11.2009 (Пт) 12:41

надо написать полное выражение в синтаксисе SQL. а одно поле из неизвестно какой таблицы - это, как грится, на деревню к дедушке.

Ну так в примере (ссылка) никаких FROM и SELECT нет. Там просто Recordset("Сотрудники"). К тому же "Поступление и выписка" - это не "неизвестно какое поле", а сама таблица.
надо выполнить команду Поле.SetFocus.

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

Evans
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 22.08.2008 (Пт) 11:27

Re: MS Access - как указать - в каком поле делать поиск

Сообщение Evans » 08.11.2009 (Вс) 10:09

AndreyMust19 писал(а):<...>
Ну так в примере (ссылка) никаких FROM и SELECT нет. Там просто Recordset("Сотрудники"). К тому же "Поступление и выписка" - это не "неизвестно какое поле", а сама таблица.
<...>


Андрей! Если учиться по одним примерам, не вникая в теорию, далеко не уедешь. И то, что отвечают на форуме тоже нужно внимательно читать.
Также неплохо сначала разобраться в применении кавычек и скобок. Повторяю. В случае если мы задаем только название таблицы:
Код: Выделить всё
OpenRecordset("Поступление и выписка")

Кавычки обязательны, скобки не нужны.
В случае если мы задаем SQL-инструкцию:
Код: Выделить всё
OpenRecordset("Select * from [Поступление и выписка]")

здесь вся инструкция в кавычках, а название таблицы - в квадратных скобках.

По части
Код: Выделить всё
Dim rst as DAO.Recordset

сначала попробуй, потом уже возражай, ссылаясь на примеры.

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

AndreyMust19
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 20.03.2009 (Пт) 23:11

Re: MS Access - как указать - в каком поле делать поиск

Сообщение AndreyMust19 » 14.11.2009 (Сб) 13:31

Еще раз здравствуйте.
Наконец-то разрешилась проблема. Ругался этот Access на все, что я ему писал и непонятно - где именно ошибка. Значит - ошибка не там, где я ищу. Надо было подключить компонент Microsoft DAO В "Сервис->Ссылки" и использовать тип DAO.Recordset. Наконец-то все получилось! Из всех VB и VBA этот - получился для меня самый сложный. Спасибо всем за советы, когда доделаю БД, выложу сюда самое интересное из нее, чтобы другие не парились, а нашли в поиске то, что искали.
Насчет обучения вы правы - нужно сначала научиться держать топор, прежде чем рубить дрова. Но если мне надо срубить одно дерево, я лучше срублю его кое-как, чем несколько дней учиться как рубить деревья, когда я его срублю всего за 20 минут. Нужно было только разобраться - в чем была ошибка в MS Access, не вникая в подробности.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList