Создание приложений баз данных в среде Delphi
Министерство
образования Республики Беларусь
Учреждение
образования «Гомельский государственный университет имени Франциска Скорины»
Факультет
математический
Кафедра
вычислительной математики и программирования
Курсовая
работа
ОСНОВЫ
АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
РЕФЕРАТ
Курсовая работа
Ключевые слова: утилита DatabaseDesktop, алиас БД, таблица БД, утилита
BDE Administrator, методы навигации, методы Locate и LookUp, вычисляемые поля,
SQL-запросы, компоненты TTable и TQuery, генератор отчетов Rave .
Объект исследования: среда Delphi.
Предмет исследования: приложения баз данных в Delphi.
Цель курсовой работы: изучение основных принципов создание приложений баз
данных в среде Delphi, разработка таблиц БД и создание приложения БД в
соответствии с заданной прикладной областью.
Задачами курсовой работы являются: изучение основных принципов создание
приложений баз данных в среде Delphi, создание таблиц БД с помощью утилиты
DatabaseDesktop, создание псевдонима (алиаса) БД с помощью утилит SQL Explorer
или BDE Administrator, разработка интерфейса приложения БД, организация поиска
и фильтрации в БД, создание вычисляемых полей, сортировка данных в таблицах БД,
построение SQL-запросов к БД, генерация отчетов в RaveDesigner.
Введение
База данных - множество файлов, предназначенных для хранения информации о
некоторой предметной области. Степень детализации информации определяется рядом
факторов. Прежде всего, целью использования информации из баз данных и
сложность информационных процессов, существующих в пределах предметной области
в конкретных условиях. С другой стороны, база данных - это двумерный массив,
где строки образуются отдельными записями, а столбцы - полями этой записи.
Ядром любой базы данных является модель данных. Модель данных - это совокупность
структур данных и операций их обработки. Модель базы данных, состоящая из
таблицы, между отдельными из которых существуют связи, называется реляционной.
Существуют и другие работы баз данных, некоторые из которых значительно
эффективнее реляционной, но не получили широкого распространения из-за
сложности создания соответствующих систем управления базами данных:
иерархическая (данные организованы в виде деревьев), сетевая (каждый узел БД
взаимодействует с другими узлами посредством сложной системы связей) и
объектная (в БД хранятся не только данные, но и методы их обработки в виде
программного кода).
В курсовой работе рассматривается создание приложений баз данных в среде
Delphi. Для этого были изучены некоторые теоретические вопросы: утилита DatabaseDesktop, компонент Query, компонент DBGrid, компонент DBNavigatorи
другое. В утилите DatabaseDesktop были созданы таблицы Услуги, Персонал,
Договора и Клиенты для предметной области Рыболовное хозяйство. Было создано
приложение БД в среде Delphi, реализующее навигацию по таблицам БД, сортировку
данных по основному и дополнительным индексам, поиск данных, отбор данных с
помощью фильтров компонентов Tableи
Query, фильтрацию в наборе данных.
1. Изученные теоретические вопросы
.1 Компоненты для работы с базой данных
) Компонент TDBCheckBox. Он обладает функциональностью стандартного флажка TCheckBox, но источником данных и приёмником
для него служит поле НД, которое может быть логическим или символьным. В
последнем случае необходимо соответствующим образом установить значение
текстовых свойств ValueChecked и ValueUnChecked. Элементы в этих свойствах
перечисляются через точку с запятой.
) Компонент TDBEdit.
Он позволяет редактировать значение отдельного поля текущей записи НД.
Используемые свойства не отличаются от свойств компонента TEdit, но источником данных и их
приёмником для него служит поле НД. При вводе значения в компонент TDBEdit программа автоматически следит за
тем, чтобы оно было совместимо по формату с полем НД. Ввод неверных значений
блокируется.
) Компонент TDBImage. Он позволяет воспроизводить на экране рисунки, хранящиеся в базе
данных. Рисунки отображаются в данном поле автоматически, если значение
свойства AutoDisplay = True. Иначе рисунок можно загрузить вызовом метода LoadPicture. Изображение можно скопировать,
используя метод Picture.
Если значение свойства QuickDraw = True, то ускоряется вывод рисунка на
экран, что часто полезно при активном просмотре больших наборов записей, но при
этом ухудшается качество изображения. Свойство Stretch позволяет подстраивать (сжимать или растягивать)
изображение под текущие размеры компонента TDBImage на форме.
) Компонент TDBListBox. Он предназначен для отображения состояния конкретного поля текущей
записи НД, а также для выбора нового значения поля. Список этого компонента
первоначально пуст, и программист должен заполнить список перед тем, как он
станет доступен пользователю.
Компонент TDBListBox может
отображать текущее значение связанного с ним поля только в том случае, если это
значение совпадает с одним из списочных значений компонента.
) Компонент TDBComboBox. Он позволяет показывать и изменять текущее значение поля в
раскрывающемся списке значений. Набор текста в области ввода позволяет быстро
переместиться к нужной записи в списке или ввести значение, отсутствующее в
нем.
.2 Особенности набора данных Table
Компонент Table представляет собой набор данных, который в текущий момент
времени может быть связан только с одной таблицей БД. Этот набор данных
формируется на базе навигационного способа доступа к данный, поэтому компонент
Table рекомендуется использовать для локальных БД, таких как dBase или Paradox.
При работе с удаленными БД следует использовать компонент Query.
Связь между таблицей и компонентом Table устанавливается через его
свойство TableName типа TFileName, которое задает имя таблицы (и имя файла с
данными таблицы). При задании свойства TableName указывается имя файла и
расширение имени файла.
На этапе разработки приложения имена всех таблиц доступны в
раскрывающемся списке Инспектора объектов. В этот список попадают таблицы,
файлы которых расположены в каталоге, указанном свойством DatabaseName. При
смене имени таблицы на этапе проектирования приложения свойству Active набора
данных автоматически устанавливается значение False. При задании имени таблицы
программным способом набор данных предварительно необходимо закрыть, установив
его свойству Active значение False. В противном случае генерируется
исключительная ситуация. Свойство TаbleТуре типа ttTableType определяет тип таблицы. Для локальных таблиц
это свойство может принимать следующие значения:
.ttoefault - тип таблицы автоматически определяется по расширению файла;
2. ttParadox - таблица Paradox;
. ttDBase - таблицаdBASE;
4. ttFoxPro - таблица FoxPro;
. ttASCII - текстовый файл, содержащий данные в табличном виде (таблица
ASCII).
По умолчанию в состав набора данных Table попадают все записи связанной с
ним таблицы. Для отбора записей, удовлетворяющих определенным условиям,
используются фильтры.через BDE автоматически поддерживает многопользовательский
доступ к локальным таблицам, при этом по умолчанию все пользовательские
приложения имеют равные права и могут редактировать содержащиеся в таблицах
данные. Чтобы запретить пользователям изменять содержание записей, можно
использовать свойство Readonly типа Boolean. По умолчанию оно имеет значение
False, что предоставляет пользователю право на модификацию записей.
В наборе данных Table возможно указание текущего индекса, требуемого для
выполнения операций: сортировки записей, поиска записей, установки связей между
таблицами.
Текущий индекс устанавливается с помощью свойства IndexName или IndexFieldNames типа String. На этапе разработки приложения текущий индекс выбирается из списка
индексов, заданных при создании таблицы. Все возможные значения свойств IndexName и IndexFieldNames содержатся в раскрывающихся списках, доступных
через Инспектор объектов. Оба свойства во многом схожи, и их использование
практически одинаково. Значением свойства IndexName является имя индекса, заданное при создании таблицы,
а значением свойства IndexFieldNames является имя поля, для которого был создан
индекс. Если индекс состоит из нескольких полей, то для свойства IndexName по-прежнему задается имя
этого индекса, а для свойства IndexFieldNames
через точку с запятой перечисляются имена полей, входящие в этот индекс.
Для таблиц Paradox сделать текущим индексом ключ (главный индекс) можно
только с помощью свойства IndexFieldNames, перечислив ключевые поля таблицы, т.
к. ключ не имеет имени и поэтому недоступен через свойство IndexName.
.3 Особенности набора данных Query
Компонент TQuery,
находящийся на панели BDE,
позволяет очень гибко определить условие отбора записей из нескольких таблиц
БД.
Основные свойства компонента TQuery
Свойства
|
Описание
|
DataSource
|
Содержит ссылку на компонент TDataSource, используемый для формирования
параметрического запроса
|
Local
|
Имеет значение True, если компонентTQuery работает с локальной или файл-серверной БД
|
Params[Index:Word]
|
Содержит массив объектов-параметров класса TParams
|
Prepared
|
Имеет значение True, если запрос был подготовлен к выполнению методом Prepare
|
RowAffected
|
Содержит количество записей, которые были изменены или
удалены в результате выполнения запроса
|
SQL
|
Содержит текст SQL запроса
|
Основные методы компонента TQuery
Метод
|
Описание
|
ExecSQL
|
Выполняет запросы Insert, Update, Delete иCreateTable. Для выполнения запроса Selectвместо
него используется метод Open или свойство Active
|
ParamByName (Const Value: String)
|
Открывает доступ к параметру по его имени Value
|
Prepare
|
Передаёт в BDE запрос, для того чтобы BDE и удаленный
сервер БД распределили свои ресурсы и дополнительно оптимизировали запрос
(подготовка запроса к выполнению)
|
Свойства класса TParams
Свойства
|
Описание
|
AsXXXX
|
Эти свойства (AsString, AsInteger и т.д) служат для преобразования значения параметра к нужному типу
|
ISNull
|
Содержит true,
если с параметром не связано значение
|
Name
|
Содержит имя параметра
|
Value
|
Содержит значение параметра
|
Для отображения результатов запросов с компонентом TQuery связываем компонент TDataSource, в свойстве DataSet которого указываем имя объекта (например, Query1). В свойстве DataSourceобъекта TDBGrid1 указываем имя источника данных (например, DataSource1). В свойстве DatabaseName компонента TQuery указываем алиас БД.
.4 Компонент DataSource
Невизуальный компонент DataSource в Delphi представляет собой источник
данных, который обеспечивает связь между набором данных и компонентами
отображения и редактирования данных.
Все наборы данных должны быть связаны с компонентом источника данных,
если требуется редактирование данных. Основное свойство источника данных -
DataSet. Оно указывает на компонент набора данных (Table, Query и др), с
которыми связан источник. Свойство State дает информацию о текущем состоянии
набора данных: находится ли он в состоянии редактирования, вставки данных и так
далее.
Основные методы:
Ø Edit- подтверждает возможность редактирования набора данных
(не путать этот метод с методом Edit из набора TDataSet). Объявление:
procedureEdit; IsLinkedTo- проверяет
связь источника с указанным набором данных. Обычно напрямую не используется, а
применяется при разработке новых компонентов.
functionIsLinkedTo(DataSet: TDataSet):Boolean;
События:
Ø OnDataChange - наступает при перемещении на новое поле или
новую запись, если текущая запись редактировалась.
Ø OnStateChange- наступает при изменении состояния набора
данных, связанного с данным источником.
Ø OnUpdateData - наступает, когда намечается обновление текущей
записи.
Основные свойства:
Ø AutoEdit определяет, вызывается ли автоматически метод
редактирования данных Edit.
Ø DataSet набор данных, с которым связан компонент.
Ø Enabled определяет, отображается ли данные в компонентах
отображения, связанных с этим источником.
Ø State- указывает текущее состояние набора данных, связанного
с источником данных.
.5 Компонент DBGrid
Компонент DBGrid отображает содержимое НД в виде таблицы, в которой
столбцы соответствуют полям НД, а строки - записям.
То, как происходит прорисовка данных в сетке TDBGrid - стандартным образом или по определенному сценарию -
определяется свойством DefaultDrawing. Если в этом свойстве установить False, то алгоритм прорисовки должен содержаться в
обработчиках события OnDrawCollumnCell и OnDrawDataCell (обработчик события OnDrawDataCell введён для совместимости с ранними
версиями Delphi).
Для стандартного вывода ячеек используется метод DefaultDrawColumnCell. Если в свойстве DefaultDrawing компонента TDBGrid установить True (задаётся по умолчанию), то обработчики будут вызваны после завершения
стандартной процедуры прорисовки, т.е. программный вывод в данном случае
накладывается на стандартный. Это может стать причиной неправильного
отображения данных. Чтобы исключить нежелательное влияние стандартного вывода
необходимо сначала закрасить прямоугольник прорисовки: FillRect(Rect). Событие OnDrawColumnCell возникает при прорисовке каждой ячейки, при этом текущей
записью базового НД становиться запись с прорисовываемой ячейкой.
Свойство Options компонента
TDBGrid имеет следующие параметры:
1. dgEditing- разрешает редактирование.
2. dgAlwaysShowEditor - при выделении столбца автоматически переводит его в
режим редактирования.
3. dgTitles - показывает заголовки столбцов.
4. dgIndicator- показывает указатель текущей строки в самом левом
фиксированном столбце.
5. dgColumResize- разрешает пользователю с помощью мыши менять ширину
столбцов.
6. dgColLines- показывает в сетке вертикальные разделяющие линии.
7. dgRowLines- показывает в сетке горизонтальные разделяющие линии.
8. dgTabs- разрешает переход от столбца к столбцу с помощью клавиши
Tab.
9. dgRowSelect- разрешает выделение цветом всей текущей строки.
10. dgAlwaysShowSelection - выделение текущей строки цветом сохраняется, даже
если компонент теряет фокус ввода.
11. dgConfirmDelete - требует подтверждения удаления строки.
12. dgCancelOnExit - если пользователь вставляет пустую строку и покидает её,
то она не сохраняется в таблице БД;
13. dgMultiSelect- разрешает множественный выбор строк.
Если dgEditing = false, то независимо от свойства ReadOnly любого столбца, все данные в сетке
будут защищены. Если dgAlwayShowEditor = false,
то редактировать выделенный столбец можно после нажатия клавиш F2,илиEnter или после двойного щелчка на ячейке мышью (левой
кнопкой).
2. Постановка задачи
Создать базу данных по предметной области: Таможня, которая будет
состоять из следующих информационных объектов:
Товары (Код товара, наименование, стоимость, пошлина)
Декларации (Номер декларации, Код товара, количество, дата декларации,
ФИО гражданина, код сотрудника)
Персонал (Код сотрудника, код должности, ФИО сотрудника, адрес
сотрудника, телефон, год рождения, образование)
Должности (Код должности, наименование должности, оклад).
Система должна обеспечить:
. ведение локальной базы данных: просмотр, корректировку, удаление,
дополнение записей БД;
. заполнение графических элементов записи базы (дополнительно);
. просмотр данных в таблице и окнах редактирования;
. формирование значения вычисляемого поля;
. отбор записей из БД по условию статического и динамического запросов на
языке SQL в компонентах Query;
. поиск данных различными способами, отбор записей из БД по условию,
определенному с помощью фильтров компонентов Table и Query;
. сортировку данных по основному и дополнительным индексам;
. формирование, предварительный просмотр и печать отчета данных из БД.
3. Структура базы данных
База данных состоит из 4 связанных таблиц: Товары, Декларации, Персонал,
Должности.
Структура таблиц базы данных приведена в следующих таблицах:
Товары
Имя поля
|
Тип данных
|
Описание
|
Размер
|
Kod_tovara
|
Числовой
|
Код товара
|
|
Tovar_name
|
Текстовый
|
Наименованиетовара
|
50
|
Tovar_cost
|
Числовой
|
Стоимость товара
|
|
Poshlina
|
Числовой
|
Пошлина
|
|
Декларации
Имя поля
|
Тип данных
|
Описание
|
Размер
|
Declaration_number
|
Числовой
|
Номердекларации
|
|
Kod_tovara
|
Числовой
|
Код товара
|
|
Kolvo
|
Числовой
|
Количество ед. товара
|
|
Declaration_Data
|
Дата
|
Дата декларации
|
|
FIO_grazhdanina
|
Текстовый
|
ФИО гражданина
|
60
|
Kod_sotrudnika
|
Числовой
|
Код сотрудника
|
|
Персонал
Имя поля
|
Тип данных
|
Описание
|
Размер
|
Kod_sotrudnika
|
Числовой
|
Код сотрудника
|
|
Kod_dolzhnosti
|
Числовой
|
Код должности
|
|
FiO_sotrudnika
|
Текстовый
|
ФИО сотрудника
|
60
|
Adress_sotrudnika
|
Текстовый
|
Адрес сотрудника
|
70
|
Telefon
|
Текстовый
|
Код сотрудника
|
9
|
Birthyear
|
Числовой
|
Год рождения
|
|
Obrazovanie
|
Текстовый
|
Образование
|
30
|
Должности
Имя поля
|
Тип данных
|
Описание
|
Размер
|
Kod_dolzhnosti
|
Числовой
|
Код должности
|
|
Naimen_dolzhnosti
|
Текстовый
|
Наименование должности
|
40
|
Oklad
|
Числовой
|
Оклад
|
|
4. Интерфейс задачи
) Просмотр данных таблиц
Для просмотра данных таблицы нужно щелкнуть правой кнопкой мыши и выбрать
необходимую таблицу (рис А.1). В результате появится выбранная таблица (рис
А.2).
) Добавление данных
Для добавления данных в таблицу нужно выбрать необходимую таблицу (см.
п.4.1). Затем нажать на кнопку Добавить или Работа с таблицами/ Добавить (рис.
А.2). Появится форма, в которую нужно ввести необходимые данные и нажать на
кнопку сохранить (рис А.3). В итоге в таблице появятся добавленные данные (рис.
А.4).
) Вставка данных
Для вставки данных в таблицу нужно выбрать необходимую таблицу
(см.п.4.1). Указать щелчком левой кнопки мыши поле, перед которым появятся
вставленные данные. Затем нажать на кнопку Вставить или Работа с
таблицами/Вставить (рис. А.2). Появится форма, в которую нужно ввести
необходимые данные и нажать на кнопку сохранить (рис А.3). В итоге в таблице
появятся вставленные данные (рис. А.5).
) Изменение данных
Для изменения данных в таблице нужно выбрать необходимую таблицу
(см.п.4.1). Указать щелчком левой кнопки мыши поле, в котором необходимы
изменения данных. Затем нажать на кнопку Изменить или Работа с
таблицами/Изменить (рис. А.2). Появится форма с данными, где их можно изменить,
а затем нужно нажать на кнопку сохранить (рис А.6). В итоге таблица будет
содержать измененные данные (рис. А.7).
) Удаление данных
Для удаления данных в таблице нужно выбрать необходимую таблицу (см.
п.4.1). Указать щелчком левой кнопки мыши поле, которое необходимо удалить.
Затем нажать на кнопку Удалить или Работа с таблицами/Удалить (рис. А.2). В
результате таблица не будет содержать удаленные данные (рис. А.8).
) Поиск данных
Для поиска данных таблицы нужно выбрать необходимую таблицу (см.п.4.1).
Затем выбрать Работа с таблицами/Поиск/Таблица/ Данные (по которым будет
происходить поиск) (рис. А. 9). Появится форма, где нужно указать данные, по
которым будет происходить поиск и нажать на кнопку ОК (рис. А.10). В результате
будут показаны все данные таблицы, но найденная запись будет выделена по
сравнению с остальными (рис. А.11).
Фильтрация данных
Для фильтрации данных таблицы нужно выбрать необходимую таблицу (см.
п.4.1). Затем выбрать Работа с таблицами/Поиск/Таблица/ Данные (по которым
будет происходить фильтрация) (рис. А.9). Появится форма, где нужно указать
данные, по которым будет происходить фильтрация, выбрать Вкл./выкл фильтрацию и
нажать на кнопку ОК (рис. А.12). В результате в таблице будут исключены данные,
не удовлетворяющие условиям фильтрации (рис А.13).
Сортировка
Для сортировки данных первой таблицы нужно выбрать таблицу (см. п.4.1).
Затем выбрать Обработка/Сортировка/ Выбор данных для сортировки (Рис. А.18). В
результате данных будут сортироваться по выбранному параметру (Рис. А.19).
Вычисляемое поле
Для создания вычисляемого поля Poshlina% по первой таблице необходимо:
) добавить это поле в список полей таблицы Сотрудники (команда NewField в редакторе полей), указать его тип
(в данном случае Currency), выбрать
с помощью переключателя FieldType вариант Calculated
(Вычисляемое поле).
) В обработчике события OnCalcFields компонента НД (в данном случае Table1) напишем:
Table1.FieldByName('Poshlina%').Value:=
(Table1.FieldByName('Poshlina').Value/.FieldByName('Tovar_cost').Value)*100;
В результате таблица Товары будет отображать данные вычисляемого поля
(Рис. А.17)
Запросы
Для просмотра запросов нужно навести курсор мыши на Обработка/Запрос
(рис. А.14). Появится подменю, где можно выбрать нужный запрос (рис. А.15).
Если запрос статический, то результат запроса появится сразу, а если
динамический, то появится форма, в которой в поле Edit вводим данные, удовлетворяющие
условию запроса, и нажимаем на кнопку ОК. (Запросы см. п.5).
Отчеты
Для просмотра отчетов нужно выбрать Отчеты, а затем щелкнуть по нужному
отчету (рис. А.16). В результате появится выбранный отчет (см. п.6).
5. Запросы
Выдать информацию о сотруднике (ФИО, адрес, телефон, год рождения) по
введенному номеру декларации.
SELECT Table3.FiO_sotrudnika, Table3.Adress_sotrudnika,
Table3.Telefon, Table3.Birthyear"Table2.DB" Table2JOIN
"Table3.db" Table3(Table2.Kod_sotrudnika = Table3.Kod_sotrudnika)Table2.Declaration_number=:Par.Query1.ParamByName('Par').AsInteger:=strtoint(Form6.Edit1.Text);
Рисунок 5.1 - результат выполнения первого запроса
Выдать список сотрудников (ФИО, адрес, телефон, образование, должность),
оформивших указанный товар.
Select
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnostiTable1,Table2,Table3,Table4(Tovar_name=:Par)
and (Table1.Kod_tovara=Table2.Kod_tovara) and
(Table2.Kod_sotrudnika=Table3.Kod_sotrudnika) and (Table3.Kod_dolzhnosti=Table4.Kod_dolzhnosti).Query1.ParamByName('Par').AsString:=Form6.Edit1.Text;
Рисунок 5.2 - результат выполнения второго запроса
По введенному названию должности выдать количество работников, занимающих
ее, оклад.
Select count(Table3.Kod_dolzhnosti), OkladTable3,
Table4(Table3.Kod_dolzhnosti=Table4.Kod_dolzhnosti) and
(Naimen_dolzhnosti=:Par)by
Oklad.Query1.ParamByName('Par').AsString:=Form6.Edit1.Text;
Рисунок 5.3 - результат выполнения третьего запроса
Подсчитать количество различных сотрудников на таможне, оформивших
декларации в этом году (используя данные только таблицы «декларации»).
Select count(distinct(Kod_sotrudnika))Table2 _Data between
"01.01.2016" and "31.12.2016"
Рисунок 5.4 - результат выполнения четвёртого запроса
Выдать список сотрудников (ФИО, адрес, телефон, образование, должность) с
указанием суммарного количества задекларированных товаров (каждым сотрудником)
в 2010 году.
Select
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti,sum(kolvo)table2,table3,table4(table2.kod_sotrudnika=table3.kod_sotrudnika)
and (table3.kod_dolzhnosti=table4.kod_dolzhnosti) and (Declaration_Data between
"01.01.2010" and "31.12.2010")by
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti
Рисунок 5.5 - результат выполнения пятого запроса
Выдать список товаров (наименование товара, стоимость), с указанием его
суммарного задекларированного количества в июне 2011 года.
selectTovar_name, tovar_cost, sum(kolvo) from
table1,table2(Table1.kod_tovara=Table2.kod_tovara) and (Declaration_Data
between "01.06.2011" and "30.06.2011")by Tovar_name,
tovar_cost
Рисунок 5.6 - результат выполнения шестого запроса
Выдать список сотрудников (ФИО, образование), с указанием наименования
задекларированного товара, суммарной стоимости задекларированного товара.
selectFiO_sotrudnika, Obrazovanie,Tovar_name,Tovar_cost,
sum(tovar_cost) from table1,table2,table3(Table1.kod_tovara=Table2.kod_tovara)
and (table2.kod_sotrudnika=Table3.kod_sotrudnika)by FiO_sotrudnika,
Obrazovanie,Tovar_name,Tovar_cost
Рисунок 5.7 - результат выполнения седьмого запроса
Выдать список сотрудников (ФИО, адрес, телефон, образование, должность),
у которых не указан год рождения.
Select
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnostitable3,table4(table3.kod_dolzhnosti=table4.kod_dolzhnosti)
and (Birthyear is null)
Рисунок 5.8 - результат выполнения восьмого запроса
6. Отчеты
.1 Простой отчёт
.2 Отчет по запросу
.3 Отчет с группировкой
Заключение
Управление базой данных - это комплекс программных средств,
предназначенных для создания структуры новой базы, наполнения её содержимым,
редактирование содержимого и визуализации информации. Под визуализацией
информации базы данных понимается отбор отображаемых данных в соответствии с
заданным критерием, их упорядочение, оформление и последующая выдача на
устройства ввода или передача по каналам связи.
В курсовой работе рассматривается создание приложения баз данных в среде
Delphi в соответствии с заданной прикладной областью. Были изучены следующие
теоретические вопросы, относящиеся к созданию приложений БД в среде Delphi:
утилита DatabaseDesktop, понятие и состояние набора данных, компонент
TDBNavigator, компонент TDBGrid, компонент TQuery, оператор Select, агрегатные
функции.
В среде Delphi 7 было создано приложение БД, реализующее следующие
функции: просмотр, корректировку, удаление и дополнение записей БД; просмотр
данных в таблице и окнах редактирования; вычисление значения вычисляемого поля;
отбор записей из БД по условиям запросов на языке SQL; поиск данных и отбор записей из БД, а также
сортировка данных по основному и дополнительному индексах. Основное меню и
продуманный интерфейс, которые включают в себя различные действия для работы с
базой данный, обеспечивают удобное взаимодействие пользователя с программой.
Список литературы
1.
Бобровский, С. И. Delphi7: учебный курс / С. И. Бобровский. - СПб.: Питер,
2008. - 736 с.
. Культин, Н.
Б. Основы программирования в Delphi7 / Н. Б. Культин. - СПб.: БХВ-Петербург,
2003. - 638 с.
. Стивенс, Р.
Delphi. Готовые алгоритмы / Р. Стивенс; пер. с англ. Мерещука П.А. - 2-е изд.
стер. - М.: ДМК Пресс; СПб.: Питер, 2004. - 384с.
. Сухарев, М.
В. Основы Delphi. Профессиональный подход / М. В. Сухарев. - СПб.: Наука и
техника, 2004. - 614 с.
. Фаронов, В.
В. Delphi 5. Учебный курс / В.В. Фаронов - М.: «Нолидж», 2000. - 608 с.
. Фаронов,
В.В. Программирование баз данных в Delphi 7. Учебный курс / В.В. Фаронов. -
СПб.: Питер, 2006. - 459 с.
. Шумаков, П.
В. Delphi3 и разработка приложений баз данных / П. В. Шумаков - М. : «Нолижд»,
1998. - 704 с.
ПРИЛОЖЕНИЯ
Приложение А. Реализация функций
базы данных
Рис А.1 - Выбор таблицы
Рис. А.2 - Просмотр таблицы данных
Рис. А.3 - Добавление данных в таблицу
приложение база фильтрация запрос
Рис. А.4 - Таблица с добавленными данными
Рис. А.5 - Вставка данных в таблицу
Рис. А.6 - Изменение данных в таблице
Рис. А.7 - Таблица с измененными данными
Рис. А.8 - Таблица после удаления записи
Рис. А.9 - Выбор данных для поиска
Рис. А.10 - Таблица для поиска данных
Рис. А.11 - Результат поиска данных
Рис. А.12 - Фильтрация данных
Рис. А.13 - Результат выполнения фильтрации
Рис. А.14 - Выбор пункта меню запросы
Рис. А.15 - Выбор запроса
Рис. А.16 - Выбор отчета для просмотра
Рис. А.17 - Отображение таблицы с вычисляемым полем
Рис. А.18 - Выбор данных для сортировки
Рис.А.19 - Результат сортировки
Приложение Б. Текст программы
unit Unit1;
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables, Menus, ExtCtrls,
DBCtrls,, Buttons, Mask, RpRave, RpDefine, RpCon, RpConDS;
TForm1 = class(TForm)
Table1: TTable;
Table2: TTable;
Table3: TTable;
Table4: TTable;
DataSource1: TDataSource;
DataSource2: TDataSource;
DataSource3: TDataSource;
DataSource4: TDataSource;
Table1Kod_tovara: TSmallintField;
Table1Tovar_name: TStringField;
Table1Tovar_cost: TIntegerField;
Table1Poshlina: TSmallintField;
Table2Declaration_number: TSmallintField;
Table2Kod_tovara: TSmallintField;
Table2Kolvo: TFloatField;
Table2Declaration_Data: TDateField;
Table2FIO_grazhdanina: TStringField;
Table2Kod_sotrudnika: TSmallintField;
Table4Kod_dolzhnosti: TSmallintField;
Table4Naimen_dolzhnosti: TStringField;
Table3Kod_sotrudnika: TSmallintField;
Table3Kod_dolzhnosti: TSmallintField;
Table3FiO_sotrudnika: TStringField;
Table3Adress_sotrudnika: TStringField;
Table3Telefon: TStringField;
Table3Birthyear: TIntegerField;
Table3Obrazovanie: TStringField;
PopupMenu1: TPopupMenu;
N11: TMenuItem;
N21: TMenuItem;
N31: TMenuItem;
N41: TMenuItem;
DBNavigator1: TDBNavigator;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
MainMenu1: TMainMenu;
Table1Poshlina2: TSmallintField;
Label1: TLabel;
Edit1: TEdit;
BitBtn4: TBitBtn;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
BitBtn5: TBitBtn;
N6: TMenuItem;
N12: TMenuItem;
N22: TMenuItem;
N32: TMenuItem;
N42: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
N20101: TMenuItem;
N20111: TMenuItem;
N16: TMenuItem;
Query1: TQuery;
DBGrid1: TDBGrid;
DataSource5: TDataSource;
BitBtn6: TBitBtn;
N17: TMenuItem;
N18: TMenuItem;
N23: TMenuItem;
N33: TMenuItem;
N43: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N24: TMenuItem;
N25: TMenuItem;
N26: TMenuItem;
N27: TMenuItem;
N28: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N34: TMenuItem;
C1: TMenuItem;
N35: TMenuItem;
N36: TMenuItem;
N37: TMenuItem;
N38: TMenuItem;
N39: TMenuItem;
N40: TMenuItem;
N44: TMenuItem;
N45: TMenuItem;
N46: TMenuItem;
N47: TMenuItem;
RVConnect1: TRvDataSetConnection;
RvProject1: TRvProject;
N48: TMenuItem;(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);N11Click(Sender:
TObject);N21Click(Sender: TObject);N31Click(Sender: TObject);N41Click(Sender:
TObject);BitBtn1Click(Sender: TObject);BitBtn2Click(Sender:
TObject);BitBtn3Click(Sender: TObject);Table1CalcFields(DataSet:
TDataSet);BitBtn4Click(Sender: TObject);N5Click(Sender:
TObject);N10Click(Sender: TObject);N14Click(Sender: TObject);N15Click(Sender:
TObject);N13Click(Sender: TObject);BitBtn6Click(Sender:
TObject);N19Click(Sender: TObject);N20Click(Sender: TObject);N24Click(Sender:
TObject);N25Click(Sender: TObject);N26Click(Sender: TObject);N27Click(Sender:
TObject);N28Click(Sender: TObject);N29Click(Sender: TObject);N30Click(Sender:
TObject);N34Click(Sender: TObject);N35Click(Sender: TObject);N36Click(Sender:
TObject);N37Click(Sender: TObject);N38Click(Sender: TObject);N39Click(Sender:
TObject);N20101Click(Sender: TObject);N20111Click(Sender:
TObject);N16Click(Sender: TObject);N40Click(Sender: TObject);N45Click(Sender:
TObject);N47Click(Sender: TObject);N46Click(Sender: TObject);
{ Private declarations }
{ Public declarations };
Form1: TForm1;Unit2, Unit3, Unit4, Unit5, Unit6, Unit7;
{$R *.dfm}TForm1.FormMouseDown(Sender: TObject; Button:
TMouseButton;
Shift: TShiftState; X, Y: Integer);P:TPoint;:=GetClientOrigin;Button=mbRight
then PopupMenu1.Popup(P.X+x,P.y+y);;TForm1.N11Click(Sender:
TObject);.IndexFieldNames:='';.IndexFieldNames:='';.Label1.Tag:=0;.DataSource:=DataSource1;.Active:=true;.DataSource:=DataSource1;;TForm1.N21Click(Sender:
TObject);.IndexFieldNames:='';.IndexFieldNames:='';.Label1.Tag:=0;.Filtered:=false;.DataSource:=DataSource2;.Active:=true;.DataSource:=DataSource2;;TForm1.N31Click(Sender:
TObject);.IndexFieldNames:='';.IndexFieldNames:='';.Label1.Tag:=0;.Filtered:=false;.DataSource:=DataSource3;.Active:=true;.DataSource:=DataSource3;;TForm1.N41Click(Sender:
TObject);.IndexFieldNames:='';.IndexFieldNames:='';.Label1.Tag:=0;.Filtered:=false;.DataSource:=DataSource4;.Active:=true;.DataSource:=DataSource4;;TForm1.BitBtn1Click(Sender:
TObject);.Tag:=0;.NaimenEdit.Clear;.CostEdit.Clear;.PoshlinaEdit.Clear;.DataEdit.Clear;.FIOEdit.Clear;.KodTEdit.Clear;.KodSEdit.Clear;.NDEdit.Clear;.EducEdit.Clear;.AdressEdit.Clear;.FiOEdit.Clear;.KodSEdit.Clear;.KodDEdit.Clear;.TelefonEdit.Clear;.BirthyearEdit.Clear;.KodDEdit.Clear;.NaimenEdit.Clear;.OkladEdit.Clear;DBGrid1.Datasource=DataSource1
then.Append;.show;;DBGrid1.Datasource=DataSource2
then.Append;.show;;DBGrid1.Datasource=DataSource3
then.Append;.show;;DBGrid1.Datasource=DataSource4 then.Append;.show;;;TForm1.BitBtn2Click(Sender:
TObject);.Tag:=1;DBGrid1.Datasource=DataSource1
then.KodTEdit.Text:=inttostr(Form1.Table1.FieldByName('Kod_tovara').Value);.NaimenEdit.Text:=Form1.Table1.FieldByName('Tovar_name').Value;.CostEdit.Text:=inttostr(Form1.Table1.FieldByName('Tovar_cost').Value);.PoshlinaEdit.Text:=inttostr(Form1.Table1.FieldByName('Poshlina').Value);.Show;;DBGrid1.Datasource=DataSource2
then.DataEdit.Text:=datetostr(Form1.Table2.FieldByName('Declaration_Data').Value);.FiOEdit.Text:=Form1.Table2.FieldByName('FIO_grazhdanina').Value;.KodSEdit.Text:=inttostr(Form1.Table2.FieldByName('Kod_sotrudnika').Value);.KodTEdit.Text:=inttostr(Form1.Table2.FieldByName('Kod_tovara').Value);.KolEdit.Text:=inttostr(Form1.Table2.FieldByName('Kolvo').Value);.NDEdit.Text:=inttostr(Form1.Table2.FieldByName('Declaration_number').Value);.Show;;DBGrid1.Datasource=DataSource3
then
begin.EducEdit.Text:=Form1.Table3.FieldByName('Obrazovanie').Value;.AdressEdit.Text:=Form1.Table3.FieldByName('Adress_sotrudnika').Value;.FiOEdit.Text:=Form1.Table3.FieldByName('FiO_sotrudnika').Value;.KodSEdit.Text:=inttostr(Form1.Table3.FieldByName('Kod_sotrudnika').Value);.KodDEdit.Text:=inttostr(Form1.Table3.FieldByName('Kod_dolzhnosti').Value);.TelefonEdit.Text:=Form1.Table3.FieldByName('Telefon').Value;.BirthyearEdit.Text:=inttostr(Form1.Table3.FieldByName('Birthyear').Value);.Show;;DBGrid1.Datasource=DataSource4
then
begin.KodDEdit.Text:=inttostr(Form1.Table4.FieldByName('Kod_dolzhnosti').Value);.NaimenEdit.Text:=Form1.Table4.FieldByName('Naimen_dolzhnosti').Value;.OkladEdit.Text:=inttostr(Form1.Table4.FieldByName('Oklad').Value);.Show;;;TForm1.BitBtn3Click(Sender:
TObject);DBGrid1.Datasource=DataSource1
then.Delete;;DBGrid1.Datasource=DataSource2 then.Delete;;DBGrid1.Datasource=DataSource3
then.Delete;;DBGrid1.Datasource=DataSource4
then.Delete;;;TForm1.Table1CalcFields(DataSet:
TDataSet);.FieldByName('Poshlina%').Value:=
(Table1.FieldByName('Poshlina').Value/.FieldByName('Tovar_cost').Value)*100;
;TForm1.BitBtn4Click(Sender: TObject);:longint;.DataSource:=DataSource1;:=0;.First;Table1
donot eof do
begin:=Cost+Table1.FieldByName('Tovar_cost').Value;;;.Text:=inttostr(Cost);;TForm1.N5Click(Sender:
TObject);.Close;;TForm1.N10Click(Sender:
TObject);.Edit1.Clear;.Label1.Caption:='№ декларации:';.Show;.BitBtn1.Tag:=1;;TForm1.N14Click(Sender:
TObject);.Edit1.Clear;.Label1.Caption:='Названиедолжности:';.Show;.BitBtn1.Tag:=3;;TForm1.N15Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('Select
count(distinct(Kod_sotrudnika))');.Query1.SQL.Add('From Table2 where
Declaration_Data between "01.01.2016" and
"31.12.2016"');.Query1.Active:=true;.DBGrid1.DataSource:=Form1.DataSource5;;TForm1.N20101Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('Select FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti,sum(kolvo)');.Query1.SQL.Add('from
table2,table3,table4');.Query1.SQL.Add('where
(table2.kod_sotrudnika=table3.kod_sotrudnika) and
(table3.kod_dolzhnosti=table4.kod_dolzhnosti) and (Declaration_Data between
"01.01.2010" and "31.12.2010")');.Query1.Sql.Add('group by
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti');.Query1.Active:=true;.DBGrid1.DataSource:=Form1.DataSource5;;TForm1.N16Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('Select
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti');.Query1.SQL.Add('from
table3,table4');.Query1.SQL.Add('where
(table3.kod_dolzhnosti=table4.kod_dolzhnosti) and (Birthyear is
null)');.Query1.Active:=true;.DBGrid1.DataSource:=Form1.DataSource5;;TForm1.N13Click(Sender:
TObject);.Edit1.Clear;.Label1.Caption:='Наименованиетовара:';.Show;.BitBtn1.Tag:=2;;TForm1.BitBtn6Click(Sender:
TObject);.Tag:=0;.NaimenEdit.Clear;.CostEdit.Clear;.PoshlinaEdit.Clear;.DataEdit.Clear;.FIOEdit.Clear;.KodTEdit.Clear;.KodSEdit.Clear;.NDEdit.Clear;.EducEdit.Clear;.AdressEdit.Clear;.FiOEdit.Clear;.KodSEdit.Clear;.KodDEdit.Clear;.TelefonEdit.Clear;.BirthyearEdit.Clear;.KodDEdit.Clear;.NaimenEdit.Clear;.OkladEdit.Clear;DBGrid1.Datasource=DataSource1
then.Insert;.show;;DBGrid1.Datasource=DataSource2
then.Insert;.show;;DBGrid1.Datasource=DataSource3
then.Insert;.show;;DBGrid1.Datasource=DataSource4
then.Insert;.show;;;TForm1.N19Click(Sender: TObject);Form1.DBGrid1.DataSource<>Form1.DataSource1
then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Tovar_name';.Label1.Tag:=1;.Show;;TForm1.N20Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource1 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Tovar_cost';.Label1.Tag:=1;.Show;;TForm1.N24Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource2 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Kod_tovara';.Label1.Tag:=2;.Show;;TForm1.N25Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource2 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Kolvo';.Label1.Tag:=2;.Show;;TForm1.N26Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource2 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Declaration_Data';.Label1.Tag:=2;.Show;;TForm1.N27Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource3 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Kod_dolzhnosti';.Label1.Tag:=3;.Show;;TForm1.N28Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource3 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='FiO_sotrudnika';.Label1.Tag:=3;.Show;;TForm1.N29Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource3 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Birthyear';.Label1.Tag:=3;.Show;;TForm1.N30Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource3 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Adress_sotrudnika';.Label1.Tag:=3;.Show;;TForm1.N34Click(Sender:
TObject);Form1.DBGrid1.DataSource<>Form1.DataSource4 then
begin('Невыбрананужнаятаблица!');;;.Label1.Caption:='Oklad';.Label1.Tag:=4;.Show;;TForm1.N35Click(Sender:
TObject);.Click;.IndexFieldNames:='';;TForm1.N36Click(Sender:
TObject);.Click;.IndexName:='DNumber';;TForm1.N37Click(Sender: TObject);.Click;.IndexName:='IKolvo';;TForm1.N38Click(Sender:
TObject);.Click;.Active:=false;.Exclusive:=true;.AddIndex('KodS','Kod_sotrudnika',[ixCaseInsensitive,ixDescending],'');.Exclusive:=false;.Active:=true;.IndexName:='KodS';;TForm1.N39Click(Sender:
TObject);.Click;.Active:=false;.Exclusive:=true;.AddIndex('IKodD','Kod_dolzhnosti',[ixDescending]);.Exclusive:=false;.Active:=true;.IndexName:='IKodD';;TForm1.N20111Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('select Tovar_name, tovar_cost,
sum(kolvo) from table1,table2');.Query1.SQL.Add('where
(Table1.kod_tovara=Table2.kod_tovara) and (Declaration_Data between
"01.06.2011" and "30.06.2011")');.Query1.SQL.Add('group by
Tovar_name, tovar_cost');.Query1.Active:=true;.DBGrid1.DataSource:=DataSource5;;TForm1.N40Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('select
FiO_sotrudnika, Obrazovanie,Tovar_name,Tovar_cost, sum(tovar_cost) from
table1,table2,table3');.Query1.SQL.Add('where (Table1.kod_tovara=Table2.kod_tovara)
and (table2.kod_sotrudnika=Table3.kod_sotrudnika)');.Query1.SQL.Add('group by
FiO_sotrudnika,
Obrazovanie,Tovar_name,Tovar_cost');.Query1.Active:=true;.DBGrid1.DataSource:=DataSource5;;TForm1.N45Click(Sender:
TObject);.RvProject1.Close;.RVConnect1.DataSet:=Form1.Table1;.RVProject1.ProjectFile:=ExtractFilePath(Application.Exename)+'Ot1.rav';.RVProject1.Execute;;TForm1.N47Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('select
FiO_sotrudnika, Obrazovanie,Tovar_name,Tovar_cost, sum(tovar_cost) from
table1,table2,table3');.Query1.SQL.Add('where
(Table1.kod_tovara=Table2.kod_tovara) and
(table2.kod_sotrudnika=Table3.kod_sotrudnika)');.Query1.SQL.Add('group by
FiO_sotrudnika, Obrazovanie,Tovar_name,Tovar_cost');.Query1.Active:=true;.RvProject1.Close;.DataSet:=Query1;.RVProject1.ProjectFile:=ExtractFilePath(Application.Exename)+'GroupOt.rav';.RVProject1.Execute;;TForm1.N46Click(Sender:
TObject);.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('Select
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti');.Query1.SQL.Add('from
table3,table4');.Query1.SQL.Add('where
(table3.kod_dolzhnosti=table4.kod_dolzhnosti) and (Birthyear is
null)');.Query1.Active:=true;.RvProject1.Close;.DataSet:=Query1;.RVProject1.ProjectFile:=ExtractFilePath(Application.Exename)+'Ot2.rav';.RVProject1.Execute;;.
Рис. Б.1 - Основная форма
unit Unit2;
interface
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons;
TForm2 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;: TEdit;: TEdit;: TEdit;
SaveBtn1: TBitBtn;
Label4: TLabel;: TEdit;SaveBtn1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };
Form2: TForm2;Unit1;
{$R *.dfm}TForm2.SaveBtn1Click(Sender:
TObject);Form1.BitBtn2.Tag=1 then Form1.Table1.Edit;.Text<>'' then
Form1.Table1.FieldByName('Kod_tovara').Value:=strtoint(KodTEdit.Text);.Table1.FieldByName('Tovar_name').Value:=NaimenEdit.Text;.Table1.FieldByName('Tovar_cost').Value:=strtoint(CostEdit.Text);.Table1.FieldByName('Poshlina').Value:=strtoint(PoshlinaEdit.Text);.Table1.Post;.Close;;
end.
Рис. Б.2 - Форма для добавления или изменения данных в первой таблице
unit Unit3;
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons;
TForm3 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;:
TEdit;
SaveBtn2: TBitBtn;SaveBtn2Click(Sender: TObject);
{ Privatedeclarations }
{ Public declarations };
Form3: TForm3;Unit1, Unit2;
{$R *.dfm}TForm3.SaveBtn2Click(Sender:
TObject);Form1.BitBtn2.Tag=1 then
Form1.Table2.Edit;.Table2.FieldByName('Declaration_Data').Value:=strtodate(Form3.DataEdit.Text);.Table2.FieldByName('FIO_grazhdanina').Value:=Form3.FiOEdit.Text;.Table2.FieldByName('Kod_sotrudnika').Value:=strtoint(Form3.KodSEdit.Text);.Table2.FieldByName('Kod_tovara').Value:=strtoint(Form3.KodTEdit.Text);.Table2.FieldByName('Kolvo').Value:=strtoint(Form3.KolEdit.Text);.Table2.FieldByName('Declaration_number').Value:=strtoint(Form3.NDEdit.Text);.Table2.Post;.Close;;.
Рис. Б.3 - Форма для добавления или изменения данных вовторой таблице
unit Unit4;
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons;
TForm4 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;:
TEdit;: TEdit;
SaveBtn3: TBitBtn;SaveBtn3Click(Sender: TObject);
{ Private declarations }
{ Public declarations };
Form4: TForm4;Unit1, Unit3;
{$R *.dfm}TForm4.SaveBtn3Click(Sender:
TObject);Form1.BitBtn2.Tag=1 then Form1.Table3.Edit;.Table3.FieldByName('Obrazovanie').Value:=Form4.EducEdit.Text;.Table3.FieldByName('Adress_sotrudnika').Value:=Form4.AdressEdit.Text;.Table3.FieldByName('FiO_sotrudnika').Value:=Form4.FiOEdit.Text;.Table3.FieldByName('Kod_sotrudnika').Value:=strtoint(Form4.KodSEdit.Text);.Table3.FieldByName('Kod_dolzhnosti').Value:=strtoint(Form4.KodDEdit.Text);.Table3.FieldByName('Telefon').Value:=Form4.TelefonEdit.Text;.Table3.FieldByName('Birthyear').Value:=strtoint(Form4.BirthyearEdit.Text);.Table3.Post;.Close;;.
Рис. Б.4 - Форма для добавления или изменения данных в третьей таблице
unit Unit5;
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, Buttons;
TForm5 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;: TEdit;: TEdit;: TEdit;
SaveBtn4: TBitBtn;SaveBtn4Click(Sender: TObject);
{ Private declarations }
{ Public declarations };
Form5: TForm5;Unit1, Unit4;
{$R *.dfm}TForm5.SaveBtn4Click(Sender: TObject);Form1.BitBtn2.Tag=1
then
Form1.Table4.Edit;.Table4.FieldByName('Kod_dolzhnosti').Value:=strtoint(KodDEdit.Text);.Table4.FieldByName('Naimen_dolzhnosti').Value:=NaimenEdit.Text;.Table4.FieldByName('Oklad').Value:=strtoint(OkladEdit.Text);.Table4.Post;.Close;;.
Рис. Б.5 - Форма для добавления или изменения данных в четвёртой таблице
unit Unit7;,Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
TForm7 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
CheckBox1: TCheckBox;
BitBtn1: TBitBtn;BitBtn1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };
Form7: TForm7;Unit1;
{$R *.dfm}TForm7.BitBtn1Click(Sender:
TObject);CheckBox1.Checked then beginLabel1.Tag of
: begin.Table1.Filtered :=
false;.Table1.Filter:=Label1.Caption+'='+#39+Edit1.Text+#39;.Table1.Filtered:=true;;
: begin.Table2.Filtered :=
false;.Table2.Filter:=Label1.Caption+'='+#39+Edit1.Text+#39;.Table2.Filtered:=true;;
: begin.Table3.Filtered := false;.Table3.Filter:=Label1.Caption+'='+#39+Edit1.Text+#39;.Table3.Filtered:=true;;
: begin.Table4.Filtered :=
false;.Table4.Filter:=Label1.Caption+'='+#39+Edit1.Text+#39;.Table4.Filtered:=true;;;
//end case blockbegin.Table1.Filtered:=false;.Table1.Filter:='';.Table2.Filter:='';.Table3.Filter:='';.Table4.Filter:='';;(Form7.Label1.Tag=1)
and(Form1.Table1.Locate(Label1.Caption,Edit1.Text,[]))
then('Записьненайдена');(Form7.Label1.Tag=2)
and(Form1.Table2.Locate(Label1.Caption,Edit1.Text,[]))
then('Записьненайдена');(Form7.Label1.Tag=3)
and(Form1.Table3.Locate(Label1.Caption,Edit1.Text,[]))
then('Записьненайдена');(Form7.Label1.Tag=4)
and(Form1.Table4.Locate(Label1.Caption,Edit1.Text,[]))
then('Записьненайдена');.Close;;.
Рис. Б.6 - Форма для поиска и фильтрации
unit Unit6;
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons;
TForm6 = class(TForm)
Edit1: TEdit;
BitBtn1: TBitBtn;
Label1: TLabel;BitBtn1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };
Form6: TForm6;Unit1;
{$R *.dfm}TForm6.BitBtn1Click(Sender:
TObject);Form6.BitBtn1.Tag=1 then
begin.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('SELECT
Table3.FiO_sotrudnika, Table3.Adress_sotrudnika, Table3.Telefon,
Table3.Birthyear');.Query1.SQL.Add('FROM "Table2.DB"
Table2');.Query1.SQL.Add('INNER JOIN "Table3.db"
Table3');.Query1.SQL.Add('ON (Table2.Kod_sotrudnika =
Table3.Kod_sotrudnika)');.Query1.SQL.Add('WHERE Table2.Declaration_number=:Par');.Query1.ParamByName('Par').AsInteger:=strtoint(Form6.Edit1.Text);.Query1.Active:=true;.Close;.DBGrid1.DataSource:=Form1.DataSource5;;Form6.BitBtn1.Tag=3
then begin.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('Select
count(Table3.Kod_dolzhnosti), Oklad');.Query1.SQL.Add('From Table3,
Table4');.Query1.SQL.Add('where (Table3.Kod_dolzhnosti=Table4.Kod_dolzhnosti)
and (Naimen_dolzhnosti=:Par)');.Query1.SQL.Add('group by
Oklad');.Query1.ParamByName('Par').AsString:=Form6.Edit1.Text;.Query1.Active:=true;.Close;.DBGrid1.DataSource:=Form1.DataSource5;;Form6.BitBtn1.Tag=2
then begin.Query1.Close;.Query1.SQL.Clear;.Query1.SQL.Add('Select
FiO_sotrudnika,Adress_sotrudnika,Telefon,Obrazovanie,Naimen_dolzhnosti');.Query1.SQL.Add('From
Table1,Table2,Table3,Table4');.Query1.SQL.Add('where (Tovar_name=:Par) and
(Table1.Kod_tovara=Table2.Kod_tovara) and
(Table2.Kod_sotrudnika=Table3.Kod_sotrudnika) and
(Table3.Kod_dolzhnosti=Table4.Kod_dolzhnosti)');.Query1.ParamByName('Par').AsString:=Form6.Edit1.Text;.Query1.Active:=true;.Close;.DBGrid1.DataSource:=Form1.DataSource5;;
end;
end.
Рис. Б.7 - Форма для работы с динамическими запросами