crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> QSqlTableModel и метод setQuery QSqlQueryModel *q=dynamic_cast<QSqlQueryModel*>(model), Редактирование полей из нескольких таблиц одновременно
Max Payne
  опции профиля:
сообщение 6.4.2012, 10:20
Сообщение #1


Студент
*

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

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




Репутация:   0  


Задача сделать редактирование данных с разных таблиц в одном QTableView. Нашел как это делается через наследование :
QSqlTableModel *model = new QSqlTableModel(this,dbSql);
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model);


Модель работает если делать не большой запрос типа ("select Name, Id from data where Pol = 1")
Но у меня сложный запрос типа:
select Animals.Код_Породы, Animals.Код_Окраса,Animals.Пол,Animals.Кличка,Animals.Дата_рождения,Animals.Родо
словная,Animals.Отец_Кличка,Animals.Отец_Окрас,Animals.Мать_Кличка,Animals.Мать_О
крас, Заводчик.Заводчики,Владелец.Владелец, View.Expert_1,View.Expert_2, View.NClass_1,View.NClass_2, View.ZOc_1,View.ZOc_2 , View.Nom_Bis_1 , View.Nom_Bis_2, View.Present_1 ,View.Present_2 , View.WCF_Master, View.WCF_Ring, View.BreedShow, View.Paying, View.AddiNote, View.Selling, View.Titul_1,View.Title_1, View.Titul_2, View.Title_2 , View.NB_1, View.NB_2 from Animals, Заводчик,Владелец , View where Заводчик.ID_Breeder=Animals.ID_Breeder And Владелец.ID_owner=Animals.ID_Owner AND View.ID=(select ID from Data where Name='привт') And View.ID_Cat=Animals.ID_Cat And View.AddiList='true'


и выборку корректно делает только по нескольким переменным (у меня это 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  


QSqlTableModel *model = new QSqlTableModel(this,dbSql);
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model);


тут вроде все в порядке...


возможно проблема в подзапросах - попробуй без них.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Max Payne
  опции профиля:
сообщение 6.4.2012, 16:49
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(PAFOS @ 6.4.2012, 15:47) *
QSqlTableModel *model = new QSqlTableModel(this,dbSql);
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model);


тут вроде все в порядке...


возможно проблема в подзапросах - попробуй без них.


Таки нашел :
Цитата
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 на примерах" Юрия Земскова. Вот тут, например, можно скачать.

А от подзапросов можно избавиться, использовав 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) *
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
  опции профиля:
сообщение 8.4.2012, 14:52
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(PAFOS @ 6.4.2012, 15:47) *
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) *
Цитата
Detailed Description: The QSqlTableModel class provides an editable data model for a single database table
наследование QSqlQueryModel никак не исправляет это =/
Не мешайте в кучу dynamic_cast, QSqlTableModel и QSqlQueryModel.
Предлагаю для Вашего примера
1. забыть пока про dynamic_cast
2. забыть пока про QSqlTableModel
3. создать класс-наследник от класса QSqlQueryModel, указать в этом классе-наследнике, что данные в модели будут редактируемыми, переопределить в этом классе все необходимое для редактирования.

Max Payne, у Вас некорректно написано одно из условий в запросе. Вот это:
Цитата(Max Payne @ 6.4.2012, 10:20) *
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, пожалуйста, прочитайте, наконец, правила оформления сообщений :),
проанализируйте, что получается при нажатии разных кнопок, предназначенных для этого (не нажимая при этом кнопки "Отправить"),
используйте кнопку "Предварительный просмотр", если пишите не быстрый ответ,
а главное, не цитируйте Вы целыми сообщениями, это занимает много места и усложняет чтение.
А когда Вам задают вопросы, хорошо бы на них отвечать, а не игнорировать.

Успехов !
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 17.2.2025, 5:26