Light-electric.com

IT Журнал
77 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba access поиск записи в таблице

Выполнение SQL запросов к текущей базе данных в среде VBA (Access)

В Microsoft Office Access поддерживается выполнение SQL запросов к текущей базе данных из программного кода на VBA. Рассмотрим, как это можно использовать при разработке приложений баз данных.

Так как запрос выполняется к той же самой базе данный в которой выполняется модуль VBA, для выполнения SQL запроса нет необходимости работать со стандартными в подобных случаях интерфейсами ADO, ODBC и т.д. Всё можно сделать при помощи объектной модели Access.

Как известно SQL запросы можно условно разделить на две большие группы:

  • Запросы, не возвращающие данных (INSERT, UPDATE, DELETE и т.д.);
  • Запросы возвращающие данные (запросы на выборку (SELECT)).
Запросы, не возвращающие данных

Для выполнения запросов к текущей базе данных служит метод Execute объекта CurrentDb. Этот метод принимает в качестве параметра строку с SQL запросом, который необходимо выполнить.

Это простейший запрос. Но, как быть с запросами, которые манипулируют теми или иными данными?

Такие запросы тоже можно выполнить. Для этого нужно просто сформировать соответствующую строку.

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

А, так их обновление:

Выполнение другие типов запросов не возвращающих данных осуществляется по аналогичным принципам.

Запросы на выборку

Метод Execute объекта CurrentDb не поддерживает выполнение запросов на выборку. Поэтому для них нужен другой подход.

Чтобы работать с выборкой данных необходимо воспользоваться объектом RecordSet, который можно создать при помощи метода OpenRecordSet объекта CurrentDb. Этот метод также принимает в качестве параметра строку с SQL запросом.

После создания RecordSet мы можем перебрать все записи, как это показано ниже.

Помимо простого перебора доступны несколько видов поиска. Но в основном используются два.

Первый вид поиска реализован в виде методов FindFirst, FindLast, FindNext и FindPrevious объекта RecordSet.

Первые два устанавливают курсор на соответственно первую и последнюю записи, соответствующие условию поиска. Условие поиска передаётся в качестве параметра в виде строки. Само условие задаётся по аналогии с предложением WHERE в обычном SQL запросе.

Методы FindNext и FindPrevious устанавливают курсор на следующую и предыдущую записи в соответствии с условием поиска, если такие записи существуют. Условие поиска для этих методов задаётся также, как и для FindFirst и FindLast.

Обратите внимание, что эти четыре метода именно устанавливают указатель на нужную запись, а не производят фильтрацию выборки. Таким образом количество записей выбранных SQL запросом остаётся неизменным.

В следующем примере перебор записей начнётся с записи, у которой id равен 234, так как курсор был перемещён к ней до начала обхода набора записей в цикле.

Поиск в таблице по данным из поля формы

Подскажите пожалуйста, как сделать поиск в таблице по двум полям формы?

Поиск в базе данных MS Access по данным из поля формы
Всем привет.Стоит такая задача : реализовать поиск по одной таблице.В форме есть поле.Данные из.

Поиск записей в одной таблице, где значения ключевого поля не совпадают с полем в другой таблице
Имеется Access XP, надо создать запрос для поиска записей в таблице ТОВАРЫ,где значения ключевого.

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

Сохранение данных из вычисляемого поля формы в таблице
Здравствуйте. Подскажите, пожалуйста, ответ на вопрос: Имеется вычисляемое поле в форме access.

проблема была в том, что строки не перебирались

Добавлено через 59 секунд
CyberБурундукЪ, пасиба!

Добавлено через 22 часа 32 минуты
записи в строке нашел, на форму в поля вывел, но появилась другая проблема

CyberБурундукЪ, знач я дето ступил

