![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
mishabard |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 13.6.2011 Из: Киев Пользователь №: 2741 Спасибо сказали: 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 |
![]()
Сообщение
#2
|
Студент ![]() Группа: Участник Сообщений: 32 Регистрация: 1.10.2009 Пользователь №: 1128 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Второй вопрос: при добавлении новой записи в 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 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 13.6.2011 Из: Киев Пользователь №: 2741 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Второй вопрос: при добавлении новой записи в 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 |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 32 Регистрация: 1.10.2009 Пользователь №: 1128 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
1. так как selectStatement() virtual protected, то мне необходимо унаследовать свой класс от QSQLRelationalTbableView и переопредилить эту функцию для того чтобы считать запрос, который создается после выполнения model->SetTable("table1") и добавления полей по внешним ключам kassaModel->setRelation(kassaModel->fieldIndex("idstat"),QSqlRelation("statlist","id","name")); Да, все верно, только не QSQLRelationalTbableView, а QSqlRelationalTableModel 2. После этого мне необходимо подменить этот запрос на свой, правильный красивый с алиасами и т.п. Как это сделать? model->setQuery("select ......."); функцией унаследованной от QSQLQueryModel? Получаешь исходный запрос
Если связей нет, то возвращаешь defaultQuery , иначе парсишь его регулярками и собираешь заново как тебе нужно. model->setQuery("select .......") использовать не нужно, твой новый запрос должен возвращаться функцией selectStatement(). 3. После того как у меня все получилось, я подменю запрос, будет ли моя модель также редактировать таблицу, накладывать фильтр, сортировать данные, которую я указал в самом начале model->SetTable("table1")? Или после редактирования запроса она у меня откажеться в TableViewe редактировать поля стандартно? Сортировка и фильтры будут работать, т.к. в новый запрос будет включено:
Редактирование не знаю, нужно проверять. Могу прислать исходники - пиши мыло. Почему-то не могу залить файлы сюда, говорит "Неудачная загрузка. Вам запрещено загружать такой тип файлов". Только все это проделывалось в качестве эксперимента, в продакшн код в итоге не вошло и, следовательно, не особо тестилось. http://narod.ru/disk/17533906001/sqlRelati...eModel.rar.html |
|
|
mishabard |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 13.6.2011 Из: Киев Пользователь №: 2741 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
1. так как selectStatement() virtual protected, то мне необходимо унаследовать свой класс от QSQLRelationalTbableView и переопредилить эту функцию для того чтобы считать запрос, который создается после выполнения model->SetTable("table1") и добавления полей по внешним ключам kassaModel->setRelation(kassaModel->fieldIndex("idstat"),QSqlRelation("statlist","id","name")); Да, все верно, только не QSQLRelationalTbableView, а QSqlRelationalTableModel 2. После этого мне необходимо подменить этот запрос на свой, правильный красивый с алиасами и т.п. Как это сделать? model->setQuery("select ......."); функцией унаследованной от QSQLQueryModel? Получаешь исходный запрос
Если связей нет, то возвращаешь defaultQuery , иначе парсишь его регулярками и собираешь заново как тебе нужно. model->setQuery("select .......") использовать не нужно, твой новый запрос должен возвращаться функцией selectStatement(). 3. После того как у меня все получилось, я подменю запрос, будет ли моя модель также редактировать таблицу, накладывать фильтр, сортировать данные, которую я указал в самом начале model->SetTable("table1")? Или после редактирования запроса она у меня откажеться в TableViewe редактировать поля стандартно? Сортировка и фильтры будут работать, т.к. в новый запрос будет включено:
Редактирование не знаю, нужно проверять. Могу прислать исходники - пиши мыло. Почему-то не могу залить файлы сюда, говорит "Неудачная загрузка. Вам запрещено загружать такой тип файлов". Только все это проделывалось в качестве эксперимента, в продакшн код в итоге не вошло и, следовательно, не особо тестилось. http://narod.ru/disk/17533906001/sqlRelati...eModel.rar.html Спасибо! Если можно то буду очень признателен. Пытался переопределять класс уже, не все понятно, впринципе есть еще пробелы в зананиях и опыте, поэтому пример будет очень полезен. Мыло написать в личку пока тоже не могу, поэтому пишу на форуме mishabardКУСАЧАЯmail.ru
Причина редактирования: не пиши почту явно, спамеры свиснут
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 27.2.2025, 14:11 |