Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2013, 22:08   #1
Rust_12
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 25
По умолчанию Поиск данных в таблице Аксесс

Здравствуйте.
Помогите, пожалуйста, с осуществлением поиска данных в таблице Access из Экселя.

У меня есть база данных в Access, состоящая из 2ух таблиц. Данные в них заносятся с формы Экселя. Выглядит это следующим образом.

Код:
Set dbs = DAO.OpenDatabase("C:\.....\database.mdb")
Set rst = dbs.OpenRecordset("Clients")
rst.AddNew
rst.Fields("Name").Value = TextBox1.Value
rst.Fields("SurName").Value = TextBox2.Value
rst.Fields("Data_of_Birth").Value = TextBox3.Value
......
rst.Update
Мне необходимо осуществить проверку на наличие клиента по его фамилии и дате рождения.
То есть:
Существует ли такой клиент в таблице "Clients" базы данных "database.mdb", для которого выполняется следующее условие:
Значение в поле "SurName" равно тому, что стоит в форме в TextBox2.Value и одновременно Значение в поле "Data_of_Birth" равно тому, что стоит в форме в TextBox3.Value.

Если такой клиент есть, то, выдать сообщение о том, что есть, если нет, о том, что нет. С выводом сообщений проблем нет.
А Вот с поиском данных через БД я очень прощу помощи. Никогда ничего ранее подобного не делала.


Спасибо.
Rust_12 вне форума Ответить с цитированием
Старый 24.04.2013, 04:19   #2
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

Используйте MoveFirst, FindFirst и NoMatch как признак найдено/ненайдено
AndVGri вне форума Ответить с цитированием
Старый 12.05.2013, 04:17   #3
Rust_12
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 25
По умолчанию

Спасибо большое.

Покажите, пожалуйста, пример синтаксиса для FindFirst.
Встретил массу вариантов, Не могу понять что к чему.
Запрос вызывается из Экселя к базе банных Аксесс.
Мне например, необходимо найти всех клиентов в столбце Surname_Client по фамилии Jokinen.
Это записывается так? :

Код:
 
Set dbs = DAO.OpenDatabase("C:\Documents and Settings\.....\database.mdb")
 Set rst = dbs.dbOpenTable("Clients")
 rst.FindFirst "Surname_Client =" & Jokinen
или так? :

Код:
 
Set dbs = DAO.OpenDatabase("C:\Documents and Settings\.....\database.mdb")
 Set rst = dbs.dbOpenTable("Clients")
  rst.FindFirst "Surname_Client = Jokinen"
Каких только вариаций не видел. одни для VBA Аксесс, другие для VBA Эксель...

Спасибо.
Rust_12 вне форума Ответить с цитированием
Старый 12.05.2013, 13:19   #4
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от Rust_12 Посмотреть сообщение
Каких только вариаций не видел.
И еще один
Код:
Set dbs = DAO.OpenDatabase("C:\Documents and Settings\.....\database.mdb")
Set rst = dbs.OpenRecordset("SELECT Clients.* FROM Clients WHERE Surname_Client = 'Jokinen'")
Do Until rst.EOF

  Debug.Print "Name=" & rst!Name
  Debug.Print "Data_of_Birth=" & rst!Data_of_Birth

  rst.MoveNext
Loop
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 13.05.2013, 02:50   #5
Rust_12
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 25
По умолчанию

doober, спасибо большое!
А как можно передать переменную, хранящуюся в TextBox, расположенную на форме в Экселе?

Прописал:
Код:
SurN = Interface.MultiPage1.Pages(1).TextBox4.Value  'Значение из TextBox4 нужно установить, как критерий выбора в запросе 

Set rst = dbs.OpenRecordset("SELECT Clients.* FROM Clients WHERE Surname_Client = SurN")
Ошибку выдает: слишком мало параметров. требуется 1.
Это потому что Аксесс не видит TextBox, расположенный на форме Экселя?
Изображения
Тип файла: jpg 456789.jpg (24.8 Кб, 135 просмотров)
Rust_12 вне форума Ответить с цитированием
Старый 13.05.2013, 04:08   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от Rust_12 Посмотреть сообщение
Ошибку выдает: слишком мало параметров. требуется 1.
Это потому что Аксесс не видит TextBox, расположенный на форме Экселя?
Нет,это потому,что кто то не внимательно прочитал мой пост.
Код:
Dim SurN as string
SurN = Interface.MultiPage1.Pages(1).TextBox4.Value  'Значение из TextBox4 нужно установить, как критерий выбора в запросе 

Set rst = dbs.OpenRecordset("SELECT Clients.* FROM Clients WHERE Surname_Client = '" & SurN & "'")
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 13.05.2013, 04:42   #7
Rust_12
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 25
По умолчанию

doober, спасибо еще раз!!
Все условия и критерии в запросах мы записываем, в ' ' -скобках, верно?
Rust_12 вне форума Ответить с цитированием
Старый 13.05.2013, 11:19   #8
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от Rust_12 Посмотреть сообщение
doober, спасибо еще раз!!
Все условия и критерии в запросах мы записываем, в ' ' -скобках, верно?
Нет
Для строки через апострофы .
Остальные типы без кавычек,но вы должны указать тип переменных.
Исключение дробное число.
Вы должны заменить запятую на точку.
Читайте буквари по SQL
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 14.05.2013, 16:40   #9
Rust_12
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 25
По умолчанию

Спасибо!
Вы сделали как раз необходимые подсказки про форматы))
Rust_12 вне форума Ответить с цитированием
Старый 16.05.2013, 22:43   #10
Rust_12
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 25
По умолчанию

doober, можно Вам еще один вопрос?

Если в таблице существует несколько записей с одним и тем же "Surname_Client", то программа выводит инфо по последней (нижней) записи, полагаю, потому что стоит оператор NextMove.
Думаю сделать проверку на кол-во записей указанного значения Surname_Client, и если их окажется больше одной (две, например), то создать новый лист и занести всю соответствующую инфу по этому второму полю аналогичным образом, как и для первой встретившейся записи.

Код:
Set rst = dbs.OpenRecordset("SELECT * FROM Clients WHERE Surname_Client = '" & SurN & "' And Date_of_Birth = '" & Date_Brth & "' ")
 rst.MoveLast
 Do Until rst.EOF
 Sheets("information").Cells(3, 2) = Now
 Sheets("information").Cells(5, 2) = rst!Num_Request
If rst.RecordCount > 1 Then
Sheets.Add.Name = "information_2"
Sheets("information_2").Cells(3, 2) = Now
Sheets("information_2").Cells(5, 2) = rst!Num_Request
End If

rst1.MoveNext
Loop

Прошу, подскажите, пожалуйста, как разграничить инфо из 2ух разных строк по 2ум листам.
Спасибо.

Последний раз редактировалось Rust_12; 16.05.2013 в 22:46.
Rust_12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск данных по таблице в базе данных Awesome96 БД в Delphi 1 03.12.2012 09:53
Поиск в БД связь с Аксесс MikaS007 БД в Delphi 30 17.06.2010 14:15
Поиск и суммирование данных в таблице произвольного размера Darkdog Microsoft Office Excel 26 16.02.2010 10:47
База данных аксесс Игорь11071990 Microsoft Office Access 1 20.01.2010 20:33
Поиск в таблице бд Aндрей Помощь студентам 2 27.04.2009 09:13