усовершенствовать QSqlRelationalTableModel, не отбрасывать строки с null-значениями |
Здравствуйте, гость ( Вход | Регистрация )
усовершенствовать QSqlRelationalTableModel, не отбрасывать строки с null-значениями |
abc |
21.1.2011, 21:06
Сообщение
#1
|
Участник Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: 4 |
От QSqlRelationalTableModel нужно не отбрасывать строки с null-значениями. Нулевое значение по умолчанию не сгодится. От чего наследоваться? QSqlRelationalTableModel или QSqlTableModel? Какой метод переопределять? selectStatement()? Пытался читать реализацию QSqlRelationalTableModel, ужасно тяжело. А какая роль во всём этом у QSqlRelation? Какие функции на этот класс возложены? Подскажите, пожалуйста, что-нибудь
другому пути решения задачи тоже буду рад, и подскажите, как редактировать своё сообщение здесь, чувствую себя кретином |
|
|
igor_bogomolov |
21.1.2011, 21:44
Сообщение
#2
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
|
|
|
abc |
25.1.2011, 21:47
Сообщение
#3
|
Участник Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: 4 |
Возможное решение. Для PostgreSQL
QSqlRelationalTableModel результирующий запрос делает такого вида: select таблица1.поле1, таблица2.поле2 from таблица1, таблица2 where условие подмены Такой запрос скрывает строки с null, а вот такой не скрывает: select таблица2.поле from таблица1 left outer join таблица2 on условие подмены Этот запрос нужно родить и вернуть в методе selectStatement() Нюансы. Запрос на замену нескольких колонок: select таблица2.поле, таблица3.поле from таблица1 left outer join таблица2 on условие подмены left outer join таблица3 on условие подмены и т.д. Если две колонки подменяете данными из одной таблицы, то в запросе нужно использовать различные псевдонимы для этой таблицы: select псевдоним1.поле, псевдоним2.поле from таблица1 left outer join таблица2 псевдоним1 on условие подмены left outer join таблица2 псевдоним2 on условие подмены и т.д. Можно наследоваться от QSqlTableModel, можно от QSqlRelationalTableModel. Во втором случае останется возможность редактировать модель с помощью стандартного делегата QSqlRelationalDelegate, но нужно будет проделать по-старинке setRelation. И это замедлит загрузку модели. Без этого показывается мгновенно. По редактированию такая проблема, что если вы берёте подменяющие значения из таблицы с множеством записей, из которых вам нужны не все, то напрашивается желание получить фильтр в setRelation. Как это сделать не знаю, но можно воспользоваться возможностью sql-представлений: create view представление as select колонка1, колонка2 from таблица where фильтр Дальше вместо setRelation("таблица", ...) делаем setRelation("представление", ...). В делегате лишних значений не будет, но представления нужно удалять по завершении работы приложения. |
|
|
MedEx |
13.8.2012, 20:58
Сообщение
#4
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 11.2.2011 Пользователь №: 2403 Спасибо сказали: 0 раз(а) Репутация: 0 |
От QSqlRelationalTableModel нужно не отбрасывать строки с null-значениями. Нулевое значение по умолчанию не сгодится. От чего наследоваться? QSqlRelationalTableModel или QSqlTableModel? Какой метод переопределять? selectStatement()? Пытался читать реализацию QSqlRelationalTableModel, ужасно тяжело. А какая роль во всём этом у QSqlRelation? Какие функции на этот класс возложены? Подскажите, пожалуйста, что-нибудь другому пути решения задачи тоже буду рад, и подскажите, как редактировать своё сообщение здесь, чувствую себя кретином Начиная с 4.8 у QSqlRelationalTableModel появился метод setJoinMode(model->setJoinMode(QSqlRelationalTableModel::LeftJoin)) так что проблема закрыта. |
|
|
Текстовая версия | Сейчас: 20.4.2024, 14:11 |