Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вычисляемый столбец в QSqlRelationalTableModel
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
nZil
Как вывести в один столбец два поля БД по такому шаблону <поле1> + " - " <поле2>?
ViGOur
QMySqlRelationalTableModel *model = new QMySqlRelationalTableModel;
model->setQuery("SELECT id + ' - '  + subject, sender, recipient, date, body FROM messages");
так?

QMySqlRelationalTableModel потому, что класс модели прийдется переопределять, так как QSqlRelationalTableModel::setQuery вроде protected.
nZil
переопределил.

void SqlRelationalTableModel::setSqlQuery(const QString &query)
{
    this->setQuery(QSqlQuery(query));
}

Запрос:
workersModel->setSqlQuery("SELECT id, incode, surname + \" \" + name + \" \" + lastname, birthdate, pseries, pnumber FROM workers");
Не получилось. В представлении отображаются все столбцы БД.
ViGOur
Полностью код приведи...
nZil
эмм... Метод setSqlQuery(const QString &query) это и есть весь код класса
nZil
Я недавно начал писать на Qt и вообще на объектно-ориентированных языках, так что тонкостей не знаю. я что то не так делаю?
Что надо ещё какиенить методы перегрузить?
Litkevich Yuriy
nZil, приведи код и класса SqlRelationalTableModel (весь, и заголовочник и реализацию)
и приведи код использования и модели и приедствления.


Справка по тэгам
nZil
Описание класса:
#ifndef SQLRELATIONALTABLEMODEL_H
#define SQLRELATIONALTABLEMODEL_H

#include <QSqlRelationalTableModel>
#include <QSqlQuery>

class SqlRelationalTableModel : public QSqlRelationalTableModel
{
public:
    SqlRelationalTableModel();
    void setSqlQuery (const QString &query);
};

#endif // SQLRELATIONALTABLEMODEL_H

и его реализация:
#include "sqlrelationaltablemodel.h"

SqlRelationalTableModel::SqlRelationalTableModel()
{}
void SqlRelationalTableModel::setSqlQuery(const QString &query)
{
    this->setQuery(QSqlQuery(query));
}



создание модели и представления:
void MWindow::createWorkersTab()
{
    workersModel = new SqlRelationalTableModel;
    workersModel->setTable("workers");
    workersModel->setHeaderData(0, Qt::Horizontal, tr("Number in database"));
    workersModel->setHeaderData(1, Qt::Horizontal, tr("Surname"));
    //workersModel->setSqlQuery("SELECT id, incode, surname + \" \" + name + \" \" + lastname, birthdate, pseries, pnumber FROM workers");
    workersModel->select();

    workersView = new QTableView;
    workersView->setModel(workersModel);
    workersView->setSortingEnabled(true);
    workersView->setAlternatingRowColors(true);
    workersView->setShowGrid(false);
    workersView->setSelectionBehavior(QAbstractItemView::SelectRows);
    workersView->setSelectionMode(QAbstractItemView::SingleSelection);
    //workersView->verticalHeader()->hide();
    workersView->resizeColumnsToContents();
    workersView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    main->addTab(workersView, QIcon (":/images/qt.png"), tr("Workers"));
}




Строка запроса закомментирована, ибо не правильно работает:(
ViGOur
А как ты делал и у тебя не работало, так?
    workersModel = new SqlRelationalTableModel;
    workersModel->setSqlQuery("SELECT id, incode, surname + \" \" + name + \" \" + lastname, birthdate, pseries, pnumber FROM workers");

    workersView = new QTableView;
    // ...
nZil
Цитата(ViGOur @ 3.9.2009, 12:15) *
А как ты делал и у тебя не работало, так?
    workersModel = new SqlRelationalTableModel;
    workersModel->setSqlQuery("SELECT id, incode, surname + \" \" + name + \" \" + lastname, birthdate, pseries, pnumber FROM workers");

    workersView = new QTableView;
    // ...


да
ViGOur
Кажется понял в чем проблема, если сделать тупо запрос приведенный тобой, то результат также будет не тот, который хотелось бы! :)
Попробуй так:
SELECT id, incode, CONCAT( surname, " ",  name,  " ", lastname), birthdate, pseries, pnumber FROM workers

по крайней мере под mysql работает... :)
nZil
а под SqLite не очень( Вот что нарыл http://www.forum.crossplatform.ru/index.ph...art=#entry21388
только как это реализовать не написано(
Litkevich Yuriy
Цитата(nZil @ 3.9.2009, 17:50) *
только как это реализовать не написано
Это реализованно в БД. Один из столбцов в таблице является вычисляемым.
Код для Firebird'а:
CREATE TABLE REFPOINT
(
  F_ID Integer NOT NULL,
  F_NAME D_NAME NOT NULL,
  F_OBJ D_NAME NOT NULL,
  F_SUBOBJ D_NAME DEFAULT '',
  F_OBJNAME COMPUTED BY (F_OBJ||' '||F_SUBOBJ)
  F_COMMENT D_COMMENT,
  F_REGDATE Timestamp NOT NULL,
  CONSTRAINT PK_REFPOINT PRIMARY KEY (F_ID),
  CONSTRAINT UK_REFPOINT UNIQUE (F_NAME)
);
ViGOur
Как вариант сделать вьюху, но вот только не знаю можно ее сделать для SqLite.
Но это только в том случае, если запрос напрямую к SqLite работает, а в модели нет.

Поэтому для начала нужно проверить правильно ли работает запрос... :)
nZil
Ясно что надо писать свои классы, на что нужно время, так что придется отложить это дело на неопределенный срок
Спасибо всем за внимание.
SABROG
Цитата(ViGOur @ 3.9.2009, 16:04) *
но вот только не знаю можно ее сделать для SqLite.


Можно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.