Russian Qt Forum
Сентябрь 25, 2024, 18:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Поиск по Базе Данных  (Прочитано 14005 раз)
gbcesc
Гость
« : Апрель 23, 2013, 18:02 »

Добрый вечер. У меня следующий вопрос - как организовать поиск по базе данных? Так,чтобы при вводе в строку интересующей фамилии, QSqlTableModel обновлялся и была только нужная запись. Спасибо.
Записан
Bepec
Гость
« Ответ #1 : Апрель 23, 2013, 18:13 »

QSqlTableModel::setFilter ( const QString & filter ) вроде.

Если изменять ничего не надо, тогда проще QSqlQueryModel использовать. Для просмотра так сказать.
Записан
gbcesc
Гость
« Ответ #2 : Апрель 23, 2013, 18:39 »

Спасибо за ответ. Нет,изменять ничего не надо,просто поиск и вывод результата. А не могли бы на примере про QSqlQuery показать?
Записан
Bepec
Гость
« Ответ #3 : Апрель 23, 2013, 18:44 »

Да, кстати как вариант использовать прокси модель, но с ней особо не работал. Ничего не посоветую.

QSqlQueryModel предназначена для получения данных при помощи запросов.

Т.е. чтобы получить данные необходимо произвести запрос к базе данных.
Нужные результаты отсеиваются при помощи построения запроса по стандартам SQL.

Т.е. к примеру вводим фамилия "Вовкин" и тыркаем кнопку поиска. В слоте пишем аля
Код:
	mySqlQueryModel.setQuery(QString("SELECT * FROM myTable WHERE firstName='%1'").arg(ui.lineedit_inputFirstName->text()));
. Перевожу на русский - выбрать все записи из таблицы myTable, в которых поле firstName(Фамилия) равняется содержимому поля ввода на вашей форме.
Записан
gbcesc
Гость
« Ответ #4 : Апрель 23, 2013, 18:52 »

Спасибо Вам большое,попробую у себя. А не знаете,это наверно уже фильтрация,как сделать ,чтобы вывести только тех,кто имеет фамилию Петров,если их несколько?

Я вставил ваш код,но к сожалению никаких изменений не происходит. Как была показана вся база,так и осталась. А может лучше если я выложу исходники?
« Последнее редактирование: Апрель 23, 2013, 19:02 от gbcesc » Записан
Bepec
Гость
« Ответ #5 : Апрель 23, 2013, 19:15 »

Это будет превосходно )
А так же желательно  все в архиве, желательно с маленькой базкой для пробы ) Тогда это будет идеалом.
Записан
gbcesc
Гость
« Ответ #6 : Апрель 23, 2013, 19:19 »

Был бы очень признателен в помощи. Я создал базу,но это все в Linux. Не знаете, куда и где там создаются базы?

Смог только в архив загнать. СУБД - Постгрес
« Последнее редактирование: Апрель 25, 2013, 22:02 от gbcesc » Записан
Bepec
Гость
« Ответ #7 : Апрель 23, 2013, 20:09 »

Посмотрю завтра. Правда не с постром, но разница не особая.
Записан
gbcesc
Гость
« Ответ #8 : Апрель 23, 2013, 20:12 »

Спасибо Вам)буду очень ждать Вашего ответа)) а то я с поиском и фильтрацией не сталкивался никогда)
Записан
Bepec
Гость
« Ответ #9 : Апрель 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 а так бы я посоветовал почитать, посмотреть чужие проекты чтобы хоть чуть немного культуру кода повысить. Улыбающийся
Записан
gbcesc
Гость
« Ответ #10 : Апрель 24, 2013, 13:00 »

Спасибо огромное на ответ. Это моя первая программа на Qt и понятно,что есть куда расти. Я сделал как Вы посоветовали,но как только ввожу символ в строку все содержимое пропадает  и все. Ничего не отображается.
Записан
Bepec
Гость
« Ответ #11 : Апрель 24, 2013, 14:38 »

setFilter насколько я помню должен ПОЛНОСТЬЮ совпадать с искомой строкой. Наберите полностью совпадаемую строку. Что получится?
Записан
gbcesc
Гость
« Ответ #12 : Апрель 24, 2013, 14:48 »

Нет,ничего не получается. После первого же ввода вся база исчезает и все. То есть как только символ в строчку введешь то все - база исчезает
« Последнее редактирование: Апрель 24, 2013, 15:27 от gbcesc » Записан
Bepec
Гость
« Ответ #13 : Апрель 24, 2013, 15:36 »

Повторюсь. Если вы ввели в строку "А" и у вас есть пациент с именем "А" в View останется только он и его тезки. Попробуйте ввести ПОЛНОЕ имя, гарантированно имеющееся в базе. И тогда будет счастье. Во всяком случае должно.
Это происходит изза написанного мной фильтра Веселый

Домой приду побалуюсь с запросами на инкрементный поиск.
Мб.
А то чегой-то не нравится ваш пессимизм Веселый
Записан
LEO
Гость
« Ответ #14 : Апрель 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 и т.д.

« Последнее редактирование: Апрель 24, 2013, 16:06 от LEO » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 21.