Russian Qt Forum

Qt => Базы данных => Тема начата: gbcesc от Апрель 13, 2013, 12:57



Название: Не сохраняется новая запись в БД Postgres
Отправлено: gbcesc от Апрель 13, 2013, 12:57
Всем добрый день. Столкнулся с одной проблемой и не могу понять,что не так. Есть программа для работы с Базой Данных Postgres, подключение - все проходит успешно, таблица выводится. Удалить последнюю строку получается и это изменение сохраняется в саму БД, а вот добавить новую строку,чтобы она сохранилась никак не выходит. Помогите пожалуйста и скажите,что в коде не так? В Qt я новичок.

Код:

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QMessageBox>
#include <QtSql/QSqlTableModel>
#include <QDataWidgetMapper>
#include <QMessageBox>
#include <QSqlQuery>
#include <QFile>
#include <QSqlRelationalDelegate>
#include <QSqlError>
#include <QApplication>
#include <QPushButton>
#include <QPrinter>
#include <QTextDocument>
#include <QPrintDialog>
#include <QTextCodec>
#include <QSqlQueryModel>
#include "dialog.h"
#include "dialog2.h"

MainWindow::MainWindow(QApplication *a, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTextCodec *codec = QTextCodec::codecForName("CP1251");
    codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForLocale(codec);

    ui->tw->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

    ui->tw->setItemDelegate(new QSqlRelationalDelegate(ui->tw));
    ui->tw->setWindowTitle("Информационная система торговой организации");

    QSqlDatabase db=QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setPort(5432);
    db.setDatabaseName("postgres");
    db.setUserName("postgres");
    db.setPassword("123123");

    if (!db.open())
    {
        QMessageBox::critical(parent,QObject::tr("Database Error"),db.lastError().text());
    }

    QSqlTableModel *model=new QSqlTableModel;
    model->setTable("trade");

    if (model->lastError().isValid() )
    {
       QMessageBox::critical(parent,QObject::tr("Query Error"),model->lastError().text());
    }

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Номер точки"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Тип торговой точки"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Число торговых залов"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Платежи за аренду, руб."));
    model->setHeaderData(4, Qt::Horizontal, QObject::tr("Коммунальные услуги, руб."));

    model->select();
    ui->tw->setModel(model);
    this->model = model;
    ui->tw->show();

    model->submitAll();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionExit_triggered()
{
    QMessageBox::information(0,"Info","exit pressed.");
}

void MainWindow::on_action_triggered()
{

    QSqlTableModel *model=new QSqlTableModel;

    model->setTable("trade");
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Номер точки"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Тип торговой точки"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Число торговых залов"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Платежи за аренду, руб."));
    model->setHeaderData(4, Qt::Horizontal, QObject::tr("Коммунальные услуги, руб."));

    model->select();
    ui->tw->setModel(model);
    delete this->model;
    this->model = model;
ui->tw->show();

}

void MainWindow::on_action_8_triggered()
    {
    model->insertRow(model->rowCount()); // добавление информации в базу данных
    }

void MainWindow::on_action_9_triggered()
    {
                model->removeRow(ui->tw->currentIndex().row()); // удаление текущей строки из базы данных
    }


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: VPS от Апрель 13, 2013, 14:52
Добавляет ли код
Код:
model->insertRow(model->rowCount()); // добавление информации в базу данных
пустую строку в конце представления?

Если вставка происходит, то по умолчанию, если я правильно понял, у Вас стратегия редактирования "OnRowChange". Вы пробовали после вставки новой строки выбрать другую, или добавить ещё одну?


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: gbcesc от Апрель 13, 2013, 14:57
Да,пустая строчка появляется. Слева,где идет нумерация строк, номера нет, а стоит *. А если вставить строчку, и например нажать на верхнюю,то значение из верхней перейдет в только что вставленную.


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: VPS от Апрель 13, 2013, 15:23
Попробуйте вставить пустую строку, заполнить её, а уже потом перевести фокус на новую.
Будет ли в этом случае она сохраняться?


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: gbcesc от Апрель 13, 2013, 15:35
вставил пустую, заполнил всю. При нажатии на остальные поля таблицы данные из них не переносятся в новую. Но стоило выйти из программы и снова ее запустить,так введенная строка исчезла..данные не сохранились.


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: VPS от Апрель 13, 2013, 15:47
Попробуйте изменить стратегию на OnFieldChange.


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: gbcesc от Апрель 13, 2013, 15:49
Поставил. В уже созданных строках изменения сохраняются,но если добавить новую и заполнить ничего не происходит. все тоже самое. А Вы бы не могли посмотреть программу целиком? Если я все файлы залью.


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: VPS от Апрель 13, 2013, 16:05
А Вы бы не могли посмотреть программу целиком? Если я все файлы залью.
Конечно заливайте, если не закрытые исходники - хуже не будет.


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: gbcesc от Апрель 13, 2013, 16:09
Был бы Вам очень благодарен,если посмотрите весь код)


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: VPS от Апрель 13, 2013, 23:05
gbcesc, посмотри вложение (оставлено взаимодействие с одной таблицей).
Чтобы представление восприняло вставку новой строки, необходимо нажимать enter после окончания ввода данных...
Ну или для вставки новой строки можно создавать форму с нужными полями и уже вставлять данные самому.

П.С.:
В книге "Бланшет,Саммерфилд - QT4 Программирование GUI на С++" довольно неплохо написано, как работать с таблицами с внешними ключами...


Название: Re: Не сохраняется новая запись в БД Postgres
Отправлено: gbcesc от Апрель 14, 2013, 11:39
vps, спасибо Вам огромное что откликнулись на мою проблему)