Зміст

Вид материалаДокументы

Содержание


2. Розробка програмного забезпечення для АІС “Облік автомобілів” 2.1. Постановка задачі
2.2. Створення проекту «АІС Облік автомобілів»
Таблиця Users, db
Surenam е
Subhouse g
Таблиця Orgcars.db
2.3. Реалізація проекту “АІС Облік автомобілів”
Інтерфейс програми
Система обробки бази даних
Робота з програмою
Подобный материал:




Зміст


Зміст 2

1. Вступ 3

2. Розробка програмного забезпечення для АІС “Облік автомобілів” 5

2.1. Постановка задачі 5

2.2. Створення проекту «АІС Облік автомобілів» 6

2.3. Реалізація проекту “АІС Облік автомобілів” 9

3. Висновки 18

4. Література 19

5. Додатки 20



1. Вступ


Метою даного курсового проекту є поглиблення знань з дисципліни "Технологія створення програмного забезпечення". Одним з базових понять методології проектування інформаційних систем є поняття життєвого циклу його програмного забезпечення (ЖЦ ПЗ). Життєвий цикл програмного забезпечення — це безперервний процес, який починається з моменту прийняття рішення про необхідність його створення і закінчується в момент його повного вилучення з експлуатації.

Структуру життєвого циклу може базуватися на таких групах процесів:
  • основні процеси ЖЦ ПЗ (придбання, постачання, розробка, експлуатація, супровід);
  • допоміжні процеси, що забезпечують виконання основних процесів
  • (документування, управління конфігурацією, забезпечення якості, верифікація, атестація, оцінка, аудит, розв'язання проблем);
  • організаційні процеси (управління проектами, створення інфраструктури проекту, визначення, оцінка і поліпшення самого ЖЦ, навчання).

Хотів би зупинитися на такому важливому процесі як розробка. Розробка включає в себе всі роботи по створенню програмного забезпечення і його компонентів відповідно до заданих вимог, включаючи оформлення проектної і експлуатаційної документації, підготовку матеріалів, необхідних для перевірки працездатності і відповідної якості програмних продуктів, матеріалів, необхідної для організації навчання персоналу і т.д

Розробка ПЗ включає в себе такі три основні етапи:
  • аналіз;
  • проектування;
  • реалізацію (програмування)

Саме ці три основні етапи я хотів би пройти при вирішенні поставленої задачі, а саме "АІС Облік автомобілів".

Курсовий проект складає ться з трьох частин висновків та додатків. У перші й частині проводиться постановка задачі, тобто іншими словами можна сказати аналізується поставлена задача У другій частині відбувається проектування цієї задачі, на основі постановки відбувається процес проектування. У третій частині подається опис реалізації.

Я вибрав дану тему тому, що я, як і кожна людина, подорожую і мене вразила недосконала система реєстрації автомобілів.

Я ж зупинився на розробці прикладного програмного забезпечення для автоматизації пошуку інформації в базах даних, використавши за об'єкт дослідження дані, що зберігаються в базі даних ДАІ України. Я зупинився на ції темі з кількох причин:

• сама база даних представляє собою великий інтерес як поле для плідної творчої діяльності

• накопичення великої кількості інформації, обробка якої стандартними методами забирала б багато часу та робочої сили

• існуюча програма, що повинна забезпечувати потрібні можливості не виконує все, що від неї вимагається

• потрібна програма, яка б працювала в операційній системі Microsoft Windows і була сумісна з такими відомими типами серверів як Oracle, Sybase, InterBase, ODBC Socket та іншими.

Отже, сьогоднішній стан справ на комп'ютерному ринку вимагає негайного написання прикладної програми, яка б дозволяла здійснювати накопичення, збереження, обробку та швидкий пошук потрібної інформації в базі даних ДАІ України.

Саме такою і є “АІС Облік атомобілів“ (надалі просто СУБД) розроблена мною.

2. Розробка програмного забезпечення для АІС “Облік автомобілів”

2.1. Постановка задачі


За більш ніж 25-річну історію розвитку реляційних баз даних виробився ряд нових вимог до методів та засобів доступу до даних. За таку довгу історію в промисловому використанні найшли своє місце велика кількість форматів зберігання даних. Тому одним з наступних питань подальшого розвитку СУБД стало питання про створення єдиного середовище обробки даних. Вирішенням такої проблеми займаються консорціуми провідних постачальників засобів обробки даних X/Open, SAG (SQL Accesss Group), що розвивають на базі стандартів ANSI/ISO єдину специфікацію доступу до даних CLI (call-level interface). На базі цих специфікацій і багаторічного досвіду створення інструментальних засобів компанія Borland представила розробникам свою технологію доступу до даних-BDE (Borland Database Engine), відому також під назвою IDAPI (Integrated Database API). Ідеологія доступу до локальних і клієнт/серверних даних помітно . відрізняються (в одному випадку використовується навігаційний підхід, а в іншому-мова SQL, що орієнтована на множину даних). BDE об'єднує ці підходи без зменьшення функціональних можливостей кожного з них. Тому BDE покладений в основу створення масштабованих систем обробки даних, одним з яких і є Delphi.

СУБД являє собою програму для ведення бази даних в ДАІ України і дозволяє виконувати такі функції:

• проводити реєстрацію автомобілів

• здійснювати корегування документів вже зареєстрованих автомобілів

• зняття з обліку автомобілів

• ведення бази викрадених автомобілів

• здійснення пошуку даних в базі

• ведення довідників

• встановлення гнучкої системи паролів

• передача та отримання інформації

• друк журналу реєстрацій


Прикладна програма досить проста в експлуатації і не вимагає від користувача великих знань. Якщо ви не перший раз сіли за комп'ютер і хоч колись працювали в операційній системі Microsoft Windows 95, то ви зразу можете приступати до роботи з програмою.

Якщо ж ви самі не можете розібратися з програмою, то в цьому вам допоможе розділ "Робота з програмою", в якому ви знайдете повну інформацію про використання СУБД.

Для повного розуміння принципів роботи програми та опису її структури в даній науково-дослідній роботі необхідне ознайомлення з програмуванням в операційній системі Microsoft Windows та з принципами організації роботи з реляційними базами даних.

2.2. Створення проекту «АІС Облік автомобілів»


Необхідно одразу визначитися з якими даними ми будемо мати справу.

Я використав таблиці Paradox for Windows, оскільки вони мають найбільш широкі можливості, нажаль далеко не всі ці властивості доцільно використати при розробці даної АІС.

В даній СУБД об'єктом накопичення та обробки виступає інформація, що використовується для ведення обліку зареєстрованих та викрадених автомобілів. Дана база даних складається з чотирьох таблиць та десяти довідників.

Таблиці:

• Users, db-таблиця приватних власників автомобілів

• Orgs.db-таблиця підприємств-власників автомобілів

• Usercars.db-таблиця приватних автомобілів

• Orgcars.db-таблиця держівних автомобілів

Таблиці аналогічної структури використовуються для зберігання даних про викрадені автомобілі та для збереження даних про автомобілі зняті з обліку.

Довідники:

• Areas, db-довідник регіонів

• Colours.db-довідник кольорів

• Cusovs.db- довідник типів кузовів

• Docs.db- довідник типів документів

• Models, db- довідник моделей автомобілів

• Numbers.db- довідник типів номерних знаків

• Organs, db- довідник підприємств

• States.db- довідник станів автомобілів

• Tecops.db- довідник технічних операцій

• Types.db- довідник типів АМТ

Таблиця Users, db


Дана таблиця призначена для зберігання в ній інформації провласників автомобілів і має таку структуру:

NZA

6

Поле, за допомогою якого зв’язані всі таблиці

SURENAM Е

18

Прізвище

NAME

15

Ім'я

BYFATHER

15

По-батькові

DATE В




Дата народження

PASSPORT

14

№ та серія паспорта

DRIVE

9

№ та серія посвідчення водія

STREET

25

Вулиця проживання

HOUSE

6

Будинок

SUBHOUSE

2

Корпус

FLAT

4

Квартира

PHONE H

7

Домашній телефон

PHONE W

7

Робочий телефон

WORK

15

Де працює

WHOM

10

Ким працює


Таблиця Orgs.db

Дана таблиця призначена для збереження в ній інформації про підприємства-власники автомобілів і має таку структуру:

NZA

6

Поле, за допомогою якого зв'язані всі таблиці

ORG AREA




Код підпрємства Код регіону

STREET 0

25

Вулиця підприємства

HOUSE 0

6

Будинок

SUBHOUSE 0

3

Корпус

PHONE 0

7

Телефон

STREET G

25

Вулиця гаража

HOUSE G

6

Будинок

SUBHOUSE G

3

Корпус

PHONE G

7

Телефон


Таблиця Usercars.db

Дана таблиця призначена для зберігання інформації про зареєстровані приватні автомобілі і має таку структуру:

NZ

A

6

Поле, за допомогою якого зв'язані всі таблиці

TECPAS

9

№ техпаспорту

AREA




Регіон

ТЕС ОР




Технічна операція

DATE ОР




Дата ставлення на облік

NUM ID

7

Номер знаку

TYPE ID

1

Тип знаку

MODEL

20

Марка автомобіля

TYPE AMT




Тип AMT

TYPE CUSO V




Тип кузова

YEAR




Рік випуску

N MOTOR

18

№ мотора

N SHASY

18

№ шасі

N CUSOV

18

№ кузова

COLOUR




Колір

DOC




Тип документу за яким ставиться па



Таблиця Orgcars.db


Дана таблиця призначена для зберігання інформації про зареєстровані державні автомобілі і має структуру таку як таблиця Usercars.db.

Довідники


Всі довідники, крім довідника моделей автомобілів мають однакову структуру:


CD




Код

ТХТ

45

Значення



2.3. Реалізація проекту “АІС Облік автомобілів”


Моя програма написана на мові програмування Delphi 2.0, що розроблена фірмою Borland International. Чому саме Delphi?

Щоб пояснити, чому я вибрав Delphi наведу слова одного з визнаних авторитетів в області клієнт-серверних розробок Кріса Морау: "Delphi posesses by the power of language hooks of C++, into also the time hand-in-hand ussing shockking efficiency and tlie simplicity of training of. Delphi is a most fast and by the comfortable facility of the development of annexs on the modern market of tools. The object-oriented architecture Delphi lets to us really twice utilize existing code and integrate our standards into self tool." ("Delphi володіє потужністю мовних засобів С + +, комбінуючи в той же час високу виробничу спроможність та простоту навчання. Delphi є найбільш швидким та зручним засобом розробки програм на сьогоднішньому ринку інструментальних засобів. Об'єктно-орієнтована архітектура Delphi дозволяє нам дійсно повторно використовувати вже існуючий код та інтегрувати наші стандарти в сам інструмент.")

Іншою причиною є те, що Delphi дозволяє створювати програми для роботи з базами даних на основі BDE.
Інтерфейс програми

Інтерфейс програми є важливим критерієм при оцінюванні програми. Адже ви не захочете працювати з програмою, в якої недосконалий інтерфейс і вам незручно виконувати вашу роботу. Програма повинна якнайбільше забезпечити комфорт користувача при роботі з нею. Керуючись цим правилом я і створював інтерфейс своєї програми.

Весь інтерфейс був розроблений засобами Delphi за допомогою візуального проектування форм. Були використані Windows елементи (компоненти) управління, що зменшує програмний код, тому що самі елементи управління в програмі не реалізовані, а реалізовані тільки додаткові можливості цих елементів, що значно скорочує програмний код.

Головна форма нагадує дещо панель запуску Microsoft Office 95 і містить: меню та кілька функціональних кнопок. З даної форми можна відкрити форма реєстрації автомобілів, форму редагування та перегляду документів зареєстрованих автомобілів, форму зняття автомобілів з обліку, форму для роботи з вкраденими автомобілями та форму для організації функцій адміністратора. Також тут можна викликати допомогу та вікна з інформацією про автора та про програму.

Головна форма (як і всі форми в програмі) є нащадком класу TForm.

З головної форми є доступ до схожих з нею форм; форма для забезпечення функцій адміністратора та форми для ведення обліку викладених автомобілів.

Опис роботи всіх форм описаний в розділі "Робота з програмою", тому перейдемо до опису функціонквання системи доступу та обробки бази даних.
Система обробки бази даних

Як вже було сказано моя програма працює з базами даних за допомогою BDE. За своєю архітектурою BDE є об'сктно-орієнтованим інтерфейсом доступу до даних. Під час виконання програми створюються різні об'єкти BDE. Кожний об'єкт володіє набором властивостей. Відповідно, через функції IDAPI розробник керує наступними об'єктами BDE:

• System-системний об'єкт, що контролює ресурси BDE для всіх програм, що працюютьна даній машині

• Clients-об'єкт клієнт створюється в процесі ініціалізації IDAPI для доної клієнтської програми. Об'єкт клієнт є тим контекстом, в якому виконуються виклики всіх функцій IDAPI і знаходяться системні ресурси BDE даної програми

• Session-сесія. Сесія містить всі інші об'єкти BDE. Будь-який з них, будучи створеним в контексті однієї сесії не може бути використаний в іншій. Сесія також є власником всіх курсорів і блокіровок таблиць/записів створених н її контексті. Іншою особливістю сесії є private-каталог, в якому розміщуються всі тимчасові таблиці та файли

• Drivers-кожний драйвер БД завантажується при першому звертанні до його сервісу

Datadases-база даних, представлена набором взаємозв'язаних таблиць. Внаслідок такої організації доступа до різних типів БД, в якості основного ідентифікатора бази даних в BDE використовується поняття псевдоніма бази даних

• Cursors-BDE здійснює доступ до вмістимого таблиць або результатів запросів за допомогою курсору, що представляє собою колекцію записів. Всі операції з даними виконуються за допомогою курсору. Крім того, курсор відповідає за операції переміщення по набору записів незалежно від природи джерела данихю Це дозволяє назвати курсор інструментом контролю над множиною даних Як я вже згадував, особливе місце в VCL (Visual Component Library) посідає TDataSource. Це положення пояснюється тип, що він ізолює низкорівневу логіку доступу до даних від компонент інтерфецсу користувача.

Основним засобом передачі даних Data Aware-компонентами через джерела даних є обробники повідомлень TDataChangeEvent, що оголошенні як функції класів.

Робота з програмою

Д
ане вікно є основним вікном програми і в ньому проводиться основна робота з програмою.

В
даному вікні проводиться реєстрація автомобілів, а при потребі з нього можна вийти на інші вікна-довідники.

Д
овідник власників авто, в нтому, як і в всіх довідниках можна робити пошук, створювати записи, знищувати і т. д.

Д
овідник областей призначений дл якорегування областей.

Д
овідник моделей авто призначений для корегування моделей авто.

Д
овідник типів АМТ призначений для корегування типів АМТ.

Д
овідник кузовів призначений для корегування типів кузовів авто.

Д
овідник кольорів авто призначений для корегування кольорів авто.

В
даному вікні можна створювати користувачів програми з різними рівнями доступу.

В
даному вікні можна зробити основні установки програми.

Д
ане вікно появляється при під’єднанні до бази для ідентифікації користувача.

Д
ане вікно дає інформацію про автора програми.

Ц
е вікно з’являється при виклику допомоги і тут можна отримати додаткову інформацію про програму.

3. Висновки


Отже метою даного курсового проекту є поглиблення знань з дисципліни "Технологія програмування".

Підсумовуючи свою роботу над проектом можу сказати, що для окремого робочого місця система в значній мірі підвищить продуктивність праці операторів і рівень обслуговування клієнтів. Впровадження цієї системи буде ще одним етапом інформатизації нашої країни. Сподіваюся, що хоча б основна ідея програми буде перейнята і запроваджена на всіх ДАІ для реєстрації авто.

Щодо самої програми, то використовуючи знання, набуті на численних лекціях та лабораторних заняттях з дисципліни “Технологія програмування”, я зміг реалізувати її на досить високому рівні, що само по собі свідчить як про високий професіоналізм викладачів, так і про непогані здібності студента.

В цілому АІС досить зручна в роботі, Для перетворення цієї локальної версії АІС в мережеву потрібно доопрацювати роботу з базою даних і внести ще кілька несуттєвих змін та доповнень.

4. Література

  1. Бердышев Е.М. Новые возможности при использовании RAD систем – М.: ДИАЛОГ-МИФИ, 1998
  2. Бродин В.Б. Программирование интерфейсов современных програм – М.: ДИАЛОГ-МИФИ, 1994
  3. Гук М. Dephi 3.0. Руководство по разработке баз дынных – СПб.: Питер, 1997
  4. Програмирование в среде Inprise Delphi – К.: Логос, 1998
  5. Разработка приложений модели клиент-сервер: особенности и трудности – М.: Намедни, 1998
  6. Персональные вычисления в 1999 году // Компьютерное обозрение.-№50, 1998
  7. Многообразие возможностей обьектно-ориентированного програмирования //Компьютер World.-№22, 1998

5. Додатки


unit Data;


interface


uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

DBTables, Db, RxQuery;


type

TdmData = class(TDataModule)

dbMain: TDatabase;

qrHumans: TRxQuery;

qrAutoHumans: TRxQuery;

dsHumans: TDataSource;

dsAutoHumans: TDataSource;

qrAutoView: TRxQuery;

qrHumansID: TIntegerField;

qrHumansSURNAME: TStringField;

qrHumansNAME: TStringField;

qrHumansBYFATHER: TStringField;

qrHumansBIRTHDAY: TDateTimeField;

qrHumansPASSPORT: TStringField;

qrHumansCERTIFICATE: TStringField;

qrHumansSTREET: TStringField;

qrHumansHOUSE: TSmallintField;

qrHumansSUBHOUSE: TStringField;

qrHumansFLAT: TSmallintField;

qrHumansHOMEPHONES: TStringField;

qrHumansWORKPHONES: TStringField;

qrHumansWHEREWORK: TStringField;

qrHumansWHOMWORK: TStringField;

qrAutoHumansID: TIntegerField;

qrAutoHumansTEHPASSPORT: TStringField;

qrAutoHumansAREA: TIntegerField;

qrAutoHumansREGDATE: TDateTimeField;

qrAutoHumansREGNUMBER: TStringField;

qrAutoHumansMODEL: TIntegerField;

qrAutoHumansAMT: TIntegerField;

qrAutoHumansCUSOV: TIntegerField;

qrAutoHumansMAKEYEAR: TSmallintField;

qrAutoHumansMOTORN: TStringField;

qrAutoHumansSHASSYN: TStringField;

qrAutoHumansCUSOVN: TStringField;

qrAutoHumansCOLOUR: TIntegerField;

qrAutoHumansTEHVIEW: TDateTimeField;

qrAutoHumansGOLEGTH: TIntegerField;

dsAutoView: TDataSource;

qrAreas: TRxQuery;

qrModels: TRxQuery;

qrAMTs: TRxQuery;

qrCusovs: TRxQuery;

qrColours: TRxQuery;

dsAreas: TDataSource;

dsModels: TDataSource;

dsAMTs: TDataSource;

dsCusovs: TDataSource;

dsColours: TDataSource;

qrAreasID: TIntegerField;

qrAreasNAME: TStringField;

qrModelsID: TIntegerField;

qrModelsNAME: TStringField;

qrAMTsID: TIntegerField;

qrAMTsNAME: TStringField;

qrColoursID: TIntegerField;

qrColoursNAME: TStringField;

qrCusovsID: TIntegerField;

qrCusovsNAME: TStringField;

qrAutoViewID: TIntegerField;

qrAutoViewREGDATE: TDateTimeField;

qrAutoViewREGNUMBER: TStringField;

qrAutoViewAUTOOWNER: TStringField;

qrAutoViewCERTIFICATE: TStringField;

qrAutoViewTEHPASSPORT: TStringField;

qrAutoViewMODELNAME: TStringField;

qrAutoViewAMTNAME: TStringField;

qrAutoViewMAKEYEAR: TSmallintField;

qrAutoViewCOLOURNAME: TStringField;

qrAutoViewAREANAME: TStringField;

qrAutoViewTEHVIEW: TDateTimeField;

qrUsers: TRxQuery;

qrUsersUserName: TStringField;

qrUsersCPassword: TStringField;

qrUsersAccessLevel: TIntegerField;

dsUsers: TDataSource;

procedure dmDataDestroy(Sender: TObject);

procedure qrHumansNewRecord(DataSet: TDataSet);

procedure qrHumansAfterPost(DataSet: TDataSet);

procedure qrAutoHumansAfterPost(DataSet: TDataSet);

procedure qrAutoHumansNewRecord(DataSet: TDataSet);

procedure qrAreasNewRecord(DataSet: TDataSet);

procedure qrModelsNewRecord(DataSet: TDataSet);

procedure qrAMTsNewRecord(DataSet: TDataSet);

procedure qrColoursNewRecord(DataSet: TDataSet);

procedure qrCusovsNewRecord(DataSet: TDataSet);

procedure qrAreasAfterPost(DataSet: TDataSet);

procedure qrModelsAfterPost(DataSet: TDataSet);

procedure qrAMTsAfterPost(DataSet: TDataSet);

procedure qrColoursAfterPost(DataSet: TDataSet);

procedure qrCusovsAfterPost(DataSet: TDataSet);

procedure dmDataCreate(Sender: TObject);

procedure qrFilterRecord(DataSet: TDataSet; var Accept: Boolean);

procedure qrAreasBeforeDelete(DataSet: TDataSet);

procedure qrModelsBeforeDelete(DataSet: TDataSet);

procedure qrAMTsBeforeDelete(DataSet: TDataSet);

procedure qrColoursBeforeDelete(DataSet: TDataSet);

procedure qrCusovsBeforeDelete(DataSet: TDataSet);

procedure qrUsersAfterPost(DataSet: TDataSet);

private

{ Private declarations }

public

{ Public declarations }

procedure OpenDatabase(AUser:String='');

procedure Closedatabase;

function OpenSQL(SQL:String):TDataSet;

procedure RunSQL(SQL:String);

function GetMaxCode(TableName:String):Integer;

function InputHuman:Integer; // -1 mrCancel

function InputArea:Integer;

function InputModel:Integer;

function InputAMT:Integer;

function InputCusov:Integer;

function InputColour:Integer;

end;


var

dmData: TdmData;

Filters: TStrings;


implementation


uses Humans, Areas, Models, AMTs, Colours, Cusovs, Global, InputPassword;


{$R *.DFM}


procedure TdmData.OpenDatabase(AUser:String='');

begin

try

Screen.Cursor:=crHourGlass;

dbMain.Open;

Filters.Clear;

qrUsers.Open;

if qrUsers.RecordCount>0 then

begin

with TfmInputPassword.Create(Application) do

try

edName.Text:=AUser;

if edName.Text<>'' then

ActiveControl:=edPassword;

Screen.Cursor:=crDefault;

if ShowModal=mrCancel then

begin

CloseDatabase;

Exit;

end;

finally

Free;

end;

end

else

begin

UserName:='=хтiфюьшщ юяхЁрЄюЁ';

Password:='';

AccessLevel:=-1;

end;

Screen.Cursor:=crDefault;

except

Screen.Cursor:=crDefault;

Application.MessageBox('Tшэшъыр яюьшыър яЁш я¦ф''¦фэрээ¦ фю срчш.',PChar(Application.Title),MB_ICONSTOP or MB_OK);

end;

end;


procedure TdmData.CloseDatabase;

begin

dbMain.Close;

end;


procedure TdmData.dmDataDestroy(Sender: TObject);

begin

CloseDatabase;

if Assigned(Filters) then

Filters.Free;

end;


function TdmData.OpenSQL(SQL:String):TDataSet;

var

ResDataSet:TQuery;

begin

Result:=nil;

if SQL='' then

raise Exception.Create('=х ьюцє тшъюэрЄш яєёЄшщ SQL чряшЄ.');

ResDataSet:=TQuery.Create(Self);

ResDataSet.Name:='OpenSQL'+IntToStr(Random(1000000000));

ResDataSet.DatabaseName:=dbMain.DatabaseName;

ResDataSet.SQL.Add(SQL);

ResDataSet.Open;

Result:=ResDataSet;

end;


procedure TdmData.RunSQL(SQL:String);

var

ResDataSet:TQuery;

begin

if SQL='' then

raise Exception.Create('=х ьюцє тшъюэрЄш яєёЄшщ SQL чряшЄ.');

ResDataSet:=TQuery.Create(Self);

ResDataSet.Name:='RunSQL'+IntToStr(Random(1000000000));

ResDataSet.DatabaseName:=dbMain.DatabaseName;

ResDataSet.SQL.Add(SQL);

ResDataSet.ExecSQL;

ResDataSet.Free;

end;


function TdmData.GetMaxCode(TableName:String):Integer;

var

SQL:TDataSet;

begin

try

SQL:=OpenSQL('SELECT MAX(ID) AS MAXID FROM '+TableName);

Result:=SQL.FieldByName('MAXID').AsInteger;

finally

if Assigned(SQL) then

begin

SQL.Active:=False;

SQL.Free;

end;

end;

end;


procedure TdmData.qrHumansNewRecord(DataSet: TDataSet);

begin

qrHumans.FieldByName('ID').AsInteger:=GetMaxCode('HUMANS')+1;

end;


function TdmData.InputHuman:Integer;

begin

Screen.Cursor:=crHourGlass;

Result:=-1;

with TfmHumans.Create(Application) do

try

Screen.Cursor:=crDefault;

if ShowModal=mrOK then

Result:=qrHumans.FieldByName('ID').AsInteger;

finally

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrHumansAfterPost(DataSet: TDataSet);

var

ID:Integer;

begin

try

Screen.Cursor:=crHourGlass;

qrHumans.DisableControls;

ID:=qrHumans.FieldByName('ID').AsInteger;

qrHumans.Close;

qrHumans.Open;

qrHumans.Locate('ID',ID,[]);

finally

qrHumans.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrAutoHumansAfterPost(DataSet: TDataSet);

var

ID:Integer;

RegNumber:String;

begin

try

Screen.Cursor:=crHourGlass;

qrAutoHumans.DisableControls;

ID:=qrAutoHumans.FieldByName('ID').AsInteger;

RegNumber:=qrAutoHumans.FieldByName('REGNUMBER').AsString;

qrAutoHumans.Close;

qrAutoHumans.Open;

qrAutoHumans.Locate('ID;REGNUMBER',VarArrayOf([ID,RegNumber]),[]);

finally

qrAutoHumans.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrAutoHumansNewRecord(DataSet: TDataSet);

begin

qrAutoHumans.FieldByName('RegDate').AsDateTime:=Date;

end;


procedure TdmData.qrAreasNewRecord(DataSet: TDataSet);

begin

qrAreas.FieldByName('ID').AsInteger:=GetMaxCode('AREAS')+1;

end;


procedure TdmData.qrModelsNewRecord(DataSet: TDataSet);

begin

qrModels.FieldByName('ID').AsInteger:=GetMaxCode('MODELS')+1;

end;


procedure TdmData.qrAMTsNewRecord(DataSet: TDataSet);

begin

qrAMTs.FieldByName('ID').AsInteger:=GetMaxCode('AMT')+1;

end;


procedure TdmData.qrColoursNewRecord(DataSet: TDataSet);

begin

qrColours.FieldByName('ID').AsInteger:=GetMaxCode('COLOURS')+1;

end;


procedure TdmData.qrCusovsNewRecord(DataSet: TDataSet);

begin

qrCusovs.FieldByName('ID').AsInteger:=GetMaxCode('CUSOVS')+1;

end;


function TdmData.InputArea:Integer;

begin

Screen.Cursor:=crHourGlass;

Result:=-1;

with TfmAreas.Create(Application) do

try

Screen.Cursor:=crDefault;

if ShowModal=mrOK then

Result:=qrAreas.FieldByName('ID').AsInteger;

finally

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrAreasAfterPost(DataSet: TDataSet);

var

ID:Integer;

begin

try

Screen.Cursor:=crHourGlass;

qrAreas.DisableControls;

ID:=qrAreas.FieldByName('ID').AsInteger;

qrAreas.Close;

qrAreas.Open;

qrAreas.Locate('ID',ID,[]);

finally

qrAreas.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrModelsAfterPost(DataSet: TDataSet);

var

ID:Integer;

begin

try

Screen.Cursor:=crHourGlass;

qrModels.DisableControls;

ID:=qrModels.FieldByName('ID').AsInteger;

qrModels.Close;

qrModels.Open;

qrModels.Locate('ID',ID,[]);

finally

qrModels.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrAMTsAfterPost(DataSet: TDataSet);

var

ID:Integer;

begin

try

Screen.Cursor:=crHourGlass;

qrAMTs.DisableControls;

ID:=qrAMTs.FieldByName('ID').AsInteger;

qrAMTs.Close;

qrAMTs.Open;

qrAMTs.Locate('ID',ID,[]);

finally

qrAMTs.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrColoursAfterPost(DataSet: TDataSet);

var

ID:Integer;

begin

try

Screen.Cursor:=crHourGlass;

qrColours.DisableControls;

ID:=qrColours.FieldByName('ID').AsInteger;

qrColours.Close;

qrColours.Open;

qrColours.Locate('ID',ID,[]);

finally

qrColours.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrCusovsAfterPost(DataSet: TDataSet);

var

ID:Integer;

begin

try

Screen.Cursor:=crHourGlass;

qrCusovs.DisableControls;

ID:=qrCusovs.FieldByName('ID').AsInteger;

qrCusovs.Close;

qrCusovs.Open;

qrCusovs.Locate('ID',ID,[]);

finally

qrCusovs.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.dmDataCreate(Sender: TObject);

begin

dbMain.Params.Values['PATH']:=ExtractFilePath(ExpandFileName(ParamStr(0)));

if dbMain.Params.Values['PATH'][Length(dbMain.Params.Values['PATH'])]='\' then

dbMain.Params.Values['PATH']:=dbMain.Params.Values['PATH']+'DATA\'

else

dbMain.Params.Values['PATH']:=dbMain.Params.Values['PATH']+'\DATA\';

Filters:=TStringList.Create;

end;


procedure TdmData.qrFilterRecord(DataSet: TDataSet;

var Accept: Boolean);

var

I:Integer;

S,FName,FValue:String;

begin

Accept:=True;

FName:='';

FValue:='';

I:=Filters.IndexOf('['+DataSet.Name+']');

if I<>-1 then

begin

S:=Filters[I+1];

FName:=Copy(S,1,Pos('=',S)-1);

Delete(S,1,Pos('=',S));

FValue:=S;

end;

if FName<>'' then

begin

case DataSet.FieldByName(FName).DataType of

ftFixedChar,

ftWideString,

ftString:Accept:=Pos(AnsiUpperCase(FValue),AnsiUpperCase(DataSet.FieldByName(FName).AsString))>0;

ftSmallint,

ftInteger,

ftLargeint,

ftWord:Accept:=StrToInt(FValue)=DataSet.FieldByName(FName).AsInteger;

ftBoolean:Accept:=(AnsiUpperCase(FValue)='TRUE')=DataSet.FieldByName(FName).AsBoolean;

ftFloat,

ftCurrency:Accept:=StrToFloat(FValue)=DataSet.FieldByName(FName).AsCurrency;

ftDate:Accept:=StrToDate(FValue)=DataSet.FieldByName(FName).AsDateTime;

ftTime:Accept:=StrToTime(FValue)=DataSet.FieldByName(FName).AsDateTime;

ftDateTime:Accept:=StrToDateTime(FValue)=DataSet.FieldByName(FName).AsDateTime;

else

raise Exception.Create('=х ьюцэр тёЄрэютшЄш Ї¦ы№ЄЁ эр тшсЁрэх яюых.');

end;

end;

end;


function TdmData.InputModel:Integer;

begin

Screen.Cursor:=crHourGlass;

Result:=-1;

with TfmModels.Create(Application) do

try

Screen.Cursor:=crDefault;

if ShowModal=mrOK then

Result:=qrModels.FieldByName('ID').AsInteger;

finally

Screen.Cursor:=crDefault;

end;

end;


function TdmData.InputAMT:Integer;

begin

Screen.Cursor:=crHourGlass;

Result:=-1;

with TfmAMTs.Create(Application) do

try

Screen.Cursor:=crDefault;

if ShowModal=mrOK then

Result:=qrAMTs.FieldByName('ID').AsInteger;

finally

Screen.Cursor:=crDefault;

end;

end;


function TdmData.InputCusov:Integer;

begin

Screen.Cursor:=crHourGlass;

Result:=-1;

with TfmCusovs.Create(Application) do

try

Screen.Cursor:=crDefault;

if ShowModal=mrOK then

Result:=qrCusovs.FieldByName('ID').AsInteger;

finally

Screen.Cursor:=crDefault;

end;

end;


function TdmData.InputColour:Integer;

begin

Screen.Cursor:=crHourGlass;

Result:=-1;

with TfmColours.Create(Application) do

try

Screen.Cursor:=crDefault;

if ShowModal=mrOK then

Result:=qrColours.FieldByName('ID').AsInteger;

finally

Screen.Cursor:=crDefault;

end;

end;


procedure TdmData.qrAreasBeforeDelete(DataSet: TDataSet);

begin

if Application.MessageBox('Tш тяхтэхэ¦, •ю срцр¦Єх чэш•шЄш тшсЁрэшщ чряшё.',PChar(Application.Title),MB_ICONQUESTION or MB_YESNO)<>IDYES then

Abort;

end;


procedure TdmData.qrModelsBeforeDelete(DataSet: TDataSet);

begin

if Application.MessageBox('Tш тяхтэхэ¦, •ю срцр¦Єх чэш•шЄш тшсЁрэшщ чряшё.',PChar(Application.Title),MB_ICONQUESTION or MB_YESNO)<>IDYES then

Abort;

end;


procedure TdmData.qrAMTsBeforeDelete(DataSet: TDataSet);

begin

if Application.MessageBox('Tш тяхтэхэ¦, •ю срцр¦Єх чэш•шЄш тшсЁрэшщ чряшё.',PChar(Application.Title),MB_ICONQUESTION or MB_YESNO)<>IDYES then

Abort;

end;


procedure TdmData.qrColoursBeforeDelete(DataSet: TDataSet);

begin

if Application.MessageBox('Tш тяхтэхэ¦, •ю срцр¦Єх чэш•шЄш тшсЁрэшщ чряшё.',PChar(Application.Title),MB_ICONQUESTION or MB_YESNO)<>IDYES then

Abort;

end;


procedure TdmData.qrCusovsBeforeDelete(DataSet: TDataSet);

begin

if Application.MessageBox('Tш тяхтэхэ¦, •ю срцр¦Єх чэш•шЄш тшсЁрэшщ чряшё.',PChar(Application.Title),MB_ICONQUESTION or MB_YESNO)<>IDYES then

Abort;

end;


procedure TdmData.qrUsersAfterPost(DataSet: TDataSet);

var

User:String;

begin

try

Screen.Cursor:=crHourGlass;

qrUsers.DisableControls;

User:=qrUsers.FieldByName('USERNAME').AsString;

qrUsers.Close;

qrUsers.Open;

qrUsers.Locate('USERNAME',User,[]);

finally

qrUsers.EnableControls;

Screen.Cursor:=crDefault;

end;

end;


initialization

Randomize;

end.