Поиск в форме

  • Автор темы oza
  • Дата начала
O
#1
Мне нужно организовать поиск книг в форме по названию, автору,издательству, виду издания. У меня есть запрос на выборку по этим критериям. Как на основе этого запроса организовать поиск в форме?
В форме существует элемент ListBox(в нем содержится запрос), поле для ввода данных, кнопка. Нужно, чтоб при щелчке на кнопке искалось искомое(то, что пользователь ввел в текстовом поле) и в listBox отображалось найденное. Какую именно процедуру надо писать в кнопке? Название столбцов в запросе, сам запрос на русском языке.
Например пользователь вводит в текстовое поле,например Акунин и выводится все книги этого автора.Или вводит Роман, и выводится все романы, которые есть в запросе. Как это сделать? Каким образом? Какой должен быть код у кнопки? Я уже всю голову себе сломала...Помогите,кто чем может, пожалуйста.
 

BOPOHA

Well-known member
26.04.2006
118
0
#2
У формы есть атрибуты Filter и FelterOn.

Например:
Код:
Me.Filter = "поле=значение And поле=значение"
Me.FilterOn = true
 
S

Shader88

#3
BOPOHA, если использовать такой фильтр точно будет отображаться то что нужно? :(
Как я понимаю, поле Автор содержит в себе ФИО автора, человеу необходимо вводить например только Фамилию...
(Сорри если туплю, с Access'ом слава богу уже давно не работаю)

oza, код точно написать не могу(могут быть ошибки)(может кто нить причешет), сорри, не установлен этот -бип-ский продукт =) Но суть расскажу =)
У вас есть запрос который формирует данные для формы например такого вида:
Код:
Select Книга.Название, Автор.ФИО, Издательство.Название, Издание.ВидИздания 
From...
Вам нужно 2 параметра, по КАКОМУ ПОЛЮ искать и ЧТО ИСКАТЬ.
В обработчике клика кнопки делаете следующее:
1. Получаете данные что искать(например Акунин)(переменная strData), и по чем искать(например Автор)(переменная strField)
2. После этого определяете строку с запросом(как у вас в запросе данных для формы):
Код:
 strSql = "Select Книга.Название, Автор.ФИО, Издательство.Название, Издание.ВидИздания From... Where "
3. Далее определяете с полем по которому искать
Код:
IF strField = "Автор" Then
strSql = strSql & "Автор.ФИО LIKE " & strData & ";"
END IF

IF strField = "Издательство" Then
strSql = strSql & "Издательство.Название LIKE " & strData & ";"
END IF
И т.д. для всех параметров поиска.
4. В самом конце процедуры пишите:
Код:
Me!RecordSet = strSql
Me!Requery

Вот примерно так =)
Еще раз повторюсь ЗА ОШИБКИ, прошу извинить, Аксесом уже давно не пользуюсь, впрочем и не жалею =)))
 
O
#4
Я немного не поняла, что надо писать в строке strSql = "Select Книга.Название, Автор.ФИО, Издательство.Название, Издание.ВидИздания From... Where(именно в этом месте) "


Вот что накалякала:
strField = [Авторы]
strField = [Книги]
strField = [Виды_книг]
strData = [ФИО]
strData = [Книги.Название]
strData = [Вид_издания]

strSql = "Select Авторы.ФИО, Книги.Название,Виды_книг.Вид_издания From [Поиск_книг] "
If strField = "Авторы" Then
strSql = strSql & "Авторы.ФИО LIKE " & strData & ";"
End If

If strField = "Книги" Then
strSql = strSql & "Книги.Название LIKE " & strData & ";"

End If
If strField = "Виды_книг" Then
strSql = strSql & "Вид_издания LIKE " & strData & ";"

End If
Me!RecordSet = strSql
Me!Requery

End Sub


Не работает, что-то я напутала,да еще как! Помогите,плиз... [Поиск_книг] это название моего запроса.

В прошлом году, у меня была курсовая на VBA 6.0, там была связь в БД Access. Там был вот такой код:

Private Sub Command2_Click()
sapr = "SELECT * From[Каталог деталей] Where [место нахождения] LIKE '" & Text2.Text & "'"
Data1.RecordSource = sapr
Data1.Refresh
SUMM
End Sub

Тут видимо, что-то похожее должно быть. В принципе, можно сделать 3 кнопки, и 3 поля, чтобы не писать цикл.
 
S

Shader88

#5
oza во From пишешь источник данных. В данном случае у тебя запрос, поэтому вроде все правильно.

Далее.
Код:
strField = [Авторы]
strField = [Книги]
strField = [Виды_книг]
strData = [ФИО]

Эээ... Нет =)
Тут ты должна из формы получать данные.
Например есть у тебя Поле1(скорее всего конечно там список) в котором вписываешь Параметр поиска значит:
strField = Поле1.Text
Соответственно с данными по которым искать
strData = Поле2.Text (Например Фамилия автора)

Т.е. примерно так должно получаться:
Код:
strField = Поле1.Text
strData = Поле2.Text

