Название: Поиск по Базе Данных Отправлено: gbcesc от Апрель 23, 2013, 18:02 Добрый вечер. У меня следующий вопрос - как организовать поиск по базе данных? Так,чтобы при вводе в строку интересующей фамилии, QSqlTableModel обновлялся и была только нужная запись. Спасибо.
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 23, 2013, 18:13 QSqlTableModel::setFilter ( const QString & filter ) вроде.
Если изменять ничего не надо, тогда проще QSqlQueryModel использовать. Для просмотра так сказать. Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 23, 2013, 18:39 Спасибо за ответ. Нет,изменять ничего не надо,просто поиск и вывод результата. А не могли бы на примере про QSqlQuery показать?
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 23, 2013, 18:44 Да, кстати как вариант использовать прокси модель, но с ней особо не работал. Ничего не посоветую.
QSqlQueryModel предназначена для получения данных при помощи запросов. Т.е. чтобы получить данные необходимо произвести запрос к базе данных. Нужные результаты отсеиваются при помощи построения запроса по стандартам SQL. Т.е. к примеру вводим фамилия "Вовкин" и тыркаем кнопку поиска. В слоте пишем аля Код: mySqlQueryModel.setQuery(QString("SELECT * FROM myTable WHERE firstName='%1'").arg(ui.lineedit_inputFirstName->text())); Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 23, 2013, 18:52 Спасибо Вам большое,попробую у себя. А не знаете,это наверно уже фильтрация,как сделать ,чтобы вывести только тех,кто имеет фамилию Петров,если их несколько?
Я вставил ваш код,но к сожалению никаких изменений не происходит. Как была показана вся база,так и осталась. А может лучше если я выложу исходники? Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 23, 2013, 19:15 Это будет превосходно )
А так же желательно все в архиве, желательно с маленькой базкой для пробы ) Тогда это будет идеалом. Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 23, 2013, 19:19 Был бы очень признателен в помощи. Я создал базу,но это все в Linux. Не знаете, куда и где там создаются базы?
Смог только в архив загнать. СУБД - Постгрес Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 23, 2013, 20:09 Посмотрю завтра. Правда не с постром, но разница не особая.
Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 23, 2013, 20:12 Спасибо Вам)буду очень ждать Вашего ответа)) а то я с поиском и фильтрацией не сталкивался никогда)
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 24, 2013, 07:43 В проекте мешанина стилей, недоработок, раздражающие месседж боксы и прочая ересь.
Смешано статическое и динамическое создание интерфейса. Дублированы некоторые элементы интерфейса полями класса. Пути к иконкам задаются по абсолютному пути. (достаточно изменить букву в названии папки и у вас весь интерфейс без картинок. Используйте относительные пути и файл ресурсов) В общем проблема проста - у вас не вызывался слот Код: void MainWindow::lineTextChanged(QString filter) База у вас не создаётся при отсутствии. С чем работать я буду (и другие помощники) вы явно не подумали. Так как нет базы, структура таблиц неизвестна. Даже если бы ваш слот вызывался, никакого положительного эффекта он не имел бы из-за Код: a like '%%1%' Решение: Замените свой кривой слот на следующий - Код: void MainWindow::on_lineEdit20_textChanged ( const QString & text ) Этот слот будет автоматически соединён с элементов интерфейса on_lineEdit20_textChanged( const QString & text ). И будет вызываться при испускании этим элементом сигнала on_lineEdit20_textChanged( const QString & text ). Чисто по коду было выяснено, что одно из полей вашей таблицы Name. PS а так бы я посоветовал почитать, посмотреть чужие проекты чтобы хоть чуть немного культуру кода повысить. :) Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 24, 2013, 13:00 Спасибо огромное на ответ. Это моя первая программа на Qt и понятно,что есть куда расти. Я сделал как Вы посоветовали,но как только ввожу символ в строку все содержимое пропадает и все. Ничего не отображается.
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 24, 2013, 14:38 setFilter насколько я помню должен ПОЛНОСТЬЮ совпадать с искомой строкой. Наберите полностью совпадаемую строку. Что получится?
Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 24, 2013, 14:48 Нет,ничего не получается. После первого же ввода вся база исчезает и все. То есть как только символ в строчку введешь то все - база исчезает
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 24, 2013, 15:36 Повторюсь. Если вы ввели в строку "А" и у вас есть пациент с именем "А" в View останется только он и его тезки. Попробуйте ввести ПОЛНОЕ имя, гарантированно имеющееся в базе. И тогда будет счастье. Во всяком случае должно.
Это происходит изза написанного мной фильтра :D Домой приду побалуюсь с запросами на инкрементный поиск. Мб. А то чегой-то не нравится ваш пессимизм :D Название: Re: Поиск по Базе Данных Отправлено: LEO от Апрель 24, 2013, 15:54 Цитировать setFilter насколько я помню должен ПОЛНОСТЬЮ совпадать с искомой строкой. Наберите полностью совпадаемую строку. Что получится? не полностью, в зависимости как задать запроспривожу пример model->setFilter("column_1 LIKE '" + ui->lineEdit->text() + "'"); если сделать так то да должен полностью совпадать с искомой строкой а если сделать так: model->setFilter("column_1 LIKE '" + ui->lineEdit->text() + "%'"); то должен начинаться с первых символов искомой и соответственно полное совпадение не обязательно, например при поиске числа 146, вводим 14, и у нас отобразятся строки если таковые имеются в которых есть записи 14, 146, 147, 140, 14444444444 и т.д. Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 24, 2013, 15:57 Это происходит изза написанного мной фильтра :D Пожалуйста внимательнее и не надо плодить пустых комментариев :P Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 24, 2013, 16:04 Да,ввожу полностью имя,ничего не появляется)) Все исчезает как только первая буква пишется) И все,ни в какую) Копировал и вставлял слова целиком - тоже самое)
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 24, 2013, 16:53 Чей то у тя там неправильно в твоём проекте :D
Незнаю, мб это ограничение какое то постгрессскьюэловское. PS ещё у вас плохие "защиты от дурака". Адрес нельзя ввести по DNS имени, невозможно написать имя базы данных, начинающееся с цифры и прочая жутко неудобная фигня :) Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 24, 2013, 18:06 Про защиту - мне именно так говорили делать,это не моя прихоть так скажем))) А Вы запускаете и у Вас поиск работает? Может я написал что-то не так.. а Вы бы не могли скинуть свой проект? Был бы Вам очень признателен.
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 25, 2013, 17:18 Был занят. Сейчас разгребу дела и скину.
Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 25, 2013, 17:49 Спасибо.Буду ждать
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 25, 2013, 18:10 Смотрел в первый раз на работе.Скачал опять ваш архив и переделаю. И скину. И в течении 5-10 минут. И... Ну всё, наверно :)
Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 25, 2013, 18:30 Хорошо)
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 25, 2013, 18:39 https://dl.dropboxusercontent.com/u/62712483/untitled144.zip
PS и всё же код у вас пока не очень :D PPS хотя б затрудняйте себя переименовывать виджеты в дизайнере "по смыслу". Название: Re: Поиск по Базе Данных Отправлено: gbcesc от Апрель 25, 2013, 19:24 Спасибо Вам большое за оказанную мне помощь))
Название: Re: Поиск по Базе Данных Отправлено: Bepec от Апрель 25, 2013, 19:28 DOCENDO DISCIMUS - обучая других, мы учимся сами (Сенека ©)
|