Курсовая на тему Разработка базы данных и прикладного программного обеспечения для автобусного парка
Работа добавлена на сайт bukvasha.net: 2014-12-15Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Министерство образования и науки Республики Казахстан
Карагандинский государственный технический университет
Кафедра
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОМУ ПРОЕКТУ
Дисциплина: Технология разработки баз данных
Тема: Разработка базы данных и прикладного ПО для автобусного парка
Принял:
___________________________
Выполнил: студент гр. ________
___________________________
Караганда 2009
Содержание
Введение
1. Постановка задачи
2. Теоретическая часть
3. Программное обеспечение
4. Концептуальная модель данных
5. Логическая модель базы данных
6. Руководство пользователю
7. SQL Запросы
Заключение
Список использованной литературы
Приложение А. Листинг программы
Введение
В настоящее время большинство организаций использует различные базы данных для автоматизации процессов обработки информации, удобства ее эксплуатации, повышения надежности хранения данных, сокращения числа возможных ошибок в работе, предотвращения избыточности данных, а также в целях повышения производительности. Состав баз данных и их размер определяются направлением деятельности конкретного предприятия и его мощностью.
В связи с тем, что современные информационные системы оперируют большими объемами и сложными структурами данных, средства управления базами данных можно выделить в отдельную группу информационных систем, отвечающих за управление сложными структурированными данными.
Сегодня можно с уверенностью утверждать, что решение широкого круга задач в любой сфере деятельности человека сегодня практически невозможно без использования оперативно управляемых баз данных.
1 Постановка задачи
Разработать базу данных и прикладное программное обеспечение для автобусного парка, позволяющее структурировать информацию об автобусных маршрутах, остановках и остановочных пунктах, автобусах парка. Также программное обеспечение должно предоставлять возможность различных манипуляций этими данными, как то редактирование и удаление данных, пополнение базы данных.
Прикладное ПО должно удовлетворять условиям работы с удалённой базой данных.
2 Теоретическая часть
Для организации оптимизированного хранения, выборки и представления информации применяются базы данных (БД). «Базой данных» часто упрощённо или ошибочно называют Системы Управления Базами Банных (СУБД). Нужно различать набор данных (собственно БД) и программное обеспечение, предназначенное для организации и ведения баз данных (СУБД).
БД бывают нескольких типов:
Картотеки
Сетевые
Иерархические
Реляционные
Объектно-ориентированные
Многомерные
Дедуктивные
На уровне физической модели электронная БД представляет собой файл или их набор в формате TXT, CSV, Excel, DBF, XML либо в специализированном формате конкретной СУБД. Также в СУБД в понятие физической модели включают специализированные виртуальные понятия, существующие в ёё рамках — таблица, табличное пространство, сегмент, куб, кластер и т.д.
В настоящее время наибольшее распространение получили реляционные базы данных. Картотеками пользовались до появления электронных баз данных. Сетевые и иерархические базы данных считаются устаревшими, объектно-ориентированные пока никак не стандартизированы и не получили широкого распространения. Некоторое возрождение получили иерархические базы данных в связи с появлением и распространением формата XML.
СУБД — специализированная программа (чаще комплекс программ), предназначенная для манипулирования базой данных. Для создания и управления информационной системой СУБД необходима в той же степени, как для разработки программы на алгоритмическом языке необходим транслятор.
Основные функции СУБД:
управление данными во внешней памяти (на дисках);
управление данными в оперативной памяти;
журнализация изменений и восстановление базы данных после сбоев;
поддержка языков БД (язык определения данных, язык манипулирования данными).
Обычно современная СУБД содержит следующие компоненты:
ядро, которое отвечает за управление данными во внешней и оперативной памяти и журнализацию,
процессор языка базы данных, обеспечивающий оптимизацию запросов на извлечение и изменение данных и создание, как правило, машинно-независимого исполняемого внутреннего кода,
подсистему поддержки времени исполнения, которая интерпретирует программы манипуляции данными, создающие пользовательский интерфейс с СУБД, а также сервисные программы (внешние утилиты), обеспечивающие ряд дополнительных возможностей по обслуживанию информационной системы.
3 Программное обеспечение
Для разработки курсового проекта выбрана среда объектно-ориентированного программирования Borland Delphi 7 под управление операционной системы Windows.
Для обеспечения возможности удаленной работы сервера БД, предлагается использовать СУБД MS SQL Server. Работа с данной СУБД довольно удобна, о писана в большом количестве литературы. Провайдеры для работы с этой СУБД поставляются вместе с операционной системой Windows.
Также MS SQL Server предоставляет в распоряжение разработчику клиент-серверную технологию, позволяющую располагать сервера БД, физически удаленно от пользователя, чем достигается централизованное хранение данных и возможность обращения к БД несколькими пользователями одновременно.
Данный выбор связан с техническим обеспечением КарГТУ, возможностями выбранных программных средств, а так же малым опытом работы разработчика с другими СУБД. Выбранные программные средства полностью удовлетворяют установленным требованиям и применима для решения поставленной задачи.
4 Концептуальная модель данных
5 Логическая модель базы данных
Таблица маршрутов routes содержит список маршрутов, обслуживаемых автобусным парком
Таблица остановок stations содержит информацию об остановках маршрута
Таблица stoppoints содержит информацию об остановочных пунктах
Информация об автобусах парка хранится в таблице buses
6 Руководство пользователю
Запустив программу, пользователь попадает в основное её окно.
Как видно, никаких данных мы пока увидеть, а тем более изменить или удалить не можем. Происходит это потому, что не произведено подключение к базе данных. Чтобы это исправить, пользователь должен совершить следующие действия:
Выбрать в основном меню пункт DB -> Connection Options (Рисунок 2). Откроется окно настроек соединения с сервером базу данных (Рисунок 3).
Рисунок 2 — Пункт меню настроек соединения с сервером БД
Рисунок 3 — Окно настроек соединения с сервером базы данных
Здесь нужно задать название сервера базы данных, название самой базы данных, а также пару логин/пароль для подключения к серверу базы данных. Задав правильные параметры и нажав на кнопку «OK» пользователь снова попадает в основное окно программы. Теперь необходимо соединиться с сервером базы данных. Для этого нужно выбрать пункт меню DB -> Connect. Если настройки были заданы верно и не возникло никаких проблем в сети, будет установлено соединение с сервером, о чём будет свидетельствовать надпись «Connected» в статусной строке и данные, отображённые на вкладках программы (Рисунок 4).
Рисунок 4 — Главное окно программы после подключения к серверу БД
По умолчанию активна первая вкладка «Routes», на которой отображаются маршруты. Перемещаясь по вкладкам можно просмотреть сведения об остановках, остановочных пунктах и автобусах парка. Добавление, редактирование и удаление данных во всех таблицах осуществляется аналогичным образом. поэтому будет рассмотрено на примере таблицы остановочных пунктов.
Добавление, редактирование и удаление записи осуществляется либо кнопками на вкладке справа, либо при помощи дублирующего их функции контекстного меню. Будьте осторожны! При удалении записи никаких дополнительных подтверждений программа не запрашивает!
При редактировании или добавлении записи открывается окно, где мы можем изменить или внести информацию об остановочном пункте (Рисунок 5).
Рисунок 5 — Окно добавления/редактирования остановочного пункта
Чтобы подтвердить изменение/добавление данных нужно нажать на кнопку «OK». Чтобы отменить их — на кнопку «Cancel».
Выбрав пункт основного меню Info -> Help можно увидеть это руководство.
Чтобы завершить работу с программой. просто закройте её основное окно.
8 SQL Запросы
Выборка государственных номеров автобусов марок Lifan и Mudan, обслуживающих определённый маршрут
SELECT issue
FROM buses
WHERE routeid = 12 AND model IN ('Lifan', 'Mudan')
Выборка автобусов, проезжающих через определённый остановочный пункт
SELECT model, issue
FROM buses
WHERE routeid =
ANY (SELECT routeid
FROM stoppoints
WHERE stationid = 2)
Выборка остановочных пунктов определённого маршрута, проезжаемых автобусами на обратном пути
SELECT name
FROM stoppoints
WHERE direction = 'return' AND routeid = 1
Выборка 5 остановочных пунктов, через которые проходит наибольшее количество маршрутов
SELECT name, Count(routeid) AS RouteCount
FROM stoppoints
GROUP BY name
ORDER BY RouteCount
limit 5
Заключение
В связи со стремительно развивающимися на данный момент технологиями хранение информации на бумажных носителях отходит в прошлое, и повсеместно вводятся средства электронного учета. В курсовой работе предложен метод оперативного обслуживания БД применительно к небольшому автопарку. Подобный метод может быть применен в любой (практически) организации.
Дальнейшее совершенствование программы возможно в сторону нормализации базы данных, добавления неких графических представлений, учёта различных состояний транспорта и т.д. При их внедрении программа может стать коммерческим продуктом, ориентированным на предприятия, занимающиеся доставкой корреспонденции, товаров народного потребления, курьерские службы, таксомоторные парки, автобусные и троллейбусные парки и т.п.
Список использованной литературы
1. Структуризированный язык запросов (SQL). Учебное пособие
2. А.М. Терлецкая БД. Лекции.
3. П. Дарахвелидзе, Е. Марков. Программирование в Delphi 7. СПб.: «БХВ-Петербург». 2003. 784 с: ил.
4. М. Фленов. Библия программистов в среде Delphi. 2002. 636 с.
5. С. Лукьяненко. Спектр. М.: ООО «Издательство АСТ», ОАО «Люкс». 2004. 490 с.
Приложение А. Листинг программы
главная форма
var
DBHost, DBLogin, DBPassword, DBDatabase: string;
implementation
uses uConnectOptions, uRoutes, uStations, uStopPoints, uBuses;
{$R *.dfm}
procedure TfmMain.mmDBOptionsClick(Sender: TObject);
begin
Application.CreateForm(TfmConnectOptions, fmConnectOptions);
fmConnectOptions.ShowModal;
end;
procedure TfmMain.mmDBConnectClick(Sender: TObject);
begin
try
fmMain.ADOConnection.Open;
StatusBar.Panels[0].Text := 'Connected';
mmDBConnect.Enabled := false;
mmDBDisconnect.Enabled := true;
ADOTableRoutes.Active := true;
ADOQueryStations.Active := true;
ADOQueryStopPoints.Active := true;
ADOQueryBuses.Active := true;
btnRoutesAdd.Enabled := true;
btnStationsAdd.Enabled := true;
btnStopPointsAdd.Enabled := true;
btnBusesAdd.Enabled := true;
ppmnRoutesAdd.Enabled := true;
ppmnStationsAdd.Enabled := true;
ppmnStopPointsAdd.Enabled := true;
ppmnBusesAdd.Enabled := true;
except
ShowMessage('Connection error!');
StatusBar.Panels[0].Text := 'Disconnected';
end;
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
fmMain.DBHost := 'ERETIK\SQLEXPRESS';
fmMain.DBLogin := 'sa';
fmMain.DBPassword := '1';
fmMain.DBDatabase := 'Buzzz';
end;
procedure TfmMain.mmDBDisconnectClick(Sender: TObject);
begin
ADOConnection.Close;
mmDBDisconnect.Enabled := false;
mmDBConnect.Enabled := true;
StatusBar.Panels[0].Text := 'Disconnected';
ADOTableRoutes.Active := false;
ADOQueryStations.Active := false;
ADOQueryStopPoints.Active := false;
ADOQueryBuses.Active := false;
btnRoutesAdd.Enabled := false;
btnStationsAdd.Enabled := false;
btnStopPointsAdd.Enabled := false;
btnBusesAdd.Enabled := false;
btnRoutesEdit.Enabled := false;
btnStationsEdit.Enabled := false;
btnStopPointsEdit.Enabled := false;
btnBusesEdit.Enabled := false;
btnRoutesDelete.Enabled := false;
btnStationsDelete.Enabled := false;
btnStopPointsDelete.Enabled := false;
ppmnRoutesAdd.Enabled := false;
ppmnStationsAdd.Enabled := false;
ppmnStopPointsAdd.Enabled := false;
ppmnBusesAdd.Enabled := false;
ppmnRoutesEdit.Enabled := false;
ppmnStationsEdit.Enabled := false;
ppmnStopPointsEdit.Enabled := false;
ppmnBusesEdit.Enabled := false;
ppmnRoutesDelete.Enabled := false;
ppmnStationsDelete.Enabled := false;
ppmnStopPointsDelete.Enabled := false;
end;
procedure TfmMain.btnRoutesAddClick(Sender: TObject);
begin
Application.CreateForm(TfmRoutes, fmRoutes);
fmRoutes.EditFlag := false;
fmRoutes.ShowModal;
end;
procedure TfmMain.dtsrcRoutesDataChange(Sender: TObject; Field: TField);
begin
btnRoutesEdit.Enabled := ADOTableRoutes.RecordCount <> 0;
btnRoutesDelete.Enabled := ADOTableRoutes.RecordCount <> 0;
ppmnRoutesEdit.Enabled := ADOTableRoutes.RecordCount <> 0;
ppmnRoutesDelete.Enabled := ADOTableRoutes.RecordCount <> 0;
end;
procedure TfmMain.dtsrcStationsDataChange(Sender: TObject; Field: TField);
begin
btnStationsEdit.Enabled := ADOQueryStations.RecordCount <> 0;
btnStationsDelete.Enabled := ADOQueryStations.RecordCount <> 0;
ppmnStationsEdit.Enabled := ADOQueryStations.RecordCount <> 0;
ppmnStationsDelete.Enabled := ADOQueryStations.RecordCount <> 0;
end;
procedure TfmMain.dtsrcStopPointsDataChange(Sender: TObject; Field: TField);
begin
btnStopPointsEdit.Enabled := ADOQueryStopPoints.RecordCount <> 0;
btnStopPointsDelete.Enabled := ADOQueryStopPoints.RecordCount <> 0;
ppmnStopPointsEdit.Enabled := ADOQueryStopPoints.RecordCount <> 0;
ppmnStopPointsDelete.Enabled := ADOQueryStopPoints.RecordCount <> 0;
end;
procedure TfmMain.dtsrcBusesDataChange(Sender: TObject; Field: TField);
begin
btnBusesEdit.Enabled := ADOQueryBuses.RecordCount <> 0;
btnBusesDelete.Enabled := ADOQueryBuses.RecordCount <> 0;
ppmnBusesEdit.Enabled := ADOQueryBuses.RecordCount <> 0;
ppmnBusesDelete.Enabled := ADOQueryBuses.RecordCount <> 0;
end;
procedure TfmMain.btnRoutesDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM routes WHERE id='+DBGridRoutes.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOCommand.CommandText := 'DELETE FROM stations WHERE routeid='+DBGridRoutes.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOCommand.CommandText := 'DELETE FROM stoppoints WHERE routeid='+DBGridRoutes.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOTableRoutes.Requery();
ADOQueryStations.Requery;
ADOQueryStopPoints.Requery;
end;
procedure TfmMain.btnStationsDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM stations WHERE id='+DBGridStations.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOCommand.CommandText := 'DELETE FROM stoppoints WHERE stationid='+DBGridStations.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOQueryStations.Requery;
ADOQueryStopPoints.Requery;
end;
procedure TfmMain.btnStopPointsDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM stoppoints WHERE id='+DBGridStopPoints.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOQueryStopPoints.Requery;
end;
procedure TfmMain.btnBusesDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM buses WHERE id='+DBGridBuses.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOQueryBuses.Requery;
end;
procedure TfmMain.btnRoutesEditClick(Sender: TObject);
begin
Application.CreateForm(TfmRoutes, fmRoutes);
fmRoutes.EditFlag := true;
fmRoutes.ShowModal;
end;
procedure TfmMain.btnStationsAddClick(Sender: TObject);
begin
Application.CreateForm(TfmStations, fmStations);
fmStations.EditFlag := false;
fmStations.ShowModal;
end;
procedure TfmMain.btnStationsEditClick(Sender: TObject);
begin
Application.CreateForm(TfmStations, fmStations);
fmStations.EditFlag := true;
fmStations.ShowModal;
end;
procedure TfmMain.btnStopPointsEditClick(Sender: TObject);
begin
Application.CreateForm(TfmStopPoints, fmStopPoints);
fmStopPoints.EditFlag := true;
fmStopPoints.ShowModal;
end;
procedure TfmMain.btnStopPointsAddClick(Sender: TObject);
begin
Application.CreateForm(TfmStopPoints, fmStopPoints);
fmStopPoints.EditFlag := false;
fmStopPoints.ShowModal;
end;
procedure TfmMain.btnBusesAddClick(Sender: TObject);
begin
Application.CreateForm(TfmBuses, fmBuses);
fmBuses.EditFlag := false;
fmBuses.ShowModal;
end;
procedure TfmMain.btnBusesEditClick(Sender: TObject);
begin
Application.CreateForm(TfmBuses, fmBuses);
fmBuses.EditFlag := true;
fmBuses.ShowModal;
end;
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection.Connected := false;
end;
end.
настройки подключения
procedure TfmConnectOptions.btnOKClick(Sender: TObject);
begin
fmMain.ADOConnection.ConnectionString :=
'Provider=SQLOLEDB.1;Password=' + medPassword.Text +
';Persist Security Info=False;User ID=' + edLogin.Text +
';Initial Catalog=' + edDatabase.Text + ';Data Source=' + edHost.Text;
fmMain.DBHost := edHost.Text;
fmMain.DBLogin := edLogin.Text;
fmMain.DBPassword := medPassword.Text;
fmMain.DBDatabase := edDatabase.Text;
Close;
end;
procedure TfmConnectOptions.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmConnectOptions.FormCreate(Sender: TObject);
begin
edHost.Text := fmMain.DBHost;
edLogin.Text := fmMain.DBLogin;
medPassword.Text := fmMain.DBPassword;
edDatabase.Text := fmMain.DBDatabase;
end;
добавление/редактирование автобусов
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmBuses: TfmBuses;
implementation
uses uMain;
{$R *.dfm}
procedure TfmBuses.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit bus';
ledModel.Text := fmMain.DBGridBuses.DataSource.DataSet.Fields[1].AsString;
ledIssue.Text := fmMain.DBGridBuses.DataSource.DataSet.Fields[2].AsString;
lcmbbxRoute.KeyValue := fmMain.DBGridBuses.DataSource.DataSet.Fields[3].AsInteger;
end
else
begin
Caption := 'Add bus';
ledModel.Clear;
ledIssue.Clear;
lcmbbxRoute.KeyValue := 1;
end;
end;
procedure TfmBuses.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmBuses.btnOKClick(Sender: TObject);
begin
if (ledModel.Text <> '') and (lcmbbxRoute.Text <> '') and (ledIssue.Text <> '') then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE buses SET model=''' + ledModel.Text
+''', issue=''' + ledIssue.Text + ''', routeid=' +
IntToStr(lcmbbxRoute.KeyValue) + ' WHERE id=' +
fmMain.DBGridBuses.DataSource.DataSet.Fields[0].AsString;
fmMain.ADOQueryBuses.Requery;
end
else
begin
fmMain.ADOCommand.CommandText :=
'INSERT INTO buses (model, issue, routeid) VALUES (''' +
ledModel.Text + ''', ''' + ledIssue.Text + ''', ' +
IntToStr(lcmbbxRoute.KeyValue) + ')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOQueryBuses.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
end.
добавление/редактирование маршрутов
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmRoutes: TfmRoutes;
implementation
uses uMain;
{$R *.dfm}
procedure TfmRoutes.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmRoutes.btnOKClick(Sender: TObject);
begin
if ledName.Text <> '' then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE routes SET name=''' + ledName.Text
+ ''' WHERE id=' + fmMain.DBGridRoutes.DataSource.DataSet.Fields[0].AsString;
fmMain.ADOQueryStations.Requery;
fmMain.ADOQueryStopPoints.Requery;
fmMain.ADOQueryBuses.Requery;
end
else
begin
fmMain.ADOCommand.CommandText := 'INSERT INTO routes (name) VALUES (''' + ledName.Text + ''')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOTableRoutes.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
procedure TfmRoutes.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit route';
ledName.Text := fmMain.DBGridRoutes.DataSource.DataSet.Fields[1].AsString;
end
else
begin
Caption := 'Add route';
ledName.Clear;
end;
end;
end.
добавление/редактирование остановок
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmStations: TfmStations;
implementation
uses uMain, DB;
{$R *.dfm}
procedure TfmStations.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit station';
ledName.Text := fmMain.DBGridStations.DataSource.DataSet.Fields[1].AsString;
lcmbbxRoute.KeyValue := fmMain.DBGridStations.DataSource.DataSet.Fields[2].AsInteger;
end
else
begin
Caption := 'Add station';
ledName.Clear;
lcmbbxRoute.KeyValue := 1;
end;
end;
procedure TfmStations.btnCancelClick(Sender: TObject);
begin
close;
end;
procedure TfmStations.btnOKClick(Sender: TObject);
begin
if (ledName.Text <> '') and (lcmbbxRoute.Text <> '') then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE stations SET name=''' + ledName.Text
+ ''', routeid=' + IntToStr(lcmbbxRoute.KeyValue) + ' WHERE id=' +
fmMain.DBGridStations.DataSource.DataSet.Fields[0].AsString;
fmMain.ADOQueryStopPoints.Requery;
end
else
begin
fmMain.ADOCommand.CommandText := 'INSERT INTO stations (name, routeid) VALUES (''' + ledName.Text + ''', ' + IntToStr(lcmbbxRoute.KeyValue) + ')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOQueryStations.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
end.
добавление/редактирование остановочных пунктов
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmStopPoints: TfmStopPoints;
implementation
uses uMain;
{$R *.dfm}
procedure TfmStopPoints.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmStopPoints.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit stop point';
with fmMain.DBGridStopPoints.DataSource.DataSet do
begin
ADOQueryRoutes.SQL.Text := 'SELECT * FROM routes WHERE id = ' +
'ANY (SELECT routeid FROM stations WHERE id = ' +
Fields[3].AsString + ')';
ADOQueryRoutes.Active := true;
ADOQueryRoutes.Requery;
ledName.Text := Fields[1].AsString;
lcmbbxRoute.KeyValue := dtsrcRoutes.DataSet.Fields[0].AsInteger;
lcmbbxStation.KeyValue := Fields[3].AsInteger;
if Fields[2].AsString = 'forward' then cmbbxDirection.ItemIndex := 0 else
cmbbxDirection.ItemIndex := 1;
end;
end
else
begin
Caption := 'Add stop point';
ledName.Clear;
lcmbbxStation.KeyValue := 1;
ADOQueryRoutes.SQL.Text := 'SELECT * FROM routes WHERE id = ' +
'ANY (SELECT routeid FROM stations WHERE id = 1)';
ADOQueryRoutes.Active := true;
ADOQueryRoutes.Requery;
end;
end;
procedure TfmStopPoints.lcmbbxStationCloseUp(Sender: TObject);
begin
ADOQueryRoutes.SQL.Text := 'SELECT * FROM routes WHERE id = ' +
'ANY (SELECT routeid FROM stations WHERE stations.id = ' +
IntToStr(lcmbbxStation.KeyValue) + ')';
ADOQueryRoutes.Open;
ADOQueryRoutes.Requery;
lcmbbxRoute.DropDown;
end;
procedure TfmStopPoints.btnOKClick(Sender: TObject);
begin
if (ledName.Text <> '') and (lcmbbxRoute.Text <> '') and (lcmbbxStation.Text <> '') then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE stoppoints SET name=''' + ledName.Text
+ ''', routeid=' + IntToStr(lcmbbxRoute.KeyValue) + ', direction=''' +
cmbbxDirection.Text + ''', stationid=' + IntToStr(lcmbbxStation.KeyValue)
+ ' WHERE id=' + fmMain.DBGridStopPoints.DataSource.DataSet.Fields[0].AsString;
end
else
begin
fmMain.ADOCommand.CommandText :=
'INSERT INTO stoppoints (name, direction, stationid, routeid) VALUES ('''
+ ledName.Text + ''', ''' + cmbbxDirection.Text + ''', ' +
IntToStr(lcmbbxStation.KeyValue) + ', ' + IntToStr(lcmbbxRoute.KeyValue) + ')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOQueryStopPoints.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
end.
Карагандинский государственный технический университет
Кафедра
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОМУ ПРОЕКТУ
Дисциплина: Технология разработки баз данных
Тема: Разработка базы данных и прикладного ПО для автобусного парка
Принял:
___________________________
Выполнил: студент гр. ________
___________________________
Караганда 2009
|
Введение
1. Постановка задачи
2. Теоретическая часть
3. Программное обеспечение
4. Концептуальная модель данных
5. Логическая модель базы данных
6. Руководство пользователю
7. SQL Запросы
Заключение
Список использованной литературы
Приложение А. Листинг программы
Введение
В настоящее время большинство организаций использует различные базы данных для автоматизации процессов обработки информации, удобства ее эксплуатации, повышения надежности хранения данных, сокращения числа возможных ошибок в работе, предотвращения избыточности данных, а также в целях повышения производительности. Состав баз данных и их размер определяются направлением деятельности конкретного предприятия и его мощностью.
В связи с тем, что современные информационные системы оперируют большими объемами и сложными структурами данных, средства управления базами данных можно выделить в отдельную группу информационных систем, отвечающих за управление сложными структурированными данными.
Сегодня можно с уверенностью утверждать, что решение широкого круга задач в любой сфере деятельности человека сегодня практически невозможно без использования оперативно управляемых баз данных.
1 Постановка задачи
Разработать базу данных и прикладное программное обеспечение для автобусного парка, позволяющее структурировать информацию об автобусных маршрутах, остановках и остановочных пунктах, автобусах парка. Также программное обеспечение должно предоставлять возможность различных манипуляций этими данными, как то редактирование и удаление данных, пополнение базы данных.
Прикладное ПО должно удовлетворять условиям работы с удалённой базой данных.
2 Теоретическая часть
Для организации оптимизированного хранения, выборки и представления информации применяются базы данных (БД). «Базой данных» часто упрощённо или ошибочно называют Системы Управления Базами Банных (СУБД). Нужно различать набор данных (собственно БД) и программное обеспечение, предназначенное для организации и ведения баз данных (СУБД).
БД бывают нескольких типов:
Картотеки
Сетевые
Иерархические
Реляционные
Объектно-ориентированные
Многомерные
Дедуктивные
На уровне физической модели электронная БД представляет собой файл или их набор в формате TXT, CSV, Excel, DBF, XML либо в специализированном формате конкретной СУБД. Также в СУБД в понятие физической модели включают специализированные виртуальные понятия, существующие в ёё рамках — таблица, табличное пространство, сегмент, куб, кластер и т.д.
В настоящее время наибольшее распространение получили реляционные базы данных. Картотеками пользовались до появления электронных баз данных. Сетевые и иерархические базы данных считаются устаревшими, объектно-ориентированные пока никак не стандартизированы и не получили широкого распространения. Некоторое возрождение получили иерархические базы данных в связи с появлением и распространением формата XML.
СУБД — специализированная программа (чаще комплекс программ), предназначенная для манипулирования базой данных. Для создания и управления информационной системой СУБД необходима в той же степени, как для разработки программы на алгоритмическом языке необходим транслятор.
Основные функции СУБД:
управление данными во внешней памяти (на дисках);
управление данными в оперативной памяти;
журнализация изменений и восстановление базы данных после сбоев;
поддержка языков БД (язык определения данных, язык манипулирования данными).
Обычно современная СУБД содержит следующие компоненты:
ядро, которое отвечает за управление данными во внешней и оперативной памяти и журнализацию,
процессор языка базы данных, обеспечивающий оптимизацию запросов на извлечение и изменение данных и создание, как правило, машинно-независимого исполняемого внутреннего кода,
подсистему поддержки времени исполнения, которая интерпретирует программы манипуляции данными, создающие пользовательский интерфейс с СУБД, а также сервисные программы (внешние утилиты), обеспечивающие ряд дополнительных возможностей по обслуживанию информационной системы.
3 Программное обеспечение
Для разработки курсового проекта выбрана среда объектно-ориентированного программирования Borland Delphi 7 под управление операционной системы Windows.
Для обеспечения возможности удаленной работы сервера БД, предлагается использовать СУБД MS SQL Server. Работа с данной СУБД довольно удобна, о писана в большом количестве литературы. Провайдеры для работы с этой СУБД поставляются вместе с операционной системой Windows.
Также MS SQL Server предоставляет в распоряжение разработчику клиент-серверную технологию, позволяющую располагать сервера БД, физически удаленно от пользователя, чем достигается централизованное хранение данных и возможность обращения к БД несколькими пользователями одновременно.
Данный выбор связан с техническим обеспечением КарГТУ, возможностями выбранных программных средств, а так же малым опытом работы разработчика с другими СУБД. Выбранные программные средства полностью удовлетворяют установленным требованиям и применима для решения поставленной задачи.
4 Концептуальная модель данных
5 Логическая модель базы данных
Таблица маршрутов routes содержит список маршрутов, обслуживаемых автобусным парком
Имя поля | Тип поля | Описание |
id | INT UNSIGNED AUTO_INCREMENT KEY | Уникальный идентификатор маршрута |
name | NVARCHAR(50) NOT NULL | Название маршрута |
Таблица остановок stations содержит информацию об остановках маршрута
Имя поля | Тип поля | Описание |
id | INT UNSIGNED AUTO_INCREMENT KEY | Уникальный идентификатор остановки |
name | NVARCHAR(100) NOT NULL | Название остановки |
routeid | INT UNSIGNED NOT NULL | Идентификатор маршрута |
Имя поля | Тип поля | Описание |
id | INT UNSIGNED AUTO_INCREMENT KEY | Уникальный идентификатор остановочного пункта |
name | NVARCHAR(100) NOT NULL | Название остановочного пункта |
direction | NVARCHAR(7) NOT NULL | Прямому или обратному маршруту принадлежит остановочный пункт (forward/return) |
stationid | INT UNSIGNED NOT NULL | Идентификатор остановки |
routeid | INT UNSIGNED NOT NULL | Идентификатор маршрута |
Имя поля | Тип поля | Описание |
id | INT UNSIGNED AUTO_INCREMENT KEY | Уникальный идентификатор автобуса |
model | NVARCHAR(50) NOT NULL | Модель автобуса |
issue | NVARCHAR(7) NOT NULL | Государственный регистрационный номер автобуса |
routeid | INT UNSIGNED NOT NULL | Идентификатор маршрута |
Запустив программу, пользователь попадает в основное её окно.
Как видно, никаких данных мы пока увидеть, а тем более изменить или удалить не можем. Происходит это потому, что не произведено подключение к базе данных. Чтобы это исправить, пользователь должен совершить следующие действия:
Выбрать в основном меню пункт DB -> Connection Options (Рисунок 2). Откроется окно настроек соединения с сервером базу данных (Рисунок 3).
Рисунок 2 — Пункт меню настроек соединения с сервером БД
Рисунок 3 — Окно настроек соединения с сервером базы данных
Здесь нужно задать название сервера базы данных, название самой базы данных, а также пару логин/пароль для подключения к серверу базы данных. Задав правильные параметры и нажав на кнопку «OK» пользователь снова попадает в основное окно программы. Теперь необходимо соединиться с сервером базы данных. Для этого нужно выбрать пункт меню DB -> Connect. Если настройки были заданы верно и не возникло никаких проблем в сети, будет установлено соединение с сервером, о чём будет свидетельствовать надпись «Connected» в статусной строке и данные, отображённые на вкладках программы (Рисунок 4).
Рисунок 4 — Главное окно программы после подключения к серверу БД
По умолчанию активна первая вкладка «Routes», на которой отображаются маршруты. Перемещаясь по вкладкам можно просмотреть сведения об остановках, остановочных пунктах и автобусах парка. Добавление, редактирование и удаление данных во всех таблицах осуществляется аналогичным образом. поэтому будет рассмотрено на примере таблицы остановочных пунктов.
Добавление, редактирование и удаление записи осуществляется либо кнопками на вкладке справа, либо при помощи дублирующего их функции контекстного меню. Будьте осторожны! При удалении записи никаких дополнительных подтверждений программа не запрашивает!
При редактировании или добавлении записи открывается окно, где мы можем изменить или внести информацию об остановочном пункте (Рисунок 5).
Рисунок 5 — Окно добавления/редактирования остановочного пункта
Чтобы подтвердить изменение/добавление данных нужно нажать на кнопку «OK». Чтобы отменить их — на кнопку «Cancel».
Выбрав пункт основного меню Info -> Help можно увидеть это руководство.
Чтобы завершить работу с программой. просто закройте её основное окно.
8 SQL Запросы
Выборка государственных номеров автобусов марок Lifan и Mudan, обслуживающих определённый маршрут
SELECT issue
FROM buses
WHERE routeid = 12 AND model IN ('Lifan', 'Mudan')
Выборка автобусов, проезжающих через определённый остановочный пункт
SELECT model, issue
FROM buses
WHERE routeid =
ANY (SELECT routeid
FROM stoppoints
WHERE stationid = 2)
Выборка остановочных пунктов определённого маршрута, проезжаемых автобусами на обратном пути
SELECT name
FROM stoppoints
WHERE direction = 'return' AND routeid = 1
Выборка 5 остановочных пунктов, через которые проходит наибольшее количество маршрутов
SELECT name, Count(routeid) AS RouteCount
FROM stoppoints
GROUP BY name
ORDER BY RouteCount
limit 5
Заключение
В связи со стремительно развивающимися на данный момент технологиями хранение информации на бумажных носителях отходит в прошлое, и повсеместно вводятся средства электронного учета. В курсовой работе предложен метод оперативного обслуживания БД применительно к небольшому автопарку. Подобный метод может быть применен в любой (практически) организации.
Дальнейшее совершенствование программы возможно в сторону нормализации базы данных, добавления неких графических представлений, учёта различных состояний транспорта и т.д. При их внедрении программа может стать коммерческим продуктом, ориентированным на предприятия, занимающиеся доставкой корреспонденции, товаров народного потребления, курьерские службы, таксомоторные парки, автобусные и троллейбусные парки и т.п.
Список использованной литературы
1. Структуризированный язык запросов (SQL). Учебное пособие
2. А.М. Терлецкая БД. Лекции.
3. П. Дарахвелидзе, Е. Марков. Программирование в Delphi 7. СПб.: «БХВ-Петербург». 2003. 784 с: ил.
4. М. Фленов. Библия программистов в среде Delphi. 2002. 636 с.
5. С. Лукьяненко. Спектр. М.: ООО «Издательство АСТ», ОАО «Люкс». 2004. 490 с.
Приложение А. Листинг программы
главная форма
var
DBHost, DBLogin, DBPassword, DBDatabase: string;
implementation
uses uConnectOptions, uRoutes, uStations, uStopPoints, uBuses;
{$R *.dfm}
procedure TfmMain.mmDBOptionsClick(Sender: TObject);
begin
Application.CreateForm(TfmConnectOptions, fmConnectOptions);
fmConnectOptions.ShowModal;
end;
procedure TfmMain.mmDBConnectClick(Sender: TObject);
begin
try
fmMain.ADOConnection.Open;
StatusBar.Panels[0].Text := 'Connected';
mmDBConnect.Enabled := false;
mmDBDisconnect.Enabled := true;
ADOTableRoutes.Active := true;
ADOQueryStations.Active := true;
ADOQueryStopPoints.Active := true;
ADOQueryBuses.Active := true;
btnRoutesAdd.Enabled := true;
btnStationsAdd.Enabled := true;
btnStopPointsAdd.Enabled := true;
btnBusesAdd.Enabled := true;
ppmnRoutesAdd.Enabled := true;
ppmnStationsAdd.Enabled := true;
ppmnStopPointsAdd.Enabled := true;
ppmnBusesAdd.Enabled := true;
except
ShowMessage('Connection error!');
StatusBar.Panels[0].Text := 'Disconnected';
end;
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
fmMain.DBHost := 'ERETIK\SQLEXPRESS';
fmMain.DBLogin := 'sa';
fmMain.DBPassword := '1';
fmMain.DBDatabase := 'Buzzz';
end;
procedure TfmMain.mmDBDisconnectClick(Sender: TObject);
begin
ADOConnection.Close;
mmDBDisconnect.Enabled := false;
mmDBConnect.Enabled := true;
StatusBar.Panels[0].Text := 'Disconnected';
ADOTableRoutes.Active := false;
ADOQueryStations.Active := false;
ADOQueryStopPoints.Active := false;
ADOQueryBuses.Active := false;
btnRoutesAdd.Enabled := false;
btnStationsAdd.Enabled := false;
btnStopPointsAdd.Enabled := false;
btnBusesAdd.Enabled := false;
btnRoutesEdit.Enabled := false;
btnStationsEdit.Enabled := false;
btnStopPointsEdit.Enabled := false;
btnBusesEdit.Enabled := false;
btnRoutesDelete.Enabled := false;
btnStationsDelete.Enabled := false;
btnStopPointsDelete.Enabled := false;
ppmnRoutesAdd.Enabled := false;
ppmnStationsAdd.Enabled := false;
ppmnStopPointsAdd.Enabled := false;
ppmnBusesAdd.Enabled := false;
ppmnRoutesEdit.Enabled := false;
ppmnStationsEdit.Enabled := false;
ppmnStopPointsEdit.Enabled := false;
ppmnBusesEdit.Enabled := false;
ppmnRoutesDelete.Enabled := false;
ppmnStationsDelete.Enabled := false;
ppmnStopPointsDelete.Enabled := false;
end;
procedure TfmMain.btnRoutesAddClick(Sender: TObject);
begin
Application.CreateForm(TfmRoutes, fmRoutes);
fmRoutes.EditFlag := false;
fmRoutes.ShowModal;
end;
procedure TfmMain.dtsrcRoutesDataChange(Sender: TObject; Field: TField);
begin
btnRoutesEdit.Enabled := ADOTableRoutes.RecordCount <> 0;
btnRoutesDelete.Enabled := ADOTableRoutes.RecordCount <> 0;
ppmnRoutesEdit.Enabled := ADOTableRoutes.RecordCount <> 0;
ppmnRoutesDelete.Enabled := ADOTableRoutes.RecordCount <> 0;
end;
procedure TfmMain.dtsrcStationsDataChange(Sender: TObject; Field: TField);
begin
btnStationsEdit.Enabled := ADOQueryStations.RecordCount <> 0;
btnStationsDelete.Enabled := ADOQueryStations.RecordCount <> 0;
ppmnStationsEdit.Enabled := ADOQueryStations.RecordCount <> 0;
ppmnStationsDelete.Enabled := ADOQueryStations.RecordCount <> 0;
end;
procedure TfmMain.dtsrcStopPointsDataChange(Sender: TObject; Field: TField);
begin
btnStopPointsEdit.Enabled := ADOQueryStopPoints.RecordCount <> 0;
btnStopPointsDelete.Enabled := ADOQueryStopPoints.RecordCount <> 0;
ppmnStopPointsEdit.Enabled := ADOQueryStopPoints.RecordCount <> 0;
ppmnStopPointsDelete.Enabled := ADOQueryStopPoints.RecordCount <> 0;
end;
procedure TfmMain.dtsrcBusesDataChange(Sender: TObject; Field: TField);
begin
btnBusesEdit.Enabled := ADOQueryBuses.RecordCount <> 0;
btnBusesDelete.Enabled := ADOQueryBuses.RecordCount <> 0;
ppmnBusesEdit.Enabled := ADOQueryBuses.RecordCount <> 0;
ppmnBusesDelete.Enabled := ADOQueryBuses.RecordCount <> 0;
end;
procedure TfmMain.btnRoutesDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM routes WHERE id='+DBGridRoutes.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOCommand.CommandText := 'DELETE FROM stations WHERE routeid='+DBGridRoutes.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOCommand.CommandText := 'DELETE FROM stoppoints WHERE routeid='+DBGridRoutes.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOTableRoutes.Requery();
ADOQueryStations.Requery;
ADOQueryStopPoints.Requery;
end;
procedure TfmMain.btnStationsDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM stations WHERE id='+DBGridStations.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOCommand.CommandText := 'DELETE FROM stoppoints WHERE stationid='+DBGridStations.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOQueryStations.Requery;
ADOQueryStopPoints.Requery;
end;
procedure TfmMain.btnStopPointsDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM stoppoints WHERE id='+DBGridStopPoints.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOQueryStopPoints.Requery;
end;
procedure TfmMain.btnBusesDeleteClick(Sender: TObject);
begin
ADOCommand.CommandText := 'DELETE FROM buses WHERE id='+DBGridBuses.DataSource.DataSet.Fields[0].AsString;;
ADOCommand.Execute;
ADOQueryBuses.Requery;
end;
procedure TfmMain.btnRoutesEditClick(Sender: TObject);
begin
Application.CreateForm(TfmRoutes, fmRoutes);
fmRoutes.EditFlag := true;
fmRoutes.ShowModal;
end;
procedure TfmMain.btnStationsAddClick(Sender: TObject);
begin
Application.CreateForm(TfmStations, fmStations);
fmStations.EditFlag := false;
fmStations.ShowModal;
end;
procedure TfmMain.btnStationsEditClick(Sender: TObject);
begin
Application.CreateForm(TfmStations, fmStations);
fmStations.EditFlag := true;
fmStations.ShowModal;
end;
procedure TfmMain.btnStopPointsEditClick(Sender: TObject);
begin
Application.CreateForm(TfmStopPoints, fmStopPoints);
fmStopPoints.EditFlag := true;
fmStopPoints.ShowModal;
end;
procedure TfmMain.btnStopPointsAddClick(Sender: TObject);
begin
Application.CreateForm(TfmStopPoints, fmStopPoints);
fmStopPoints.EditFlag := false;
fmStopPoints.ShowModal;
end;
procedure TfmMain.btnBusesAddClick(Sender: TObject);
begin
Application.CreateForm(TfmBuses, fmBuses);
fmBuses.EditFlag := false;
fmBuses.ShowModal;
end;
procedure TfmMain.btnBusesEditClick(Sender: TObject);
begin
Application.CreateForm(TfmBuses, fmBuses);
fmBuses.EditFlag := true;
fmBuses.ShowModal;
end;
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection.Connected := false;
end;
end.
настройки подключения
procedure TfmConnectOptions.btnOKClick(Sender: TObject);
begin
fmMain.ADOConnection.ConnectionString :=
'Provider=SQLOLEDB.1;Password=' + medPassword.Text +
';Persist Security Info=False;User ID=' + edLogin.Text +
';Initial Catalog=' + edDatabase.Text + ';Data Source=' + edHost.Text;
fmMain.DBHost := edHost.Text;
fmMain.DBLogin := edLogin.Text;
fmMain.DBPassword := medPassword.Text;
fmMain.DBDatabase := edDatabase.Text;
Close;
end;
procedure TfmConnectOptions.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmConnectOptions.FormCreate(Sender: TObject);
begin
edHost.Text := fmMain.DBHost;
edLogin.Text := fmMain.DBLogin;
medPassword.Text := fmMain.DBPassword;
edDatabase.Text := fmMain.DBDatabase;
end;
добавление/редактирование автобусов
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmBuses: TfmBuses;
implementation
uses uMain;
{$R *.dfm}
procedure TfmBuses.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit bus';
ledModel.Text := fmMain.DBGridBuses.DataSource.DataSet.Fields[1].AsString;
ledIssue.Text := fmMain.DBGridBuses.DataSource.DataSet.Fields[2].AsString;
lcmbbxRoute.KeyValue := fmMain.DBGridBuses.DataSource.DataSet.Fields[3].AsInteger;
end
else
begin
Caption := 'Add bus';
ledModel.Clear;
ledIssue.Clear;
lcmbbxRoute.KeyValue := 1;
end;
end;
procedure TfmBuses.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmBuses.btnOKClick(Sender: TObject);
begin
if (ledModel.Text <> '') and (lcmbbxRoute.Text <> '') and (ledIssue.Text <> '') then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE buses SET model=''' + ledModel.Text
+''', issue=''' + ledIssue.Text + ''', routeid=' +
IntToStr(lcmbbxRoute.KeyValue) + ' WHERE id=' +
fmMain.DBGridBuses.DataSource.DataSet.Fields[0].AsString;
fmMain.ADOQueryBuses.Requery;
end
else
begin
fmMain.ADOCommand.CommandText :=
'INSERT INTO buses (model, issue, routeid) VALUES (''' +
ledModel.Text + ''', ''' + ledIssue.Text + ''', ' +
IntToStr(lcmbbxRoute.KeyValue) + ')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOQueryBuses.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
end.
добавление/редактирование маршрутов
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmRoutes: TfmRoutes;
implementation
uses uMain;
{$R *.dfm}
procedure TfmRoutes.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmRoutes.btnOKClick(Sender: TObject);
begin
if ledName.Text <> '' then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE routes SET name=''' + ledName.Text
+ ''' WHERE id=' + fmMain.DBGridRoutes.DataSource.DataSet.Fields[0].AsString;
fmMain.ADOQueryStations.Requery;
fmMain.ADOQueryStopPoints.Requery;
fmMain.ADOQueryBuses.Requery;
end
else
begin
fmMain.ADOCommand.CommandText := 'INSERT INTO routes (name) VALUES (''' + ledName.Text + ''')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOTableRoutes.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
procedure TfmRoutes.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit route';
ledName.Text := fmMain.DBGridRoutes.DataSource.DataSet.Fields[1].AsString;
end
else
begin
Caption := 'Add route';
ledName.Clear;
end;
end;
end.
добавление/редактирование остановок
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmStations: TfmStations;
implementation
uses uMain, DB;
{$R *.dfm}
procedure TfmStations.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit station';
ledName.Text := fmMain.DBGridStations.DataSource.DataSet.Fields[1].AsString;
lcmbbxRoute.KeyValue := fmMain.DBGridStations.DataSource.DataSet.Fields[2].AsInteger;
end
else
begin
Caption := 'Add station';
ledName.Clear;
lcmbbxRoute.KeyValue := 1;
end;
end;
procedure TfmStations.btnCancelClick(Sender: TObject);
begin
close;
end;
procedure TfmStations.btnOKClick(Sender: TObject);
begin
if (ledName.Text <> '') and (lcmbbxRoute.Text <> '') then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE stations SET name=''' + ledName.Text
+ ''', routeid=' + IntToStr(lcmbbxRoute.KeyValue) + ' WHERE id=' +
fmMain.DBGridStations.DataSource.DataSet.Fields[0].AsString;
fmMain.ADOQueryStopPoints.Requery;
end
else
begin
fmMain.ADOCommand.CommandText := 'INSERT INTO stations (name, routeid) VALUES (''' + ledName.Text + ''', ' + IntToStr(lcmbbxRoute.KeyValue) + ')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOQueryStations.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
end.
добавление/редактирование остановочных пунктов
private
{ Private declarations }
public
{ Public declarations }
EditFlag: boolean;
end;
var
fmStopPoints: TfmStopPoints;
implementation
uses uMain;
{$R *.dfm}
procedure TfmStopPoints.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfmStopPoints.FormShow(Sender: TObject);
begin
if EditFlag then
begin
Caption := 'Edit stop point';
with fmMain.DBGridStopPoints.DataSource.DataSet do
begin
ADOQueryRoutes.SQL.Text := 'SELECT * FROM routes WHERE id = ' +
'ANY (SELECT routeid FROM stations WHERE id = ' +
Fields[3].AsString + ')';
ADOQueryRoutes.Active := true;
ADOQueryRoutes.Requery;
ledName.Text := Fields[1].AsString;
lcmbbxRoute.KeyValue := dtsrcRoutes.DataSet.Fields[0].AsInteger;
lcmbbxStation.KeyValue := Fields[3].AsInteger;
if Fields[2].AsString = 'forward' then cmbbxDirection.ItemIndex := 0 else
cmbbxDirection.ItemIndex := 1;
end;
end
else
begin
Caption := 'Add stop point';
ledName.Clear;
lcmbbxStation.KeyValue := 1;
ADOQueryRoutes.SQL.Text := 'SELECT * FROM routes WHERE id = ' +
'ANY (SELECT routeid FROM stations WHERE id = 1)';
ADOQueryRoutes.Active := true;
ADOQueryRoutes.Requery;
end;
end;
procedure TfmStopPoints.lcmbbxStationCloseUp(Sender: TObject);
begin
ADOQueryRoutes.SQL.Text := 'SELECT * FROM routes WHERE id = ' +
'ANY (SELECT routeid FROM stations WHERE stations.id = ' +
IntToStr(lcmbbxStation.KeyValue) + ')';
ADOQueryRoutes.Open;
ADOQueryRoutes.Requery;
lcmbbxRoute.DropDown;
end;
procedure TfmStopPoints.btnOKClick(Sender: TObject);
begin
if (ledName.Text <> '') and (lcmbbxRoute.Text <> '') and (lcmbbxStation.Text <> '') then
begin
if EditFlag then
begin
fmMain.ADOCommand.CommandText := 'UPDATE stoppoints SET name=''' + ledName.Text
+ ''', routeid=' + IntToStr(lcmbbxRoute.KeyValue) + ', direction=''' +
cmbbxDirection.Text + ''', stationid=' + IntToStr(lcmbbxStation.KeyValue)
+ ' WHERE id=' + fmMain.DBGridStopPoints.DataSource.DataSet.Fields[0].AsString;
end
else
begin
fmMain.ADOCommand.CommandText :=
'INSERT INTO stoppoints (name, direction, stationid, routeid) VALUES ('''
+ ledName.Text + ''', ''' + cmbbxDirection.Text + ''', ' +
IntToStr(lcmbbxStation.KeyValue) + ', ' + IntToStr(lcmbbxRoute.KeyValue) + ')';
end;
fmMain.ADOCommand.Execute;
fmMain.ADOQueryStopPoints.Requery;
close;
end
else
ShowMessage('Incorrect parameters!');
end;
end.