crossplatform.ru

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


  Ответ в QSqlRelationTableModel SetRelation возвращает NULL при добавлении новой строки
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 6.7.2011, 22:01
 
Цитата(tp4 @ 29.6.2011, 16:03) *
Почему-то не могу залить файлы сюда, говорит "Неудачная загрузка. Вам запрещено загружать такой тип файлов".
RAR-ы в не закона. используйте ZIP
mishabard Дата 6.7.2011, 19:18
  Спасибо большое! Все заработало.
Подключил класс к проекту.
Просто в программе заменил стандартный
QSqlRelationTableModel * model;
на
SqlRelationTableModel * model;

теперь показываются все строки вместе с нулевыми.
Класс ведет себя точно так же как и раньше. Можно добавлять удалять изменять записи.
Теперь появилась возможность обращаться к полям relation напрямую по их именам, которые формирует им selectStatment,
правде это не совсем правильно, но можно.

Еще обратил внимание, что замена запроса происходит всегда. а не один раз при инициализации модели.
И selectStatment даже после замены постоянно возвращает исходный запрос без left join.
mishabard Дата 1.7.2011, 11:12
 
Цитата(tp4 @ 29.6.2011, 13:03) *
Цитата(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

Спасибо! Если можно то буду очень признателен. Пытался переопределять класс уже, не все понятно, впринципе есть еще пробелы в зананиях и опыте, поэтому пример будет очень полезен.
Мыло написать в личку пока тоже не могу, поэтому пишу на форуме mishabardКУСАЧАЯmail.ru
tp4 Дата 29.6.2011, 13:03
 
Цитата(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
mishabard Дата 28.6.2011, 17:29
 
Цитата(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 Дата 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 <что-нибудь>
mishabard Дата 28.6.2011, 12:41
 
Цитата(Litkevich Yuriy @ 28.6.2011, 6:12) *
Цитата(mishabard @ 28.6.2011, 0:59) *
В официальной документации вычитал что никак!!!????(((((
ссылку давай

Поискал ссылку, не нахожу, много вчера пересмотрел. Это наверно была статья по использованию QSQLRelation. Может и не официальная. Но было написано черным по белому на русском языке примерно следующие: Что при использовании QSQLRelation идет сопоставление внешнего ключа одной таблицы к ID в другой "ОДИН к ОДНОМУ". бла бла бла... и на экран в Представлении выведутся только те строки у которых удовелтворены зависимости внешний ключ - ID внешней таблицы. бла бла бла... Если у вас может возникнуть такая ситуация, то лучше использовать QSQLQueryModel и строить запросы в которых будет проверяться возможность отображения строк с NULLевыми полями. ЧТо то в таком духе.



Цитата(Litkevich Yuriy @ 28.6.2011, 6:12) *
Цитата(mishabard @ 28.6.2011, 0:59) *
В официальной документации вычитал что никак!!!????(((((
ссылку давай



Все таки нашел!!!!
Вот ссылка на статью: http://symmetrica.net/qt4/lesson2.htm

Вот текст из статьи(примерно по середине статьи) :
Следует отметить один недостаток отображения сложных систем реляционных таблиц с помощью Interview Framework. В нашей модели данных вешний ключ album_id таблицы compositions может содержать пустые значения. При замещении столбца album_id столбцом с названием альбома с помощью метода setRelation(), строки, содержащие пустые значения в поле album_id, просто не попадут в модель (то же самое происходит при попытке сформировать таблицу с помощью запроса SELECT * FROM albums WHERE...). В представлении view_all, которые вы найдете в файле createtables.sql я обошел эту проблему, комбинируя левые и правые объединения (joins). Но класс QSqlRelationalTableModel так делать не умеет, поэтому если вы хотите отображать таблицы с пустыми внешними ключами целиком, вам придется самостоятельно конструировать SQL-запросы. Можно, конечно, пойти и по другому пути – ввести в список альбомов псевдо-альбом single, и добавлять в этот «альбом» все композиции, не являющиеся частью альбомов. При таком подходе замечательная песня «Есть на Волге утес» классифицировалась бы как «сингл неизвестного автора».
Litkevich Yuriy Дата 28.6.2011, 6:12
 
Цитата(mishabard @ 28.6.2011, 0:59) *
В официальной документации вычитал что никак!!!????(((((
ссылку давай
mishabard Дата 27.6.2011, 21:59
  Здравствуйте!
Использую 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. Как это решить? В официальной документации вычитал что никак!!!????(((((
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 9:37