Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
Max Payne |
6.4.2012, 10:20
Сообщение
#1
|
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: 0
|
Задача сделать редактирование данных с разных таблиц в одном QTableView. Нашел как это делается через наследование :
Модель работает если делать не большой запрос типа ("select Name, Id from data where Pol = 1") Но у меня сложный запрос типа: и выборку корректно делает только по нескольким переменным (у меня это 10 колонок ), а дальше таблица забивается словом, которым определён хидер таблицы. Может кто то с этим сталкивался хелп. Заранее спасибо. |
|
|
|
|
Steklova Olga |
6.4.2012, 13:29
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4
|
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 |
6.4.2012, 14:11
Сообщение
#3
|
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: 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 |
6.4.2012, 14:26
Сообщение
#4
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4
|
Max Payne,
Цитата я имел ввиду что модель работает с простыми запросами, где меньше 10 колонок. И в таких простых запросах селектируются поля из разных таблиц?Приведите пример такого простого запроса, с которым эта модель работает. Цитата Опять же если доверится элементарной математике и посчитать то там окажется 34 колонки из которых отображается только 10. Первые 10 или какие? PS Я умею считать даже до 35! Цитата Как раз 10 полей из одной таблицы и указаны в этом сложном запросе. Я имела в виду, что 10 полей из одной таблицы и указаны в начале этого сложного запроса.Сообщение отредактировал Steklova Olga - 6.4.2012, 16:54 |
|
|
|
|
Steklova Olga |
6.4.2012, 15:40
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4
|
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.4.2012, 15:47
Сообщение
#6
|
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8
|
тут вроде все в порядке... возможно проблема в подзапросах - попробуй без них. |
|
|
|
|
Max Payne |
6.4.2012, 16:49
Сообщение
#7
|
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: 0
|
Цитата(PAFOS @ 6.4.2012, 15:47) Link тут вроде все в порядке... возможно проблема в подзапросах - попробуй без них. Таки нашел : Цитата Detailed Description The QSqlTableModel class provides an editable data model for a single database table наследование QSqlQueryModel никак не исправляет это =/ Может есть выход как сделать редактирование нескольких таблиц одновременно? Или может кто то уже реализовывал свою редактируемую модель? |
|
|
|
|
Steklova Olga |
6.4.2012, 17:25
Сообщение
#8
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4
|
Max Payne, повторюсь,
To make QSqlQueryModel read-write, you must subclass it and reimplement setData() and flags(). И все получится! И пример нужный есть в книге "Qt на примерах" Юрия Земскова. Link, например, можно скачать. А от подзапросов можно избавиться, использовав INNER JOIN. Цитата Таки нашел: А прочитать полностью мой первый ответ?...
Detailed Description The QSqlTableModel class provides an editable data model for a single database table |
|
|
|
|
Max Payne |
6.4.2012, 19:03
Сообщение
#9
|
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: 0
|
Цитата(Steklova Olga @ 6.4.2012, 17:25) Link Max Payne, повторюсь, To make QSqlQueryModel read-write, you must subclass it and reimplement setData() and flags(). И все получится! И пример нужный есть в книге "Qt на примерах" Юрия Земскова. Link, например, можно скачать. А от подзапросов можно избавиться, использовав INNER JOIN. Цитата Таки нашел: А прочитать полностью мой первый ответ?...Detailed Description The QSqlTableModel class provides an editable data model for a single database table Спасибо большое, пошел читать мануал =) |
|
|
|
|
Steklova Olga |
8.4.2012, 14:52
Сообщение
#10
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4
|
Цитата(PAFOS @ 6.4.2012, 15:47) Link QSqlTableModel *model = new QSqlTableModel(this,dbSql); Эти два указателя описаны верно. Но дальше они неверно используются, когда в запросе указываются поля из разных таблиц.QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model); тут вроде все в порядке... Max Payne, использование QSqlRelationalTableModel, которое Вам посоветовали на prog.org, тоже не подойдет, по той же причине, что и использование QSqlTableModel Цитата(Max Payne @ 6.4.2012, 16:49) Link Цитата Не мешайте в кучу 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, у Вас некорректно написано одно из условий в запросе. Вот это: Цитата(Max Payne @ 6.4.2012, 10:20) Link 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, пожалуйста, прочитайте, наконец, правила оформления сообщений проанализируйте, что получается при нажатии разных кнопок, предназначенных для этого (не нажимая при этом кнопки "Отправить"), используйте кнопку "Предварительный просмотр", если пишите не быстрый ответ, а главное, не цитируйте Вы целыми сообщениями, это занимает много места и усложняет чтение. А когда Вам задают вопросы, хорошо бы на них отвечать, а не игнорировать. Успехов ! |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 27.12.2025, 12:07 |