crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QSqlRelationalTableModel, как подружить setRelation и setFilter?
grio
  опции профиля:
сообщение 16.1.2010, 15:27
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 87
Регистрация: 11.11.2009
Пользователь №: 1221

Спасибо сказали: 6 раз(а)




Репутация:   0  


 model_user = new QSqlRelationalTableModel;
model_user->setTable("users");
model_user->setFilter("Name LIKE '%"+ui->lineEdit_search->text()+"%'");
model_user->setRelation(13, QSqlRelation("users", "UID", "Name"));
model_user->select();
...


Делаю форму поиска пользователей, в которой один пользователь может ссылаться на другого.
Но если использую одновременно setRelation и setFilter то результат - пустая таблица.
Как можно выйти из положения?
У меня нет задачи редактировать таблицу, нужно лишь отображать данные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 16.1.2010, 18:06
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Странно. Может запрос (без реляции) возвращает пустую таблицу? Или может в описании таблицы БД у не указано то, что поле с номером 13 (не знаю какое название) таблицы users является внешним ключом, ссылающимся на поле UID этой же таблицы?

Ну а вообще, только для чтения можно воспользоваться классом QSqlQueryModel:
...
model_user = new QSqlQueryModel(this);
//готовим запрос
QSqlQuery q;
query.prepare("SELECT * FROM users WHERE name LIKE '%' || :name || '%' ");
query.bindValue(":name", ui->lineEdit_search->text());
query.exec();
//устанавливаем данные в модель
model_user->setQuery(q);
...

|| - операция конкатенации строк в Oracle
В setQuery можно было бы сразу записать текст запроса, но с подготовленным (prepared) запросом имеем более оптимизированное решение (если конечно СУБД поддерживает это).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
grio
  опции профиля:
сообщение 16.1.2010, 19:27
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 87
Регистрация: 11.11.2009
Пользователь №: 1221

Спасибо сказали: 6 раз(а)




Репутация:   0  


Цитата(MoPDoBoPoT @ 16.1.2010, 18:06) *
Странно. Может запрос (без реляции) возвращает пустую таблицу? Или может в описании таблицы БД у не указано то, что поле с номером 13 (не знаю какое название) таблицы users является внешним ключом, ссылающимся на поле UID этой же таблицы?


Использую базу SQLITE.
Запрос с пустым значением LIKE возвращает всю таблицу целиком (как *)
Отдельно setFilter работает без вопросов, если закомментировать строку setRelation.
И наоборот, setRelation работает отлично, если setFilter закомментирован.

Действительно, 13 поле содержит одно из значений поля UID той же таблицы (users).

QSqlQueryModel в данном случае не подходит т.к. нужно подменить значение 13 столбца именем пользователя из тойже таблицы.
Если есть идеи как это реализовать через QSqlQueryModel, тогда вариант вполне годится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.1.2010, 20:08
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(grio @ 16.1.2010, 22:27) *
QSqlQueryModel в данном случае не подходит т.к. нужно подменить значение 13 столбца именем пользователя из тойже таблицы.
Если есть идеи как это реализовать через QSqlQueryModel, тогда вариант вполне годится.
в запросе вместо имени 13 столбца пишешь в скобках запрос, который будет возвращать необходимое имя пользователя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 16.1.2010, 20:14
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Самое главное я забыл для чего все это нужно было :)
Дело сводится к простому SQL:
...
QSqlQuery q;
query.prepare("SELECT u1.UID, u1.name,..., u2.name AS chief FROM users u1, users u2"
                      " WHERE name LIKE '%' || :name || '%' "
                      " AND u1._chief = u2.UID);
query.bindValue(":name", ui->lineEdit_search->text());
query.exec();
...

В полях выбора перечисляются все необходимые поля с алиасом u1, кроме 13 поля - "u2.name AS chief"
В условии WHERE "u1._chief" - подразумевает 13 поле...

Сообщение отредактировал MoPDoBoPoT - 16.1.2010, 20:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
grio
  опции профиля:
сообщение 16.1.2010, 22:41
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 87
Регистрация: 11.11.2009
Пользователь №: 1221

Спасибо сказали: 6 раз(а)




Репутация:   0  


Цитата(MoPDoBoPoT @ 16.1.2010, 20:14) *
query.prepare("SELECT u1.UID, u1.name,..., u2.name AS chief FROM users u1, users u2"
" WHERE name LIKE '%' || :name || '%' "
" AND u1._chief = u2.UID);


Результат отрицательный. QSqlError(-1, "Parameter count mismatch", "")

Цитата(Litkevich Yuriy)
в запросе вместо имени 13 столбца пишешь в скобках запрос, который будет возвращать необходимое имя пользователя.


такая подсказка не помогла тоже.

а вот друг Шурик подсказал как правильно сформировать запрос в моем случае:
 query.prepare("SELECT users.UID, users.Name, users_1.UID, users_1.Name"
                  " FROM users LEFT JOIN users AS users_1 ON users.Agent = users_1.UID"
                  " WHERE users.Name LIKE '%' || :name || '%' ");


Сообщение отредактировал grio - 16.1.2010, 22:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 17.1.2010, 0:10
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Те же яйца только в профиль :)
Просто я забыл алиас дописать:
SELECT u1.UID, u1.name,..., u2.name AS chief FROM users u1, users u2 WHERE u1.name LIKE '%' || :name || '%' AND u1.pole13 = u2.UID

А вообще, работа с БД предполагает знание SQL ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
grio
  опции профиля:
сообщение 17.1.2010, 8:45
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 87
Регистрация: 11.11.2009
Пользователь №: 1221

Спасибо сказали: 6 раз(а)




Репутация:   0  


Цитата(MoPDoBoPoT @ 17.1.2010, 1:10) *
Те же яйца только в профиль :)
Просто я забыл алиас дописать:
SELECT u1.UID, u1.name,..., u2.name AS chief FROM users u1, users u2 WHERE u1.name LIKE '%' || :name || '%' AND u1.pole13 = u2.UID

А вообще, работа с БД предполагает знание SQL ;)


Нет, здесь яйца как раз другие.
В твоем случае записи, содержащие пустое поле 13 не будут отображены никогда.
Но этот вопрос, возможно, тоже решается через *= (я не пробовал).
В принципе, пошел оффтопик уже. Надо переходить в ветку SQLITE.


Сообщение отредактировал grio - 17.1.2010, 11:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 14:49