Реферат: Разработка базы данных
<div v:shape="_x0000_s1026"> <span Courier New"">Министерство образования
<span Courier New"">Российской Федерации
<span Courier New"">
<span Courier New"">Хабаровский Государственный Технический Университет<span Courier New"">
<span Courier New"">Кафедра
<span Courier New";mso-bidi-font-family: «Times New Roman»">программного обеспечения вычислительной<span Courier New";mso-bidi-font-family:«Times New Roman»">техники и автоматизированных систем
<span Courier New""><span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<img src="/cache/referats/13710/image002.jpg" v:shapes="_x0000_i1025">
<span Courier New";text-transform:uppercase;letter-spacing:5.0pt">пояснительная записка
<span Courier New";text-transform:uppercase;letter-spacing:5.0pt">к курсовой работе
<span Courier New";mso-bidi-font-family:«Times New Roman»">ПО ДИСЦИПЛИНЕ «БАЗЫ ДАННЫХ»
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">Выполнил:
<span Courier New""> студент гр. ПО-02
<span Courier New""> Самойленко Павел
<span Courier New"">Проверил:
<span Courier New""> к.т.н., доцент
<span Courier New""> Саринков А. А.
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New";mso-bidi-font-family:«Times New Roman»">Хабаровск 2002г.
<span Courier New"">Задание
<span Courier New"">Разработка клиент – серверного приложения.
<span Courier New"">Введение в технологию клиент-сервер
<span Courier New""><span Courier New"">База данных представляетсобой набор файлов на сетевом сервере. Характерная особенность архитектурыклиент-сервер является перенос вычислительной нагрузки на сервер БД(
<span Courier New";mso-ansi-language: EN-US">SQL<span Courier New""><span Courier New"">сервер), атакже максимальная разгрузка клиента от вычислительной работы и существенноеукрепление данных. Взаимодействие сервера и клиента реализуется с помощью <span Courier New";mso-ansi-language: EN-US">SQL<span Courier New"">запросов, которые формирует и отсылает серверу клиент. Сервер, приняв запрос,выполняет его и возвращает результат клиенту. В клиентском приложении восновном осуществляется интерпретация полученных от сервера данных, реализацияпользовательского интерфейса, а также реализация части бизнес — правил.<span Courier New"">Преимущества архитектурыклиент – сервер:
<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New"">Большинствовычислительных процессов происходит на сервере, что снижает требования квычислительной мощности клиента.<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New"">Снижаетсясетевой трафик, так как пересылаются не все данные, а только запрошенные.<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New"">БДна сервере представляет единый файл, в котором содержатся таблицы, ограниченияцелостности и другие компоненты БД. Взломать, похитить или испортить такую БДзначительно труднее; существенно увеличивается защищенность БД от вводанеправильных значений. Кроме того для каждого пользователя устанавливаются своиуровни доступа.<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New"">Серверреализует управление транзакциями и предотвращает попытки одновременного изменения одних и техже данных.<span Courier New"">Сервер базыданных
<span Courier New"">При выборе сервера базыданных я остановился на промышленном сервере
<span Courier New";mso-ansi-language:EN-US">InterBase<span Courier New"">. <span Courier New";mso-ansi-language:EN-US">InterBase<span Courier New""> – «родной» сервер для <st1:place w:st=«on»><span Courier New"; mso-ansi-language:EN-US">Delphi</st1:place><span Courier New"">. Для доступа к нему не нужно устанавливать дополнительныхдрайверов. Все данные хранятся на сервере в файле <span Courier New";mso-ansi-language:EN-US">baze<span Courier New"">.<span Courier New";mso-ansi-language:EN-US">gdb<span Courier New"">.<span Courier New"">Предметная область
<span Courier New""><span Courier New"">Программапредназначена для учета медицинских аппаратов, имеющихся в воинских частях.Основная задача — учет драгоценных металлов, содержащихся в этих аппаратах, возможностьподсчета списанных, не списанных и общего числа аппаратов в отдельно взятойчасти и сумма драг. металлов, в них содержащихся.
<span Courier New"">Создание базы данных
<span Courier New""><span Courier New"">Структура таблиц и связеймежду ними:
<span Courier New";mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA"><span Courier New"">
<div v:shape="_x0000_s1027">
Рис. 1
<span Courier New""><img src="/cache/referats/13710/image004.jpg" v:shapes="_x0000_i1026"><span Courier New"">
<span Courier New"">Форматы полей в таблицах:
<span Courier New"">CREATE TABLE CHASTT
<span Courier New""> (<span Courier New"">
<span Courier New";mso-ansi-language:EN-US">KOD INTEGER NOT NULL,<span Courier New";mso-ansi-language:EN-US"> VCH VARCHAR(20) NOT NULL
<span Courier New"">)
<span Courier New";mso-ansi-language: EN-US">CREATE TABLE MODELL
<span Courier New"; mso-ansi-language:EN-US">(<span Courier New";mso-ansi-language:EN-US"> KOD3 INTEGER NOT NULL,
<span Courier New";mso-ansi-language:EN-US"> MODEL VARCHAR(160) NOT NULL,
<span Courier New";mso-ansi-language:EN-US"> <st1:place w:st=«on»>K2</st1:place> INTEGER
<span Courier New"">)
<span Courier New";mso-ansi-language: EN-US">CREATE TABLE NAIMM
<span Courier New"; mso-ansi-language:EN-US"> (<span Courier New";mso-ansi-language:EN-US"> KOD2 INTEGER NOT NULL,
<span Courier New";mso-ansi-language:EN-US"> NAIM VARCHAR(160) NOT NULL,
<span Courier New";mso-ansi-language:EN-US"> K1 INTEGER
<span Courier New"">)
<span Courier New";mso-ansi-language: EN-US">CREATE TABLE RAZDELL
<span Courier New"; mso-ansi-language:EN-US"> (<span Courier New";mso-ansi-language:EN-US"> KOD1 INTEGER NOT NULL,
<span Courier New";mso-ansi-language:EN-US">
<span Courier New"">RAZDELVARCHAR(160) NOT NULL<span Courier New"">)
<span Courier New";mso-ansi-language: EN-US">CREATE TABLE SVODKA
<span Courier New"; mso-ansi-language:EN-US"> (<span Courier New";mso-ansi-language:EN-US"> KOD5 INTEGER NOT NULL,
<span Courier New";mso-ansi-language:EN-US"> SERNO VARCHAR(20),
<span Courier New";mso-ansi-language:EN-US"> K4 INTEGER NOT NULL,
<span Courier New";mso-ansi-language:EN-US"> SER FLOAT,
<span Courier New";mso-ansi-language:EN-US"> ZOL FLOAT,
<span Courier New";mso-ansi-language:EN-US"> PT FLOAT,
<span Courier New";mso-ansi-language:EN-US"> PG FLOAT,
<span Courier New";mso-ansi-language:EN-US"> DVIP CHAR(4),
<span Courier New";mso-ansi-language:EN-US"> DVVOD CHAR(4),
<span Courier New";mso-ansi-language:EN-US"> DSPIS CHAR(4),
<span Courier New";mso-ansi-language:EN-US"> SROK SMALLINT,
<span Courier New";mso-ansi-language:EN-US"> KATEGOR SMALLINT,
<span Courier New";mso-ansi-language:EN-US"> CENA FLOAT,
<span Courier New";mso-ansi-language:EN-US"> PRIMECH CHAR(200),
<span Courier New";mso-ansi-language:EN-US"> K3 INTEGER
<span Courier New"">)
<span Courier New"">Между полями в таблицахустановлена ссылочная целостность согласно рисунку 1.
<span Courier New"">В
<span Courier New";mso-ansi-language:EN-US">InterBase<span Courier New""> отсутствует аппаратавтоинкрементных столбцов. Вместо этого для установки уникальных значенийстолбцов я использовал аппарат генераторов. Перед запоминанием для каждойтаблицы генерируется уникальное значение с помощью функции <span Courier New";mso-ansi-language: EN-US">Gen<span Courier New"">_<span Courier New";mso-ansi-language: EN-US">id<span Courier New"">.Например,<span Courier New"; mso-ansi-language:EN-US"> <span Courier New"">для<span Courier New"; mso-ansi-language:EN-US"> <span Courier New"">сводной<span Courier New"; mso-ansi-language:EN-US"> <span Courier New"">таблицы<span Courier New";mso-ansi-language:EN-US"><span Courier New"; mso-ansi-language:EN-US">CREATE TRIGGER NOVOE FOR RAZDELL BEFORE INSERTPOSITION 0 AS
<span Courier New"; mso-ansi-language:EN-US">BEGIN
<span Courier New"; mso-ansi-language:EN-US"> new.kod1 =gen_id(gen1,1);
<span Courier New"">END
<span Courier New"">Удаленными процедурами непользовался – хватило возможностей
<span Courier New";mso-ansi-language:EN-US">sql<span Courier New""> запросов для реализациивсех потребностей.<span Courier New"">Задал индексы по полям:
<span Courier New";mso-ansi-language: EN-US">Modell<span Courier New"">.<span Courier New";mso-ansi-language: EN-US">model<span Courier New"">, <span Courier New";mso-ansi-language: EN-US">naimm<span Courier New"">.<span Courier New";mso-ansi-language: EN-US">naim<span Courier New"">, <span Courier New";mso-ansi-language: EN-US">chastt<span Courier New"">.<span Courier New";mso-ansi-language: EN-US">vch<span Courier New"">, <span Courier New";mso-ansi-language: EN-US">razdell<span Courier New"">.<span Courier New";mso-ansi-language: EN-US">razdel<span Courier New""><span Courier New"">для увеличенияскорости выполнения запросов.<span Courier New"">Проектирование приложения в среде
<span Courier New";mso-ansi-language:EN-US">Delphi<span Courier New"">Используемые средства
<span Courier New""><span Courier New"">Приложение было написано всреде
<span Courier New"; mso-ansi-language:EN-US">Delphi<span Courier New""> 7 на компьютере <span Courier New";mso-ansi-language:EN-US">Athlon<span Courier New""> 1600+<span Courier New";mso-ansi-language: EN-US">XP<span Courier New"">, чтоочень плохо, потому что приложение написано для компьютера, намного уступающегопо мощности моему. Платформа БД – <span Courier New";mso-ansi-language:EN-US">InterBase<span Courier New""> 6.0.<span Courier New"">Формы
<img src="/cache/referats/13710/image006.jpg" v:shapes="_x0000_s1028">
<span Courier New"">Первая форма типа
<span Courier New"">Для доступа к данным яиспользовал компоненты со вкладки
<span Courier New";mso-ansi-language:EN-US">InterBase<span Courier New"">, характерной особенностьюкоторых является то, что они не обращаются к <span Courier New";mso-ansi-language:EN-US">BDE<span Courier New""> и являются более компактнымии быстрыми.<span Courier New"">Назначение компонентов:
<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New";mso-ansi-language:EN-US">IBDataBase<span Courier New"">1 – создает соединение с БД <span Courier New";mso-ansi-language: EN-US">InterBase<span Courier New"">.Есть свойство <span Courier New"; mso-ansi-language:EN-US">DataBaseName<span Courier New"">, которое указывает имя физической БД, с которойсвязан компонент. При связи с удаленной БД по протоколу <span Courier New";mso-ansi-language: EN-US">TCP<span Courier New"">/<span Courier New";mso-ansi-language: EN-US">IP<span Courier New""><span Courier New"">имя записываетсяв формате <имя сервера>:<имя файла БД>; по протоколу <span Courier New";mso-ansi-language: EN-US">NetBios<span Courier New"">– в формате \<имясервера><имя файла БД>; по протоколу <span Courier New";mso-ansi-language:EN-US">SPX<span Courier New""> <span Courier New"">– в формате <имя сервера>@<имяфайла БД>. При запуске приложения расположение БД берется из файла <span Courier New";mso-ansi-language: EN-US">del<span Courier New"">.<span Courier New";mso-ansi-language: EN-US">ini<span Courier New"">:<span Courier New";mso-ansi-language:EN-US">
<span Courier New";mso-ansi-language: EN-US">Inii := TIniFile.Create(getcurrentdir+'del.ini');<span Courier New"; mso-ansi-language:EN-US"> try
<span Courier New"; mso-ansi-language:EN-US"> str:=Inii.ReadString( 'Baza', 'Put', '');
<span Courier New"; mso-ansi-language:EN-US"> ibdatabase1.databaseName:=str;
<span Courier New"; mso-ansi-language:EN-US"> IBDatabase1.Connected:=true;
<span Courier New"; mso-ansi-language:EN-US"> IBTransaction1.Active:=true;
<span Courier New"; mso-ansi-language:EN-US"> IBTable1.Active:=true;
<span Courier New"; mso-ansi-language:EN-US"> IBTable2.Active:=true;
<span Courier New"; mso-ansi-language:EN-US"> IBTable3.Active:=true;
<span Courier New"; mso-ansi-language:EN-US"> IBTable4.Active:=true;
<span Courier New"; mso-ansi-language:EN-US"> IBTable5.Active:=true;
<span Courier New"; mso-ansi-language:EN-US">
<span Courier New"">IBTable44.Active:=true;<span Courier New"">Текст файла
<span Courier New";mso-ansi-language: EN-US">del<span Courier New"">.<span Courier New";mso-ansi-language: EN-US">ini<span Courier New"">,если БД на локальном компьютере в папке <span Courier New";mso-ansi-language:EN-US">D<span Courier New"">:<span Courier New";mso-ansi-language:EN-US">interBase<span Courier New"">:<span Courier New"">[Baza]
<span Courier New"">Put=D:interBasebase.gdb
<span Courier New"">Следущее использованноесвойство –
<span Courier New"; mso-ansi-language:EN-US">Params<span Courier New"">, которое содержит список параметров, которые передаются серверув момент соединения:<span Courier New"">USER_NAME=SYSDBA
<span Courier New"">PASSWORD=masterkey
<span Courier New"">lc_ctype=WIN1251
<span Courier New"">Тут задается имяпользователя и пароль – окно с запросом пароля при подключении не появляется.
<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New";mso-ansi-language:EN-US">IBTranzaction1 – <span Courier New"">транзакция<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New";mso-ansi-language:EN-US">IBTable<span Courier New"">~ — аналог <span Courier New";mso-ansi-language: EN-US">TTable<span Courier New"">.Отличается тем, что работает быстрее и грузит данные по надобности.<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New";mso-ansi-language:EN-US">IBQyery~<span Courier New""> — аналог <span Courier New";mso-ansi-language: EN-US">TQuery<span Courier New"">.<span Courier New";mso-fareast-font-family:«Courier New»">o<span Times New Roman"">
<span Courier New";mso-ansi-language:EN-US">OPDial<span Courier New""> – окно выбора файла – длязагрузки запроса из файла.<span Courier New"">При попытке сохранениязаписи в таблицу
<span Courier New";mso-ansi-language:EN-US">Svodka<span Courier New""> <span Courier New"">запускается процедура:<span Courier New"; mso-ansi-language:EN-US">procedure TDM.IBTable1BeforePost(DataSet: TDataSet);
<span Courier New"">begin
<span Courier New"; mso-ansi-language:EN-US"> ifibtable1.fieldbyname('K4').AsString='' then begin
<span Courier New";mso-ansi-language:EN-US"><span Courier New";mso-ansi-language:EN-US">
<span Courier New"">MessageDlg('Введите номер воинскойчасти',mterror,[mbok],0);<span Courier New"">
<span Courier New";mso-ansi-language: EN-US">ibtable1.fieldbyname('K4').FocusControl;<span Courier New"; mso-ansi-language:EN-US"> abort;
<span Courier New"; mso-ansi-language:EN-US"> end;
<span Courier New"; mso-ansi-language:EN-US"> ifibtable1.fieldbyname('SerNo').AsString='' then begin
<span Courier New"; mso-ansi-language:EN-US"> MessageDlg('
<span Courier New"">Введите<span Courier New"; mso-ansi-language:EN-US"> <span Courier New"">серийный<span Courier New";mso-ansi-language:EN-US"> <span Courier New"">номер<span Courier New"; mso-ansi-language:EN-US"> <span Courier New"">аппарата<span Courier New";mso-ansi-language: EN-US">!', mterror, [mbok],0);<span Courier New"; mso-ansi-language:EN-US"> ibtable1.fieldbyname('SerNo').FocusControl;
<span Courier New"; mso-ansi-language:EN-US"> abort;
<span Courier New"; mso-ansi-language:EN-US"> end;
<span Courier New"; mso-ansi-language:EN-US"> ifibtable1.fieldbyname('K3').AsString='' then begin
<span Courier New"; mso-ansi-language:EN-US"> MessageDlg('
<span Courier New"">Введите<span Courier New"; mso-ansi-language:EN-US"> <span Courier New"">модель<span Courier New";mso-ansi-language:EN-US"> <span Courier New"">аппарата<span Courier New"; mso-ansi-language:EN-US">!',mterror,[mbok],0);<span Courier New"; mso-ansi-language:EN-US"> ibtable1.fieldbyname('K3').FocusControl;
<span Courier New"; mso-ansi-language:EN-US"> abort;
<span Courier New"; mso-ansi-language:EN-US"> end;
<span Courier New"; mso-ansi-language:EN-US"> if ibtable1.State=dsinsert then IBTable1. FieldByName('KOD5').
<span Courier New""><span Courier New";mso-ansi-language:EN-US">AsInteger:=-1;<span Courier New""> (*)<span Courier New"">end;
<span Courier New"">Нужна для предотвращениязанесения
<span Courier New"; mso-ansi-language:EN-US">null<span Courier New""> <span Courier New"">в поля <span Courier New";mso-ansi-language:EN-US">SerNo<span Courier New"">,<span Courier New";mso-ansi-language:EN-US">K<span Courier New"">3,<span Courier New";mso-ansi-language:EN-US">K<span Courier New"">4, по которым можнооднозначно идентифицировать запись в наборе данных <span Courier New";mso-ansi-language:EN-US">svodka<span Courier New""> (по ним можно построитьключ).<span Courier New"">Еще один нюанс – если убратьстроку (*), то при добавлении новой записи будет выдаваться ошибка, что не заполненополе, на которое стоит ограничение
<span Courier New";mso-ansi-language:EN-US">not<span Courier New""> <span Courier New";mso-ansi-language: EN-US">null<span Courier New"">.Эта ошибка возникает, потому что сервер <span Courier New";mso-ansi-language:EN-US">interBase<span Courier New""> <span Courier New"">генерирует уникальноезначение в поле “<span Courier New";mso-ansi-language:EN-US">KOD<span Courier New"">5” после сохранения, а до сохранения он проверяетзначение в поле “<span Courier New";mso-ansi-language:EN-US">KOD<span Courier New"">5”, записи, полученной от клиентского приложения напустое значение, то есть до генерации не доходит. Для того, чтобы этогоизбежать мы при добавлении новой записи заносим в поле “<span Courier New";mso-ansi-language: EN-US">KOD<span Courier New"">5”любое числовое значение, которое все равно потом триггером поменяется науникальное. Аналогичное действие мы проводим для всех таблиц.<span Courier New";mso-ansi-language: EN-US">FormMain
<span Courier New""> <span Courier New"">и<span Courier New"; mso-ansi-language:EN-US">FormVvod<span Courier New"">2<span Courier New";mso-ansi-language: EN-US">FormMain
<span Courier New"">– основная, родительская форма для всех остальных форм. Управление отображениемдочерних окон внутри родительской осуществляется с помощью <span Courier New";mso-ansi-language: EN-US">Api<span Courier New""><span Courier New"">функции ShowWindow.<span Courier New";mso-ansi-language: EN-US">FormVvod
<span Courier New"">2– экранная форма с отображением параметров одного конкретно взятого прибора.Навигация идет по таблице <span Courier New";mso-ansi-language:EN-US">Svodka<span Courier New"">, с которой связан компонент<span Courier New"; mso-ansi-language:EN-US">IBTable<span Courier New"">1 из формы <span Courier New";mso-ansi-language:EN-US">DM<span Courier New"">. Воинская часть и модель отображаютсяс помощью связи компонента <span Courier New";mso-ansi-language:EN-US">TLookupKomboBox<span Courier New""> <span Courier New"">из компонентов <span Courier New";mso-ansi-language: EN-US">IBTable<span Courier New"">44и <span Courier New"; mso-ansi-language:EN-US">IBTable<span Courier New"">5 соответственно.<span Courier New"">
<span Courier New";mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA"><img src="/cache/referats/13710/image008.jpg" v:shapes="_x0000_s1030">
<span Courier New"">
<span Courier New"">Вид форм при работепрограммы:
<span Courier New"">
<span Courier New";mso-ansi-language: EN-US">FormVvod
<span Courier New""><img src="/cache/referats/13710/image010.jpg" v:shapes="_x0000_s1031">
<span Courier New"">Вид формы при работепрограммы:
<span Courier New"">
<span Courier New"">В форме отображаются записи таблицы
<span Courier New";mso-ansi-language: EN-US">svodka<span Courier New"">,с которой связан компонент <span Courier New";mso-ansi-language:EN-US">IBTable<span Courier New"">1. Добавил поля <span Courier New";mso-ansi-language: EN-US">Lookup<span Courier New""><span Courier New""> в компонент <span Courier New";mso-ansi-language:EN-US">IBTable<span Courier New""> и в таблице появились полявыбора воинской части и модели аппарата.<span Courier New";mso-ansi-language: EN-US">Vch
<span Courier New""><span Courier New"">В форме – список всехвоинских частей.
<span Courier New"">Вид:
<span Courier New";mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA"><span Courier New"">
<img src="/cache/referats/13710/image012.jpg" v:shapes="_x0000_s1032">
<span Courier New";mso-ansi-language: EN-US">Svazka
<img src="/cache/referats/13710/image014.jpg" v:shapes="_x0000_s1033">
<span Courier New"">Вид формы:
<span Courier New"">С помощью галочки «Связанныйнабор» можно устанавливать или убирать связь между таблицами “Раздел”, “Наименование”и “Модель”. Тип связей: “Наименование” подчиненная для “Раздела”, а “Модель” –подчиненная для “Наименования”. Процедура
<span Courier New";mso-ansi-language:EN-US"> <span Courier New"">клика<span Courier New";mso-ansi-language:EN-US"> <span Courier New"">на<span Courier New";mso-ansi-language:EN-US"> CheckBox:<span Courier New"; mso-ansi-language:EN-US">procedure TSvazka.CheckClick(Sender: TObject);
<span Courier New"; mso-ansi-language:EN-US">begin
<span Courier New"; mso-ansi-language:EN-US"> if check.Checkedthen begin
<span Courier New"; mso-ansi-language:EN-US">
<span Courier New"">svazka.Caption:='Редактированиесвязанных таблиц: Раздел->Наименование->Модель';<span Courier New"">
<span Courier New";mso-ansi-language: EN-US">dm.IBTable3.active:=false;<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable4.active:=false;
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable3.IndexFieldNames:='K1';
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable3.MasterSource:=dm.DataSource2;
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable4.IndexFieldNames:='<st1:place w:st=«on»>K2</st1:place>';
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable4.MasterSource:=dm.DataSource3;
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable3.active:=true;
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable4.active:=true;
<span Courier New"; mso-ansi-language:EN-US">
<span Courier New"">end<span Courier New""> else begin
<span Courier New""> svazka.Caption:='Редактирование несвязанных таблиц';
<span Courier New"">
<span Courier New";mso-ansi-language: EN-US">dm.IBTable3.MasterSource:=nil;<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable3.IndexFieldNames:='NAIM';
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable4.MasterSource:=nil;
<span Courier New"; mso-ansi-language:EN-US"> dm.IBTable4.IndexFieldNames:='MODEL';
<span Courier New"; mso-ansi-language:EN-US">
<span Courier New"">end;<span Courier New"">end;
<span Courier New"">
<span Courier New"">Из текста процедуры видно,что мы меняем свойства
<span Courier New";mso-ansi-language:EN-US">MasterSource<span Courier New"">, которое содержит ссылку наглавную таблицу и выставляем индекс – для сортировки по алфавиту при отсутствиисвязей между таблицами. Но эта форма используется еще и для задания параметровзапросу, который будет рассмотрен ниже.<span Courier New";mso-ansi-language: EN-US">Avt
<span Courier New""><span Courier New"">и <span Courier New";mso-ansi-language: EN-US">Opr<span Courier New""><span Courier New"">О авторе и о программе.
<span Courier New";mso-ansi-language: EN-US">ZaprVibr
<span Courier New""> <img src="/cache/referats/13710/image016.jpg" v:shapes="_x0000_s1034">
<span Courier New"">Вид формы:
<span Courier New"">Форма нужна для выбора типазапроса(а по запросу формируем отчет).
<span Courier New"">Запросы
<span Courier New"">Поиск не списанного илисписанного аппарата
<img src="/cache/referats/13710/image018.jpg" v:shapes="_x0000_s1035">
<span Courier New"">Данные запросы почтиполностью одинаковы, рассмотрим поиск не списанного аппарата.
<span Courier New"">Вид формы:
<span Courier New"">
<span Courier New";mso-ansi-language: EN-US">DbGrid
<span Courier New""><span Courier New"">связана с <span Courier New";mso-ansi-language: EN-US">Zapr<span Courier New"">1 через<span Courier New"; mso-ansi-language:EN-US">DZapr<span Courier New"">.<span Courier New"">Текст
<span Courier New";mso-ansi-language:EN-US"> <span Courier New"">запроса<span Courier New";mso-ansi-language: EN-US">:<span Courier New"; mso-ansi-language:EN-US">select kod5,vch,model,serno,dvip,cena
<span Courier New"; mso-ansi-language:EN-US">from SVODKA,CHASTT,MODELL
<span Courier New"; mso-ansi-language:EN-US">where K4 in
<span Courier New"; mso-ansi-language:EN-US"> (select KOD
<span Courier New"; mso-ansi-language:EN-US"> from CHASTT
<span Courier New"; mso-ansi-language:EN-US"> whereUPPER(VCH) like upper(:pvch)
<span Courier New"; mso-ansi-language:EN-US"> ) and (UPPER(serno) like upper(:pserno))
<span Courier New"; mso-ansi-language:EN-US"> and (dspis is null)
<span Courier New"; mso-ansi-language:EN-US"> and K3 in
<span Courier New"; mso-ansi-language:EN-US"> (select KOD3
<span Courier New"; mso-ansi-language:EN-US"> from Modell
<span Courier New"; mso-ansi-language:EN-US"> where UPPER(Model) like upper(:pmodel)
<span Courier New"; mso-ansi-language:EN-US"> )
<span Courier New"; mso-ansi-language:EN-US">and svodka.k4=chastt.kod and svodka.k3=modell.kod3
<span Courier New"">orderby vch
<span Courier New"">Тут используются вложенныезапросы. Параметры берутся из полей
<span Courier New";mso-ansi-language:EN-US">edit<span Courier New"">. Для независимости отрегистра используем процедуру <span Courier New";mso-ansi-language:EN-US">UPPER<span Courier New"">. Процедура нажатия накнопку «Выполнить»:<span Courier New""> with dm do begin
<span Courier New""> Zapr1.Active:=false;
<span Courier New"; mso-ansi-language:EN-US"> if ch1.Checkedthen zapr1.ParamByName('pvch').Value:= '%'+edit1.Text+'%'
<span Courier New"; mso-ansi-language:EN-US"> elsezapr1.ParamByName('pvch').Value:='%%';
<span Courier New"; mso-ansi-language:EN-US"> if ch2.Checkedthen zapr1.ParamByName('pserno').Value:= '%'+edit2.Text+'%'
<span Courier New"; mso-ansi-language:EN-US"> elsezapr1.ParamByName('pserno').Value:='%%';
<span Courier New"; mso-ansi-language:EN-US"> if ch3.Checkedthen zapr1.ParamByName('pmodel').Value: ='%'+edit3.Text+'%'
<span Courier New"; mso-ansi-language:EN-US"> elsezapr1.ParamByName('pmodel').Value:='%%';
<span Courier New"; mso-ansi-language:EN-US"> Zapr1.Active:=true;
<span Courier New"; mso-ansi-language:EN-US"> label2.Caption:=inttostr(zapr1.RecordCount);
<span Courier New"; mso-ansi-language:EN-US">
<span Courier New"">end;<span Courier New"">При нажатии на кнопку простозадаются параметры
<span Courier New";mso-ansi-language:EN-US">sql<span Courier New""> <span Courier New"">запросу. В <span Courier New";mso-ansi-language: EN-US">SQL<span Courier New""><span Courier New"">используетсяоператор <span Courier New"; mso-ansi-language:EN-US">Like<span Courier New""> – для поиска по части строки символы %, стоящие в начале и вконце параметра означают, что вместо них могут стоять любые другие.<span Courier New"">Работает запрос так: ищутсятакие записи в
<span Courier New";mso-ansi-language:EN-US">svodka<span Courier New"">, у которых <span Courier New";mso-ansi-language:EN-US">K<span Courier New"">4 и <span Courier New";mso-ansi-language:EN-US">K<span Courier New"">3 находятся из вложенныхзапросов как коды записей с частичным совпадением не ключевых полей с заданнымипараметрами “<span Courier New"; mso-ansi-language:EN-US">pvch<span Courier New"">” и “<span Courier New";mso-ansi-language:EN-US">pmodel<span Courier New"">”, и серийный номер частично совпадает с “<span Courier New";mso-ansi-language: EN-US">pserno<span Courier New"">”.<span Courier New"">Аппарат является несписанным, если в поле “
<span Courier New";mso-ansi-language:EN-US">DSpis<span Courier New"">” (Дата списания) содержитсязначение <span Courier New"; mso-ansi-language:EN-US">null<span Courier New"">. Если нам надо найти списанный аппарат, то запрос будет почтитакой же, только <span Courier New";mso-ansi-language:EN-US">DSpis<span Courier New""> <span Courier New";mso-ansi-language:EN-US">is<span Courier New""> <span Courier New";mso-ansi-language: EN-US">not<span Courier New""><span Courier New"; mso-ansi-language:EN-US">null<span Courier New"">. Поэтому поиск списанного аппарата я рассматривать не буду.<span Courier New"">Отобранные записисортируются по номеру воинской части (
<span Courier New";mso-ansi-language:EN-US">Order<span Courier New""> <span Courier New";mso-ansi-language: EN-US">by<span Courier New""><span Courier New"; mso-ansi-language:EN-US">vch<span Courier New"">).<span Courier New"">Кнопка «Перейти» нужна дляперехода в таблице
<span Courier New";mso-ansi-language:EN-US">IBTable<span Courier New"">1 каппарату, который является текущим в таблице отобранных с помощью запросааппаратов. Процедура нажатия на кнопку «Перейти»:<span Courier New"; mso-ansi-language:EN-US">procedure TZ1.SpeedButton1Click(Sender: TObject);
<span Courier New"; mso-ansi-language:EN-US">begin
<span Courier New"; mso-ansi-language:EN-US">dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr1.FieldByName('kod5').Value]),[]);
<span Courier New"; mso-ansi-language:EN-US"> ShowWindow(formvvod2.Handle, SW_SHOW);
<span Courier New"; mso-ansi-language:EN-US">
<span Courier New"">formvvod2.Show;<span Courier New"">end;
<span Courier New"">Переход нужен для просмотра параметров, которые не выводятсязапросом или же для изменения значений полей.
<span Courier New";mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA"><span Courier New"">Поиск аппарата по группам
<img src="/cache/referats/13710/image020.jpg" v:shapes="_x0000_s1036">
<span Courier New"">После выбора данноговида поиска на экране появляется форма “
<span Courier New"">
<span Courier New"">
<span Courier New"">Добавились 3
<span Courier New";mso-ansi-language: EN-US">CheckBox<span Courier New"">– для выбора по какому критерию мы будем отбирать аппараты. Одновременно большеодного критерия быть выбрано не может. Процедура нажатия на кнопку «Выполнить»:<span Courier New";mso-ansi-language: EN-US">procedure TSvazka.SpeedButton2Click(Sender: TObject);
<span Courier New";mso-ansi-language: EN-US">begin
<span Courier New";mso-ansi-language: EN-US"> with dm do begin
<span Courier New";mso-ansi-language: EN-US"> Zapr3.Active:=false;
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Clear;
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('select *');
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('from naimm,modell,chastt,svodka');
<span Courier New";mso-ansi-language: EN-US"> if c3.Checked then begin
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('wheresvodka.k3= '+dm.ibtable4.fieldbyname('KOD3').AsString);
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('and modell.kod3='+dm.ibtable4.fieldbyname('KOD3').AsString);
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('and modell.k2=naimm.kod2');
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('andsvodka.k4=chastt.kod');
<span Courier New";mso-ansi-language: EN-US"> end
<span Courier New";mso-ansi-language: EN-US"> else if c2.Checked then begin
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('wheresvodka.k3=modell.kod3');
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('andnaimm.kod2= '+dm.ibtable3.fieldbyname('KOD2').AsString);
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('and modell.k2='+dm.ibtable3.fieldbyname('KOD2').AsString);
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('andsvodka.k4=chastt.kod');
<span Courier New";mso-ansi-language: EN-US"> end
<span Courier New";mso-ansi-language: EN-US"> else if c1.Checked then begin
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('wheresvodka.k3=modell.kod3');
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('andmodell.k2=naimm.kod2');
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('and naimm.k1='+dm.ibtable2.fieldbyname('KOD1').AsString);
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('andsvodka.k4=chastt.kod');
<span Courier New";mso-ansi-language: EN-US"> end;
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('and svodka.k4=chastt.kod');
<span Courier New";mso-ansi-language: EN-US"> zapr3.SQL.Add('order by vch');
<span Courier New";mso-ansi-language: EN-US"> if c1.Checked or c2.Checked orc3.Checked then Zapr3.Active:=true
<span Courier New";mso-ansi-language: EN-US">
<span Courier New"">elsemessagedlg('Надо выделить хоть одну категорию!',mtinformation,[mbok],0);<span Courier New"">
<span Courier New";mso-ansi-language: EN-US">z3.label2.Caption:=inttostr(zapr3.RecordCount);<span Courier New";mso-ansi-language: EN-US"> end;
<span Courier New";mso-ansi-language: EN-US"> ShowWindow(z3.Handle,SW_SHOW);
<span Courier New";mso-ansi-language: EN-US">
<span Courier New"">z3.Show;<span Courier New"">end;
<span Courier New"">
<span Courier New"">Процедура заполняет
<span Courier New";mso-ansi-language: EN-US">sql<span Courier New""><span Courier New"">запроскомпонента <span Courier New"; mso-ansi-language:EN-US">zapr<span Courier New"">3 и выводит на экран форму “<span Courier New";mso-ansi-language:EN-US">Z<span Courier New"">3” с результатом:<span Courier New""><img src="/cache/referats/13710/image022.jpg" v:shapes="_x0000_i1027">
<span Courier New"">В этой форме таблицасвязанна с
<span Courier New"; mso-ansi-language:EN-US">zapr<span Courier New"">3, а кнопка «Перейти» работает также как кнопка, описанная выше.Количество отобранных записей выводится с помощью метода <span Courier New";mso-ansi-language: EN-US">recordcount<span Courier New"">.<span Courier New"">Загрузка запроса из файла.
<span Courier New"">Текст запроса загружается спомощью метода
<span Courier New";mso-ansi-language:EN-US">loadfromfile<span Courier New"">. Возможность загрузкизапроса из файла очень удобна, так как запрос очень легко можно перенести и ненадо перекомпилировать программу.<span Courier New"">Пример:
<span Courier New"">Текст запроса в файле «Всеиз сводки.
<span Courier New"; mso-ansi-language:EN-US">sql<span Courier New"">»:<span Courier New"">select*
<span Courier New"">fromsvodka
<span Courier New"">/* грузит все из таблицы сводки */
<img src="/cache/referats/13710/image024.jpg" v:shapes="_x0000_s1037">
<span Courier New"">Форма с результатами:
<span Courier New"">
<span Courier New"">Список аппаратов вопределенной части
<span Courier New"">Для этого запроса меняпросили сделать отчет. Запрос показывает все аппараты в заданной воинской частисо всеми их характеристиками.
<span Courier New"">Поиск идет по неполномусовпадению (
<span Courier New"; mso-ansi-language:EN-US">Like<span Courier New"">). Но если нужен отчет, то надо задать номер воинской частиполностью (чтоб по нескольким воинским частям выборки не произошло).<span Courier New";mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA"><img src="/cache/referats/13710/image026.jpg" v:shapes="_x0000_s1038">
<span Courier New"">Вид формы:
<span Courier New"">
<span Courier New"">Текст
<span Courier New";mso-ansi-language:EN-US"> sql <span Courier New"">запроса<span Courier New";mso-ansi-language: EN-US">:<span Courier New"; mso-ansi-language:EN-US">selectvch,razdel,naim,model,serno,dspis,dvvod,cena,ser,zol,pt,pg,kod5
<span Courier New"; mso-ansi-language:EN-US">from chastt,razdell,naimm,modell,svodka
<span Courier New"; mso-ansi-language:EN-US">where
<span Courier New"; mso-ansi-language:EN-US">chastt.vch like :par
<span Courier New"; mso-ansi-language:EN-US">and svodka.k4=chastt.kod
<span Courier New"; mso-ansi-language:EN-US">and svodka.k3=modell.kod3
<span Courier New"; mso-ansi-language:EN-US">and naimm.kod2=modell.k2
<span Courier New"">and razdell.kod1=naimm.k1
<span Courier New"; mso-ansi-language:EN-US">order by vch,razdel,naim,model,dspis
<span Courier New""><span Courier New"">
<span Courier New"">Этот запрос я сделал безподзапросов (не знаю что быстрее, наверное быстрее без подзапросов, зато сподзапросами нагляднее).
<span Courier New"">Формирование отчета.
<span Courier New"">В
<span Courier New";mso-ansi-language:EN-US">Delphi<span Courier New""> 7 отчеты делаются уже не спомощью компонентов <span Courier New";mso-ansi-language:EN-US">QReport<span Courier New"">, а с помощью <span Courier New";mso-ansi-language:EN-US">Rave<span Courier New""> <span Courier New";mso-ansi-language: EN-US">Report<span Courier New"">.Вкладки <span Courier New"; mso-ansi-language:EN-US">QReport<span Courier New""> <span Courier New"">больше не существует. Так как система <span Courier New";mso-ansi-language:EN-US">Delphi<span Courier New""> 7 вышла недавно, топришлось разбираться по справке. В общем то принципы остались те же – разбитиедокумента на несколько полос и т. д. Для работы с отчетами на форме расположенодва не визуальных компонента — RvProject1, с помощью которого идет связь сфайлом проекта и RvDataSetConnection1 – связь с набором данных. Файл проектастроится с помощью утилиты <span Courier New";mso-ansi-language:EN-US">Rave<span Courier New""> <span Courier New";mso-ansi-language:EN-US">Designer<span Courier New"">. Отчет при проектированиивыглядит так:<span Courier New"">
<span Courier New"">
<img src="/cache/referats/13710/image028.jpg" v:shapes="_x0000_s1039">
<span Courier New"">
<span Courier New"">
<span Courier New"">Я сформировал отчет,выровнял и сохранил как
<span Courier New";mso-ansi-language:EN-US">otch<span Courier New"">4.<span Courier New";mso-ansi-language:EN-US">rav<span Courier New"">.<img src="/cache/referats/13710/image030.jpg" v:shapes="_x0000_s1040">
<span Courier New"">Вид отчета при работеприложения:
<span Courier New"">
<span Courier New"">Отчет вызывается по нажатиина кнопку «Отчет» через метод
<span Courier New";mso-ansi-language:EN-US">execute<span Courier New""> <span Courier New"">компонента rvproject1.<span Courier New"">Заключение
<span Courier New"">Самый сложный этап –формирование таблиц, связей между ними, ссылочной целостности. Типы данных в
<span Courier New";mso-ansi-language: EN-US">InterBase<span Courier New"">какие-то «корявые». <span Courier New";mso-ansi-language:EN-US">Float<span Courier New""> – точность 7 знаков. Если вносишь десятичную дробь,целая часть у которой равна нулю, то в дробной части гарантируется точность до7 знаков после запятой. Например, если внести 0.123, а потом сохранить запись,то в этом поле будет число 0.1230000004233858, что конечно же не наглядно иприбавляет программисту лишней головной боли. Тип <span Courier New";mso-ansi-language:EN-US">varchar<span Courier New""> – доставляет пробелов додлины строки – опять неудобства – если максимальная длина строки – 120символов, а там допустим слово из 5 букв, то будет сохранено слово+115 пробеловперед ним, теперь смотрим в поле – видим пусто (если поле длиной меньше 120символов). При попытке переформировать таблицу данные исчезают. Возможно этонеудобство <span Courier New"; mso-ansi-language:EN-US">InterBase<span Courier New"">, но есть системы и лучше – <span Courier New";mso-ansi-language:EN-US">MS<span Courier New""> <span Courier New";mso-ansi-language: EN-US">SQLServer<span Courier New"">,<span Courier New"; mso-ansi-language:EN-US">Oracl<span Courier New"">. После соединения с сетевой базой данных работа с ней мало чемотличается от работы с локальной базой данных.<span Courier New"">Я получил приложение,которое осуществляет все виды операций с удаленной базой данных, такие, каквставка, удаление, выборка данных. Подключение идет через стандартные сетевыепротоколы к серверу баз данных
<span Courier New";mso-ansi-language:EN-US">InterBase<span Courier New"">. Если сравнивать локальныеи сетевые базы данных, то, на мой взгляд, будущее за сетевыми базами данных, алокальные базы будут уходить в прошлое. Причина – широкое распространениелокальных сетей и сети <span Courier New";mso-ansi-language:EN-US">Internet<span Courier New"">. Проще подключиться к сети,сформировать запрос и тут же получить нужные данные, чем хранить все на своемкомпьютере. Как видно из моей работы, с помощью объектно-ориентированного программированиястроить сложное приложение становится все проще и проще, растут мощности компьютеров,объемы ОЗУ и ПЗУ и приложения работают с базами данных все быстрее и быстрее.<span Courier New";mso-fareast-font-family: «Times New Roman»;mso-ansi-language:RU;mso-fareast-language:RU;mso-bidi-language: AR-SA"><span Courier New"">Список используемой литературы:
<span Courier New"; mso-fareast-font-family:«Courier New»">1.<span Times New Roman"">
<span Courier New"">«Microsoft®Access 2000», И.А. Харитонова, В.Д. Михеева, издательство «БХВ — Петербург»,1999<span Courier New"; mso-fareast-font-family:«Courier New»">2.<span Times New Roman"">
<span Courier New"">«Базыданных: Учебный курс», С.В. Глушаков, Д.В. Ломотько, ООО «Издательство АСТ»,2000<span Courier New"; mso-fareast-font-family:«Courier New»">3.<span Times New Roman"">
<span Courier New"">«Delphi5 Руководство разработчика баз данных», В.В. Фаронов, П.В. Шумаков,издательство «Нолидж», 2001<span Courier New"; mso-fareast-font-family:«Courier New»">4.<span Times New Roman"">
<span Courier New"">«Работас базами данных в Delphi», В.Э. Гофман, А.Д. Хомоненк