#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->passEdit->setEchoMode(QLineEdit::Password);
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("ash"));
ui->passEdit->setText(tr("is"));
//установка слотов на сигналы нажатия кнопок
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());
db.setPassword(ui->passEdit->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_photo);
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") ||
db.tables().contains("BOOKS"))
{
QMessageBox::warning(this, tr("Ошибка создания"),
tr("Таблица уже создана. Отменено"));
return;
}
QSqlQuery query;
//задаем скрипты для создания таблицы, последовательности
// и триггера
QString table_statement = "CREATE table \"BOOKS\" ("
"\"ID\" NUMBER NOT NULL,"
"\"NAME\" VARCHAR2(60) NOT NULL,"
"\"AUTH\" VARCHAR2(60) NOT NULL,"
"\"DILL\" VARCHAR2(60) NOT NULL,"
"\"DATE\" DATE NOT NULL,"
"\"HOWM\" VARCHAR2(60) NOT NULL,"
"\"HOWC\" VARCHAR2(60) NOT NULL,"
"\"COVER\" BLOB,"
"constraint \"BOOKS_PK\" primary key(\"ID\"))";
QString sequence_statement = "CREATE sequence \"BOOKS_SEQ\"";
QString trigger_statement = "CREATE trigger \"BI_BOOKS\" "
"before insert on \"BOOKS\" "
"for each row "
"begin "
"if :NEW.\"ID\" is null then "
"select \"BOOKS_SEQ\".nextval into :NEW.\"ID\" 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)
{
//определяем индекс и передаем его в форму редактирвоания
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") &&
!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;
}