Russian Qt Forum
Март 25, 2017, 02:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView+model ошибки UPDATE  (Прочитано 624 раз)
PavelS
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« : Февраль 17, 2017, 12:08 »

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

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

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

В инет видел точно те же вопросы, без ответов...
« Последнее редактирование: Февраль 17, 2017, 12:11 от PavelS » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 838

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #1 : Февраль 17, 2017, 13:21 »

Возможно лучше будет генерировать формы и ими уже рулить?
Записан

Win Xp SP-2, Qt4.3.4/MinGW.
vic57
Новичок

Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #2 : Февраль 17, 2017, 16:29 »

если QSqlTableModel, то она наследуется от QSqlQueryModel, там есть lastError(). знатоки советуют QSqlQueryModel с переопределенной TableView для редактирования
чтобы увидеть изменения можно задать фильтр типа
Код:
model->setFilter("id is not null");
« Последнее редактирование: Февраль 17, 2017, 16:47 от vic57 » Записан
PavelS
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #3 : Февраль 17, 2017, 16:57 »

Вик, благодарю за ответ, однако
1) чтобы вызывать LastError нужно событие, а я его не знаю, никто не подскажет? Когда в таблице заканчивается редактирование, прошел update и LastError даст актуальную инфомацию?
2) ID проблем не вызывает, проблемы с update обычных полей. Если триггер сломался, или же просто забыть его проинсталлить, то тогда таблица отображается ОК, но после редактирования ничего не сохраняется.


Пан Алексей, я не понял ответа про формы и рулить. Нельзя ли поподробней? Формы есть, а что рулить?
« Последнее редактирование: Февраль 17, 2017, 16:59 от PavelS » Записан
vic57
Новичок

Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #4 : Февраль 17, 2017, 17:47 »

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

Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #5 : Февраль 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;
}
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 838

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Февраль 20, 2017, 10:11 »

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

Однако vic57 предложил более удобную реализацию.
« Последнее редактирование: Февраль 20, 2017, 10:15 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW.
vic57
Новичок

Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #7 : Февраль 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;
}
 
« Последнее редактирование: Февраль 20, 2017, 16:30 от vic57 » Записан
PavelS
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #8 : Февраль 21, 2017, 16:11 »

Принято. Перегрузить submit, submitAll в модели и так ловить ошибки. Попробую так.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.151 секунд. Запросов: 22.