Скачайте в формате документа WORD

Объектно-ориентированное программирование Автобусы и маршруты

Содержание

Содержание <_

1. Введение <_

2. Постановка задачи <_

3. Структура выходных и входных данных <_

4. Описание основных классов <_

5. Листинг программы <_

6. Результат работы программы <_

7. Заключение <_

8. Литератур <_



1. Введение

Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько "близок к машине", что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким мыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько "близок к решаемой задаче", чтобы концепции ее решения можно было выражать прямо и коротко. С таким мыслом предварительно задумывались средства, добавленные к C для создания C++.

Связь между языком, на котором мы думаем/программируем, и задачами и решениями, которые мы можем представлять в своем воображении, очень близка. По этой причине ограничивать свойства языка только целями исключения ошибок программиста в лучшем случае опасно. Язык предоставляет программисту набор концептуальных инструментов; если они не отвечают задаче, то их просто игнорируют. Например, серьезные ограничения концепции казателя заставляют программиста применять вектора и целую арифметику, чтобы реализовать структуры, указатели и т.п. Хорошее проектирование и отсутствие ошибок не может гарантироваться чисто за счет языковых средств. Система типов должна быть особенно полезна в нетривиальных задачах. Действительно, концепция классов в C++ показала себя мощным концептуальным средством.




2. Постановка задачи

Написать информационную систему по чёту автобусных рейсов. Информационная система должна позволять:

         Вести учет автотранспорта (преимущественно автобусного). В свою очередь следует:

         учитывать время отправления каждого автобуса;

         учитывать типы автобусов;

         привязывать автотранспорт (автобусы) к рейсам;

         Вести учет рейсов. В свою очередь следует:

         учитывать пути, составляющие рейс;

         Вести учет остановочных пунктов


Система должна обеспечить выполнение этих возможностей путем реализации алгоритмов даления, редактирования и добавления новой информации.

При этом при далении следует обеспечить целостность данных и выводить предупреждение пользователю в тех случаях, когда удаление информации невозможно в результате наличия связей с другими сущностями.

При добавлении необходимо разработать механизм, реализующий проверку на никальность, который в случаях, когда необходимо соблюдать никальность, будет предупреждать пользователя о недопустимости таких действий, также будет препятствовать добавлению такой информации. Также необходимо обеспечить проверку на пустоту и ограничивать действия пользователя в тех случаях, когда он пытается ввести пустые значения.

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


Для реализации поставленной задачи использовать Visual Studio C<++ версии не ниже 6.0. В частности применить библиотеку Microsoft Foundation Classes (MFC), представляющую интерфейс ODBC для доступа к базам данных и другие возможности.



3. Структура выходных и входных данных

Программа использует СУБД Access. В ней будет разработана основная база (bus.mdb). Разрабатываемая программа будет взаимодействовать с базой путем интерфейса MFC< ODBC, что позволяет размещать данные как непосредственно на локальном компьютере, так и на любой машине в сети, предоставляющий открытый доступ к такого рода ресурсам.

База данных содержит в себе необходимое и достаточное количество нормализованных сущностей - таблиц:

         Bus - таблица, размещающая информацию об автобусах. Содержит три поля: первое - это никальный идентификатор автобуса, однозначно определяющий его во всем множестве других автобусов, второе - тип автобуса, третье - никальный идентификатор рейса.

Название

тип

bus_ID

счетчик

busType_ID

длинное целое

race_ID

длинное целое


        

Название

тип

path_ID

счетчик

start/end station_ID

длинное целое

end/start station_ID

длинное целое

time

длинное целое


         Race - таблица, размещающая информацию о рейсах. Имеет два поля:а первое - это никальный идентификатор рейса, однозначно определяющий его во всем множестве других рейсов, второе - описание рейса.

Название

тип

race_ID

счетчик

description

поле


         Race

Название

тип

race_ID

счетчик

path_ID

поле memo


         Station - таблица, размещающая информацию об остановочных пунктах автобусов. Имеет два поля - это никальный идентификатор остановочного пункта, однозначно определяющий его во всем множестве других остановочных пунктах, и поле с его названием.

Название

тип

station_ID

длинное целое

name

длинное целое


         Time - таблица, размещающая информацию о временах отправлений автобусов[1]<. Автобусы, привязанные к одному рейсу, в течении определенного периода могут неоднократно отправляться в рейс в разные часы, что и отражается структурой данной таблицы. Таблица состоит из 3 полей: первое - это никальный идентификатор времени, однозначно определяющий его во всем множестве других времен отправлений, второе поле - это идентификатор автобуса, свеянный с таблицей Bus (поскольку таблица Bus связанна с Time связью один ко многим, в Time может присутствовать несколько идентификаторов одного автобуса), третье поле - время отправления.

Название

тип

time_ID

счетчик

bus_ID

длинное целое

time

длинное целое


         Type - таблица, размещающая информацию о типах автобусов (классов). Имеет два поля - это никальный идентификатор типа, однозначно определяющий его во всем множестве других типов, и поле с названием типа.

Название

тип

busType_ID

счетчик

name

поле



Схема данных представлена в таблице 1. Она отражает сущности, также связи и их типы.


Таблица 1 - схема данных



4. Описание основных классов

На рисунке 1 изображена диаграмма классов. Она отражает все классы проекта. Практически все классы являются пользовательскими. Они переопределены от встроенных классов путем однократного и множественного наследования.

Класс CMyDBVariant представляет собой объект, способный хранить различные типы данных. Он незаменим для работы с базой данный. Его прародителем стал класс CDBVariant. Поскольку возможностей базового класса оказалось недостаточно, пришлось его переопределить, вводя дополнительные переменные m<_cstring для передачи строк типа Cstring и m<_time для передачи времени типа CTime.

CMyDBRecordset - новый класс от CDBRecordset. Более гибок, нежели стандартный класс. Позволяет легко, без внедрения дополнительных переопределений, на месте, быстро создать представление сущности. В него добавлены: Count - член класса, хранящий количество записей (это сделано в силу того, что метод GetCount не возвращает реального количества), DefineRealCount - метод, определяющий Count. Также в этот класс входит fieldnames и fieldValues, позволяющий не передавать непосредственно переменные в метод DoFieldExchange держать их прямо в классе в качестве его членов, что значительно прощает код и способ обращения к полям представления.


