Russian Qt Forum

Qt => Базы данных => Тема начата: PavelS от Февраль 17, 2017, 12:08



Название: QTableView+model ошибки UPDATE
Отправлено: PavelS от Февраль 17, 2017, 12:08
Редактируются данные через связку QTableView+model. На модель поставлена setEditStrategy(OnFieldChange), т.е. сбрасываю данные с GUI в DB почаще. База (PostgreSQL), в ней насверлено много view, соответственно триггеры. Как правило всё работает. Иногда триггеры оказываются не совсем правильно написанными и падают при update, т.е. при редактировании, т.е. SQL-запрос с update даёт ошибку при исполнении.

Суть проблемы: в пользовательском интерфейсе совершенно нет сообщений о возникающих ошибках, кажется что всё ОК, когда не ОК. Приходится закрывать приложение, потом открывать заново и смотреть, сохранилось ли хоть что-то, что маразм. Хочу ловить и сигналить, что редактирование завершилось ошибкой. Как это сделать?

Qt5.3 (последняя сертифицированная мин.обороны)

В инет видел точно те же вопросы, без ответов (https://bugreports.qt.io/browse/QTBUG-45468)...


Название: Re: QTableView+model ошибки UPDATE
Отправлено: panAlexey от Февраль 17, 2017, 13:21
Возможно лучше будет генерировать формы и ими уже рулить?


Название: Re: QTableView+model ошибки UPDATE
Отправлено: vic57 от Февраль 17, 2017, 16:29
если QSqlTableModel, то она наследуется от QSqlQueryModel, там есть lastError(). знатоки советуют QSqlQueryModel с переопределенной TableView для редактирования
чтобы увидеть изменения можно задать фильтр типа
Код:
model->setFilter("id is not null");


Название: Re: QTableView+model ошибки UPDATE
Отправлено: PavelS от Февраль 17, 2017, 16:57
Вик, благодарю за ответ, однако
1) чтобы вызывать LastError нужно событие, а я его не знаю, никто не подскажет? Когда в таблице заканчивается редактирование, прошел update и LastError даст актуальную инфомацию?
2) ID проблем не вызывает, проблемы с update обычных полей. Если триггер сломался, или же просто забыть его проинсталлить, то тогда таблица отображается ОК, но после редактирования ничего не сохраняется.


Пан Алексей, я не понял ответа про формы и рулить. Нельзя ли поподробней? Формы есть, а что рулить?


Название: Re: QTableView+model ошибки UPDATE
Отправлено: vic57 от Февраль 17, 2017, 17:47
для записи изменений вызывается submit(), submitAll(). по докам они возвращают true/false
имхо SqlQueryModel более прозрачна
у Земскова Ю. есть книги по Qt, там прям пример есть такой  
ЗЫ нашел в архиве


Название: Re: QTableView+model ошибки UPDATE
Отправлено: vic57 от Февраль 17, 2017, 19:51
или проще можно
model.h
Код:
class Model : public QSqlTableModel {
    Q_OBJECT
public:
    Model(QObject* parent=0,QSqlDatabase db=QSqlDatabase());
public slots:
    bool submit();
    bool submitAll();
};
model.cpp
Код:
Model::Model(QObject *parent,QSqlDatabase) : QSqlTableModel(parent) {}

bool Model::submit() {
    bool ret = QSqlTableModel::submit();
    if (!ret) qDebug() << Model::lastError().text();
    return ret;
}

bool Model::submitAll() {
    bool ret = QSqlTableModel::submitAll();
    if (!ret) qDebug() << Model::lastError().text();
    return ret;
}


Название: Re: QTableView+model ошибки UPDATE
Отправлено: panAlexey от Февраль 20, 2017, 10:11
Пан Алексей, я не понял ответа про формы и рулить. Нельзя ли поподробней? Формы есть, а что рулить?
Пусть не модель сабминтит, а созданная тобой форма, и запрос писать руками и обрабатывать коды возврата.
Только это геморойно и что-бы гемороя избежать нужны метаданные и генератор форм.

Однако vic57 предложил более удобную реализацию.


Название: Re: QTableView+model ошибки UPDATE
Отправлено: vic57 от Февраль 20, 2017, 16:22
для удобства можно еще сигнал прикрутить :)
Код
C++ (Qt)
//model.h
class Model : public QSqlTableModel {
   Q_OBJECT
public:
   Model(QObject* parent=0,QSqlDatabase db=QSqlDatabase());
public slots:
   bool submit();
   bool submitAll();
signals:
   void sqlError(const QString &);
};
 
Код
C++ (Qt)
//model.cpp
Model::Model(QObject *parent,QSqlDatabase) : QSqlTableModel(parent) {}
 
bool Model::submit() {
   bool ret = QSqlTableModel::submit();
   if (!ret) emit sqlError(QSqlTableModel::lastError().text());
   return ret;
}
 
bool Model::submitAll() {
   bool ret = QSqlTableModel::submitAll();
   if (!ret) emit sqlError(QSqlTableModel::lastError().text());
   return ret;
}
 


Название: Re: QTableView+model ошибки UPDATE
Отправлено: PavelS от Февраль 21, 2017, 16:11
Принято. Перегрузить submit, submitAll в модели и так ловить ошибки. Попробую так.