Торговая фирма
Особенности работы с SQL-базами данных. Установка и настройка локального сервера СУБД Interbase. Создание приложения "Торговая фирма", состоящее из серверной части и клиентской. Разработка спецификаций и описание интерфейса пользователя программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.07.2012 |
Размер файла | 634,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ и науки РОССИЙСКОЙ ФЕДЕРАЦИИ
РЫБИНСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
имени П. А. Соловьева
Кафедра МПО ЭВС
Специальность
«Программное обеспечение вычислительной техники и автоматических систем»
КУРСОВАЯ РАБОТА
по курсу: «Базы данных»
Вариант № 2
на тему: «Торговая фирма»
Пояснительная записка
Студент гр. ИВП-09
Кулаевский Д.Ю.
Студент гр. ИВП-09
Лукьянченко А. Ю.
Руководитель
Задорина Н. А.
Рыбинск 2012
- Оглавление
- Постановка задачи
- 1. Проектирование базы данных
- 1.1 Описание предметной области
- 1.2 ER-диаграммы и бизнес правила
- 1.3 Отношения
- 1.4 Ограничения целостности
- 2. Разработка серверной части
- 2.1 Создание таблиц
- 2.2 Создание представлений
- 2.3 Создание триггеров
- 3. Реализация клиентской части
- 3.1 Разработка спецификаций
- 3.2 Описание интерфейса пользователя
- 4. Текст основных модулей программы
- Заключение
- Список используемой литературы
Постановка задачи
Торговая фирма занимается оптовой торговлей. Фирма имеет сеть поставщиков товаров. Поставщики находятся в разных городах. Каждый поставщик специализируется на поставке одного товара, склады фирм позволяют разместить ограниченное количество каждого из товаров.
Товар на фирму может поступать по ее заявкам или по предложению поставщика без предварительного заказа. Отпуск товаров производится по заявкам.
Система должна обеспечивать выполнение следующих операций:
- прием предложения поставщика о возможности поставить товар в виде накладной;
- прием товара на склад или отказ в приеме;
- формирование заказа поставщику на поставку товара;
- отпуск товара или отказ;
- получение справок о сделанных заказах поставщикам, о предложениях поставщиков, о заявках на отпуск товаров;
- получение других справок.
1. Проектирование базы данных
1.1 Описание предметной области
В рассматриваемой предметной области можно выделить следующие объекты:
- товары;
- поставщики;
- склады;
- города;
- заявки.
Товары имеют уникальный номер, название и дополнительную информацию.
Поставщики имеют уникальный номер, имя, поставляемый товар и код города в котором живут. Каждый поставщик по условию поставляет лишь один товар.
Склады имеют уникальный номер, код города в котором находятся, адрес и телефон. Адрес и код города должны быть уникальны для идентификации склада.
Города имеют уникальный номер, название и дополнительную информацию.
Заявки имеют код поставщика, которому предназначена или получена заявка, количество запрашиваемого или предлагаемого товара, а также предлагаемую цену на товар.
В процессе проектирования необходимо выделить информационные объекты и связи между ними, соответствующие реальным объектам и бизнес-правилам, действующим в предметной области.
Процесс выделения информационных объектов предметной области, отвечающих требованиям нормализации, может производиться на основе интуитивного или формального подхода. Теоретические основы формального подхода были разработаны и полно изложены в монографиях по организации баз данных известного американского ученого Дж. Мартина. При интуитивном подходе легко могут быть выявлены информационные объекты, соответствующие реальным объектам. Однако, получаемая при этом информационно-логическая модель, как правило, требует дальнейших преобразований, в частности, преобразования много-многозначных (M:N) связей между объектами. При таком подходе возможны существенные ошибки, если отсутствует достаточный опыт. Последующая проверка выполнения требований нормализации обычно приводит к необходимости уточнения информационных объектов.
1.2 ER-диаграммы и бизнес правила
Всего в предметной области можно выделить пять связей:
- поставщик поставляет;
- склад хранит;
- склад находится;
- поставщик живет;
- заявка предлагается.
Каждая из связей связывает две сущности, что можно изобразить с помощью ER-диаграмм.
Размещено на http://www.allbest.ru/
Рисунок 1 - ER-диаграмма для сущностей Товар - Поставщик
Исходя из ER-диаграммы на рисунке 1 можно выделить следующие бизнес-правила.
1. Каждый поставщик поставляет лишь один товар.
2. Один товар могут поставлять много разных поставщиков.
3. Товар обязан поставляться хотя бы одним поставщиком.
4. Поставщик обязан поставлять товар.
Размещено на http://www.allbest.ru/
Рисунок 2 - ER-диаграмма для сущностей Товар-Склад
Исходя из ER-диаграммы на рисунке 2 можно выделить следующие бизнес-правила.
1. На каждом складе может храниться множество разных товаров.
2. Каждый товар может храниться на разных складах.
3. Товар может не хранится ни на одном складе.
4. Склад может не хранить товаров.
Размещено на http://www.allbest.ru/
Рисунок 3 - ER-диаграмма для сущностей Склад - Город
Исходя из ER-диаграммы на рисунке 3 можно выделить следующие бизнес-правила.
1. Каждый склад обязательно находится в каком-либо городе
2. Склад находится только в одном городе.
3. В каждом городе может находиться несколько разных складов.
4. В городе может не быть складов.
Размещено на http://www.allbest.ru/
Рисунок 4 - ER-диаграмма для сущностей Поставщик - Город
Исходя из ER-диаграммы на рисунке 4 можно выделить следующие бизнес-правила.
1. Каждый поставщик обязательно живет в каком-либо городе.
2. Каждый поставщик живет лишь в одном городе.
3. В каждом городе могут жить несколько поставщиков.
4. В городе может не жить ни одного поставщика.
Размещено на http://www.allbest.ru/
Рисунок 5 - ER-диаграмма для сущностей Поставщик - Заявка
Исходя из ER-диаграммы на рисунке 4 можно выделить следующие бизнес-правила.
1. Каждый поставщик может получить/предложить сколь угодно много различных заявок на товар.
2. Каждая заявка привязана лишь к одному поставщику.
3. Каждая заявка обязана иметь целевого поставщика.
4. Поставщик может не иметь заявок.
В общем виде ER-диаграмма продемонстрирована на рисунке 6.
Рисунок 6 - ER-диаграмма в общем виде
1.3 Отношения
Главная цель проектирования базы данных заключается в нормализации предварительных отношений. Выполнение требований нормализации обеспечивает построение реляционной базы данных без дублирования данных и возможность поддержки целостности при внесении изменений. В процессе проектирования к отношениям выдвигают следующие требования:
- информационный объект должен содержать уникальный идентификатор (ключ);
- все описательные реквизиты должны быть взаимонезависимы, т.е. между ними не может быть функциональных зависимостей;
- все реквизиты, входящие в составной ключ, должны быть также взаимонезависимы;
- каждый описательный реквизит должен функционально полно зависеть от ключа, т.е. каждому значению ключа соответствует только одно значение описательного реквизита;
- при составном ключе описательные реквизиты должны зависеть целиком от всей совокупности реквизитов, образующих ключ;
- каждый описательный реквизит не может зависеть от ключа транзитивно, т.е. через другой промежуточный реквизит.
Исходя из анализа описания предметной области, выявленных бизнес-правил, а также правил построения отношений, исходя из ER-диаграмм была получена следующая схема базы данных:
1. Товары(код_товара,Наименование,Дополнительная информация)
2. Поставщики(код_поставщика,Имя,код_города,код_товара)
3. Города(код_города,Имя,Дополнительная информация)
4. Склады(код_склада, Адрес, код_города, телефон)
5. Хранится(код_товара,код_склада, количество, ограничение)
6. Заявки(код_заявки,код_поставщика,количество,цена,статус,флаг)
1.4 Ограничения целостности
При реализации полученной схемы следует учитывать, что предметная область накладывает некоторые ограничения на значения атрибутов. Также следует учитывать, что при реализации на атрибуты будут наложены ограничения, связанные с выбранным типом данных. Таблица 1демонстрирует ограничения целостности и соответствия типов атрибутам отношений.
Таблица 1 - Ограничения
Отношение |
Атрибут |
Описание |
Тип атрибута |
Ограничение |
|
Товары |
Код_товара |
Уникальный номер товара, первичный ключ |
Целое число |
Уникальное поле, генерируется автоматически |
|
Наименование |
Уникальное наименование товара |
Строка (40 символов) |
Уникальное поле, обязательно для заполнения |
||
Информация |
Дополнительная информация |
Строка(50 символов) |
|||
Поставщики |
Код_поставщика |
Уникальный номер поставщика, первичный ключ |
Целое число |
Уникальное поле, генерируется автоматически |
|
Имя |
Уникальное имя поставщика |
Строка (40 символов) |
Уникальное поле, обязательно для заполнения |
||
Код_города |
Код города, в котором живет поставщик |
Целое число |
Внешний ключ, должно существовать в таблице «Города» |
||
Код_товара |
Код товара, который поставляется поставщиком |
Целое число |
Внешний ключ, должно существовать в таблице «Товары» |
||
Города |
Код_города |
Уникальный номер города, первичный ключ |
Целое число |
Уникальное поле, генерируется автоматически |
|
Наименование |
Уникальное наименование города |
Строка (40 символов) |
Уникальное поле, обязательно для заполнения |
||
Информация |
Дополнительная информация |
Строка(50 символов) |
|||
Склады |
Код_склада |
Уникальный номер склада, первичный ключ |
Целое число |
Уникальное поле, генерируется автоматически |
|
Адрес |
Адрес склада в городе |
Строка (40 символов) |
Обязательно для заполнения |
||
Код_города |
Код города, в котором находится склад |
Целое число |
Внешний ключ, должно существовать в таблице «Города» |
||
Телефон |
Телефон склада |
Строка (40 символов) |
|||
Заявки |
Код_заявки |
Уникальный номер заявки, первичный ключ |
Целое число |
Уникальное поле, генерируется автоматически |
|
Код_поставщика |
Код поставщика оставившего (которому предназначена) заявка |
Целое число |
Внешний ключ, должно существовать в таблице «Поставщики» |
||
Количество |
Количество предложенного товара |
Целое число |
Обязательно для заполнения |
||
Цена |
Предложенная цена |
Число с плавающей точкой |
Обязательно для заполнения |
||
Статус |
Статус заявки может иметь три значения: принята не принята не рассмотрена |
Байт |
Значение по умолчанию «не рассмотрена» |
||
Флаг |
Флаг может принимать два значения: Заявка адресована фирме от поставщика Заявка адресована поставщику от фирмы |
Байт |
Обязательно для заполнения |
||
Хранится |
Код_товара |
Код хранимого на складе товара |
Целое число |
Внешний ключ, должно существовать в таблице «Товары» |
|
Код_склада |
Код склада на котором хранится товар |
Целое число |
Внешний ключ, должно существовать в таблице «Склады» |
||
Количество |
Количество товара, хранящегося на складе |
Целое число |
Значение по умолчанию 0, должно быть меньше ограничения |
||
Ограничение |
Максимальное количество данного товара на складе |
Целое число |
Обязательно для заполнения |
2. Разработка серверной части
Для создания серверной части базы данных в Interbaseпредполагается использовать интерактивную консоль SQL.Для создания различных структур в базе данных предлагается использовать SQL-запросы к серверу. Особенность интерактивной консоли в том, что она моментально позволяет увидеть результат запроса, что заметно упрощает создание структуры базы данных.
2.1 Создание таблиц
Создание таблицы «Города»
CREATE TABLE "CITIES"
(
"ID" INTEGER NOT NULL,
"NAME" VARCHAR(40) NOT NULL,
"INFORMATION" VARCHAR(40) default '',
PRIMARY KEY ("ID"),
UNIQUE ("NAME")
);
Создание таблицы «Товары»
CREATE TABLE "GOODS"
(
"ID" INTEGER NOT NULL,
"NAME" VARCHAR(40) NOT NULL,
"INFORMATION" VARCHAR(40) default '',
PRIMARY KEY ("ID"),
UNIQUE ("NAME")
);
Создание таблицы «Поставщики»
CREATE TABLE "SUPPLIERS"
(
"ID" INTEGER NOT NULL,
"NAME" VARCHAR(40) NOT NULL,
"CITY_ID" INTEGER,
"GOOD_ID" INTEGER,
PRIMARY KEY ("ID"),
UNIQUE ("NAME")
);
ALTER TABLE "SUPPLIERS" ADD FOREIGN KEY ("CITY_ID") REFERENCES "CITIES" ("ID");
ALTER TABLE "SUPPLIERS" ADD FOREIGN KEY ("GOOD_ID") REFERENCES "GOODS" ("ID");
Создание таблицы «Склады»
CREATE TABLE "STOREAGE"
(
"ID" INTEGER NOT NULL,
"ADDRES" VARCHAR(50) NOT NULL,
"CITY_ID" INTEGER NOT NULL,
"TELEPHONE" VARCHAR(40) default null,
PRIMARY KEY ("ID"),
UNIQUE ("CITY_ID", "ADDRES")
);
ALTER TABLE "STOREAGE" ADD FOREIGN KEY ("CITY_ID") REFERENCES "CITIES" ("ID");
Создание таблицы «Заявки»
CREATE TABLE "REQUESTS"
(
"ID" INTEGER NOT NULL,
"SUPP_ID" INTEGER NOT NULL,
"AMOUNT" INTEGER NOT NULL,
"PRICE" FLOAT NOT NULL,
"STATUS" INTEGER default 0,
"FLAG" INTEGER NOT NULL,
PRIMARY KEY ("ID")
);
ALTER TABLE "REQUESTS" ADD FOREIGN KEY ("SUPP_ID") REFERENCES "SUPPLIERS" ("ID");
Создание таблицы «Хранение»
CREATE TABLE "STORAGE"
(
"ID" INTEGER NOT NULL,
"ADDRES" VARCHAR(50) NOT NULL,
"CITY_ID" INTEGER NOT NULL,
"TELEPHONE" VARCHAR(40) default null,
PRIMARY KEY ("ID"),
UNIQUE ("CITY_ID", "ADDRES")
);
ALTER TABLE "STORAGE" ADD FOREIGN KEY ("CITY_ID") REFERENCES "CITIES" ("ID");
2.2 Создание представлений
Представление на связь «Поставщик - Товар»
CREATE VIEW "SUPP_GOODS" (
"SUPP_NAME",
"GOOD_NAME",
"INFORMATION",
"CITY"
) AS
selecta.name,b.name,b.information,c.name from suppliers a,goodsb,cities c
where a.good_id=b.id and a.city_id=c.id;
Представление на связь «Город - Склад»
CREATE VIEW "STORAGE_WITH_CITY" (
"ADDRESS",
"CITY_NAME",
"TELEPHONE"
) AS
selecta.addres,b.name,a.telephone
fromstoreagea,cities b
whereb.id = a.city_id;
2.3 Создание триггеров
Триггеры для таблицы «Товары»
Триггер для генерации первичного ключа
CREATE TRIGGER "GEN_ID_GOODS" FOR "GOODS"
ACTIVE BEFORE INSERT POSITION 0
as
begin
if(new.id is null)
then new.id = gen_id(id_good,1);
end
Триггер для удаления всех поставщиков, поставляющих данных товар
CREATE TRIGGER "DEL_FROM_GOODS" FOR "GOODS"
ACTIVE BEFORE DELETE POSITION 0
as
begin
delete from suppliers where good_id=old.id;
end
Триггеры для таблицы «Поставщики»
Триггер для генерации первичного ключа
CREATE TRIGGER "GEN_ID_SUPP" FOR "SUPPLIERS"
ACTIVE BEFORE INSERT POSITION 0
as
begin
if(new.id is null)
then new.id = gen_id(id_supp,1);
end
Триггер для удаления всех заявок, привязанных к данному поставщику
CREATE TRIGGER "DEL_FROM_SUPP" FOR "SUPPLIERS"
ACTIVE BEFORE DELETE POSITION 0
as
begin
delete from requests where supp_id=old.id;
end
Триггеры для таблицы «Склады»
Триггер для генерации первичного ключа
CREATE TRIGGER "GEN_ID_STOREAGE" FOR "STOREAGE"
ACTIVE BEFORE INSERT POSITION 0
as
begin
if(new.id is null)
then new.id = gen_id(id_storeage,1);
end
Триггер для каскадного удаления всех товаров, хранящихся на складе
CREATE TRIGGER "DEL_FROM_STORAGE" FOR "STORAGE"
ACTIVE BEFORE DELETE POSITION 0
as
begin
delete from store where store_id=old.id;
end
Триггеры для таблицы «Города»
Триггер для генерации первичного ключа
CREATE TRIGGER "GEN_ID_CITY" FOR "CITIES"
ACTIVE BEFORE INSERT POSITION 0
as
begin
if(new.id is null)
then new.id = gen_id(id_city,1);
end
Триггер для удаления всех складов и поставщиков из этого города
CREATE TRIGGER "DEL_FROM_CITIES" FOR "CITIES"
ACTIVE BEFORE DELETE POSITION 0
as
begin
delete from suppliers where city_id=old.id;
delete from storeage where city_id=old.id;
end
Триггеры для таблицы «Заявки»
Триггердлягенерациипервичногоключа
CREATE TRIGGER "GEN_ID_REQUEST" FOR "REQUESTS"
ACTIVE BEFORE INSERT POSITION 0
as begin
if(new.id is null)
then new.id = gen_id(id_request,1);
end
Триггеры для таблицы «Хранение»
Триггернавставкувтаблицу
CREATE TRIGGER "STORE_INS" FOR "STORE"
ACTIVE BEFORE INSERT POSITION 0
as
declare variable my_id integer;
declare variable my_good_id integer;
declare variable amount integer;
begin
selectstore_id,good_id from store where store_id=new.store_id and good_id=new.good_id into my_id,my_good_id;
if(:my_id is not null)
then
begin
select amount from store where store_id=:my_id and good_id=:my_good_id into :amount;
if(:amount+new.amount<new.st_size)
then
begin
new.amount=:amount+new.amount;
delete from store where store_id=new.store_id and good_id=new.good_id;
end
else
begin
exceptionwrong_size;
end
end
end
Триггеры для представления «Поставщик - Товар»
Триггер на вставку
CREATE TRIGGER "INS_FOR_VIEW" FOR "SUPP_GOODS"
ACTIVE BEFORE INSERT POSITION 0
as
declare variable my_id integer;
declare variable my_city_id integer;
begin
select id from goods where new.good_name=name into my_id;
if(:my_id is null) then
begin
insert into goods(name,information) values(new.good_name,new.information);
select id from goods where new.good_name=name into my_id;
end
select id from cities where new.city=name into my_city_id;
if(:my_city_id is null) then
begin
insert into cities(name) values(new.city);
select id from cities where new.city=name into my_city_id;
end
insert into suppliers(name,city_id,good_id) values(new.supp_name,:my_city_id,:my_id);
end
Триггер на обновление
CREATE TRIGGER "UPD_FOR_VIEW" FOR "SUPP_GOODS"
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable my_id integer;
declare variable my_city_id integer;
declare variable my_supp_id integer;
begin
select id from cities where name=new.city into my_city_id;
if(:my_city_id is null) then exception wrong_city;
select id from goods where name=new.good_name into my_id;
if(:my_id is null) then exception wrong_good;
select id from suppliers where name=old.supp_name into my_supp_id;
update suppliers set name=new.supp_name, good_id=:my_id, city_id=:my_city_id where id=:my_supp_id;
end
Триггер на удаление
CREATE TRIGGER "DEL_FOR_VIEW" FOR "SUPP_GOODS"
ACTIVE BEFORE DELETE POSITION 0
as
declare variable my_id integer;
declare variable my_s_id integer;
begin
delete from suppliers where old.supp_name=name;
select id from goods where old.good_name=name into my_id;
select count(*) from suppliers where good_id=:my_id into my_s_id;
if(:my_s_id = 0)
then delete from goods where id=:my_id;
end
Триггеры для представления «Склад - Город»
Триггер на вставку
CREATE TRIGGER "ST_W_C_INS" FOR "STORAGE_WITH_CITY"
ACTIVE BEFORE INSERT POSITION 0
as
declare variable my_id integer;
declare variable my_city_id integer;
begin
select id from cities where new.city_name = name into :my_city_id;
if(:my_city_id is null)
then begin
insert into cities(name) values(new.city_name);
select id from cities where new.city_name = name into :my_city_id;
end
insert into storeage(addres,city_id,telephone) values(new.address,:my_city_id,new.telephone);
end
Триггер на обновление
CREATE TRIGGER "ST_W_C_UPD" FOR "STORAGE_WITH_CITY"
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable my_city_id integer;
declare variable my_id integer;
begin
select id from cities where name=new.city_name into my_city_id;
if(:my_city_id is null) then exception wrong_city;
select id from storeage where addres=old.address and telephone=old.telephone into my_id;
updatestoreage set addres=new.address, city_id=:my_city_id, telephone=new.telephone where id=:my_id;
end
Триггер на удаление
CREATE TRIGGER "ST_W_C_DEL" FOR "STORAGE_WITH_CITY"
ACTIVE BEFORE DELETE POSITION 0
as
begin
delete from storeage where addres=old.address and telephone=old.telephone;
end
3. Реализация клиентской части
3.1 Разработка спецификаций
Как следует из задания, клиентское приложение должно обеспечивать следующие функции:
1. Вести учет товаров, позволять редактировать существующую базу товаров, добавлять новые.
2. Вести учет поставщиков, позволять добавлять новых и менять данные уже существующих поставщиков.
3. Предоставлять доступ к базе существующих городов, для размещения складов и добавления новых поставщиков.
4. Предоставлять доступ к списку складов, позволять добавлять и редактировать уже существующие.
5. Предоставлять удобный интерфейс для работы с товарами на каждом складе, представлять информацию о хранимых товарах в виде графической диаграммы.
6. Обеспечивать работу с заявками, позволять добавлять новые заявки, отклонять поступившие, либо принимать с отгрузкой товара на выбранный склад.
7. Предоставлять справки
3.2 Описание интерфейса пользователя
Ведение учета товаров реализовано с помощью стандартных компонентов C++ Builder. Для отображения таблиц на экране и работы с ними используются компоненты TDBGridи TDBNavigator. Для доступа к базе данных используются стандартные компоненты TTable, TDataSourceи TDatabase. Внешний вид вкладки для учета товаров показан на рисунке 7.
Рисунок 7 - Интерфейс вкладки "Товары"
Для учета поставщиков было создано представление и реализованы триггеры для основных операций: вставка, обновление и удаление. Это позволило осуществить доступ к базе данных с помощью тех же компонентов, что и в случае со вкладкой «Товары». Также были использованны компоненты TDNLookupComboBox, которые позволяют выбрать существующий город и товар, что позволяет избавить пользователя от необходимости ручного ввода и ошибок связанных с ним. Внешний вид вкладки учета поставщиков показан на рисунке 8.
Рисунок 8 - Интерфейс вкладка "Поставщики"
Для просмотра и редактирования базы городов был разработан интерфейс, показанный на рисунке 9. Реализовано с помощью стандартных компонентов, как в случае с таблицей «Товары».
Рисунок 9 - Интерфейс вкладки "Города"
Для реализации интерфейса работы со списком складов, а также с товарами на складе были применены некоторые дополнительные компоненты C++ Builder, такие как TQueryиTChart.
Доступ к списку складов и товаров на складах осуществляется на одной вкладке. Вывод таблицы «Склады», а также основные функции работы с ней реализованы с помощью стандартных компонентов, как в случае с таблицей «Товары». Для TDBGrid, на котором отображаются склады,был написан обработчик, который при изменении положения курсора в таблице перезагружал соседнюю таблицу со списком товаров, а также перерисовывал диаграмму. Таким образом выбирая склад в таблице «Склады» мы видим актуальные данные по товарам на складе. Также рисуется диаграмма, отображающая отношение количества товаров на складе. Существует возможность добавлять на склад место для хранения, а также удалять его.
Работа с вкладкой товаров, а то есть добавление, удаление и выборка данных реализована с помощью компонента TQuery. Для выборки необходимо знать код_склада из которого мы хотим выбрать товары, поэтому запрос на выборку имеет параметры, позволяющие нам получить лишь нужные товары. локальный сервер интерфейсе программа
Для добавления используется компонент TQueryс 4 параметрами, полученными в диалоговом окне добавления товара на склад.
Внешний вид вкладки учета складов и товаров показан на рисунке 10.
Интерфейс вкладки «Заявки» реализован с помощью собственных SQL-запросов (через компонент TQuery)и обработчиков. Таким образом на вкладке было использовано два компонента ComboBox, позволяющих выбирать тип заявки и ее статус. Обработчики на изменение этих полей перезагружают таблицу заявок, таким образом, мы всегда видим нужные нам заявки. На данной вкладке можно добавить новую заявку для поставщика, а также принять или отклонить пришедшую. В этом случае открывается окно диалога, предлагающее нам выбрать склад, на который будет отгружен товар. Особенность SQL-запроса в том, что выборка из предлагаемых целевых складов содержит лишь те склады, на которых данный товар может храниться, при условии, что на нем хватает места. Таким образом, не может возникнуть ситуации с переполнением склада. Следует также заметить, что свойство Enabledу кнопок взводится лишь тогда, когда мы выбираем тип заявки «Нам» и статус «Не рассмотрена», в других случаях кнопки неактивны, что позволяет избежать ошибок.
Внешний вид вкладки «Заявки» показан на рисунке 11.
Рисунок 11 - Интерфейс вкладки "Заявки"
Также реализовано получение справок, выводимых в MSExcelс помощью кнопки «В Excel»на некоторых вкладках.
4. Текст основных модулей программы
//---------------------------------------------------------------------------
#include<vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void TForm1::updateQuery()
{
Query10->Params->Items[0]->Value = status;
Query10->Params->Items[1]->Value = flag;
Query10->Active = false;
Query10->Active = true;
DBGrid6->Update();
}
void TForm1::addRequest()
{
Query11->Params->Items[0]->Value = supp_name;
Query11->Active=false;
Query11->Active=true;
intsupp_id = (Query11->FieldByName("ID"))->AsInteger;
Query9->Params->Items[0]->Value = supp_id;
Query9->Params->Items[1]->Value = amount;
Query9->Params->Items[2]->Value = price;
Query9->ExecSQL();
Query10->Active = false;
Query10->Active = true;
DBGrid6->Update();
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
fprin = true;
fnam = true;
status = 0;
flag = 1;
updateQuery();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid4CellClick(TColumn *Column)
{
StoreShow(this);
/*Query2->Params->Items[0]->Value = DBGrid4->DataSource->DataSet->FieldValues["ADDRESS"];
Query2->Params->Items[1]->Value = DBGrid4->DataSource->DataSet->FieldValues["TELEPHONE"];
Query2->Active = false;
Query2->Active = true;
DBGrid5->Update();
DBGrid5->DataSource->DataSet->First();
Series1->Clear();
inti = 100;
while(!DBGrid5->DataSource->DataSet->Eof)
{
Series1->Add(DBGrid5->DataSource->DataSet->FieldValues["AMOUNT"],DBGrid5->DataSource->DataSet->FieldValues["NAME"],i);
DBGrid5->DataSource->DataSet->Next();
i += 100;
}
DBGrid5->DataSource->DataSet->First();*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Table4->Active = false;
//Table4->Active = true;
Form2->Show();
}
//---------------------------------------------------------------------------
void TForm1::addStore()
{
Query13->Params->Items[0]->Value = amount;
Query13->Params->Items[1]->Value = store_id;
Query13->Params->Items[2]->Value = good_id;
Query13->ExecSQL();
Query7->Params->Items[0]->Value = request_id;
Query7->ExecSQL();
updateQuery();
}
void TForm1::addField()
{
int amount = Form2->CSpinEdit1->Value;
intst_size = Form2->CSpinEdit2->Value;
if(st_size>= amount)
{
try
{
intgood_id = Form2->DBGrid2->DataSource->DataSet->FieldValues["ID"];
Query4->Params->Items[0]->Value = DBGrid4->DataSource->DataSet->FieldValues["ADDRESS"];
Query4->Params->Items[1]->Value = DBGrid4->DataSource->DataSet->FieldValues["TELEPHONE"];
Query4->Active=false;
Query4->Active=true;
intstore_id = (Query4->FieldByName("ID"))->AsInteger;
//intstore_id = 1;
Query3->Params->Items[0]->Value = good_id;
Query3->Params->Items[1]->Value = store_id;
Query3->Params->Items[2]->Value = amount;
Query3->Params->Items[3]->Value = st_size;
Query3->ExecSQL();
}
catch(...)
{
ShowMessage("Неправильныйпараметр");
Form2->Show();
}
}
//Query2->Active = false;
//Query2->Active = true;
//DBGrid5->Update();
StoreShow(this);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query4->Params->Items[0]->Value = DBGrid4->DataSource->DataSet->FieldValues["ADDRESS"];
Query4->Params->Items[1]->Value = DBGrid4->DataSource->DataSet->FieldValues["TELEPHONE"];
Query4->Active=false;
Query4->Active=true;
intstore_id = (Query4->FieldByName("ID"))->AsInteger;
Query6->Params->Items[0]->Value = DBGrid5->DataSource->DataSet->FieldValues["NAME"];
Query6->Active=false;
Query6->Active=true;
intgood_id = (Query6->FieldByName("ID"))->AsInteger;
Query5->Params->Items[0]->Value = store_id;
Query5->Params->Items[1]->Value = good_id;
Query5->ExecSQL();
//Query2->Active = false;
//Query2->Active = true;
//DBGrid5->Update();
StoreShow(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
bool f = false;
status = 0;
if(ComboBox1->Text == "Принятые")
{
status = 1;
f = true;
}
if(ComboBox1->Text == "Отклоненные")
{
status = 2;
f = true;
}
updateQuery();
if(f)
{
Button3->Enabled=false;
Button4->Enabled=false;
fprin = false;
}
else
{
fprin = true;
if(fnam)
{Button3->Enabled=true;
Button4->Enabled=true;}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
bool f = false;
flag = 0;
if(ComboBox2->Text == "Нам")
{
flag = 1;
f = true;
}
updateQuery();
if(f)
{
fnam = true;
if(fprin)
{Button3->Enabled=true;
Button4->Enabled=true;}
}
else
{
fnam = false;
Button3->Enabled=false;
Button4->Enabled=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
try
{
Query12->Params->Items[0]->Value = DBGrid6->DataSource->DataSet->FieldValues["NAME"];
Query12->Active=false;
Query12->Active=true;
Good_name = (Query12->FieldByName("NAME"))->AsString;
good_id = (Query12->FieldByName("ID"))->AsInteger;
amount = DBGrid6->DataSource->DataSet->FieldValues["AMOUNT"];
request_id = DBGrid6->DataSource->DataSet->FieldValues["ID"];
Form4->Show();
}
catch(...)
{
ShowMessage("Ошибка");
}
// Query7->Params->Items[0]->Value = DBGrid6->DataSource->DataSet->FieldValues["ID"];
// Query7->ExecSQL();
// updateQuery();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
try
{
Query8->Params->Items[0]->Value = DBGrid6->DataSource->DataSet->FieldValues["ID"];
Query8->ExecSQL();
updateQuery();
}
catch(...)
{
ShowMessage("Ошибка");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Form3->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StoreShow(TObject *Sender)
{
Query2->Params->Items[0]->Value = DBGrid4->DataSource->DataSet->FieldValues["ADDRESS"];
Query2->Params->Items[1]->Value = DBGrid4->DataSource->DataSet->FieldValues["TELEPHONE"];
Query2->Active = false;
Query2->Active = true;
DBGrid5->Update();
DBGrid5->DataSource->DataSet->First();
Series1->Clear();
inti = 100;
while(!DBGrid5->DataSource->DataSet->Eof)
{
if(DBGrid5->DataSource->DataSet->FieldValues["AMOUNT"] > 0)
Series1->Add(DBGrid5->DataSource->DataSet->FieldValues["AMOUNT"],DBGrid5->DataSource->DataSet->FieldValues["NAME"],i);
DBGrid5->DataSource->DataSet->Next();
i += 100;
}
DBGrid5->DataSource->DataSet->First();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Table4->Active = false;
Table4->Active = true;
DBGrid4->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Table1->Active = false;
Table1->Active = true;
DBGrid1->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
updateQuery();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
Variant XL, XLBooks, RpXL, Sh, Range;
longlgSab, lgRp;
boolRezult= false;
try
{ //Попыткаоткрытьприложение Excel
XL = Variant::CreateObject("Excel.Application");
XLBooks = XL.OlePropertyGet("WorkBooks");
Rezult = true;
}
catch (...)
{ //Попытка не удалась
Application->MessageBox("Невозможнооткрыть Microsoft Excel!"
"Возможно, Excel не установлен на компьютере.",
"Ошибка",MB_OK+MB_ICONERROR);
}
try {
XL.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=XL.OlePropertyGet("WorkSheets",1);
} catch(...) {
Application->MessageBox("Ошибкаоткрытиякниги Microsoft Excel!",
"Ошибка",MB_OK+MB_ICONERROR);
}
if (Rezult)
{
XL.OlePropertySet("Visible",(Variant)true);
try {
int i;
for(int j=1; j<5; j++)
{
Table1->First();
i=2;
while(!Table1->Eof){
if(j==1){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (Table1->FieldValues["SUPP_NAME"]);
cur.OlePropertySet("Value", s.c_str());
i++;
Table1->Next();
}
if(j==2){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (Table1->FieldValues["CITY"]);
cur.OlePropertySet("Value", s.c_str());
i++;
Table1->Next();
}
if(j==3){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (Table1->FieldValues["GOOD_NAME"]);
cur.OlePropertySet("Value", s.c_str());
i++;
Table1->Next();
}
if(j==4){
AnsiString s;
Variant cur = Sh.OlePropertyGet("Cells", i, j);
if(!(Table1->FieldValues["INFORMATION"]).IsNull())
s = (Table1->FieldValues["INFORMATION"]);
else
s = "";
cur.OlePropertySet("Value", s.c_str());
i++;
Table1->Next();
}
}
}
Variant cur = Sh.OlePropertyGet("Cells", 1, 1);
AnsiString s = "Поставщик";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 2);
s = "Город";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 3);
s = "Товар";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 4);
s = "Информация";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 5);
i++;
}//for(j)
catch(...)
{
;
}
Table1->First();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
Variant XL, XLBooks, RpXL, Sh, Range;
longlgSab, lgRp;
TDataSet *my_table = DBGrid4->DataSource->DataSet;
boolRezult= false;
try
{ //Попыткаоткрытьприложение Excel
XL = Variant::CreateObject("Excel.Application");
XLBooks = XL.OlePropertyGet("WorkBooks");
Rezult = true;
}
catch (...)
{ //Попытка не удалась
Application->MessageBox("Невозможнооткрыть Microsoft Excel!"
"Возможно, Excel не установлен на компьютере.",
"Ошибка",MB_OK+MB_ICONERROR);
}
try {
XL.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=XL.OlePropertyGet("WorkSheets",1);
} catch(...) {
Application->MessageBox("Ошибкаоткрытиякниги Microsoft Excel!",
"Ошибка",MB_OK+MB_ICONERROR);
}
if (Rezult)
{
XL.OlePropertySet("Visible",(Variant)true);
try {
inti;
for(int j=1; j<4; j++)
{
my_table->First();
i=2;
while(!my_table->Eof){
if(j==1){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (my_table->FieldValues["CITY_NAME"]);
cur.OlePropertySet("Value", s.c_str());
i++;
my_table->Next();
}
if(j==2){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (my_table->FieldValues["ADDRESS"]);
cur.OlePropertySet("Value", s.c_str());
i++;
my_table->Next();
}
if(j==3){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (my_table->FieldValues["TELEPHONE"]);
cur.OlePropertySet("Value", s.c_str());
i++;
my_table->Next();
}
}
}
Variant cur = Sh.OlePropertyGet("Cells", 1, 1);
AnsiString s = "Город";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 2);
s = "Адрес";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 3);
s = "Телефон";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 4);
i++;
}//for(j)
catch(...)
{
;
}
my_table->First();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button11Click(TObject *Sender)
{
Variant XL, XLBooks, RpXL, Sh, Range;
longlgSab, lgRp;
TDataSet *my_table = DBGrid6->DataSource->DataSet;
boolRezult= false;
try
{ //Попыткаоткрытьприложение Excel
XL = Variant::CreateObject("Excel.Application");
XLBooks = XL.OlePropertyGet("WorkBooks");
Rezult = true;
}
catch (...)
{ //Попытка не удалась
Application->MessageBox("Невозможно открыть MicrosoftExcel!"
"Возможно, Excel не установлен на компьютере.",
"Ошибка",MB_OK+MB_ICONERROR);
}
try {
XL.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=XL.OlePropertyGet("WorkSheets",1);
} catch(...) {
Application->MessageBox("Ошибкаоткрытиякниги Microsoft Excel!",
"Ошибка",MB_OK+MB_ICONERROR);
}
if (Rezult)
{
XL.OlePropertySet("Visible",(Variant)true);
try {
inti;
for(int j=1; j<4; j++)
{
my_table->First();
i=3;
while(!my_table->Eof){
if(j==1){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (my_table->FieldValues["NAME"]);
cur.OlePropertySet("Value", s.c_str());
i++;
my_table->Next();
}
if(j==2){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (my_table->FieldValues["AMOUNT"]);
cur.OlePropertySet("Value", s.c_str());
i++;
my_table->Next();
}
if(j==3){
Variant cur = Sh.OlePropertyGet("Cells", i, j);
AnsiString s = (my_table->FieldValues["PRICE"]);
cur.OlePropertySet("Value", s.c_str());
i++;
my_table->Next();
}
}
}
Variant cur = Sh.OlePropertyGet("Cells", 2, 1);
AnsiString s = "Поставщик";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 2, 2);
s = "Количество";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 2, 3);
s = "Цена";
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 1);
s = ComboBox1->Text;
cur.OlePropertySet("Value", s.c_str());
cur = Sh.OlePropertyGet("Cells", 1, 2);
s = ComboBox2->Text;
cur.OlePropertySet("Value", s.c_str());
i++;
}//for(j)
catch(...)
{
;
}
my_table->First();
}
}
//---------------------------------------------------------------------------
Заключение
В ходе курсовой работы были закреплены навыки работы с SQL-базами данных, полученные в ходе лабораторных работ. Была проведена установка и настройка локального сервера СУБД Interbase. Были изучены дополнительные материалы и создано приложение «Торговая фирма», состоящее из серверной части и клиентской.
Стандарт SQL был принят в 1986 году Международной организацией по стандартизации (ISO) и Американским национальным институтом стандартов (ANSI). В дальнейшие годы стандарт бурно развивался и все больше производителей СУБД стали поддерживать этот формат. Каждый производитель считал, что функции определенные стандартом недостаточны для эффективной разработки БД и поэтому добавлял свои, таким образом каждая реализация SQLнемного (или много) отличалась от остальных. По началу были предприняты попытки контролировать и систематизировать изменения стандарта, но после 1999 года эти попытки прекратились и вся ответственность легла на плечи производителей СУБД.
На настоящий момент обязательной в SQL-стандарте является поддержка лишь небольшой группы функций - Core, которые реализуют основную часть стандарта. Поддержка остальных возможностей оставлена на усмотрение производителей СУБД.
Не смотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML, могут быть достаточно легко перенесены из одной СУБД в другую. Это также означает, что при переходе с одной СУБД на другую программисту требуется минимум времени для освоения СУБД и начала работ над базой данных, поэтому изучение SQL-очень важно.
Список используемой литературы
1 К. Дж. Дейт. Введение в системы баз данных - IntroductiontoDatabaseSystems. -- 8-е изд. -- М.: «Вильямс», 2006 г.
2 А. Я. Скляр. Введение в interbase, 2006 г.
3 В. Г. Шаров. Курс лекций «Базы данных».
Размещено на Allbest.ru
Подобные документы
Общая характеристика и функциональное назначение проектируемого программного обеспечения, требования к нему. Разработка и описание интерфейса клиентской и серверной части. Описание алгоритма и программной реализации приложения. Схема базы данных.
курсовая работа [35,4 K], добавлен 12.05.2013Установка и настройка локального web–сервера и его компонентов. Конфигурационные файлы сервера Apache и их натройка. Настройка PHP, MySQL и Sendmail. Проверка работоспособности виртуальных серверов. Создание виртуальных хостов. Тест Server Side Includes.
учебное пособие [6,2 M], добавлен 27.04.2009Создание ИС "Туристическая фирма" для оформления и выдачи путевок клиенту. Проектирование пользовательского интерфейса. Обоснование выбора СУБД. Построение физической модели приложения. Бухгалтерский учет формирования финансовых результатов предприятия.
дипломная работа [3,9 M], добавлен 05.10.2013Система управления базами данных (СУБД) MySQL. Установка, настройка и запуск MySQL. Окончательная настройка нового MySQL сервера. Основные утилиты и журнальные файлы. Работа с виртуальными хостами. Синтаксис для создания таблиц и управление данными.
реферат [3,5 M], добавлен 24.06.2019Система управления базами данных (СУБД) как программная система для создания общей базы данных. Создание СУБД для управления поставкой и реализацией ювелирных изделий. Типы данных, физическая и логическая модели. Разработка интерфейса пользователя.
курсовая работа [467,8 K], добавлен 14.12.2012Проектирование системы управления базами данных. Особенности реализации в MS SQL. Разработка пользовательского интерфейса. Тестирование и отладка приложения. Руководство пользователя и системного администратора. Анализ и методы разработки приложений.
курсовая работа [867,9 K], добавлен 16.07.2013Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.
курсовая работа [1,6 M], добавлен 19.04.2017Описание создаваемого сервиса. Разработка и реализация серверной части сервиса и клиентской части сервиса, которая будет предоставлять пользователям возможность создания и редактирования генеалогических деревьев, возможность импорта и экспорта данных.
курсовая работа [116,9 K], добавлен 20.07.2012Разработка сетевой карточной игры "King" для операционной системы Windows XP. Реализация приложения с помощью интерфейса прикладного программирования Win32 API. Назначение серверной и клиентской части. Анализ исходных данных, тестирование приложения.
курсовая работа [209,3 K], добавлен 24.01.2016Сравнительный анализ функциональных возможностей десктопных видео редакторов. Функциональные возможности разрабатываемого Web-приложения. Процессы взаимодействия пользователя и системы. Выбор библиотек для обработки видео. Создание локального сервера.
дипломная работа [1,3 M], добавлен 30.11.2016