Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
17:04:2008, 14:13
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 6:04:2008 Пользователь №: 16 413 Репутация: 0
|
Мне нужно организовать поиск книг в форме по названию, автору,издательству, виду издания. У меня есть запрос на выборку по этим критериям. Как на основе этого запроса организовать поиск в форме?
В форме существует элемент ListBox(в нем содержится запрос), поле для ввода данных, кнопка. Нужно, чтоб при щелчке на кнопке искалось искомое(то, что пользователь ввел в текстовом поле) и в listBox отображалось найденное. Какую именно процедуру надо писать в кнопке? Название столбцов в запросе, сам запрос на русском языке. Например пользователь вводит в текстовое поле,например Акунин и выводится все книги этого автора.Или вводит Роман, и выводится все романы, которые есть в запросе. Как это сделать? Каким образом? Какой должен быть код у кнопки? Я уже всю голову себе сломала...Помогите,кто чем может, пожалуйста. |
|
Сообщение
#1
|
|
![]() |
|
|
17:04:2008, 20:56
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
У формы есть атрибуты Filter и FelterOn.
Например: Код Me.Filter = "поле=значение And поле=значение"
Me.FilterOn = true |
|
Сообщение
#2
|
|
|
|
18:04:2008, 07:39
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 25:12:2005 Пользователь №: 2 734 Специализация: программист Репутация: 0
|
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 Вот примерно так =) Еще раз повторюсь ЗА ОШИБКИ, прошу извинить, Аксесом уже давно не пользуюсь, впрочем и не жалею =))) Сообщение отредактировал Shader88 - 18:04:2008, 07:49 |
|
Сообщение
#3
|
|
|
|
18:04:2008, 16:59
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 6:04:2008 Пользователь №: 16 413 Репутация: 0
|
Я немного не поняла, что надо писать в строке 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 поля, чтобы не писать цикл. Сообщение отредактировал oza - 18:04:2008, 16:51 |
|
Сообщение
#4
|
|
|
|
19:04:2008, 10:55
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 25:12:2005 Пользователь №: 2 734 Специализация: программист Репутация: 0
|
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 Сообщение отредактировал Shader88 - 19:04:2008, 10:56 |
|
Сообщение
#5
|
|
|
|
19:04:2008, 18:51
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 6:04:2008 Пользователь №: 16 413 Репутация: 0
|
моя форма выглядит вот так:
Дело в том, что туда, куда я вписываю критерии поиска это текстовое поле, а откуда берутся данные, это список. Как определить список? Что писать после точки?Ну как: strField = Поле3.Text strData = Список7.??? Я пробовала 2 из списка это ListCount и ListIndex, все равно не работает. А еще он ругался на то, что для объекта Поле3 не определен фокус(идиотство конечно!) Я добавила Поле3.SetFocus И еще непонятно, что писать после слова Where? Может мне как-нибудь перерисовать форму?Чтобы был не список, а поле со списком? Тогда непонятно, что там должно быть. Я понимаю, вас уже достала, но только вы отвечаете в этой теме весьма логично =) Сообщение отредактировал oza - 19:04:2008, 19:04
Прикрепленные файлы
|
|
Сообщение
#6
|
|
|
|
20:04:2008, 13:47
|
|
Новенький ![]() Группа: Программист Сообщений: 14 Регистрация: 12:06:2007 Из: 0x0B Пользователь №: 11 348 Специализация: Кодер Репутация: 0
|
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 'Обновляем форму Сообщение отредактировал ~/~евто/-/ - 20:04:2008, 13:49 |
|
Сообщение
#7
|
|
|
|
20:04:2008, 14:48
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 6:04:2008 Пользователь №: 16 413 Репутация: 0
|
Ругается: "Ошибка синтаксиса в предложении Where"
И выделяет строку: Me.RecordSource = strSql |
|
Сообщение
#8
|
|
|
|
20:04:2008, 15:23
|
|
Новенький ![]() Группа: Программист Сообщений: 14 Регистрация: 12:06:2007 Из: 0x0B Пользователь №: 11 348 Специализация: Кодер Репутация: 0
|
oza, покажи как строка strSQL выглядит перед вызовом Me.RecordSource = strSql
И еще сразу, что то не посмотрел =) Поменяй везде Код LIKE "" & strData & "";" на Код LIKE '" & strData & "*';"
Сообщение отредактировал ~/~евто/-/ - 20:04:2008, 15:48 |
|
Сообщение
#9
|
|
|
|
20:04:2008, 18:26
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 6:04:2008 Пользователь №: 16 413 Репутация: 0
|
CODE 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 А еще strData = Список0.Column(0) надо писать перед каждым If'ом(с разными цифрами в скобках)?Колонки каждый раз ведь разные откуда надо брать текст... Сообщение отредактировал oza - 20:04:2008, 18:28 |
|
Сообщение
#10
|
|
|
|
21:04:2008, 06:38
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Как-то слишком много буков для такой простой задачи.
Доступ к данным на форме очень просто получать через Me.<имя> - не перепутаешь... Переопределять данные на форме - RowSorce не нужно, укажите его один раз. Дальше используйте Me.Filter и Me.FilterOn. Me.Filter присваивают условие отбора без ключевого слова Where. Посмотрев на форму, я так и не понял где отображаются данные.... Можете вырезать из вашего проекта эту форму и необходимые данные и приложить к сообщению, так будет проще и быстрее. |
|
Сообщение
#11
|
|
|
|
23:04:2008, 16:36
|
|
Новенький ![]() Группа: Программист Сообщений: 12 Регистрация: 6:04:2008 Пользователь №: 16 413 Репутация: 0
|
Всем спасибо! Реализовала с помощью макроса!
|
|
Сообщение
#12
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 11:50 |