#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "editdialog.h"
#include "finddialog.h"
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->splitter->setStretchFactor(1, 2);
//делаем неактивными кнопки для работы с таблицей
ui->openButton->setEnabled(false);
ui->editButton->setEnabled(false);
ui->createButton->setEnabled(false);
ui->removeButton->setEnabled(false);
ui->findButton->setEnabled(false);
ui->resetButton->setEnabled(false);
//уставливаем параметры соединения по умолчанию
ui->DSNEdit->setText(tr("DEFAULT"));
//установка слотов на сигналы нажатия кнопок
connect(ui->exitButton, SIGNAL(clicked()), this, SLOT(close()));
connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(dbConnect()));
connect(ui->openButton, SIGNAL(clicked()), this, SLOT(dbOpen()));
connect(ui->findButton, SIGNAL(clicked()), this, SLOT(dbFind()));
connect(ui->resetButton, SIGNAL(clicked()), this, SLOT(dbReset()));
connect(ui->createButton, SIGNAL(clicked()), this, SLOT(dbCreate()));
connect(ui->editButton, SIGNAL(clicked()), this, SLOT(dbEdit()));
connect(ui->removeButton, SIGNAL(clicked()), this, SLOT(dbRemove()));
}
//функция-слот соединения с БД
void MainWindow::dbConnect()
{
//устанавливаем параметры соединения
db = QSqlDatabase::addDatabase("QODBC3");
db.setDatabaseName(ui->DSNEdit->text());
//открытие БД
if(!db.open())
QMessageBox::warning(this, tr("Ошибка соединения с базой данных"),
db.lastError().text());
else
{
QMessageBox::information(this, tr("Статус соединения"),
tr("Соединение установлено"));
}
//делаем активными кнопки действий с таблицей
ui->openButton->setEnabled(true);
ui->createButton->setEnabled(true);
ui->removeButton->setEnabled(true);
}
//функция-слот открытия таблицы
void MainWindow::dbOpen()
{
//связываем модель с дескриптором соединения
model = new QSqlTableModel(this, db);
model->setTable("Books");
model->setSort(0, Qt::AscendingOrder);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//попытка выборки
if(!model->select())
{
QMessageBox::warning(this, tr("Ошибка. Невозможно открыть таблицу"),
model->lastError().text());
return;
}
//связываем представление с моделью
ui->dbTable->setModel(model);
//устанавливаем параметры представления
ui->dbTable->setEditTriggers(QTableView::NoEditTriggers);
ui->dbTable->hideColumn(table_cover);
ui->dbTable->resizeColumnsToContents();
ui->dbTable->setCurrentIndex(model->index(0, 0));
//делаем активными кнопки действий с таблицей
ui->editButton->setEnabled(true);
ui->findButton->setEnabled(true);
ui->resetButton->setEnabled(true);
}
//функция-слот создания таблицы
void MainWindow::dbCreate()
{
//проверка на наличие таблицы в БД
if(db.tables().contains("Books") )
{
QMessageBox::warning(this, tr("Ошибка создания"),
tr("Таблица уже создана. Отменено"));
return;
}
QSqlQuery query;
//задаем скрипты для создания таблицы, последовательности
// и триггера
QString table_statement = "CREATE table books ("
"id NUMBER NOT NULL,"
"name VARCHAR(30) NOT NULL PRIMARY KEY AUTOINCREMENT,"
"auth VARCHAR(30) NOT NULL,"
"dill VARCHAR(30) NOT NULL,"
"date DATE NOT NULL,"
"howm VARCHAR(5) NOT NULL,"
"howc VARCHAR(5) NOT NULL,"
"cover BLOB ";
// QString sequence_statement = "CREATE sequence BOOKS_SEQ";
// QString trigger_statement = "CREATE trigger BI_BOOKS "
// "before insert on BOOKS "
// "for each row "
// "begin "
// "if :NEW.NOM is null then "
// "select BOOKS_SEQ.nextval into :NEW.NOM from dual;"
// "end if;"
// "end; ";
query.exec(table_statement);
//query.exec(sequence_statement);
// query.exec(trigger_statement);
//выводим статус создания
QMessageBox::information(this, tr("Статус создания"),
tr("Таблица успешно создана"));
ui->createButton->setEnabled(false);
ui->removeButton->setEnabled(true);
}
//функция-слот вызова формы редактирования таблицы
void MainWindow::dbEdit()
{
//проверка на наличие таблицы в БД
if(db.isOpen() && ui->dbTable->model() != NULL)
{
//определяем индекс и передаем его в форму редактирoвания
QModelIndex id = ui->dbTable->currentIndex();
EditDialog *EditForm = new EditDialog(model, id.row(), this);
EditForm->exec();
ui->dbTable->resizeColumnsToContents();
delete EditForm;
}
else
{
QMessageBox::warning(this, tr("Ошибка редактирования"),
tr("Таблица не выбрана"));
}
}
//функция-слот удаления таблицы
void MainWindow::dbRemove()
{
//проверка на наличие таблицы в БД
if(!db.tables().contains("books"))
{
QMessageBox::warning(this, tr("Ошибка удаления"),
tr("Таблицы не существует. Отменено"));
return;
}
QSqlQuery query;
///скрипты удаления таблицы, последовательностии триггера
//query.exec("DROP sequence BOOKS_SEQ");
//query.exec("DROP trigger BI_BOOKS");
query.exec("DROP table BOOKS");
QMessageBox::information(this, tr("Статус удаления"),
tr("Таблица успешно удалена"));
ui->createButton->setEnabled(true);
ui->removeButton->setEnabled(false);
}
//функция-слот открытия формы поиска записи в таблице
void MainWindow::dbFind()
{
if(db.isOpen() && ui->dbTable->model() != NULL)
{
FindDialog dialog(model, this);
dialog.exec();
}
else
{
QMessageBox::warning(this, tr("Ошибка поиска"),
tr("Таблица не выбрана"));
}
}
//функция-слот сброса параметров поиска
void MainWindow::dbReset()
{
model->setFilter("");
model->select();
}
MainWindow::~MainWindow()
{
delete ui;
}