Russian Qt Forum

Qt => Базы данных => Тема начата: cya-st от Декабрь 05, 2009, 21:43



Название: Сообщения БД.
Отправлено: cya-st от Декабрь 05, 2009, 21:43
Всем привет.
Есть таблица (PostgreSQL):
Код
SQL
CREATE TABLE Test
(
 id SERIAL UNIQUE,
 DTPost TIMESTAMP NOT NULL,
 ...
 PricePost NUMERIC(10,2),
 PriceProd NUMERIC(10,2),
 CONSTRAINT m_SkladOsnid PRIMARY KEY (id),
 CONSTRAINT "PricePost >= 0" CHECK (PricePost >= 0),
 CONSTRAINT "PriceProd >= 0" CHECK (PriceProd >= 0)
);
 
Установлено CONSTRAINT, но при добавлении записи минусовое число (например PricePost= -1.00), запись не добавляется и не выводится сообщение CONSTRAINT. Запись добавляется в QTableViews. Подскажите пожалуйста как вывести сообщение.


Название: Re: Сообщения БД.
Отправлено: MoPDoBoPoT от Декабрь 05, 2009, 22:25
Из контекста догадываюсь, что ты пользуешся QSqlTableModel (или производным классом от него).
Узнать об ошибке можно вызвав метод  lastError().
В представлении ты видишь новую некорректную строку из-за стратегии редактирования QSqlTableModel::OnManualSubmit (все изменения в модели кэшируются до submitAll()/revertAll())
Если ты вводишь значения прямо во вьющке, то на нее можно повесить делегата, который будет накладывать заведомо известные ограничения. А если изменения производятся через диалог, то пользуйся валидоторами.


Название: Re: Сообщения БД.
Отправлено: cya-st от Декабрь 05, 2009, 22:37
Я вставляю прямо на вьюшке:
Код:
    md.insertRow(model->rowCount());
    md.submit();
Цитировать
В представлении ты видишь новую некорректную строку из-за стратегии редактирования QSqlTableModel::OnManualSubmit (все изменения в модели кэшируются до submitAll()/revertAll())
Если ты вводишь значения прямо во вьющке, то на нее можно повесить делегата, который будет накладывать заведомо известные ограничения. А если изменения производятся через диалог, то пользуйся валидоторами.
Не понял, поподробней можно?


Название: Re: Сообщения БД.
Отправлено: MoPDoBoPoT от Декабрь 06, 2009, 13:24
Кхм, просто в первом посте как-то неоднозначно было написано :)
...запись не добавляется и не выводится сообщение CONSTRAINT. Запись добавляется в QTableViews....
Я подумал что запись не добавляется в БД, но добавляется в модель (видна во вьюшке).

Код:
    md.insertRow(model->rowCount());
    md.submit();
А этот код тебе и не добавит запись в БД, т.к. запись пустая, а в таблице есть ОЦ DTPost TIMESTAMP NOT NULL
Перед submit() надо заполнить запись значениями. Для этого удобней воспользоваться методом QSqlTableModel::insertRecord().


Название: Re: Сообщения БД.
Отправлено: cya-st от Декабрь 07, 2009, 17:31
Вообщето добавляет запись даже без submit. После выполнения md.insertRow(model->rowCount());, появляется новая строка, где я ввожу данные. Но если PricePost я введу меньше нуля, то запись не добавляется и не появляется сообщение CONSTRAINT, вопрос в том, как мне этот CONSTRAINT показать?


Название: Re: Сообщения БД.
Отправлено: MoPDoBoPoT от Декабрь 07, 2009, 18:31
Вообщето добавляет запись даже без submit.
В БД добавляется?
вопрос в том, как мне этот CONSTRAINT показать?
Метод QSqlTableModel::submit() возвращает признак успеха/неуспеха операции. Для получения доступа к информации об ошибках используй QSqlTableModel::lastError(). А для отображения ошибки есть QMessageBox.


Название: Re: Сообщения БД.
Отправлено: cya-st от Декабрь 07, 2009, 20:06
Заработало. Спасибо.