Зміст
Вид материала | Документы |
- Єрьомін Розміщення продуктивних сил Зміст, 1769.51kb.
- Міністерство освіти І науки україни перечинський професійний ліцей, 202.74kb.
- Організація та зміст навчально –в виховної роботи у днз, 81.03kb.
- Збірник державних стандартів, 1247.56kb.
- Зміст І порядок розроблення виробничої програми підрозділів виробнича програма, 128.75kb.
- Зміст І порядок розроблення виробничої програми підрозділів виробнича програма, 127.69kb.
- Процеси прийняття рішення І управління зміст процесу управління, 283.85kb.
- Поняття та зміст комунального управління, 500.89kb.
- Завдання та зміст виробничої програми підприємства Показники виробничої програми підприємства, 123.69kb.
- План Поняття та зміст юридична деонтологія > Юридична діяльність: поняття та зміст, 476.58kb.
Зміст
Зміст 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. Література
- Бердышев Е.М. Новые возможности при использовании RAD систем – М.: ДИАЛОГ-МИФИ, 1998
- Бродин В.Б. Программирование интерфейсов современных програм – М.: ДИАЛОГ-МИФИ, 1994
- Гук М. Dephi 3.0. Руководство по разработке баз дынных – СПб.: Питер, 1997
- Програмирование в среде Inprise Delphi – К.: Логос, 1998
- Разработка приложений модели клиент-сервер: особенности и трудности – М.: Намедни, 1998
- Персональные вычисления в 1999 году // Компьютерное обозрение.-№50, 1998
- Многообразие возможностей обьектно-ориентированного програмирования //Компьютер 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.