Добавлено через 1 час 21 минуту
Шото нифига правильно не работает((( Сразу если в первой строке несовпадение — добавляет строчку, дальше сравнение не идет, даже если в таблице действительно есть совпадение

Редактировать через .Edit — автоматически

я понял
спасибо о великий гуру, наконец то до меня дощло че ж тебе хоцца
.. ВЦ .

Добавлено через 3 минуты

не вижу ни ошибки, ни базы, ни вашего монитора.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

VBA: Запрос на обновление записи в таблице, по значению поля формы
Здравствуйте, есть вопрос. База данных "Гостиница". Как обновить данные в таблице "Номера", а.

Поиск в таблице из формы
Добрый Всем день. При нажатии кнопки на форме должен происходить поиск в таблице1,согласно данных.

Читать еще:  Access вложенные запросы

Как поле формы (привязка к таблице у поля отсутствует) сделать не текстовым, а числовым
Здравствуйте! У меня имеется на форме поле. Это поле не привязано к таблице. Оно свободное. Но.

Поиск в базе данных MS Access по данным из поля формы
Есть БД. Нужно реализовать поиск по ней за значение (текстом) в поле (смотрите рисунок). Кнопка.

Макрокоманда «ПоискЗаписи»

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

Настройка

Макрокоманда ПоискЗаписи имеет следующие аргументы:

Выберите или введите тип объекта базы данных, в котором будет выполняться поиск. Можно выбрать значение Таблица, Запрос, Форма или Отчет.

Введите или выберите объект, содержащий искомую запись. Раскрывающийся список содержит все объекты базы данных с типом, заданным в аргументе Тип объекта.

Укажите начало и направление поиска.

Поиск назад от текущей записи.

Поиск вперед от текущей записи.

Поиск вперед от первой записи. Это значение по умолчанию.

Поиск назад от последней записи.

Введите условия поиска, используя синтаксис предложения WHERE инструкции SQL, только без слова WHERE. Например:

Чтобы создать условие, содержащее значение из текстового поля в форме, следует написать выражение, объединяющее первую часть условия с именем текстового поля, содержащего значение, по которому будет проводиться поиск. Например, в следующем условии будет выполняться поиск в поле Description по значению текстового поля txtDescription в форме frmCategories. Обратите внимание на знак равенства (=) в начале выражения и на одинарные кавычки () по обеим сторонам ссылки на текстовое поле:

Примечания

Если более чем одна запись соответствует условию, заданному в аргументе Условие отбора, на результат поиска могут оказать влияние следующие факторы:

Значение аргумента «Запись». Дополнительные сведения об аргументе Запись см. в таблице в разделе «Настройка».

Порядок сортировки записей. Например, если аргумент Запись имеет значение Первая, изменение порядка сортировки записей может отразиться на том, какая запись будет найдена.

Объект, заданный в аргументе Имя объекта, должен быть открыт до выполнения команды. В противном случае произойдет ошибка.

Если условие, заданное в аргументе Условие отбора, не выполняется, это не считается ошибкой, а фокус остается на текущей записи.

При поиске последующей или предыдущей записи поиск не продолжается, когда достигается конец данных. Если больше нет записей, соответствующих условию отбора, это не считается ошибкой, а фокус остается на текущей записи. Чтобы подтвердить обнаружение совпадения, можно ввести условие для следующей команды и сделать его таким же, как значение аргумента Условие отбора.

Для запуска макрокоманды ПоискЗаписи в модуле VBA используйте метод SearchForRecord объекта DoCmd.

Макрокоманда аналогична ПоискЗаписи макрокоманде НайтиЗапись, но у ПоискЗаписи более широкие возможности поиска. Макроманда НайтиЗапись в основном используется для поиска строк, и ее функции аналогичны возможностям диалогового окна Найти. В макрокоманде ПоискЗаписи используются условия, которые больше напоминают фильтр или запрос SQL. Вот некоторые возможности макрокоманды ПоискЗаписи:

В аргументе Условие отбора могут использоваться составные условия, например:

Description = «Напитки» and CategoryID = 11

Можно ссылаться на поля, которые существуют в источнике записей формы или отчета, но не отображаются в них. В предыдущем примере поля Description и CategoryID необязательно должны выводиться в форме или отчете.

Можно использовать логические операторы, такие как , AND, OR и BETWEEN. Макрокоманда НайтиЗапись ищет только строки, равные искомой строке, начинающиеся с нее или содержащие ее.

Пример

Следующий макрос открывает таблицу Categories с помощью команды ОткрытьТаблицу. Затем с помощью команды ПоискЗаписи ищется первая запись таблицы, в поле Description которой содержится значение «Напитки».

Vba access поиск записи в таблице

Хочу написать макрос, который бы искал определённое значение в базе данных Access. Пока получился вот такой код:

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Sub Search()

‘переменная, хранящая результат запроса
Dim tbl As Recordset

‘строка запроса SQL
Dim SQLr As String

‘переменная, хранящая ссылку на подключенную БД
Dim dbs As Database

‘переменная, содержимое которой надо искать
Dim txt
txt = «‘99999999′»

‘подключаемся к mdb
Set dbs = DAO.OpenDatabase(«C:Documents and SettingsuserРабочий столbase.mdb»)

‘составляем строку SQL запроса
SQLr = «SELECT * FROM Table1 WHERE Table1.[ID устройства]=» & txt

‘отправляем запрос открытой БД
‘результат в виде таблицы сохранен в tbl
Set tbl = dbs.OpenRecordset(SQLr)

‘вставляем результат в лист, начиная с ячейки A1
Cells(1, 1).CopyFromRecordset tbl

Читать еще:  Как вставить рисунок в powerpoint

‘закрываем временную таблицу
tbl.Close

‘очищаем память от таблицы — ЭТО ВАЖНО!
Set tbl = Nothing

‘закрываем базу
dbs.Close
Set dbs = Nothing
End Sub

Макрос ищет значение переменной txt в указанной базе MsAccess, после чего вставляет в лист Excel все данные из строки, где было найдено вхождение. С чем в упор не могу разобраться:

а) как заставить его искать не жёстко указанное значение, а то, которое находится в подсвеченной ячейке? Если вместо 99999999 подставить ActiveCell.Value, то всё ломается. пробовал играться с » и ‘, но результата это не принесло

б) как его заставить его делать фокус на найденном в самой базе? Делал похожий макрос для Excel, там это реализовывалось таким образом:

(перед этим, естественно, открывая нужную книгу, выводя её на передний план и производя поиск, более подробно выложил решение тут)

Но как провернуть это в Access? Как открыть базу и вывести её на передний план — понятно, а что делать с ActiveSheet.Range(. ).Select? Там-то такой трюк не сработает.

Тут надо понимать, что набор записей, который достается из базы данных при помощи DAO или ADO, сам по себе не имеет визуального представления. Чтобы увидеть эти данные, их надо передать в какое-либо средство визуализации. Например, на лист Excel или в форму Access или в какой-нибудь элемент управления Grid. Сделать запрос в DAO и потом вызвать «какой-нибудь» метод для визуализации нельзя, потому что такого метода нет ни в DAO, ни в ADO, ни в SQL.

В Access «на безрыбье» можно макрокомандами объекта DoCmd открыть таблицу, найти запись по условию, встать на эту запись и даже встать в конкретное поле этой записи. Будет похоже на Excel:
[vba]

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub io()
Dim strMsg As String

strMsg = strMsg & «ПОЛЕ 1: » & «значение Поля 1» & vbCrLf
strMsg = strMsg & «ПОЛЕ 2: » & «значение Поля 2» & vbCrLf
strMsg = strMsg & «ПОЛЕ 3: » & «значение Поля 3» & vbCrLf
strMsg = strMsg & «ПОЛЕ 4: » & «значение Поля 4» & vbCrLf
strMsg = strMsg & «ПОЛЕ 5: » & «значение Поля 5» & vbCrLf

MsgBox strMsg
End Sub

Pelena, прикладываю архив с файлом и базой. С переменной пока так и не разобрался — каким образом выводить MsgBox о том, что результатов поиска нет? Надо как-то проверять содержимое tbl или SQLq?

Gustav, нюанс в том, что в MsgBox, в отличии от UserForm (если я ничего не путаю) нельзя добавить «свои» кнопки. Например, кнопку «скопировать в буфер обмена». Как все-таки прикрутить UserForm?

Тем не менее, попробовал реализовать на основе MsgBox и сразу возник следующий вопрос — как получить и распарсить значение tbl, в котором содержится ответ от базы? Это значение успешно копируется на лист вот этой строкой:

Но что подставлять вместо «значение Поля #», чтобы вывести оное уже в окне? Нечто вроде tbl.[Поле 1], tbl.[Поле 2] и т.п.

Pelena, спасибо, не догадался про «RecordCount».

По поводу вывода — макрос вставляет полученные через SQL данные на лист чисто для дебага, чтобы понимать, что он сам по себе работает и данные получает корректно. Поэтому копировать и подставлять в окно данные из ячеек — хитро, но не туда, так как в конечном счете он должен вставлять эти данные напрямую в окно, а не на лист

Venique, при программировании с использованием DAO существуют определенные традиции, например, префиксом (или переменной) tbl обозначаются объекты таблицы. Рекордсет в таком требуквии обычно обозначается rst. Самый надежный признак отсутствия записей в выборке (ладно уж, по-вашему будем): tbl.BOF = True And tbl.EOF = True (или просто tbl.BOF And tbl.EOF). Либо можно использовать tbl.RecordCount = 0.

Вам надо немножко почитать про всё это, пока знаний маловато для беседы. В том смысле, что нам придется объяснять слишком много — мы на это не рассчитываем Поищите материал и примеры кода по строкам «DAO.Recordset» и «Excel UserForm». Гугл еще никто не отменял.

[/vba]
Но это если одна запись найдена, а если несколько, то понадобится цикл

Pelena, Gustav, спасибо огромное и за решение, и за пищу к размышлению! До этого ни разу не организовывал взаимосвязь Excel с MSAccess, посему даже не знал, в какую сторону гуглить.

Читать еще:  Работа в access 2020

С вашей помощью блок обработки результатов получился таким (с учетом цикла, если записей несколько):

Надо только обработчик ошибок прикрутить, чтобы по достижению последней записи макрос никого не пугал Единственный вопрос, который остался — каким образом на протяжении цикла собрать все strMsg воедино, а вывести разом уже после его завершения? Т.е. чтобы не приходилось при нахождении новой строки каждый раз тыкать «ОК», а разом получить всю информацию по найденным записям.

Отлично, спасибо! Получилось. Как причешу — обязательно выложу сюда, может, кому-то будет полезно уже готовое решение

Правда, вылез один нюанс. одно из значений в таблице является связью с другой таблицей, в итоге мне выводится не «Модель устройства — Intel», а «Модель устройства — 13». И если посмотреть в другую таблицу, то там под номером 13 как раз и будет записан «Intel». Т.е. в данном виде мой макрос (и запрос к базе) не может интерпретировать эту цифру «13», т.е. посмотреть что она значит в другой таблице.

Как научить его такой «вложенности», т.е. чтобы он понимал, что нужно перед выводом модели устройства заглянуть в соседнюю таблицу и посмотреть, что там значится под номером 13, а мне уже вывести слово «Intel»?

Была идея сделать в цикле проверку вроде IF tbl1.[Модель устройства] = 1 Then strMsg.[Модель устройства] = ATOM, IF tbl1.[Модель устройства] = 2 Then strMsg.[Модель устройства] = AMD и так со всеми ID из «соседней» базы, но это очень громоздко + придется постоянно обновлять не только саму базу, но и макрос, дописывая в него новые ID и изменяя уже существующие.

Выполнение SQL запросов к текущей базе данных в среде VBA (Access)

В Microsoft Office Access поддерживается выполнение SQL запросов к текущей базе данных из программного кода на VBA. Рассмотрим, как это можно использовать при разработке приложений баз данных.

Так как запрос выполняется к той же самой базе данный в которой выполняется модуль VBA, для выполнения SQL запроса нет необходимости работать со стандартными в подобных случаях интерфейсами ADO, ODBC и т.д. Всё можно сделать при помощи объектной модели Access.

Как известно SQL запросы можно условно разделить на две большие группы:

  • Запросы, не возвращающие данных (INSERT, UPDATE, DELETE и т.д.);
  • Запросы возвращающие данные (запросы на выборку (SELECT)).
Запросы, не возвращающие данных

Для выполнения запросов к текущей базе данных служит метод Execute объекта CurrentDb. Этот метод принимает в качестве параметра строку с SQL запросом, который необходимо выполнить.

Это простейший запрос. Но, как быть с запросами, которые манипулируют теми или иными данными?

Такие запросы тоже можно выполнить. Для этого нужно просто сформировать соответствующую строку.

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

А, так их обновление:

Выполнение другие типов запросов не возвращающих данных осуществляется по аналогичным принципам.

Запросы на выборку

Метод Execute объекта CurrentDb не поддерживает выполнение запросов на выборку. Поэтому для них нужен другой подход.

Чтобы работать с выборкой данных необходимо воспользоваться объектом RecordSet, который можно создать при помощи метода OpenRecordSet объекта CurrentDb. Этот метод также принимает в качестве параметра строку с SQL запросом.

После создания RecordSet мы можем перебрать все записи, как это показано ниже.

Помимо простого перебора доступны несколько видов поиска. Но в основном используются два.

Первый вид поиска реализован в виде методов FindFirst, FindLast, FindNext и FindPrevious объекта RecordSet.

Первые два устанавливают курсор на соответственно первую и последнюю записи, соответствующие условию поиска. Условие поиска передаётся в качестве параметра в виде строки. Само условие задаётся по аналогии с предложением WHERE в обычном SQL запросе.

Методы FindNext и FindPrevious устанавливают курсор на следующую и предыдущую записи в соответствии с условием поиска, если такие записи существуют. Условие поиска для этих методов задаётся также, как и для FindFirst и FindLast.

Обратите внимание, что эти четыре метода именно устанавливают указатель на нужную запись, а не производят фильтрацию выборки. Таким образом количество записей выбранных SQL запросом остаётся неизменным.

В следующем примере перебор записей начнётся с записи, у которой id равен 234, так как курсор был перемещён к ней до начала обхода набора записей в цикле.

Ссылка на основную публикацию
Adblock
detector