crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QSqlRelationTableModel->submitAll() ошибка No Fields to update"
mishabard
  опции профиля:
сообщение 6.7.2011, 15:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

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




Репутация:   0  


Добрый день! Вот код в кратце. Выбрал все самое нужно. Все работает, данные обновляются или добовляются,
но в дебаге выскакиевает ошибка: No Fields to update".

В программе используется следующая модель:
QSqlRelationTableModel * model;
QTableView *view;

Создаю диалоговое окно для обновления или добавления записей в таблицу. Впринципе все сделал на основе примера из Qt


вот конструктор диалогвого окна, для добавления новой записи в QSqlRelationTableModel
передаю в него указатель view на TableView

{
.....
QAbstractItemModel * model;[size="1"][/size]

    model = view->model();
    mapper = new QDataWidgetMapper(this);
    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
    mapper->setModel(model);
  
    mapper->addMapping(pdataCrt, ((QSqlRelationalTableModel*)model)->fieldIndex("datacrt"));
    mapper->addMapping(pSumma, ((QSqlRelationalTableModel*)model)->fieldIndex("summa"));
    .....
    mapper->setCurrentModelIndex(view->currentIndex());

  
        int row = mapper->currentIndex();
        model->insertRow(row);
        mapper->setCurrentIndex(row);
   .......
        pSumma->clear();
        pdataCrt->setDate(QDate::currentDate());
        pSumma->setFocus();

....
}

Если пользователь нажимает ОК в диалоговом окне то делаю
void Carta::accept()
{

    mapper->submit()

    QDialog::accept();
}

Вот процедура, которая вызывает диалоговое окно
void MainWindow::addRect()
{
    pCarta = new Carta(kassaView,-1);
    if (pCarta->exec()==QDialog::Accepted)
    {
        if (!model->submit());
        {
    
          qDebug()<<"Ошибка"+model->lastError().text();[color="#FF0000"]ошибка: No Fields to update". [/color]
        }
    }
    else
        qDebug()<<"Отмена добавления записи";

    delete pCarta;
    pCarta=0;


}

Вроде все добавляет в базу(хотя через раз вроде), но выскакивает ошибка, и не позволяет обробатывать действительно проблемы со вствкой записей.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mishabard
  опции профиля:
сообщение 6.7.2011, 16:42
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

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




Репутация:   0  


РЕШЕНО!!!
Целый день занимался проблемой, и только как написал вопрос на форум, сразу понял всем проблема. НЕВНИМАТЕЛЬНОСТЬ!

Я в mapper использую
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);

а в главной модели стоит стратеги по умолчанию т.е QSqlTableModel::OnFieldChange.

Просто дописал строку при настройке модели:

Model->setEditStrategy(QSqlTableModel::OnManualSubmit);
Все работает!!!!
Теперь обновления в базу данных происходят только по model->submitAll();


Поторопился!!!!((((( :(

Теперь при model->submitAll() возвращает false, но в model->lastError().text возвращает пустую строку.
Подскажите что еще я не учел?

ПС : Данные в базу записываются.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.7.2011, 18:34
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


как-то я уже упоминал, что Мапер сам делает submitAll(), поэтому второй (model->submitAll()) лишний. ЛОЖЬ вернётся, потому что нечего фиксировать в БД, а сообщения об ошибке нет, так как и ошибки, собственно, нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mishabard
  опции профиля:
сообщение 6.7.2011, 19:02
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 6.7.2011, 18:34) *
как-то я уже упоминал, что Мапер сам делает submitAll(), поэтому второй (model->submitAll()) лишний. ЛОЖЬ вернётся, потому что нечего фиксировать в БД, а сообщения об ошибке нет, так как и ошибки, собственно, нет.


Знаю! Читал! Только что специально еще раз перепроверил. Не работает!

если сделать mapper->submit();
Но не сделать model->submitAll(), то данные в модели остаются до первой ее обновления из базы, например сортировки колонки
Если сделать model->submitAll() то, я уже проверил, model->errorLast().type() возвращает QSqlError::NoError. т.е. ошибки действительно нет. Значит мне нужно при mapper->submit() еще что-то делать, что , пока не понимаю

Может из-за QSqlRelationTableModel?

У меня Furebird2.1 QT 4.7

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.7.2011, 21:55
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(mishabard @ 6.7.2011, 22:02) *
Может из-за QSqlRelationTableModel?

У меня Furebird2.1 QT 4.7
именно при таком сочетании, я сделал вот такое печальное открытие

надо порыть в закромах, вроде с мапером я всё таки что-то сделал. Помню только, что код я по уродовал порядком.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 13.12.2024, 10:42