Разработка базы данных и прикладного программного обеспечения для автобусного парка
Разработка базы данных и прикладного программного обеспечения для автобусного парка
33 Министерство образования и науки Республики Казахстан Карагандинский государственный технический университет Кафедра ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОМУ ПРОЕКТУ Дисциплина: Технология разработки баз данных Тема: Разработка базы данных и прикладного ПО для автобусного парка Принял: ___________________________ Выполнил: студент гр. ________ ___________________________ Караганда 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 | Идентификатор маршрута | | |
Таблица 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 Заключение В связи со стремительно развивающимися на данный момент технологиями хранение информации на бумажных носителях отходит в прошлое, и повсеместно вводятся средства электронного учета. В курсовой работе предложен метод оперативного обслуживания БД применительно к небольшому автопарку. Подобный метод может быть применен в любой (практически) организации. Дальнейшее совершенствование программы возможно в сторону нормализации базы данных, добавления неких графических представлений, учёта различных состояний транспорта и т.д. При их внедрении программа может стать коммерческим продуктом, ориентированным на предприятия, занимающиеся доставкой корреспонденции, товаров народного потребления, курьерские службы, таксомоторные парки, автобусные и троллейбусные парки и т.п. Список использованной литературы 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.
|