Разработка базы данных и прикладного программного обеспечения для автобусного парка

Министерство образования и науки Республики Казахстан

Карагандинский государственный технический университет

Кафедра

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОМУ ПРОЕКТУ

Дисциплина: Технология разработки баз данных

Тема: Разработка базы данных и прикладного ПО для автобусного парка

Принял:

___________________________

Выполнил: студент гр. ________

___________________________

Караганда 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.