strSql = "Select Авторы.ФИО, Книги.Название,Виды_книг.Вид_издания From [Поиск_книг] Where "

If strField = "Авторы" Then
strSql = strSql & "ФИО LIKE "" & strData & "";" ' ФИО тут название поля в запросе которое содержит ФИО автора, далее по тексту соотвествено
End If

If strField = "Книги" Then
strSql = strSql & "Название LIKE "" & strData & "";"
End If

If strField = "Виды_книг" Then
strSql = strSql & "Вид_издания LIKE "" & strData & "";"
End If

Me.RecordSource = strSql 'Вот тут ошибся, поэтому правильно RecordSource
Me.Refresh
 
O
#6
моя форма выглядит вот так:
Дело в том, что туда, куда я вписываю критерии поиска это текстовое поле, а откуда берутся данные, это список. Как определить список? Что писать после точки?Ну как:
strField = Поле3.Text
strData = Список7.???
Я пробовала 2 из списка это ListCount и ListIndex, все равно не работает.
А еще он ругался на то, что для объекта Поле3 не определен фокус(идиотство конечно!)
Я добавила Поле3.SetFocus
И еще непонятно, что писать после слова Where?
Может мне как-нибудь перерисовать форму?Чтобы был не список, а поле со списком? Тогда непонятно, что там должно быть.
Я понимаю, вас уже достала, но только вы отвечаете в этой теме весьма логично =)
 

Вложения

?
#7
strData = Список7.Column(0) ' Получить первый элемент ВЫДЕЛЕННОЙ строки.

Т.е. если у тебя в списке 2 колонки, то для доступа к данным 2-ой колонки писать Список7.Column(1) и т.д.

А еще он ругался на то, что для объекта Поле3 не определен фокус(идиотство конечно!)
Это к Биллу =) Вернее его работникам =)


И еще непонятно, что писать после слова Where?
Пробел =)
А дальше смотри, что получиться =)
Если у тебя выбрано поле поиска Авторы и в критерии стоит Иванов, то будет работать это так:
Код:
strField = Поле1.Text
strData = Список7.Column(0)

strSql = "Select Авторы.ФИО, Книги.Название,Виды_книг.Вид_издания From [Поиск_книг] Where " 
' StrSql на этом шаге равна: Select Авторы.ФИО, Книги.Название,Виды_книг.Вид_издания From [Поиск_книг] Where 

If strField = "Авторы" Then ' да это то что нам нужно
strSql = strSql & "ФИО LIKE "" & strData & "";" ' ФИО тут название поля в запросе которое содержит ФИО автора, далее по тексту соотвествено
' Теперь strSql равна: Select Авторы.ФИО, Книги.Название,Виды_книг.Вид_издания From [Поиск_книг] Where ФИО Like "Иванов";
End If

If strField = "Книги" Then ' сюда не заходим
strSql = strSql & "Название LIKE "" & strData & "";"
End If

If strField = "Виды_книг" Then ' сюда не заходим
strSql = strSql & "Вид_издания LIKE "" & strData & "";"
End If

Me.RecordSource = strSql 'Обновляем данные формы
Me.Refresh 'Обновляем форму
 
O
#8
Ругается: "Ошибка синтаксиса в предложении Where"
И выделяет строку:
Me.RecordSource = strSql
 
?
#9
oza, покажи как строка strSQL выглядит перед вызовом Me.RecordSource = strSql

И еще сразу, что то не посмотрел =)
Поменяй везде
Код:
LIKE "" & strData & "";"
на
Код:
LIKE '" & strData & "*';"
 
O
#10
[codebox]Private Sub Кнопка4_Click()
Поле5.SetFocus
strField = Поле5.Text
strData = Список0.Column(0)
strSql = "Select Авторы.ФИО, Книги.Название,Виды_книг.Вид_издания, Издательства.Название_издательства From [Поиск_книг] Where "
If strField = "Авторы" Then
strSql = strSql & "ФИО LIKE '" & strData & "*';"
End If
If strField = "Книги" Then
strSql = strSql & "Название LIKE '" & strData & "*';"
End If
If strField = "Виды_книг" Then
strSql = strSql & "Вид_издания LIKE '" & strData & "*';"
End If
If strField = "Издательства" Then
strSql = strSql & "Название_издательства LIKE '" & strData & "*';"
End If
Me.RecordSource = strSql
Me.Refresh
End Sub[/codebox]

А еще strData = Список0.Column(0) надо писать перед каждым If'ом(с разными цифрами в скобках)?Колонки каждый раз ведь разные откуда надо брать текст...
 

BOPOHA

Well-known member
26.04.2006
118
0
#11
Как-то слишком много буков для такой простой задачи.
Доступ к данным на форме очень просто получать через Me.<имя> - не перепутаешь...
Переопределять данные на форме - RowSorce не нужно, укажите его один раз.
Дальше используйте Me.Filter и Me.FilterOn. Me.Filter присваивают условие отбора без ключевого слова Where.
Посмотрев на форму, я так и не понял где отображаются данные....
Можете вырезать из вашего проекта эту форму и необходимые данные и приложить к сообщению, так будет проще и быстрее.