Russian Qt Forum

Qt => Базы данных => Тема начата: chu от Март 02, 2011, 22:49



Название: setQuery и qSqlTableModel
Отправлено: chu от Март 02, 2011, 22:49
в документации:
Цитировать
void QSqlTableModel::setQuery ( const QSqlQuery & query )   [protected]
Эта функция просто вызывает QSqlQueryModel::setQuery(query). Вы не должны, как правило, вызывать её для QSqlTableModel. Вместо этого используйте setTable(), setSort(), setFilter() и т.д. для создания запроса.
Мне нужен результат запроса:
Код:
SELECT title, SUM(sum) 
FROM `details`
GROUP BY title
как его записать с помощью setTable(), setSort(), setFilter() я без понятия.
поэтому решил проверить:
Код:
    detModel = new QSqlTableModel;
    detModel->setQuery(QString("SELECT title, SUM(sum)"
                                 "FROM `details`"
                                 "GROUP BY title"));

оказалось что ", как правило,"==правилу!
как это решается?


Название: Re: setQuery и qSqlTableModel
Отправлено: kowsan от Март 03, 2011, 01:17
QSqlQueryModel


Название: Re: setQuery и qSqlTableModel
Отправлено: chu от Март 03, 2011, 01:34
QSqlQueryModel
я в курсе, что  с QSqlQueryModel функция работает, но хотелось бы узнать как выполнить запрос, используя QSqlTableModel


Название: Re: setQuery и qSqlTableModel
Отправлено: serg_hd от Март 03, 2011, 03:00
Код
C++ (Qt)
 
 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "connection_1");
 db.setHostName("localhost");
 db.setDatabaseName("mydb");
 db.setUserName("root");
 db.setPassword("123456");
 if (db.open())
 {
   QSqlTableModel* model = new QSqlTableModel(this, QSqlDatabase::database("connection_1"));
   model->setTable("test_table"); //выбираем таблицу
   model->setFilter("id = 22350"); //делаем фильтр (как если бы написали в запросе "WHERE id = 22350")
   model->select();
   QString field_value = model->record(0).value("name").toString(); //берём name из результата, первая строка
   qDebug() << field_value; //смотрим на значение по полю `name`
 }
 else
  qDebug() << db.lastError().text();
 

C QSqlTableModel::setSort() думаю понятно - простая сортировка, по возрастанию (параметр Qt::AscendingOrder) и убыванию (Qt::DescendingOrder).


Название: Re: setQuery и qSqlTableModel
Отправлено: chu от Март 03, 2011, 03:34
Код
C++ (Qt)
 
 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "connection_1");
 db.setHostName("localhost");
 db.setDatabaseName("mydb");
 db.setUserName("root");
 db.setPassword("123456");
 if (db.open())
 {
   QSqlTableModel* model = new QSqlTableModel(this, QSqlDatabase::database("connection_1"));
   model->setTable("test_table"); //выбираем таблицу
   model->setFilter("id = 22350"); //делаем фильтр (как если бы написали в запросе "WHERE id = 22350")
   model->select();
   QString field_value = model->record(0).value("name").toString(); //берём name из результата, первая строка
   qDebug() << field_value; //смотрим на значение по полю `name`
 }
 else
  qDebug() << db.lastError().text();
 

C QSqlTableModel::setSort() думаю понятно - простая сортировка, по возрастанию (параметр Qt::AscendingOrder) и убыванию (Qt::DescendingOrder).
я знаю как пользоваться setSort(), setFilter().
Вопрос: как вывести результат запроса:
Цитировать
SELECT title, SUM(sum)
FROM `details`
GROUP BY title
то есть объединить повторяющиеся title и сложить их sum


Название: Re: setQuery и qSqlTableModel
Отправлено: serg_hd от Март 03, 2011, 03:41
а если использовать QSortFilterProxyModel как прослойку между моделью и видом?


Название: Re: setQuery и qSqlTableModel
Отправлено: chu от Март 03, 2011, 03:56
а если QSortFilterProxyModel как прослойку между моделью и видом?
наверное можно... но я пока ещё не знаком с QSortFilterProxyModel, надо будет изучить.
может быть поможешь с примером её применения к моей задаче? :)


Название: Re: setQuery и qSqlTableModel
Отправлено: alexman от Март 03, 2011, 08:04
а если QSortFilterProxyModel как прослойку между моделью и видом?
наверное можно... но я пока ещё не знаком с QSortFilterProxyModel, надо будет изучить.
может быть поможешь с примером её применения к моей задаче? :)
Нафига QSqlTableModel ??? Для таких запросов есть QSqlQueryModel.


Название: Re: setQuery и qSqlTableModel
Отправлено: Troglodit от Март 03, 2011, 23:39
Сделайте вьюху из этого запроса, и все будет так, как вы  хотели. Если СУБД использует редактируемые вью,то даже без проблем редактирование.