crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Как в модели отобразить пустыми поля со значением NULL
magoldnew
  опции профиля:
сообщение 5.5.2013, 11:31
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 29.4.2013
Пользователь №: 3816

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




Репутация:   0  


Имеется таблица некоторые поля которых до определенного момента времени имеют значение NULL (поле со значением даты и внешний ключ), с помощью свойства LeftJoin я вывел в модель все записи данной таблицы, но возникла интересная проблема: в модели в этих полях вместо пустого поля, в записях имеющих значение NULL отображается значение предыдущей записи где оно не являлось NULL. Кто-нибудь решал подобную задачку и как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Majestio
  опции профиля:
сообщение 5.5.2013, 11:44
Сообщение #2


Студент
*

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

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




Репутация:   1  


Цитата(magoldnew @ 5.5.2013, 11:31) *
Имеется таблица некоторые поля которых до определенного момента времени имеют значение NULL (поле со значением даты и внешний ключ), с помощью свойства LeftJoin я вывел в модель все записи данной таблицы, но возникла интересная проблема: в модели в этих полях вместо пустого поля, в записях имеющих значение NULL отображается значение предыдущей записи где оно не являлось NULL. Кто-нибудь решал подобную задачку и как?


Можно модифицировать запрос, заменив поля, в которых возможен NULL - на связку (CASE ... WHEN ... THEN ... ELSE ... END) AS name
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
magoldnew
  опции профиля:
сообщение 5.5.2013, 13:08
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 29.4.2013
Пользователь №: 3816

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




Репутация:   0  


Фищка в том что в данном случае я не использую запрос, я вывожу данные в поля с помощью метода setRelation(int column, const QSqlRelation & relation), а метод QSqlRelation(const QString & tableName, const QString & indexColumn, const QString & displayColumn) принимает только имя таблицы и запихнуть ему sql запрос не получится, да и в данном случае как я понимаю в модельку возвращается все как надо, скорее всего метод setRelation не дружит с NULL и поэтому ничего не возвращает в данные поля и моделька продолжает отоброжать предыдущее значения... значит надо как-то реализовать проверку на текущее значение в методе setRelation и в случае пустого значения очищать элементы в модели....

Т.е. внешний ключ в главной таблицы имеет значение NULL и соответственно метод setRelation не может установить связь

Попробую пошаманить с методом bool isNull(const QString & name) const класса QSqlRecord
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Majestio
  опции профиля:
сообщение 5.5.2013, 15:55
Сообщение #4


Студент
*

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

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




Репутация:   1  


Цитата(magoldnew @ 5.5.2013, 13:08) *
Фищка в том что в данном случае я не использую запрос, я вывожу данные в поля с помощью метода setRelation(int column, const QSqlRelation & relation), а метод QSqlRelation(const QString & tableName, const QString & indexColumn, const QString & displayColumn) принимает только имя таблицы и запихнуть ему sql запрос не получится, да и в данном случае как я понимаю в модельку возвращается все как надо, скорее всего метод setRelation не дружит с NULL и поэтому ничего не возвращает в данные поля и моделька продолжает отоброжать предыдущее значения... значит надо как-то реализовать проверку на текущее значение в методе setRelation и в случае пустого значения очищать элементы в модели....

Т.е. внешний ключ в главной таблицы имеет значение NULL и соответственно метод setRelation не может установить связь

Попробую пошаманить с методом bool isNull(const QString & name) const класса QSqlRecord

Тогда можно определить этот запрос в виде VIEW ... но все же я советовал бы использовать модель QSqlQueryModel вместо QSqlTableModel.
Значительно упростится вывод необходимого. На счет модификации данных - сложнее точно не будет, чем пытаться это определить для сложных отношений пробуя настроить табличную модель.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
magoldnew
  опции профиля:
сообщение 6.5.2013, 19:12
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 29.4.2013
Пользователь №: 3816

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




Репутация:   0  


А можно пример, сейчас у меня в комбобокс данные подставляются так:


QSqlTableModel *relModel6 = model->relationModel(CantorIndex);
ui->cmbCantor->setModel(relModel6);
ui->cmbCantor->setModelColumn(relModel6->fieldIndex("cantor"));
....
mapper->addMapping(ui->cmbCantor, CantorIndex);
....
CantorIndex = model->fieldIndex("cantor_fk");
model->setRelation(CantorIndex, QSqlRelation("cantor", "cantor_pk", "cantor"));
model->select();


Данные в таблице привязанной к форме:

model = new QSqlRelationalTableModel(this);
model ->setTable("main_view");
model ->setEditStrategy(QSqlTableModel::OnFieldChange);
model->setJoinMode(model->LeftJoin);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
magoldnew
  опции профиля:
сообщение 6.5.2013, 19:55
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 29.4.2013
Пользователь №: 3816

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




Репутация:   0  


И в двух словах: преимущества QSqlQueryModel перед QSqlTableModel, ведь второе насдедуется от первого и соответствеено обладает всеми фишками родителя?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
magoldnew
  опции профиля:
сообщение 6.5.2013, 21:37
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 29.4.2013
Пользователь №: 3816

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




Репутация:   0  


И похоже проблема вообще в комбобоксе либо у меня недостаточно знаний :) когда стираю значение в записи где оно существует NULL не передается в БД (приминение изменений привязано к изменению данных в поле), да и вообще после изменений данных в комбобоксе они передаются в БД через раз, и также не присваивает значение NULL в QEditLine, хотя в бд в данных полях галочка NOT NULL не установлена.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.4.2024, 18:50