Полное описание классов находиться в листинге программы.

Рисунок 1 - Диаграмма классов


5. Листинг программы

CAboutForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CAboutForm.h"


CAboutForm::CAboutForm(CWnd* pParent):CDialog(CAboutForm::IDD,pParent){

<}


oid CAboutForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CAboutForm, CDialog)

END_MESSAGE_MAP()

CAboutForm.h

#if !defined(AFX_CABOUTFORM_H__09D6634D_16A6_44E9_849C_AD1B2E71646D__INCLUDED_)

#define AFX_CABOUTFORM_H__09D6634D_16A6_44E9_849C_AD1B2E71646D__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CAboutForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CAboutForm dialog


class CAboutForm : public CDialog

{

// Construction

public:

CAboutForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CABOUTFORM_H__09D6634D_16A6_44E9_849C_AD1B2E71646D__INCLUDED_)

CBusForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CBusForm.h"

#include "CTypeForm.h"

#include "../ExLibrary/CMyRecordset.h"

CString IsEmpty_CEdit(CEdit* ctrl);


CBusForm::CBusForm(CWnd* pParent):CDialog(CBusForm::IDD, pParent){

<}


oid CBusForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CBusForm, CDialog)

ON_BN_CLICKED(Button_showBusType, showBusType_onClick)

ON_BN_CLICKED(Button_DeleteBus, DeleteBus_onClick)

ON_BN_CLICKED(Button_EditBus, EditBus_onClick)

ON_BN_CLICKED(Button_AddBus, AddBus_onClick)

ON_BN_CLICKED(IDOK, OK_onClick)

ON_WM_CLOSE()

END_MESSAGE_MAP()


/* ============================

<===== User realization =====

<============================ */


CListBox* pList_Bus;

CComboBox* pComboBox_BusType;

CComboBox* pComboBox_RaceInBus;



/* ============================

<====== indexes & Funcn =====

<============================ */



oid ClearIndexes_pList_Bus_indexes(){

delete []pList_Bus_indexes,pLBiLen;


oid InitIndexes_pList_Bus_indexes(int len){

*(pLBiLen=new int)=len;}


oid SetIndexes_pList_Bus_indexes(int idx,int value){



oid ClearIndexes_pComboBox_BusType_indexes(){

delete []pComboBox_BusType_indexes,pCBBTiLen;


oid InitIndexes_pComboBox_BusType_indexes(int len){

*(pCBBTiLen=new int)=len;}


oid SetIndexes_pComboBox_BusType_indexes(int idx,int value){



oid ClearIndexes_pComboBox_RaceInBus_indexes(){

delete []pComboBox_RaceInBus_indexes,pCBRIBiLen;


oid InitIndexes_pComboBox_RaceInBus_indexes(int len){

*(pCBRIBiLen=new int)=len;}


oid SetIndexes_pComboBox_RaceInBus_indexes(int idx,int value){


/* ============================

<====== ............... =====

<============================ */


oid Load_List_Bus(){

Load_List("SELECT Bus.bus_ID,Trim(Str(Bus.bus_ID))+') '+Race.description+' - '+Type.name FROM Type INNER JOIN (Race INNER JOIN Bus ON Race.race_ID = Bus.race_ID) ON Type.busType_ID = Bus.busType_ID ORDER BY Trim(Str(Bus.bus_ID))+') '+Race.description+' - '+Type.name","[bus_ID]&,[Expr1001]$",

ClearIndexes_pList_Bus_indexes,

InitIndexes_pList_Bus_indexes,

SetIndexes_pList_Bus_indexes);}


oid Load_ComboBox_BusType(){

Load_List("SELECT Type.* FROM Type","[busType_ID]&,[name]$",

ClearIndexes_pComboBox_BusType_indexes,

InitIndexes_pComboBox_BusType_indexes,

SetIndexes_pComboBox_BusType_indexes);}


oid Load_ComboBox_RaceInBus(){

Load_List("SELECT Race.race_ID,Trim(Str(Race.race_ID))+') '+Race.description FROM Race","[race_ID]&,[Expr1001]$",

ClearIndexes_pComboBox_RaceInBus_indexes,

InitIndexes_pComboBox_RaceInBus_indexes,

SetIndexes_pComboBox_RaceInBus_indexes);}


bool IsSelected_BusForm(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


bool IsSelected_List_Bus(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


oid setCurSel_List_Bus(int fictionIndex){

return;}}


/* ============================

<====== Add Edit Remove =====

<============================ */


oid CBusForm::AddBus_onClick(){

CString insertSql="INSERT INTO Bus (busType_ID,race_ID) Values($$1,$$2)";

DB.ExecuteSQL(insertSql);

Load_List_Bus();

RS=new CMyRecordset(&DB);

CString getNewIdSql="SELECT TOP 1 Bus.bus_ID FROM Bus WHERE Bus.busType_ID=$$1 AND Bus.race_ID=$$2 ORDER BY Bus.bus_ID DESC";

RS->Open(getNewIdSql,"[bus_ID]&");

RS->MoveFirst();

RS->Close();

delete RS;


oid CBusForm::EditBus_onClick(){

CString updateSql="UPDATE Bus SET Bus.busType_ID=$$1,Bus.race_ID=$$2 WHERE Bus.bus_ID=$$3";

DB.ExecuteSQL(updateSql);

Load_List_Bus();


oid CBusForm::DeleteBus_onClick(){

CString deleteSql="DELETE Bus.*, Bus.bus_ID FROM Bus WHERE Bus.bus_ID=$$$";

deleteSql.Replace("$$$",toString(cID));

DB.ExecuteSQL(deleteSql);

Load_List_Bus();

// :::


/* ============================

<=== OnInitDialog OnClose ===

<============================ */


oid CBusForm::OK_onClick(){SendMessage(WM_CLOSE,0,0);}


BOOL CBusForm::OnInitDialog(){CDialog::OnInitDialog();

Load_List_Bus();

Load_ComboBox_BusType();

Load_ComboBox_RaceInBus();

return TRUE;}


oid CBusForm::OnClose(){CDialog::OnClose();

ClearIndexes_pList_Bus_indexes();

ClearIndexes_pComboBox_BusType_indexes();

ClearIndexes_pComboBox_RaceInBus_indexes();}


oid CBusForm::showBusType_onClick(){

CTypeForm typeForm;

Load_ComboBox_BusType();}

CBusForm.h

#if !defined(AFX_CBUSFORM_H__15C9D50F_B1DF_4489_9E98_8BAF03968B1A__INCLUDED_)

#define AFX_CBUSFORM_H__15C9D50F_B1DF_4489_9E98_8BAF03968B1A__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CBusForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CBusForm dialog


class CBusForm : public CDialog

{

// Construction

public:

CBusForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CBUSFORM_H__15C9D50F_B1DF_4489_9E98_8BAF03968B1A__INCLUDED_)

CMainForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CMainForm.h"

#include "CAboutForm.h"

#include "CTimeForm.h"

#include "CStationForm.h"

#include "CPathForm.h"

#include "CRaceForm.h"

#include "CBusForm.h"

#include "../ExLibrary/CMyRecordset.h"


CMainForm::CMainForm(CWnd* pParent):CDialog(CMainForm::IDD, pParent){

<}


oid CMainForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CMainForm, CDialog)

ON_BN_CLICKED(Button_showTime, showTime_onClick)

ON_BN_CLICKED(Button_showStation, showStation_onClick)

ON_BN_CLICKED(Button_showPath, showPath_onClick)

ON_BN_CLICKED(Button_showAbout, showAbout_onClick)

ON_BN_CLICKED(Button_showRace, showRace_onClick)

ON_BN_CLICKED(Button_showBus, showBus_onClick)

END_MESSAGE_MAP()


/* ============================

<===== User realization =====

<============================ */


oid CMainForm::showTime_onClick(){

CTimeForm timeForm;


oid CMainForm::showStation_onClick(){

CStationForm stationForm;


oid CMainForm::showPath_onClick(){

CPathForm pathForm;


oid CMainForm::showAbout_onClick(){

CAboutForm aboutForm;


oid CMainForm::showRace_onClick(){

CRaceForm raceForm;

raceForm.DoModal();}


oid CMainForm::showBus_onClick(){

CBusForm busForm;


BOOL CMainForm::OnInitDialog(){

CDialog::OnInitDialog();

DB.Open("ODBC;DSN=");}

CString str;

AfxMessageBox(str);

return TRUE;}

CMainForm.h

#if !defined(AFX_CMAINFORM_H__43C7FDB1_2162_4824_BBAC_EAF31944B6FB__INCLUDED_)

#define AFX_CMAINFORM_H__43C7FDB1_2162_4824_BBAC_EAF31944B6FB__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CMainForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CMainForm dialog


class CMainForm : public CDialog

{

// Construction

public:

CMainForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CMAINFORM_H__43C7FDB1_2162_4824_BBAC_EAF31944B6FB__INCLUDED_)

CPathForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CPathForm.h"

#include "../ExLibrary/CMyRecordset.h"

CString IsEmpty_CEdit(CEdit* ctrl);


CPathForm::CPathForm(CWnd* pParent):CDialog(CPathForm::IDD,pParent){

<}


oid CPathForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CPathForm, CDialog)

ON_BN_CLICKED(Button_AddPath, AddPath_onClick)

ON_BN_CLICKED(Button_EditPath, EditPath_onClick)

ON_BN_CLICKED(Button_DeletePath, DeletePath_onClick)

ON_BN_CLICKED(IDOK, OK_onClick)

ON_WM_CLOSE()

END_MESSAGE_MAP()


/* ============================

<===== User realization =====

<============================ */


CListBox* pList_Pathes;

CComboBox* pComboBox_Station1;

CComboBox* pComboBox_Station2;

CEdit* pEdit_pathTime;



/* ============================

<====== indexes & Funcn =====

<============================ */



oid ClearIndexes_pList_Pathes_indexes(){

delete []pList_Pathes_indexes,pLPiLen;


oid InitIndexes_pList_Pathes_indexes(int len){

*(pLPiLen=new int)=len;}



oid ClearIndexes_pComboBox_Stations_indexes(){

delete []pComboBox_Stations_indexes,pCBSiLen;


oid InitIndexes_pComboBox_Stations_indexes(int len){

*(pCBSiLen=new int)=len;}


/* ============================

<====== ............... =====

<============================ */


oid Load_ComboBox_Stations(){

RS=new CMyRecordset(&DB);

RS->Open("SELECT Station.* FROM Station","[station_ID]&,[name]$");

RS->DefineRealCount();

ClearIndexes_pComboBox_Stations_indexes();

InitIndexes_pComboBox_Stations_indexes(RS->Count);

RS->MoveNext();}}

RS->Close();

delete RS;}


oid Load_List_Pathes(){

RS=new CMyRecordset(&DB);

RS->Open("SELECT Path.path_ID, Station_1.name+' <-> '+Station_2.name+' - ('+Trim(Str(Path.time))+' min)' FROM Station AS Station_2 INNER JOIN (Station AS Station_1 INNER JOIN Path ON Station_1.station_ID = Path.[start/end station_ID]) ON Station_2.station_ID = Path.[end/start station_ID] ORDER BY Station_1.name,Station_2.name,Path.time","[path_ID]&,[Expr1001]$");

RS->DefineRealCount();

ClearIndexes_pList_Pathes_indexes();

InitIndexes_pList_Pathes_indexes(RS->Count);

RS->MoveNext();}}

RS->Close();

delete RS;}


bool IsSelected_PathStations(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


bool IsSelected_List_Pathes(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


oid setCurSel_PathStations(int fictionIndex){

return;}}


/* ============================

<====== Add Edit Remove =====

<============================ */


oid CPathForm::AddPath_onClick(){

CString newValue;

AfxMessageBox("Path can't be cycled!");

return;}

CString prepSql="SELECT Path.path_ID FROM Path WHERE (Path.[start/end station_ID]=$$1 OR Path.[start/end station_ID]=$$2) AND (Path.[end/start station_ID]=$$1 OR Path.[end/start station_ID]=$$2) AND (Path.time=$$3)";

CString insertSql="INSERT INTO Path ([start/end station_ID],[end/start station_ID],[time]) Values($$1,$$2,$$3)";

DB.ExecuteSQL(insertSql);

Load_List_Pathes();

RS=new CMyRecordset(&DB);

CString getNewIdSql="SELECT Path.path_ID FROM Path WHERE Path.[start/end station_ID]=$$1 AND Path.[end/start station_ID]=$$2 AND Path.time=$$3";

RS->Open(getNewIdSql,"[path_ID]&");

RS->MoveFirst();

RS->Close();

delete RS;


oid CPathForm::EditPath_onClick(){

CString newValue;

AfxMessageBox("Path can't be cycled!");

return;}

CString prepSql="SELECT Path.path_ID FROM Path WHERE (Path.[start/end station_ID]=$$1 OR Path.[start/end station_ID]=$$2) AND (Path.[end/start station_ID]=$$1 OR Path.[end/start station_ID]=$$2) AND (Path.time=$$3);";

CString updateSql="UPDATE Path SET Path.[start/end station_ID]=$$1, Path.[end/start station_ID]=$$2, Path.[time]=$$3 WHERE Path.path_ID=$$4";

DB.ExecuteSQL(updateSql);

Load_List_Pathes();


oid CPathForm::DeletePath_onClick(){

CString relateTestSql="SELECT [Race items].race_ID FROM [Race items] WHERE [Race items].path_ID=$$$";

relateTestSql.Replace("$$$",toString(cID));

CString deleteSql="DELETE Path.* FROM Path WHERE Path.path_ID=$$$";

deleteSql.Replace("$$$",toString(cID));

DB.ExecuteSQL(deleteSql);

Load_List_Pathes();


/* ============================

<=== OnInitDialog OnClose ===

<============================ */


oid CPathForm::OK_onClick(){SendMessage(WM_CLOSE,0,0);}


BOOL CPathForm::OnInitDialog(){CDialog::OnInitDialog();

// >>>

Load_ComboBox_Stations();

Load_List_Pathes();

return TRUE;}


oid CPathForm::OnClose(){CDialog::OnClose();

ClearIndexes_pComboBox_Stations_indexes();

ClearIndexes_pList_Pathes_indexes();}

CPathForm.h

#if !defined(AFX_CPATHFORM_H__ADDA99DE_4EF9_466B_8617_713613F3161E__INCLUDED_)

#define AFX_CPATHFORM_H__ADDA99DE_4EF9_466B_8617_713613F3161E__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CPathForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CPathForm dialog


class CPathForm : public CDialog

{

// Construction

public:

CPathForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CPATHFORM_H__ADDA99DE_4EF9_466B_8617_713613F3161E__INCLUDED_)

CRaceForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CRaceForm.h"

#include "../ExLibrary/CMyRecordset.h"

CString IsEmpty_CEdit(CEdit* ctrl);


CRaceForm::CRaceForm(CWnd* pParent):CDialog(CRaceForm::IDD,pParent){

<}


oid CRaceForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CRaceForm, CDialog)

ON_BN_CLICKED(Button_AddRace, AddRace_onClick)

ON_BN_CLICKED(Button_EditRace, EditRace_onClick)

ON_BN_CLICKED(Button_DeleteRace, DeleteRace_onClick)

ON_BN_CLICKED(IDOK, OK_onClick)

ON_WM_CLOSE()

ON_BN_CLICKED(Button_toAcceptPath, toAcceptPath_onCLick)

ON_BN_CLICKED(Button_toFreePath, toFreePath_onClick)

ON_LBN_SELCHANGE(Race_List, SelchangeList_onSelectChange)

ON_LBN_SELCHANGE(List_AcceptPath, AcceptPath_onSelchange)

ON_LBN_SELCHANGE(List_FreePath, FreePath_onSelchange)

END_MESSAGE_MAP()


/* ============================

<===== User realization =====

<============================ */


CListBox* pRace_List;

CEdit* pEdit_race;


CListBox* pList_AcceptPath;

CListBox* pList_FreePath;



/* ============================

<====== indexes & Funcn =====

<============================ */



oid ClearIndexes_pRace_List_indexes(){

delete []pRace_List_indexes,pRLiLen;


oid InitIndexes_pRace_List_indexes(int len){

*(pRLiLen=new int)=len;}



oid ClearIndexes_pList_AcceptPath_indexes(){

delete []pList_AcceptPath_indexes,pLAPiLen;


oid InitIndexes_pList_AcceptPath_indexes(int len){

*(pLAPiLen=new int)=len;}


oid SetIndexes_pList_AcceptPath_indexes(int idx,int value){



oid ClearIndexes_pList_FreePath_indexes(){

delete []pList_FreePath_indexes,pLFPiLen;


oid InitIndexes_pList_FreePath_indexes(int len){

*(pLFPiLen=new int)=len;}


oid SetIndexes_pList_FreePath_indexes(int idx,int value){


/* ============================

<====== ............... =====

<============================ */


oid Load_Race_List(){

RS=new CMyRecordset(&DB);

RS->Open("SELECT Race.race_ID, Str(Race.race_ID)+') '+Race.description FROM Race ORDER BY Race.description","[race_ID]&,[Expr1001]$");

RS->DefineRealCount();

ClearIndexes_pRace_List_indexes();

InitIndexes_pRace_List_indexes(RS->Count);

RS->MoveNext();}}

RS->Close();

delete RS;}


bool IsSelected_Race_List(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


oid setCurSel_Race_List(int fictionIndex){

return;}}


/* ============================

<====== Add Edit Remove =====

<============================ */


oid CRaceForm::AddRace_onClick(){

CString newValue;

CString prepSql="SELECT Race.race_ID FROM Race WHERE Race.description='$$$'";

CString insertSql="INSERT INTO Race (description) Values('$$$')";

DB.ExecuteSQL(insertSql);

Load_Race_List();

RS=new CMyRecordset(&DB);

CString getNewIdSql="SELECT Race.race_ID FROM Race WHERE Race.description='$$1'";

RS->Open(getNewIdSql,"[race_ID]&");

RS->MoveFirst();

RS->Close();

delete RS;


oid CRaceForm::EditRace_onClick(){

CString newValue;

CString prepSql="SELECT Race.race_ID FROM Race WHERE Race.description='$$$'";

CString updateSql="UPDATE Race SET Race.description='$$1' WHERE Race.race_ID=$$2";

DB.ExecuteSQL(updateSql);

Load_Race_List();


oid CRaceForm::DeleteRace_onClick(){

CString relateTestSql="SELECT Bus.bus_ID FROM Bus WHERE Bus.race_ID=$$$";

relateTestSql.Replace("$$$",toString(cID));

CString deleteSql="DELETE Race.* FROM Race WHERE Race.race_ID=$$$";

deleteSql.Replace("$$$",toString(cID));

DB.ExecuteSQL(deleteSql);

Load_Race_List();


/* ============================

<======= Accept pathes ======

<============================ */


oid CRaceForm::AcceptPath_onSelchange(){pList_FreePath->SetCurSel(-1);}

oid CRaceForm::FreePath_onSelchange(){pList_AcceptPath->SetCurSel(-1);}


CString sh1Sql="SELECT Path.path_ID, Station_1.name+' < - > '+Station_2.name FROM Station AS Station_2 INNER JOIN ((Station AS Station_1 INNER JOIN PAth ON Station_1.station_ID = PAth.[start/end station_ID]) INNER JOIN [Race items] ON Path.path_ID = [Race items].path_ID) ON Station_2.station_ID = Path.[end/start station_ID] WHERE [Race items].race_ID = $$1 ORDER BY Station_1.name+' < - > '+Station_2.name";

CString sh2Sql="SELECT PAth.path_ID, Station_1.name+' < - > '+Station_2.name FROM Station AS Station_2 INNER JOIN ((Station AS Station_1 INNER JOIN PAth ON Station_1.station_ID = PAth.[start/end station_ID]) LEFTа JOIN [Race items] ON PAth.path_ID = [Race items].path_ID) ON Station_2.station_ID = PAth.[end/start station_ID] WHERE [Race items].race_ID <> $$1 Or [Race items].race_ID Is Null ORDER BY Station_1.name+' < - > '+Station_2.name";


oid Load_List_AcceptPath(long cID){

CString tmpSql(sh1Sql);

Load_List(tmpSql,"[path_ID]&,[Expr1001]$",pList_AcceptPath,ClearIndexes_pList_AcceptPath_indexes,InitIndexes_pList_AcceptPath_indexes,SetIndexes_pList_AcceptPath_indexes);}


oid Load_List_FreePath(long cID){

CString tmpSql(sh2Sql);

Load_List(tmpSql,"[path_ID]&,[Expr1001]$",pList_FreePath,ClearIndexes_pList_FreePath_indexes,InitIndexes_pList_FreePath_indexes,SetIndexes_pList_FreePath_indexes);}


oid CRaceForm::toAcceptPath_onCLick(){

AfxMessageBox("Nothing selected!");

return;}

CString prepSql="INSERT INTO [Race items] (race_ID,path_ID) Values($$1,$$2)";

DB.ExecuteSQL(prepSql);

Load_List_AcceptPath(cRaceID);

Load_List_FreePath(cRaceID);}


oid CRaceForm::toFreePath_onClick(){

AfxMessageBox("Nothing selected!");

return;}

CString prepSql="DELETE [Race items].* FROM [Race items] WHERE [Race items].path_ID=$$$";

DB.ExecuteSQL(prepSql);

Load_List_AcceptPath(cRaceID);

Load_List_FreePath(cRaceID);}


oid CRaceForm::SelchangeList_onSelectChange(){

Load_List_AcceptPath(cID);

Load_List_FreePath(cID);}


/* ============================

а<=== OnInitDialog OnClose ===

<============================ */


oid CRaceForm::OK_onClick(){SendMessage(WM_CLOSE,0,0);}


BOOL CRaceForm::OnInitDialog(){CDialog::OnInitDialog();

// >>>

Load_Race_List();

return TRUE;}


oid CRaceForm::OnClose(){CDialog::OnClose();

ClearIndexes_pRace_List_indexes();

ClearIndexes_pList_AcceptPath_indexes();

ClearIndexes_pList_FreePath_indexes();}

CRaceForm.h

#if !defined(AFX_CRACEFORM_H__4F7EEA3A_E810_4324_9EAE_F11652E482D3__INCLUDED_)

#define AFX_CRACEFORM_H__4F7EEA3A_E810_4324_9EAE_F11652E482D3__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CRaceForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CRaceForm dialog


class CRaceForm : public CDialog

{

// Construction

public:

CRaceForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:

DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CRACEFORM_H__4F7EEA3A_E810_4324_9EAE_F11652E482D3__INCLUDED_)

CStationForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CStationForm.h"

#include "../ExLibrary/CMyRecordset.h"

CString IsEmpty_CEdit(CEdit* ctrl);


CStationForm::CStationForm(CWnd* pParent):CDialog(CStationForm::IDD,pParent){

<}


oid CStationForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CStationForm, CDialog)

ON_BN_CLICKED(Button_AddStation, AddStation_onClick)

ON_BN_CLICKED(Button_EditStation, EditStation_onClick)

ON_BN_CLICKED(Button_DeleteStation, DeleteStation_onClick)

ON_BN_CLICKED(IDOK, OK_onClick)

ON_WM_CLOSE()

END_MESSAGE_MAP()


/* ============================

а<===== User realization =====

<============================ */


CListBox* pList_Station;

CEdit* pEdit_station;



/* ============================

<====== indexes & Funcn =====

<============================ */



oid ClearIndexes_pList_Station_indexes(){

delete []pList_Station_indexes,pLSiLen;


oid InitIndexes_pList_Station_indexes(int len){

*(pLSiLen=new int)=len;}


/* ============================

<====== Add Edit Remove =====

<============================ */


oid Load_List_Station(){

RS=new CMyRecordset(&DB);

RS->Open("SELECT * FROM Station ORDER BY name","[station_ID]&,[name]$");

RS->DefineRealCount();

InitIndexes_pList_Station_indexes(RS->Count);

RS->MoveNext();}}

RS->Close();

delete RS;}


oid setCurSel_StationForm(int fictionIndex){

return;}}


bool IsSelected_StationForm(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


/* ============================

<====== ............... =====

<============================ */


oid CStationForm::AddStation_onClick(){

CString newValue;

CString prepSql="SELECT name From Station WHERE name='$$$'";

CString insertSql="INSERT INTO Station (name) Values('$$$')";

DB.ExecuteSQL(insertSql);

Load_List_Station();

RS=new CMyRecordset(&DB);

CString getNewIdSql="SELECT station_ID From Station WHERE name='$$$'";

RS->Open(getNewIdSql,"[station_ID]&");

RS->MoveFirst();

RS->Close();

delete RS;


oid CStationForm::EditStation_onClick(){

CString newValue;

CString prepSql="SELECT name From Station WHERE name='$$$'";

CString updateSql="UPDATE Station SET Station.name = '$$1' WHERE station_ID=$$2";

DB.ExecuteSQL(updateSql);

Load_List_Station();


oid CStationForm::DeleteStation_onClick(){

CString relateTestSql="SELECT path_ID FROM path WHERE [start/end station_ID]=$$$ OR [end/start station_ID]=$$$";

relateTestSql.Replace("$$$",toString(cID));

CString deleteSql="DELETE * FROM Station WHERE station_ID=";

deleteSql+=toString(cID);

DB.ExecuteSQL(deleteSql);

Load_List_Station();


/* ============================

<=== OnInitDialog OnClose ===

<============================ */


oid CStationForm::OK_onClick(){SendMessage(WM_CLOSE,0,0);}


BOOL CStationForm::OnInitDialog(){CDialog::OnInitDialog();

Load_List_Station();

return TRUE;}


oid CStationForm::OnClose(){CDialog::OnClose();

ClearIndexes_pList_Station_indexes();}

CStationForm.cpp

#if !defined(AFX_CSTATIONFORM_H__446D119D_055C_445F_8865_161D473D2E2E__INCLUDED_)

#define AFX_CSTATIONFORM_H__446D119D_055C_445F_8865_161D473D2E2E__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CStationForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CStationForm dialog


class CStationForm : public CDialog

{

// Construction

public:

CStationForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CSTATIONFORM_H__446D119D_055C_445F_8865_161D473D2E2E__INCLUDED_)

CTimeForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CTimeForm.h"

#include "../ExLibrary/CMyRecordset.h"


CTimeForm::CTimeForm(CWnd* pParent):CDialog(CTimeForm::IDD,pParent){

<}


oid CTimeForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CTimeForm, CDialog)

ON_BN_CLICKED(Button_timesHelp, timesHelp_onClick)

ON_BN_CLICKED(Button_AddTime, AddTime_onClick)

ON_BN_CLICKED(Button_EditTime, EditTime_onClick)

ON_BN_CLICKED(Button_DeleteTime, DeleteTime_onClick)

ON_BN_CLICKED(IDOK, OK_onClick)

ON_WM_CLOSE()

ON_CBN_SELCHANGE(ComboBox_BusList, SelchangeBusList_onChange)

END_MESSAGE_MAP()


/* ============================

<===== User realization =====

<============================ */


CListBox* pList_Time;

CComboBox* pComboBox_BusList;

CComboBox* pComboBox_TimeH;

CComboBox* pComboBox_TimeM;



/* ============================

<====== indexes & Funcn =====

<============================ */



oid ClearIndexes_pList_Time_indexes(){

delete []pList_Time_indexes,pLTiLen;


oid InitIndexes_pList_Time_indexes(int len){

*(pLTiLen=new int)=len;}



oid ClearIndexes_pComboBox_BusList_indexes(){

delete []pComboBox_BusList_indexes,pLTiLen;


oid InitIndexes_pComboBox_BusList_indexes(int len){

*(pCBBiLen=new int)=len;}


/* ============================

<====== ............... =====

<============================ */


oid Load_List_Time(int busID){

RS=new CMyRecordset(&DB);

CString selectSql="SELECT Time.time_ID,Time.time FROM [Time] WHERE Time.bus_ID=$$$ ORDER BY Time.time;"; selectSql.Replace("$$$",toString(busID));

RS->Open(selectSql,"[time_ID]&,[time]&");

RS->DefineRealCount();

ClearIndexes_pList_Time_indexes();

InitIndexes_pList_Time_indexes(RS->Count);

CString Time,buf1,buf2;

Time+=buf1.Right(2); Time+=":";

Time+=buf2.Right(2);

RS->MoveNext();}}

RS->Close();

delete RS;}


oid Load_ComboBox_BusList(){

RS=new CMyRecordset(&DB);

CString selectSql="SELECT Bus.bus_ID,Type.name,Race.description FROM Race INNER JOIN (Type INNER JOIN Bus ON Type.busType_ID = Bus.busType_ID) ON Race.race_ID = Bus.race_ID ORDER BY Type.name,Race.description";

RS->Open(selectSql,"[bus_ID]&,[name]$,[description]$");

RS->DefineRealCount();

ClearIndexes_pComboBox_BusList_indexes();

InitIndexes_pComboBox_BusList_indexes(RS->Count);

CString buf;

RS->MoveNext();}}

RS->Close();

delete RS;}


bool IsSelected_Time(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


bool IsEmpty_List_Time(){

AfxMessageBox("No selected hour or min.!");

return 0;}

return 1;}


oid setCurSel_List_Time(int fictionIndex){

return;}}


/* ============================

<====== Add Edit Remove =====

<============================ */


oid CTimeForm::AddTime_onClick(){

AfxMessageBox("No selected bus!");

return;}

CString prepSql="SELECT Time.time FROM [Time] WHERE Time.bus_ID=$$1 AND Time.time=$$2";

CString insertSql="INSERT INTO [Time] (bus_ID,[time]) Values($$1,$$2)";

DB.ExecuteSQL(insertSql);

Load_List_Time(busID);

RS=new CMyRecordset(&DB);

CString getNewIdSql="SELECT Time.time_ID FROM [Time] WHERE Time.bus_ID=$$1 AND Time.time=$$2";

RS->Open(getNewIdSql,"[time_ID]&");

RS->MoveFirst();

RS->Close();

delete RS;


oid CTimeForm::EditTime_onClick(){

CString prepSql="SELECT Time.time FROM [Time] WHERE Time.bus_ID=$$1 AND Time.time=$$2";

CString updateSql="UPDATE [Time] SET [Time].bus_ID=$$1,[Time].[time]=$$2 WHERE Time.time_ID=$$3";

DB.ExecuteSQL(updateSql);

Load_List_Time(busID);


oid CTimeForm::DeleteTime_onClick(){

CString deleteSql="DELETE Time.* FROM [Time] WHERE Time.time_ID=";

deleteSql+=toString(cID);

DB.ExecuteSQL(deleteSql);

Load_List_Time(busID);


oid CTimeForm::timesHelp_onClick(){

AfxMessageBox("One bus = only one race! One race - can be many bus!");}


/* ============================

<=== OnInitDialog OnClose ===

<============================ */


oid CTimeForm::OK_onClick(){SendMessage(WM_CLOSE,0,0);}


BOOL CTimeForm::OnInitDialog(){CDialog::OnInitDialog();

// >>>

Load_ComboBox_BusList();

return TRUE;}


oid CTimeForm::OnClose(){CDialog::OnClose();

ClearIndexes_pList_Time_indexes();

ClearIndexes_pComboBox_BusList_indexes();}


oid CTimeForm::SelchangeBusList_onChange(){

Load_List_Time(pComboBox_BusList_indexes[pComboBox_BusList->GetCurSel()]);}

CTimeForm.h

#if !defined(AFX_CTIMEFORM_H__3FEEABA8_85EA_4B93_9813_A60092BB9ED8__INCLUDED_)

#define AFX_CTIMEFORM_H__3FEEABA8_85EA_4B93_9813_A60092BB9ED8__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CTimeForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CTimeForm dialog


class CTimeForm : public CDialog

{

// Construction

public:

CTimeForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CTIMEFORM_H__3FEEABA8_85EA_4B93_9813_A60092BB9ED8__INCLUDED_)

CTypeForm.cpp

#include "stdafx.h"

#include "../main.h"

#include "CTypeForm.h"

#include "../ExLibrary/CMyRecordset.h"

CString IsEmpty_CEdit(CEdit* ctrl);


CTypeForm::CTypeForm(CWnd* pParent):CDialog(CTypeForm::IDD,pParent){

<}


oid CTypeForm::DoDataExchange(CDataExchange* pDX){

CDialog::DoDataExchange(pDX);

<}


BEGIN_MESSAGE_MAP(CTypeForm, CDialog)

ON_WM_CLOSE()

ON_BN_CLICKED(IDOK, OK_onClick)

ON_BN_CLICKED(Button_AddBusType, AddBusType_onClick)

ON_BN_CLICKED(Button_EditBusType, EditBusType_onClick)

ON_BN_CLICKED(Button_DeleteBusType, DeleteBusType_onClick)

END_MESSAGE_MAP()


/* ============================

<===== User realization =====

<============================ */


CListBox* pList_BusType;

CEdit* pEdit_busType;



/* ============================

<====== indexes & Funcn =====

<============================ */



oid ClearIndexes_pList_BusType_indexes(){

delete []pList_BusType_indexes,pLBTiLen;


oid InitIndexes_pList_BusType_indexes(int len){

*(pLBTiLen=new int)=len;}


/* ============================

<====== ............... =====

<============================ */


oid Load_List_BusType(){

RS=new CMyRecordset(&DB);

RS->Open("SELECT * FROM Type ORDER BY name","[busType_ID]&,[name]$");

RS->DefineRealCount();

ClearIndexes_pList_BusType_indexes();

InitIndexes_pList_BusType_indexes(RS->Count);

RS->MoveNext();}}

RS->Close();

delete RS;}


oid setCurSel_TypeForm(int fictionIndex){

return;}}


bool IsSelected_TypeForm(){

AfxMessageBox("Nothing selected!");

return 0;}

return 1;}


/* ============================

<====== Add Edit Remove =====

<============================ */


oid CTypeForm::AddBusType_onClick(){

CString newValue;

CString prepSql="SELECT name From Type WHERE name='$$$'";

CString insertSql="INSERT INTO Type (name) Values('$$$')";

DB.ExecuteSQL(insertSql);

Load_List_BusType();

RS=new CMyRecordset(&DB);

CString getNewIdSql="SELECT busType_ID From Type WHERE name='$$$'";

RS->Open(getNewIdSql,"[busType_ID]&");

RS->MoveFirst();

RS->Close();

delete RS;


oid CTypeForm::EditBusType_onClick(){

CString newValue;

CString prepSql="SELECT name From Type WHERE name='$$$'";

CString updateSql="UPDATE Type SET Type.name = '$$1' WHERE busType_ID=$$2";

DB.ExecuteSQL(updateSql);

Load_List_BusType();


oid CTypeForm::DeleteBusType_onClick(){

CString relateTestSql="SELECT bus_ID FROM Bus WHERE busType_ID=$$$";

relateTestSql.Replace("$$$",toString(cID));

CString deleteSql="DELETE * FROM Type WHERE busType_ID=";

deleteSql+=toString(cID);

DB.ExecuteSQL(deleteSql);

Load_List_BusType();


/* ============================

<=== OnInitDialog OnClose ===

<============================ */


oid CTypeForm::OK_onClick(){SendMessage(WM_CLOSE,0,0);}


BOOL CTypeForm::OnInitDialog(){CDialog::OnInitDialog();

Load_List_BusType();

return TRUE;}


oid CTypeForm::OnClose(){CDialog::OnClose();

ClearIndexes_pList_BusType_indexes();}

CTypeForm.h

#if !defined(AFX_CTYPEFORM_H__7C58861A_0178_48E8_A650_7CB3A7C3C4D9__INCLUDED_)

#define AFX_CTYPEFORM_H__7C58861A_0178_48E8_A650_7CB3A7C3C4D9__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif // _MSC_VER > 1

// CTypeForm.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CTypeForm dialog


class CTypeForm : public CDialog

{

// Construction

public:

CTypeForm(CWnd* pParent = NULL);

// Dialog Data


// Overrides


// Implementation

protected:


DECLARE_MESSAGE_MAP()

};


//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_CTYPEFORM_H__7C58861A_0178_48E8_A650_7CB3A7C3C4D9__INCLUDED_)

main.

#include "stdafx.h"

#include "main.h"

#include "Forms/CMainForm.h"

#include <afxdb.h>

#include "ExLibrary/CMyRecordset.h"


#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif


BEGIN_MESSAGE_MAP(CApp, CWinApp)

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()


CApp::CApp(){}


BOOL CApp::InitInstance(){

AfxEnableControlContainer();

CMainForm dlg;

<{

<}

<{

<}

return FALSE;}


CApp theApp;

CDatabase DB;

CMyRecordset* RS;


/* ============================

<===== User realization =====

<============================ */


char buf[10]; char* toString(int value,int radix=10){

return buf;};


CString IsEmpty_CEdit(CEdit* ctrl){

CString newValue;

AfxMessageBox("New value can't be empty!");

return "";}

return newValue;}


oid sqlFilter(CString* value){


long isExistRecordsOnCondition(CString sql,CString fields){

RS=new CMyRecordset(&DB);

RS->Open(sql,fields);

RS->DefineRealCount();

RS->Close();

delete RS;

return Count;}


bool isUnique(CString sql,CString fields){

AfxMessageBox("New value must be unique!");

return 0;}

return 1;}


bool isRelate(CString sql,CString fields){

AfxMessageBox("The record cannot be deleted because this record related!!");

return 1;}

return 0;}


oid Load_List(CString sql,CString fields,

CListBox* ctrl,

RS=new CMyRecordset(&DB);

RS->Open(sql,fields);

RS->DefineRealCount();

RS->MoveNext();}}

RS->Close();

delete RS;}


oid Load_List(CString sql,CString fields,

CComboBox* ctrl,

RS=new CMyRecordset(&DB);

RS->Open(sql,fields);

RS->DefineRealCount();

RS->MoveNext();}}

RS->Close();

delete RS;}

main.h

#if !defined(AFX_MAIN_H__91D8EF8A_1C83_4AD5_8267_EBB877E382FD__INCLUDED_)

#define AFX_MAIN_H__91D8EF8A_1C83_4AD5_8267_EBB877E382FD__INCLUDED_


#if _MSC_VER > 1

#pragma once

#endif


#ifndef __AFXWIN_H__

<#error include 'stdafx.h' before including this file for PCH

#endif


#include "resource.h"


class CApp:public CWinApp{

CApp();

DECLARE_MESSAGE_MAP()};


#endif // !defined(AFX_MAIN_H__91D8EF8A_1C83_4AD5_8267_EBB877E382FD__INCLUDED_)

CMyRecordset.cpp

#include "stdafx.h"

#include "../main.h"

#include "CMyRecordset.h"


oid CMyRecordset::Open(CString sql,CString fields){

((CRecordset*)this)->Open(AFX_DB_USE_DEFAULT_TYPE,sql);}


oid CMyRecordset::Close(){

delete []fieldsValue;

delete []fieldsNames;}

<$ String

<% Integer

<& Long

<# Time

<=========а */


oid CMyRecordset::DoFieldExchange(CFieldExchange* pFX){


oid CMyRecordset::DefineRealCount(){

Count=0;

MoveLast();

MovePrev();

Count++;};

MoveFirst();}

CMyRecordset.h

#include <afxdb.h>


/* ============================

<======= CMyDBVariant =======

<============================ */


class CMyDBVariant:public CDBVariant{

CString m_cstring;

CTime m_time;};


/* ============================

<======= CMyRecordset =======

<============================ */


class CMyRecordset:public CRecordset{

CMyRecordset(CDatabase* pdb):CRecordset(pdb){};

CMyDBVariant* fieldsValue;

CString* fieldsNames;};


6. Результат работы программы

Ниже на рисунках представлены внешние виды форм, разработанных для данного проекта.


Рисунок 2 - Основная форма приложения


Рисунок 3 - Форма работы с автобусами


Рисунок 4 - Форма работы с типами автобусов


Рисунок 5 - Форма работы с временами отправлений


Рисунок 6 - Форма работы с рейсами


Рисунок 7 - Форма работы с маршрутами (путями)


Рисунок 8 - Форма работы с остановками



Рисунок 9 - Форма О программе


Далее представлены предупреждения, выводимые в случаях, когда требуется ввести непустое значение, ввести никальное значение, выбрать пункт из списка, также предупреждение, информирующее о невозможности даления записи в связи с присутствием связей.

Также имеются сообщения, информативного характера, не несущие в себе каких-либо ограничений.


Рисунок 10 - Сообщение в форме Времена отправлений


Рисунок 11 - Сообщение о необходимости выбора


Рисунок 12 - Сообщение о необходимости задания непустого значения


Рисунок 13 - Сообщение о необходимости задания никального значения


Рисунок 14 - Сообщение о невозможности даления связанных записей



7. Заключение

Проделав значительную работу я изучил возможности работы с библиотекой MFCа и в частности интерфейс обращения с СУБД посредством ODBC. Изучил способы манипулирования данными в элементах управления библиотеки MFC. Изучил механизмы создания пользовательских классов и принципы наследования в языке C<++.

Изучил возможности обеспечения целостности данных, также каскадного даления данных.


8. Литература

1.   

2.   

3.   

4.   



[1]< при этом считается, что один автобус может обслуживать только один рейс, но в тоже время на один рейс может приходиться несколько автобусов