crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> усовершенствовать 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 @ 21.1.2011, 21:06) *
и подскажите, как редактировать своё сообщение здесь
Пока ни как. Как наберёшь 20 сообщений такая возможность появится
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(abc @ 21.1.2011, 21:06) *
От QSqlRelationalTableModel нужно не отбрасывать строки с null-значениями. Нулевое значение по умолчанию не сгодится. От чего наследоваться? QSqlRelationalTableModel или QSqlTableModel? Какой метод переопределять? selectStatement()? Пытался читать реализацию QSqlRelationalTableModel, ужасно тяжело. А какая роль во всём этом у QSqlRelation? Какие функции на этот класс возложены? Подскажите, пожалуйста, что-нибудь

другому пути решения задачи тоже буду рад, и подскажите, как редактировать своё сообщение здесь, чувствую себя кретином

Начиная с 4.8 у QSqlRelationalTableModel появился метод setJoinMode(model->setJoinMode(QSqlRelationalTableModel::LeftJoin))
так что проблема закрыта.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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