Russian Qt Forum
Ноябрь 23, 2024, 15:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не сохраняется новая запись в БД Postgres  (Прочитано 6115 раз)
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()); // удаление текущей строки из базы данных
    }
Записан
VPS
Гость
« Ответ #1 : Апрель 13, 2013, 14:52 »

Добавляет ли код
Код:
model->insertRow(model->rowCount()); // добавление информации в базу данных
пустую строку в конце представления?

Если вставка происходит, то по умолчанию, если я правильно понял, у Вас стратегия редактирования "OnRowChange". Вы пробовали после вставки новой строки выбрать другую, или добавить ещё одну?
« Последнее редактирование: Апрель 13, 2013, 14:57 от vps » Записан
gbcesc
Гость
« Ответ #2 : Апрель 13, 2013, 14:57 »

Да,пустая строчка появляется. Слева,где идет нумерация строк, номера нет, а стоит *. А если вставить строчку, и например нажать на верхнюю,то значение из верхней перейдет в только что вставленную.
« Последнее редактирование: Апрель 13, 2013, 15:02 от gbcesc » Записан
VPS
Гость
« Ответ #3 : Апрель 13, 2013, 15:23 »

Попробуйте вставить пустую строку, заполнить её, а уже потом перевести фокус на новую.
Будет ли в этом случае она сохраняться?
Записан
gbcesc
Гость
« Ответ #4 : Апрель 13, 2013, 15:35 »

вставил пустую, заполнил всю. При нажатии на остальные поля таблицы данные из них не переносятся в новую. Но стоило выйти из программы и снова ее запустить,так введенная строка исчезла..данные не сохранились.
Записан
VPS
Гость
« Ответ #5 : Апрель 13, 2013, 15:47 »

Попробуйте изменить стратегию на OnFieldChange.
Записан
gbcesc
Гость
« Ответ #6 : Апрель 13, 2013, 15:49 »

Поставил. В уже созданных строках изменения сохраняются,но если добавить новую и заполнить ничего не происходит. все тоже самое. А Вы бы не могли посмотреть программу целиком? Если я все файлы залью.
« Последнее редактирование: Апрель 13, 2013, 16:00 от gbcesc » Записан
VPS
Гость
« Ответ #7 : Апрель 13, 2013, 16:05 »

А Вы бы не могли посмотреть программу целиком? Если я все файлы залью.
Конечно заливайте, если не закрытые исходники - хуже не будет.
Записан
gbcesc
Гость
« Ответ #8 : Апрель 13, 2013, 16:09 »

Был бы Вам очень благодарен,если посмотрите весь код)
Записан
VPS
Гость
« Ответ #9 : Апрель 13, 2013, 23:05 »

gbcesc, посмотри вложение (оставлено взаимодействие с одной таблицей).
Чтобы представление восприняло вставку новой строки, необходимо нажимать enter после окончания ввода данных...
Ну или для вставки новой строки можно создавать форму с нужными полями и уже вставлять данные самому.

П.С.:
В книге "Бланшет,Саммерфилд - QT4 Программирование GUI на С++" довольно неплохо написано, как работать с таблицами с внешними ключами...
Записан
gbcesc
Гость
« Ответ #10 : Апрель 14, 2013, 11:39 »

vps, спасибо Вам огромное что откликнулись на мою проблему)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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