![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Max Payne |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Задача сделать редактирование данных с разных таблиц в одном QTableView. Нашел как это делается через наследование :
Модель работает если делать не большой запрос типа ("select Name, Id from data where Pol = 1") Но у меня сложный запрос типа:
и выборку корректно делает только по нескольким переменным (у меня это 10 колонок ), а дальше таблица забивается словом, которым определён хидер таблицы. Может кто то с этим сталкивался хелп. Заранее спасибо. |
|
|
Steklova Olga |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Max Payne,
Цитата Модель работает если делать небольшой запрос типа ("select Name, Id from data where Pol = 1") Так тут запрос к одной таблице.Цитата Но у меня сложный запрос... Как раз 10 полей из одной таблицы и указаны в этом сложном запросе.и выборку корректно делает только по нескольким переменным (у меня это 10 колонок ) QSqlQueryModel Class Reference The model is read-only by default. To make it read-write, you must subclass it and reimplement setData() and flags(). Another option is to use QSqlTableModel, which provides a read-write model based on a single database table. Посмотрите, например, пример в главе 18 книги "Qt на примерах" Юрия Земскова, там как раз написано, как это делать ![]() Сообщение отредактировал Steklova Olga - 6.4.2012, 14:05 |
|
|
Max Payne |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Max Payne, Цитата Модель работает если делать небольшой запрос типа ("select Name, Id from data where Pol = 1") Так тут запрос к одной таблице.[/quoteя имел ввиду что модель работает с простыми запросами, где меньше 10 колонок. Цитата Цитата Но у меня сложный запрос... Как раз 10 полей из одной таблицы и указаны в этом сложном запросе.и выборку корректно делает только по нескольким переменным (у меня это 10 колонок ) Опять же если доверится элементарной математике и посчитать то там окажется 34 колонки из которых отображается только 10. Цитата QSqlQueryModel Class Reference The model is read-only by default. To make it read-write, you must subclass it and reimplement setData() and flags(). Another option is to use QSqlTableModel, which provides a read-write model based on a single database table. Если вы вдумались в то что я там написал, то там ясно , что с помощью наследования и такой фичи как dynamic_cast , я В QSqlTableModel устанавливаю запрос через наследника QSqlQueryModel. |
|
|
Steklova Olga |
![]()
Сообщение
#4
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Max Payne,
Цитата я имел ввиду что модель работает с простыми запросами, где меньше 10 колонок. И в таких простых запросах селектируются поля из разных таблиц?Приведите пример такого простого запроса, с которым эта модель работает. Цитата Опять же если доверится элементарной математике и посчитать то там окажется 34 колонки из которых отображается только 10. Первые 10 или какие? PS Я умею считать даже до 35! Цитата Как раз 10 полей из одной таблицы и указаны в этом сложном запросе. Я имела в виду, что 10 полей из одной таблицы и указаны в начале этого сложного запроса.Сообщение отредактировал Steklova Olga - 6.4.2012, 16:54 |
|
|
Steklova Olga |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Max Payne,
Цитата Нашел как это делается через наследование: QSqlTableModel *model = new QSqlTableModel(this, dbSql); QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model); Я тоже нашла описание использования dynamic_cast у Бланшет: A *obj = new B; B *b = dynamic_cast<B *>(obj); Замечаете разницу? Пардон, Max Payne, я перепутала родителя с наследником. Сообщение отредактировал Steklova Olga - 6.4.2012, 16:01 |
|
|
PAFOS |
![]()
Сообщение
#6
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
тут вроде все в порядке... возможно проблема в подзапросах - попробуй без них. |
|
|
Max Payne |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
тут вроде все в порядке... возможно проблема в подзапросах - попробуй без них. Таки нашел : Цитата Detailed Description The QSqlTableModel class provides an editable data model for a single database table наследование QSqlQueryModel никак не исправляет это =/ Может есть выход как сделать редактирование нескольких таблиц одновременно? Или может кто то уже реализовывал свою редактируемую модель? |
|
|
Steklova Olga |
![]()
Сообщение
#8
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Max Payne, повторюсь,
To make QSqlQueryModel read-write, you must subclass it and reimplement setData() and flags(). И все получится! И пример нужный есть в книге "Qt на примерах" Юрия Земскова. Вот тут, например, можно скачать. А от подзапросов можно избавиться, использовав INNER JOIN. Цитата Таки нашел: А прочитать полностью мой первый ответ?...
Detailed Description The QSqlTableModel class provides an editable data model for a single database table |
|
|
Max Payne |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Max Payne, повторюсь, To make QSqlQueryModel read-write, you must subclass it and reimplement setData() and flags(). И все получится! И пример нужный есть в книге "Qt на примерах" Юрия Земскова. Вот тут, например, можно скачать. А от подзапросов можно избавиться, использовав INNER JOIN. Цитата Таки нашел: А прочитать полностью мой первый ответ?...Detailed Description The QSqlTableModel class provides an editable data model for a single database table Спасибо большое, пошел читать мануал =) |
|
|
Steklova Olga |
![]()
Сообщение
#10
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
QSqlTableModel *model = new QSqlTableModel(this,dbSql); Эти два указателя описаны верно. Но дальше они неверно используются, когда в запросе указываются поля из разных таблиц.QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model); тут вроде все в порядке... Max Payne, использование QSqlRelationalTableModel, которое Вам посоветовали на prog.org, тоже не подойдет, по той же причине, что и использование QSqlTableModel Цитата Не мешайте в кучу dynamic_cast, QSqlTableModel и QSqlQueryModel.Detailed Description: The QSqlTableModel class provides an editable data model for a single database table наследование QSqlQueryModel никак не исправляет это =/ Предлагаю для Вашего примера 1. забыть пока про dynamic_cast 2. забыть пока про QSqlTableModel 3. создать класс-наследник от класса QSqlQueryModel, указать в этом классе-наследнике, что данные в модели будут редактируемыми, переопределить в этом классе все необходимое для редактирования. Max Payne, у Вас некорректно написано одно из условий в запросе. Вот это: View.ID = (select ID from Data where Name='привт') Вы тут сравниваете на равенство одиночное значение (View.ID) с множеством значений, которое может выдать подзапрос (select ID from Data where Name='привт'). Ваша логика тут не понятна. И, вообще, лучше так не писать. Может быть, в отдельной ситуации подзапрос и выдаст только одно значение, но если данные в БД потом изменятся или дополнятся, то запрос может оказаться ошибочным. Вашего алгоритма я не знаю, но я поменяла бы это условие на один из следующих вариантов (на какой - зависит от алгоритма): View.ID IN (select ID from Data where Name='привт') View.ID = (select FIRST 1 ID from Data where Name='привт') Max Payne, пожалуйста, прочитайте, наконец, правила оформления сообщений ![]() проанализируйте, что получается при нажатии разных кнопок, предназначенных для этого (не нажимая при этом кнопки "Отправить"), используйте кнопку "Предварительный просмотр", если пишите не быстрый ответ, а главное, не цитируйте Вы целыми сообщениями, это занимает много места и усложняет чтение. А когда Вам задают вопросы, хорошо бы на них отвечать, а не игнорировать. Успехов ! |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 17.2.2025, 5:26 |