crossplatform.ru

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

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


Студент
*

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

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




Репутация:   0  


База данных:
dbSql = QSqlDatabase::addDatabase("QSQLITE","SqlConnection");
    dbSql.setHostName("locallhost");
    dbSql.setDatabaseName("Pan_Kot.db");
    dbSql.setUserName("Max");
    dbSql.setPassword("qwerty");
    QFile qw;
    if (!dbSql.open("Max","qwerty"))
    {
        QMessageBox::critical(this,tr(" Ошибка "),tr("Ошибка при создании базы данных, убедитесь что вы имеете необходимые права для создания файла базы данных : \n ").append(dbSql.lastError().databaseText()));
        return(false);
    }


и запрос:
"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=1 And View.ID_Cat=Animals.ID_Cat And View.AddiList='false'"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 10.4.2012, 16:06
Сообщение #22


Участник
**

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

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




Репутация:   4  


Еще раз внимательно читаем пример в книге Земскова:
1.
sql.exec( tr(
        "create table employee ( "
        "  id integer PRIMARY KEY, "
        "  name char(30) not null, "
        "  born date null, "
        "  salary numeric(12,2), "
        "  married boolean null ) " ) );
Заметим, что
id - 0-е поле таблицы employee, ПК
name - 1-е поле таблицы employee.

2.
void MyModel::refresh(){
    setQuery("select * from employee...");
    ...
}
Заметим, что запрашиваются все поля таблицы employee, то есть
в 0-й колонке модели окажется employee.id,
в 1-й колонке модели окажется employee.name.

3.
setData у Земского
bool MyModel::setData(const QModelIndex &index,const QVariant &value,int /* role */)
{
    if (index.column() < 1 || index.column() > 4)
        return false;

    //во входном параметре - index той ячейки, которую редактируем,
    //при том, известны index.column() и index.row():
    //index.column() - колонка, которой принадлежит редактируемая ячейка
    //index.row() - запись, которой принадлежит редактируемая ячейка

    //чтобы обновить запись в таблице employee,
    //надо вычислить для редактируемой записи таблицы
    //значения каждого из полей, составляющих первичный ключ
    //(в данном случае в состав ПК входит одно поле, но может быть и несколько)

    //так как в таблице employee ПК - это employee.id (0-е поле),
    //а в setQuery запрашиваются все поля,
    //то мы получаем primaryKeyIndex
    QModelIndex primaryKeyIndex = QSqlQueryModel::index(
            index.row(), //указывая на текущую строку модели и
            0); //указывая на 0-ю колонку модели
    //получаем id, учитывая типа поля
    int id = QSqlQueryModel::data(primaryKeyIndex).toInt();

    bool ok;
    QSqlQuery query;

    if (index.column() == 1) { //заметим, что сюда мы попадаем,
        //когда редактируем 1-ю колонку модели
        query.prepare("update employee set name = ? where id = ?");
        //соответственно и обновляем мы поле name в текущей записи
        query.addBindValue(value.toString());
        query.addBindValue(id);
    }
    ...
    ok = query.exec();
    refresh();
    return ok;
}
4.
а у Вас, Max Payne, в setData:
if (index.column() != 1)
        return false;

//так как Ваш запрос начинается со слов "select Animals.Код_Породы,...",
//то в 0-й колонке модели у Вас Animals.Код_Породы,
//а Вы тут обращаетесь к 0-й колонке модели, чтобы вытащить значение ПК Animals.ID_Cat,
//которого в ней сейчас нет
QModelIndex primaryKeyIndex = QSqlQueryModel::index(
        index.row(), //указываете на текущую строку модели и
        0); //указываете на 0-ю колонку модели
//Код_Породы имеет тип VARCHAR, а Вы его пытаетесь прочесть как целое
int id = QSqlQueryModel::data(primaryKeyIndex).toInt();

//чтобы в модели оказалась колонка с ПК,
//надо включить соотв. поле таблицы в запрос

bool ok;
qDebug() <<value;
QSqlQuery query;
if ((index.column() == 1))
{
    query.prepare("update Animals set Код_Окраса=? where ID_Cat=?");
    query.addBindValue(value);
    query.addBindValue(id);
}
ok = query.exec(); //надо вычислить ok, чтобы его вернуть
if (!ok) qDebug() << query.lastError().text();
this->submit(); //а у Земскова и без submit() работает редактирование
refresh();
return ok;


Сообщение отредактировал Steklova Olga - 11.4.2012, 9:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Max Payne
  опции профиля:
сообщение 12.4.2012, 19:51
Сообщение #23


Студент
*

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

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




Репутация:   0  


С этим разобрался большое спасибо =) Еще такой вопрос, с делал модель с пустой строчкой в конце для добавления новой записи и назначил всем колонкам нужные делегаты. Теперь при обычном редактировании любой ячейки, значение с этой ячейки копируется в конец таблицы .
Вот код:

tabM = new QSqlTableModel (this,dbSql);   //модель обьявлена глобально
tabM->setTable(ob);
tabM->setEditStrategy(QSqlTableModel::OnRowChange);
tabM->select();
ui->tableView->setModel(tabM);
tabM->insertRow(tabM->rowCount());

Как мне избежать дублирования данных в конец в пустую строку ? Заранее спасибо .
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 13.4.2012, 13:53
Сообщение #24


Участник
**

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

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




Репутация:   4  


Могу посоветовать следующее.
--------------------------------
Беспл и без рег скачать серьезную книгу по Qt (если у Вас ее еще нет) тут:
Link
(Qt 4. Программирование GUI на C++ (+ CD) 2-е издание
Автор: Жасмин Бланшет, Марк Саммерфилд
Размер файла: 12.5 мб
Тип файла: DjVu
Язык: Русский)
В одном архиве с книгой там есть все примеры из книги.

Предлагаю посмотреть проект staffmanager.pro.
Текст проекта см в папке Examples | qt-book | chap13 | staffmanager.
Описание проекта см в части II в главе 13 в пунктах "Редактирование данных с использованием форм", "Представление данных в табличной форме".
Обратите внимание на рис. 13.3 на стр. 330 книги, рис. 13.4 на стр. 336 и метод addDepartment на стр. 340.

Там ВСТАВЛЯЮТ НОВУЮ СТРОКУ в конец таблицы, делают эту строку текущей и запускают редактирование нужной ячейки в этой строке ПРИ НАЖАТИИ КНОПКИ "Add Dept". Еще там есть кнопка "Delete Dept".
Мне кажется, и Вам, Max Payne, в проекте надо сделать аналогичные кнопки и их обработку.

--------------------------------
Еще ссылки на книги:
Link
Link
--------------------------------
Может быть, будет полезным этот пример в Qt Creator:
SQL | Music Archive (проект masterdetail.pro)
--------------------------------
P.S. я сама еще не до конца разобралась с проектом staffmanager, так что, давайте учиться вместе :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.12.2025, 15:45