![]() |
|
|
![]()
|
|
| Gamber |
|
||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Всем доброго времени суток помогите пожалуйста разобраться...
Есть БД "Библиотека" в оболочке которая реализуется под эту базу я создаю параметризированный SELECT-запрос для поиска книги, в качестве параметров могут использоваться: название книги, имя автора, название издательства, название книготорговой фирмы значение параметров задается пользователем в обычных edit полях... Необходимо чтобы пользователь мог задавать произвольное число параметров... Допустим введено: "Пушкин", остальные Edit пустые, результат все книги Пушкина, или к примеру введено "Пушкин" "Питер", результат все книги Пушкина изданные издательством Питер...
А вот с SQL запросом возникили проблемы, сначала писал:
В этом случае получал из-за "OR" получался не уточняющий поиск, а обобщающий (весь Пушкин, весь Питер), при замене на "AND" работает лучше, но необходимо вводить все параметры иначе поиск не осуществится... Предложили попробовать сделать так:
Сделал, но теперь получаю ошибку от сервера:
На данный момент для реализации поставленной задачи получается использовать только отдельные запросы с одним параметром (поиск по названию книги - один запрос с одним параметром типа:
и т.д Минусы очевидны: много практически идентичных запросов, нет возможности уточняющего поиска по нескольким параметрам (т.е нельзя искать все книги Пушкина изданные издательством "Питер", к примеру, а можно искать только все книги Пушкина или все книги изданные издательством "Питер")... Может все-таки есть решение этой проблемы? Подскажите пожалуйста... Это сообщение отредактировал(а) Gamber - 21.10.2008, 08:33 |
||||||||||
|
|||||||||||
| Deniz |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Минусы: использование индексов зависит от ума оптимизатора. Есть еще вариант динамически формировать запрос на клиенте:
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
| vovk |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 28.2.2008 Репутация: 6 Всего: 6 |
А Like не подходит?
|
|||
|
||||
| Frees |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
ошибка должна пропасть Добавлено через 4 минуты и 20 секунд
думеш есть смысл индексировать по этим полям? Это сообщение отредактировал(а) Frees - 21.10.2008, 10:58 -------------------- Кольцов Виктор Владимирович |
||||
|
|||||
| Gamber |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Решил сделать динамически... Для начала для пары полей (книга и автор):
SQL Запрос вот такой:
Столкнулся с двумя проблемами: 1. При открытии окна запроса, сразу исполняется SQL запрос, полная выборка из базы... Можно ли это предотвратить и сделать так, чтобы выводились данные в грид только после нажатия на кнопку "Выполнить запрос"? 2. Допустим я ввел: "Сказки", пустой ответ (ничего не найдено), хотя две таких книги есть Пушкина и Гоголя, ввел в поле автора Гоголь увидел книгу, ввел Пушкина тоже OK... И например так ввел Пушкин увидел все его книги, ввел Сказки увидел его книгу, поменял на гоголя тоже нормально, а начинаю вновь вводить просто Пушкин, вижу только Сказки... Вообщем что-то я запутался... Подскажите пожалуйста где я мог ошибиться? Frees, та же самая ошибка... Это сообщение отредактировал(а) Gamber - 21.10.2008, 11:14 |
||||||||
|
|||||||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
cast может не у всех параметров стоит зы динамичесски лучше IBQSearchByName.active false в свойствах поставь когда на кнопку нажмеш он выполниться по поводу 2 вопрса попробуй так -
Это сообщение отредактировал(а) Frees - 21.10.2008, 11:33 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Gamber |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
А разве не нужно еще дописать связь?
|
||||
|
|||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
да нужно не заметил просто Добавлено @ 11:47 вот так значит
Это сообщение отредактировал(а) Frees - 21.10.2008, 11:48 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Gamber |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Не хочет работать... Запрос вообще не выполняется... Ругается "Empty SQL Statment" |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
IBQSearchByName - это что за компонент? Это сообщение отредактировал(а) Frees - 21.10.2008, 12:14 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Gamber |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
IBQuery |
|||
|
||||
| vovk |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 28.2.2008 Репутация: 6 Всего: 6 |
А в таком виде не пойдёт? Единственно что будет отсеивать записи с пустыми значениями из этих полей Это сообщение отредактировал(а) vovk - 21.10.2008, 12:17 |
|||
|
||||
| Gamber |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Нет врядли... |
||||
|
|||||
| Gamber |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
ВСЕ! Вроде бы заработало
Frees, Большое спасибо! Это сообщение отредактировал(а) Gamber - 21.10.2008, 12:50 |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
введи в поле поиска по книге одинарную кавычку -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Gamber |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Ага, понял... Ну вроде бы все исправил, вот посмотрите пожалуйста, надеюсь окончательный код, на предмет ляпов:
Это сообщение отредактировал(а) Gamber - 21.10.2008, 17:21 |
|||
|
||||
| Deniz |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Gamber, не знаю как сейчас работают IBX (сам общаюсь через FIBPlus), но раньше конструкция вида:
Между добавлением к SQL параметра и указанием значения нужно было вызывать Prepare, иначе параметры не находились. Как сейчас не знаю. Далее, дополнить для всех строковых полей
Далее, год издания и цену лучше передавать не AsString а AsInteger/AsFloat. Далее, для дополнительной функциональности предлагаю разделить период даты издания:
Аналогично для цены. И последнее, лучше сначала проверить правильность введенного в Edit'ы и выдать сообщение об ошибке, а потом формировать SQL-запрос. Самый простой способ:
Это сообщение отредактировал(а) Deniz - 22.10.2008, 05:51 -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||||
|
|||||||||
| Gamber |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Да вроде бы не было замечено проблем с Prepare, хотя все-таки решил прислушаться, добавил
Вот, что вышло:
Правда есть пара нюансов: 1. Если добавить конструкцию типа:
то результат всегда пустой, как я понял как раз из-за кавычек которые добавляются в начале и конце... 2. Скажите как сделать корректнее, так:
или так:
Добавлено через 9 минут и 14 секунд И еще забыл, добавил контроль ввода на поля годов и цен... Для года издания:
Для цены, вот такой вариант нашел:
Это сообщение отредактировал(а) Gamber - 22.10.2008, 17:58 |
||||||||||||
|
|||||||||||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
однозначно
Контроль для ввода года и цены, ИМХО, не нужен в таком виде. Во-первых, ты гасишь кнопки стрелка влево/вправо/home/end, delete, к которыми пользователь возможно привык. Во-вторых, существуют готовые компоненты для ввода цифр. (У тебя TJvEdit может там что-то есть). В-третьих, можно проще проверить правильность ввода через try except. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Gamber |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Ага, понял... По контроль ввода да, сначала хотел решить вопрос компонентом, MaskEdit как я понял здесь не пойдет (возникает проблема преобразования в число проблелов)... Попробую покопать JvEdit... Кстати стрелки и delete работают по-умолчанию, а Backspace прописан (#8), хотя соглашусь, это конечно не самое лучшее решение... Deniz большое тебе спасибо за помощь, сток косяков удалось откопать |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |