QSqlRelationalTableModel, как подружить setRelation и setFilter? |
Здравствуйте, гость ( Вход | Регистрация )
QSqlRelationalTableModel, как подружить setRelation и setFilter? |
grio |
16.1.2010, 15:27
Сообщение
#1
|
Студент Группа: Участник Сообщений: 87 Регистрация: 11.11.2009 Пользователь №: 1221 Спасибо сказали: 6 раз(а) Репутация: 0 |
Делаю форму поиска пользователей, в которой один пользователь может ссылаться на другого. Но если использую одновременно setRelation и setFilter то результат - пустая таблица. Как можно выйти из положения? У меня нет задачи редактировать таблицу, нужно лишь отображать данные. |
|
|
MoPDoBoPoT |
16.1.2010, 18:06
Сообщение
#2
|
Участник Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: 9 |
Странно. Может запрос (без реляции) возвращает пустую таблицу? Или может в описании таблицы БД у не указано то, что поле с номером 13 (не знаю какое название) таблицы users является внешним ключом, ссылающимся на поле UID этой же таблицы?
Ну а вообще, только для чтения можно воспользоваться классом QSqlQueryModel:
|| - операция конкатенации строк в Oracle В setQuery можно было бы сразу записать текст запроса, но с подготовленным (prepared) запросом имеем более оптимизированное решение (если конечно СУБД поддерживает это). |
|
|
grio |
16.1.2010, 19:27
Сообщение
#3
|
Студент Группа: Участник Сообщений: 87 Регистрация: 11.11.2009 Пользователь №: 1221 Спасибо сказали: 6 раз(а) Репутация: 0 |
Странно. Может запрос (без реляции) возвращает пустую таблицу? Или может в описании таблицы БД у не указано то, что поле с номером 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 |
QSqlQueryModel в данном случае не подходит т.к. нужно подменить значение 13 столбца именем пользователя из тойже таблицы. в запросе вместо имени 13 столбца пишешь в скобках запрос, который будет возвращать необходимое имя пользователя.
Если есть идеи как это реализовать через QSqlQueryModel, тогда вариант вполне годится. |
|
|
MoPDoBoPoT |
16.1.2010, 20:14
Сообщение
#5
|
Участник Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: 9 |
Самое главное я забыл для чего все это нужно было
Дело сводится к простому SQL:
В полях выбора перечисляются все необходимые поля с алиасом 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 |
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 столбца пишешь в скобках запрос, который будет возвращать необходимое имя пользователя. такая подсказка не помогла тоже. а вот друг Шурик подсказал как правильно сформировать запрос в моем случае:
Сообщение отредактировал 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 |
Те же яйца только в профиль Просто я забыл алиас дописать: 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 |
|
|
Текстовая версия | Сейчас: 22.12.2024, 8:28 |