crossplatform.ru

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

> QSqlRelationTableModel SetRelation возвращает NULL при добавлении новой строки, Новая строка не отображается если в подменяемом поле стоит NULL
mishabard
  опции профиля:
сообщение 27.6.2011, 21:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

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




Репутация:   0  


Здравствуйте!
Использую QSQLRelationTableModel QTableView
Есть две таблицы поля у которых связанные между собой таким образом:

kassaModel->setRelation(kassaModel->fieldIndex("idstat"),QSqlRelation("statlist","id","name"));
kassaModel->setRelation(kassaModel->fieldIndex("idpartner"),QSqlRelation("partner","id","name"));

Вопрос первый:

При отображении в QTAbleView получается два поля после подмены NAME, STATLIST_NAME_2
Можно как-то переназвать эти поля( не заголовки в представлении!!!! а именно название полей), например чтобы потом было удобно ими пользоваться и не вспоминать все эти названия?


Второй вопрос: при добавлении новой записи в kassaModel связанные поля idstat, idpartner имеют значения NULL потому как в них еще не установленны соответсвия из связанных таблиц. И поэтому новые записи не появляются в TableView. Как это решить? В официальной документации вычитал что никак!!!????(((((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
tp4
  опции профиля:
сообщение 28.6.2011, 15:04
Сообщение #2


Студент
*

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

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




Репутация:   0  


Цитата(mishabard @ 27.6.2011, 22:59) *
Второй вопрос: при добавлении новой записи в kassaModel связанные поля idstat, idpartner имеют значения NULL потому как в них еще не установленны соответсвия из связанных таблиц. И поэтому новые записи не появляются в TableView. Как это решить? В официальной документации вычитал что никак!!!????(((((


QSqlRelationalTableModel::seclectStatement() возвращает запрос вида:

SELECT ...
FROM table1 tb1, table2 tb2
WHERE (tb1.fk = tb2.id) AND (<условия фильтра>)
ORDER BY <что-нибудь>

Можно переопределить этот метод, чтобы он использовал внешние join'ы:

SELECT ...
FROM table1 tb1 LEFT JOIN table2 tb2 ON (tb1.fk = tb2.id)
WHERE (<условия фильтра>)
ORDER BY <что-нибудь>
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mishabard
  опции профиля:
сообщение 28.6.2011, 17:29
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

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




Репутация:   0  


Цитата(tp4 @ 28.6.2011, 15:04) *
Цитата(mishabard @ 27.6.2011, 22:59) *
Второй вопрос: при добавлении новой записи в kassaModel связанные поля idstat, idpartner имеют значения NULL потому как в них еще не установленны соответсвия из связанных таблиц. И поэтому новые записи не появляются в TableView. Как это решить? В официальной документации вычитал что никак!!!????(((((


QSqlRelationalTableModel::seclectStatement() возвращает запрос вида:

SELECT ...
FROM table1 tb1, table2 tb2
WHERE (tb1.fk = tb2.id) AND (<условия фильтра>)
ORDER BY <что-нибудь>

Можно переопределить этот метод, чтобы он использовал внешние join'ы:

SELECT ...
FROM table1 tb1 LEFT JOIN table2 tb2 ON (tb1.fk = tb2.id)
WHERE (<условия фильтра>)
ORDER BY <что-нибудь>


Немного не силен пока поэтому хочу уточнить, правильно ли я понял.
1. так как selectStatement() virtual protected, то мне необходимо унаследовать свой класс от QSQLRelationalTbableView и переопредилить эту функцию для того чтобы считать запрос, который создается после выполнения model->SetTable("table1") и добавления полей по внешним ключам
kassaModel->setRelation(kassaModel->fieldIndex("idstat"),QSqlRelation("statlist","id","name"));
2. После этого мне необходимо подменить этот запрос на свой, правильный красивый с алиасами и т.п.
Как это сделать? model->setQuery("select ......."); функцией унаследованной от QSQLQueryModel?
3. После того как у меня все получилось, я подменю запрос, будет ли моя модель также редактировать таблицу, накладывать фильтр, сортировать данные, которую я указал в самом начале model->SetTable("table1")? Или после редактирования запроса она у меня откажеться в TableViewe редактировать поля стандартно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tp4
  опции профиля:
сообщение 29.6.2011, 13:03
Сообщение #4


Студент
*

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

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




Репутация:   0  


Цитата(mishabard @ 28.6.2011, 18:29) *
1. так как selectStatement() virtual protected, то мне необходимо унаследовать свой класс от QSQLRelationalTbableView и переопредилить эту функцию для того чтобы считать запрос, который создается после выполнения model->SetTable("table1") и добавления полей по внешним ключам
kassaModel->setRelation(kassaModel->fieldIndex("idstat"),QSqlRelation("statlist","id","name"));

Да, все верно, только не QSQLRelationalTbableView, а QSqlRelationalTableModel

Цитата(mishabard @ 28.6.2011, 18:29) *
2. После этого мне необходимо подменить этот запрос на свой, правильный красивый с алиасами и т.п.
Как это сделать? model->setQuery("select ......."); функцией унаследованной от QSQLQueryModel?

Получаешь исходный запрос
QString defaultQuery = QSqlRelationalTableModel::selectStatement();

Если связей нет, то возвращаешь defaultQuery , иначе парсишь его регулярками и собираешь заново как тебе нужно.

model->setQuery("select .......") использовать не нужно, твой новый запрос должен возвращаться функцией selectStatement().

Цитата(mishabard @ 28.6.2011, 18:29) *
3. После того как у меня все получилось, я подменю запрос, будет ли моя модель также редактировать таблицу, накладывать фильтр, сортировать данные, которую я указал в самом начале model->SetTable("table1")? Или после редактирования запроса она у меня откажеться в TableViewe редактировать поля стандартно?

Сортировка и фильтры будут работать, т.к. в новый запрос будет включено:
WHERE (<условия фильтра>)
ORDER BY <что-нибудь>

Редактирование не знаю, нужно проверять.

Могу прислать исходники - пиши мыло. Почему-то не могу залить файлы сюда, говорит "Неудачная загрузка. Вам запрещено загружать такой тип файлов".
Только все это проделывалось в качестве эксперимента, в продакшн код в итоге не вошло и, следовательно, не особо тестилось.








http://narod.ru/disk/17533906001/sqlRelati...eModel.rar.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 28.4.2024, 23:01