Разработка базы данных и прикладного программного обеспечения для автобусного парка
Министерство образования и науки Республики Казахстан
Карагандинский государственный технический университет
Кафедра
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОМУ ПРОЕКТУ
Дисциплина: Технология разработки баз данных
Тема: Разработка базы данных и прикладного ПО для автобусного парка
Принял:
___________________________
Выполнил: студент гр. ________
___________________________
Караганда 2009
С одержание
Введение
Постановка задачи
Теоретическая часть
Программное обеспечение
Концептуальная модель данных
Логическая модель базы данных
Руководство пользователю
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
Идентификатор маршрута
Таблица stoppoints содержит информацию об остановочных пунктах
-
Имя поля
Тип поля
Описание
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
Идентификатор маршрута
Информация об автобусах парка хранится в таблице buses
Имя поля |
Тип поля |
Описание |
id |
INT UNSIGNED AUTO_INCREMENT KEY |
Уникальный идентификатор автобуса |
model |
NVARCHAR(50) NOT NULL |
Модель автобуса |
issue |
NVARCHAR(7) NOT NULL |
Государственный регистрационный номер автобуса |
routeid |
INT UNSIGNED NOT NULL |
Идентификатор маршрута |
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
Заключение
В связи со стремительно развивающимися на данный момент технологиями хранение информации на бумажных носителях отходит в прошлое, и повсеместно вводятся средства электронного учета. В курсовой работе предложен метод оперативного обслуживания БД применительно к небольшому автопарку. Подобный метод может быть применен в любой (практически) организации.
Дальнейшее совершенствование программы возможно в сторону нормализации базы данных, добавления неких графических представлений, учёта различных состояний транспорта и т.д. При их внедрении программа может стать коммерческим продуктом, ориентированным на предприятия, занимающиеся доставкой корреспонденции, товаров народного потребления, курьерские службы, таксомоторные парки, автобусные и троллейбусные парки и т.п.
Список использованной литературы
Структуризированный язык запросов (SQL). Учебное пособие
А.М. Терлецкая БД. Лекции.
П. Дарахвелидзе, Е. Марков. Программирование в Delphi 7. СПб.: «БХВ-Петербург». 2003. 784 с: ил.
М. Фленов. Библия программистов в среде Delphi. 2002. 636 с.
С. Лукьяненко. Спектр. М.: ООО «Издательство АСТ», ОАО «Люкс». 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.