Russian Qt Forum

Qt => Базы данных => Тема начата: gbcesc от Апрель 23, 2013, 18:02



Название: Поиск по Базе Данных
Отправлено: 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()));
. Перевожу на русский - выбрать все записи из таблицы myTable, в которых поле firstName(Фамилия) равняется содержимому поля ввода на вашей форме.


Название: 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%'
Чем вы думали добавляя знаки % по сторонам от вставляемого значения? (%1 - вставляемое значение).

Решение:
Замените свой кривой слот на следующий -
Код:
void MainWindow::on_lineEdit20_textChanged ( const QString & text )
{
    model->setFilter(QString("Name='%1'").arg(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 - обучая других, мы учимся сами (Сенека ©)