
- •I. Программирование на языке Pascal в среде Delphi
- •1. Векторы
- •2. Матрицы
- •3.Строки
- •II. Разработка бд-приложений в среде Delphi для субд Paradox
- •III. Задание для самостоятельной работы
- •«Видеопрокат»
- •1. Создайте таблицы
- •5. Запросы
- •2. «Отдел уголовного розыска»
- •1. Создайте таблицы
- •5. Запросы
- •3. «Поп-звезды»
- •1. Создайте таблицы
- •5. Запросы
- •4. «Прокат автомобилей»
- •1. Создайте таблицы
- •5. Запросы
- •5. «Продажа газет и журналов»
- •Создайте таблицы
- •5. Запросы
- •6. «Аукцион драгоценностей»
- •1. Создайте таблицы
- •5. Запросы
- •7. «Пункт обмена валюты»
- •Создайте таблицы
- •5. Запросы
- •8. «Автозаправочные станции»
- •1. Создайте таблицы
- •5. Запросы
Задания для зачета по дисциплине «Языки и методы программирования», 3 курс, 1 семестр
I. Программирование на языке Pascal в среде Delphi
1. Векторы
1. Даны два вектора х[1..7] и у[1..7] координат 7 точек на плоскости. Найти среди них точку, наиболее близко расположенную к началу координат.
2. Числовой массив А[1..5] упорядочен по возрастанию. Известно, что число х меньше наибольшего элемента массива и больше наименьшего. Определить номер к, для которого A[k-1]<x<A[k].
3. Дан вещественный вектор у[1..7] и вещественное х. Определить, какое утверждение справедливо "х - больше всех элементов вектора у" или "х - меньше всех элементов вектора у" или "min y[1..7] <=x<=max y[1..7]"
4. Дан целочисленный вектор D[1..7]. Напечатать все его элементы, которые не имеют в нем себе равных.
2. Матрицы
1. Дана матрица вещественных чисел М[1..5,1..4]. Сосчитать сколько в ней строк, не содержащих нулевых элементов.
2. Дана матрица C[1..5,1..8]. Построить по ней вектор А[1..5] такой, что A[i] = 0, если элементы i -ой строки матрицы образуют возрастающую последовательность и A[i] = 1 в противном случае.
3. Дана матрица. Подсчитать в ней количество столбцов, составленных из попарно различных чисел.
4. Многочлен степени n задан массивом своих коэффициентов. Найти значение многочлена и его производной в точке х.
3.Строки
1. Написать функцию, которая для заданной строки символов и заданного символа подсчитывает количество вхождений этого символа в строку: function n_char ( s: string; a: char): integer.
2. Написать процедуру, которая из заданной строки символов удаляет все вхождения заданного символа: procedure del_char ( var s: string; a: char).
3.Написать процедуру, которая заменяет в заданной строке все повторные вхождения каждого символа пробелом: procedure ch_char ( var s: string; a: char).
4. Написать функцию, которая вычисляет значение выражения, заданного в строке. Предполагается, что выражение имеет вид "число1+число2*число3".
5. Написать процедуру, которая для натурального числа формирует строку символов, являющуюся представлением этого числа в двоичной системе счисления: procedure dec_bin ( n: integer; var s: string).
6. Написать процедуру, которая для натурального числа формирует строку символов, являющуюся представлением этого числа в восьмеричной системе счисления: procedure dec_oct( n: integer; var s: string).
II. Разработка бд-приложений в среде Delphi для субд Paradox
Лабораторная работа 1
В каталоге учебных программ создайте подкаталог со своей фамилией.
Создайте Alias (псевдоним) базы данных, указывающий на созданный подкаталог. В дальнейшем в среде Delphi Вы будете обращаться к таблицам вашей базы данных только через Alias.
Для этого выберите в меню строчку Программы/Delphi/BDE Administrator. Выберите закладку Databases. Раскройте каталог Databases в окне. Выполните команду Object/New и подтвердите выбор драйвера Standard. Замените стандартный псевдоним Standard1 на uch_db. В правом окне выберите путь к созданному подкаталогу. Выполните команду Object/Apply, а затем Object/Exit.
Запомните имя псевдонима – uch_db!
В Вашем подкаталоге создайте таблицу Product.db, в которой регистрируются продажи товаров в магазине. Таблица имеет следующие поля:
Наименование поля |
Тип |
Примечание, поясняющее назначение поля |
Name_Product |
A15 |
Наименование товара – тип текстовый (А), не более 15 символов |
Date_Sell |
D |
Дата продажи – тип дата (D) |
Price |
$ |
Цена за единицу – денежный тип ($) |
Amount |
N |
Количество проданного – тип вещественный (N) |
Таблицы создаются в специальном средстве Database Desktop. Database Desktop запускается из среды Delphi по команде Tools/Database Desktop. Загрузите среду Delphi. Загрузите Database Desktop. Выполните команду File/New/Table. Подтвердите выбор типа таблицы Paradox7. Для задания структуры таблицы введите имена и типы полей. Тип выбирается из списка после щелчка правой кнопкой мыши или нажатия пробела в столбце типов.
После ввода структуры таблицы нажмите кнопку SaveAs, выберите свой подкаталог и нажмите кнопку Сохранить. Закройте Database Desktop по команде File/Exit.
Сохраните новый проект, состоящий из одной формы: модуль под именем One_table, проект под именем: Pr_one.
В проекте Pr_one разработайте форму, которая позволяет просматривать и редактировать таблицу Product.db.
Для этого выполните следующие действия:
5.1. Поставьте в верхнем левом углу формы компонент Table. Компонент Table обеспечивает связь с физической таблицей БД. Эту связь обеспечивают значения двух свойств компонента: DatabaseName (указание псевдонима, определяющего каталог БД) и TableName (имя конкретной таблицы). Выберите из списка нужные значения свойств. Задайте значение Тrue свойству Active для открытия связи с физической таблицей. Обратите внимание на значение свойства Name компонента (Table1 – имя компонента по умолчанию).
5.2. Поставьте на форму компонент DataSource. Компонент DataSource связывает компонент Table (а, значит, и физическую таблицу БД) с визуальным компонентом, обеспечивающим просмотр и редактирование данных таблицы пользователем. Компонент DataSource связывается с нужным компонентом Table по его имени через значение свойства DataSet. Выберите нужное значение для свойства из списка. Обратите внимание на значение свойства Name компонента (DataSource1 – компонента имя по умолчанию).
5.3. В центре формы поставьте визуальный компонент DBGrid. Компонент DBgrid связывается с компонентом DataSource (а, значит, с компонентом Table и с физической таблицей БД) через значение своего свойства DataSource и служит для визуального отображения данных физической таблицы БД. Выберите нужное значение для свойства из списка. Обратите внимание на значение свойства Name компонента (DBGrid1 – имя компонента по умолчанию).
Располагать невизуальные компоненты можно в любом месте формы, рекомендуется только, чтобы они располагались рядом!
Запустите проект. Введите в таблицу 5 различных записей. Удалите третью запись. Измените значения всех полей второй записи.
Отказаться от изменений и выйти из режима редактирования можно по клавише Esc. Удалить текущую запись можно, нажав одновременно клавиши Ctrl и Del.
Перейдите в режим разработки. Измените названия столбцов в отображении таблицы соответственно на: Товар, Дата продажи, Цена, Количество. Запустите проект.
Для этого:
7.1. Щелкните дважды по компоненте DBGrid - появится окно для редактирования столбцов визуального отображения таблицы.
7.2. По правому щелчку мыши появится короткое меню, в котором следует выбрать строчку Add All Fields – в окне отобразятся все существующие поля. По умолчанию названия полей совпадают с именами полей таблицы.
7.3. Щелкните по первому полю Name_Product и измените в Инспекторе Объектов значение свойства Title/Caption на Наименование.
7.4. Аналогичные действия произведите с остальными названиями столбцов.
Поставьте на форму визуальный компонент Навигатор (DBNavigator на странице Data Controls) и свяжите его с таблицей Product.db. Проверьте работу всех кнопок Навигатора.
Для свойства DataSource Навигатора выберите из списка имя источника данных, связанных с таблицей Product.db, - DataSource1.
Сделайте невидимыми все кнопки Навигатора, кроме кнопок перехода.
Воспользуйтесь свойством VisibleButton компонента.
Поставьте на форму кнопку с наименованием «Поиск товара». При нажатии этой кнопки должно выводиться сообщение «Товар найден!», если в таблице есть запись с наименованием товара «молоко», а в противном случае - сообщение «Товара нет!».
Для поиска записи в таблице можно использовать обращение к стандартному методу класса TTable Locate:
function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean;
При поиске по значению одного поля параметры имеют следующие значения:
KeyFields – строковая константа, представляющая имя поля;
KeyValues – значение искомого поля;
Пустое значение последнего параметра Options предполагает полное совпадение (без учета регистров).
Если нужная запись найдена, она становиться текущей и функция возвращает значение Тrue, в противном случае функция возвращает значение False.
В тексте программы этот метод вызывается оператором Table1.Locate(<параметры>), где Table1 – имя компонента Table, связанного с таблицей БД, в которой происходит поиск.
Например, для определения наличия товара с наименованием ‘молоко’ в соответствующей таблице необходимо использовать следующий программный код:
//В поле таблицы БД, связанной с компонентом Table1, ищется первая
//запись, которая в поле Name_Product содержит значение ‘молоко’
if Table1.Locate(‘Name_Product’,’молоко’, []) then
// Искомая запись найдена, она становится текущей
Showmessage(‘Товар найден!’)
else
// Искомая запись не найдена, текущая запись не изменяется
Showmessage(‘Товар не найден!’);
Для уточнения возможностей функции Locate воспользуйтесь справкой для метода TBDEDataSet.Locate.
Измените программный код, вызываемый по нажатию кнопки «Поиск товара» так, чтобы наименование искомого товара вводилось пользователем.
Для ввода значений с клавиатуры можно использовать обращение к стандартой функции InputBox:
function InputBox(const ACaption, APrompt, ADefault: string): string;
Строки ACaption и APrompt используются для заголовков окна. Функция возвращает вводимое пользователем значение (при нажатии им кнопки OK) или значение константы ADefault (при нажатии пользователем кнопки Cancel).
Например, res:=InputBox('Поиск товара', 'Товар', ''). Переменная res получает значение введенной пользователем строки (при нажатии им кнопки OK) или значение пустой строки (при нажатии пользователем кнопки Cancel).
Поставьте кнопку с заголовком «Установить фильтр», по которой можно установить фильтр на цену: будут высвечиваться только продажи, цены которых не меньше значения 100.
Для события OnClick кнопки ввести следующий программный код:
Table1.Filter:= 'Price>=100’;
Table1.Filtered:=true
Поставьте кнопку с заголовком «Отменить фильтр», по которой установленный фильтр на цену отменяется.
Для события OnClick кнопки ввести следующий программный код:
Table1.Filtered:=false
Измените программный код, вызываемый по нажатию кнопки «Установить фильтр» так, чтобы цена вводилась пользователем с клавиатуры.
Замените соответствующую строчку программного кода на:
Table1.Filter:='Price>='+InputBox('Фильтр на цену товара','Товар', '');
Сохраните проект.
Лабораторная работа 2. Переход по записям таблицы. Вычисляемые поля.
Откройте проект Pr_one.
Измените метод, вызываемый по кнопке «Поиск товара» так, чтобы при нахождении товара в окне сообщения отображалось значение поля Цена найденной записи.
Для доступа к значениям полей текущей записи таблицы необходимо дважды щелкнуть по компоненту Table, представляющему таблицу, в появившемся окне нажать правую кнопку мыши и выбрать команду Add All Fields. После этого для доступа к значениям полей таблицы можно использовать свойство Value класса TField: <Имя компонента TTable><Имя поля>.Value. Тип возвращаемого значения соответствует типу поля таблицы - тип Variant.
Например, для вывода в окне сообщения значения цены товара из текущей записи достаточно вызвать процедуру:
ShowMessage(‘Цена товара: ’+CurrToStr(Table1Price.Value));
3. Измените метод, вызываемый по кнопке «Поиск товара» так, чтобы при нахождении товара в окне сообщения отображались значения следующих полей найденной записи: наименование, дата продажи, цена, количество, общая сумма выручки от продажи.
Для вывода значений полей различного типа помощью процедуры ShowMessage необходимо преобразовать их в строковые значения. Для преобразования значений различных типов к строковому типу используются следующие функции: IntToStr, FloatToStr, CurrToStr, DateToStr. Уточнить алгоритмы работы этих функций можно с помощью справки.
4. Поставьте кнопку «Сумма выручки», по которой на метке высвечивается сумма общей выручки.
Для последовательного просмотра записей таблицы Table1 от первой до последней используется следующий алгоритм:
s:=0;
//Переход к началу таблицы
Table1.First;
//Последовательный просмотр записей таблицы
while not Table1. eof do
begin
//Вычисление значений по полям текущей записи таблицы
s:=s+Table1Price.Value*Table1Amount.Value;
//Переход к очередной записи таблицы
Table1.Next
end;
Измените расчет по кнопке «Сумма выручки» так, чтобы вычислялась выручка за определенный вводимый интервал пользователем интервал дат.
Для ввода начальной и конечной дат интервала два раза воспользуйтесь функцией InputBox.
Поставьте кнопку «Лучшая продажа», по которой на метке высвечивается продажа (наименование товара, дата, цена, количество, общая сумма) с наибольшей общей суммой по все таблице.
Воспользуйтесь алгоритмом нахождения наибольшего значения в векторе и программным кодом, который выполняется при нажатии кнопки «Сумма выручки».
Измените расчет по кнопке «Лучшая продажа» так, чтобы вычислялась продажа с наибольшей выручкой только за определенный вводимый пользователем интервал дат.
Для ввода начальной и конечной дат интервала два раза воспользуйтесь функцией InputBox.
Поставьте кнопку «Увеличить стоимость», по которой цена всех товаров с введенным наименованием увеличивается на 10%.
Для изменения значений в таблице необходимо перевести ее в режим редактирования (с помощью метода Edit). Для подтверждения изменений и выхода из режима редактирования необходимо вызвать метод Post.
Например, для изменения значения поля Цена для текущей записи таблицы на 10%, необходимо выполнить следующие операторы:
Table1.Edit;
Table1Price.Value:= Table1Price.Value*1.1;
Table1.Post;
Подключите к проекту новую форму Form2 для отображения календаря.
Для этого:
9.1. Выполните команду File/New Form для создания новой формы (Form2).
9.2. Сохраните программный модуль формы по команде Save As под именем Calendar.
9.3. Присоедините модуль к проекту по команде Project/Add to project.
9.4. Поставьте на форму Form2 стандартный компонент MonthCalendar. Измените размер календаря, границы и используемые цвета.
9.5. Сохраните проект по команде Save All.
Поставьте на основную форму кнопку, по нажатию которой будет вызываться календарь.
Для вызова формы используется метод формы ShowModal, например, Form2.ShowModal. После этого активной становится вызванная форма, а вызывающая форма становится недоступной до тех пор, пока не будет закрыта вызванная форма. Такой вызов называется модальным.
Подключите по двойному щелчку выбор значения поля Дата продажи из календаря.
Для этого на форме Form1 для объекта DBGrid1 для метода OnDblClick вставьте следующий программный код:
//Если щелчок на поле типа Date таблицы
if TDBGrid(Sender).SelectedField.DataType = ftDate then
// Sender – это объект (в данном случае сетка DBgrid), который является
// источником сообщений.
// TDBGrid(Sender).SelectedField – это текущее поле (класс TField) сетки
//(DBgrid), которая является источником сообщений.
// DataType – это свойство класса TField, определяющее тип поля.
begin
// Вызвать форму с календарем
Form2.ShowModal;
//Перейти для таблицы в режим редактирования
Table1.Edit;
//Занести в поле даты текущей записи выбранную дату из календаря
Table1Date_Sell.Value:=Form2.MonthCalendar1.Date;
// Выйти из режима редактирования
Table1.Post;
end;
Сохраните проект по команде Save All.
12.-Добавьте к календарю две кнопки c заголовками OK и Cancel (типа TBitBtn). По кнопке OK текущая дата из календаря должна переноситься в таблицу, а по кнопке Cancel – нет.
Модальную форму можно закрыть программно, если присвоить свойству ModalResult формы определенные значения, например, mrOk или mrCancel (системные константы).
Для этого:
12.1. Поставьте на Form2 кнопку класса TВitBtn со страницы Additional c заголовком OK и для ее метода, вызываемого по щелчку, введите код: ModalResult:=mrOk.
12.2. Поставьте на Form2 кнопку класса TВitBtn со страницы Additional c заголовком Cancel и для ее метода, вызываемого по щелчку, введите код: ModalResult:=mrCancel.
12.3. Измените программный код при вызове календаря на:
if Form2.ShowModal=mrOk then…
Запустите проект.
13. Реализуйте аналогичные функции кнопок OK и Cancel без программного кода.
Для этого достаточно установить свойство ModalResult кнопок: OK как mrOk, Cancel как mrCancel. Это значение передается свойству формы ModalResult и вызывает закрытие формы. После этого программный код, вызываемый при нажатии кнопок, можно удалить.
14. Создайте вычисляемое поле, определяющее для каждой продажи общую сумму выручки.
Применение вычисляемых полей (Сalculated Fields) позволяет использовать значения в полях физической таблицы для вычисления значений различных выражений (в зависимости от типов полей) и их визуального представления в сетке таблицы. Вычисляемое поле перевычисляется при вводе новых значений в поля записи, по значениям которых определяется значение вычисляемого поля.
Для установки вычисляемого поля необходимо:
14.1. Дважды щелкнуть по компоненту TTable соответствующей таблицы.
14.2. Нажать правую кнопку мыши на появившемся окне таблицы и выбрать команду New Field.
14.3. Ввести наименование вычисляемого поля Sum в окне Field properties/Name.
14.4. Выбрать тип поля Currency в окне Field properties/Type.
14.5. Выбрать значение Calculated в окне Field type и нажать кнопку OK.
14.6. Вставить в событие визуального компонета Table OnСalcFields следующий программный код:
Table1Sum.Value:=Table1Price.Value*Table1Amount.Value;
14.7. Для отображения вычисляемого поля в сетке необходимо: щелкнуть дважды по сетке (DBGrid), в появившемся окне нажать правую кнопку мыши и выбрать команду Add. Затем для нового столбца выбрать в Инспекторе Объектов поле Sum и ввести название столбца «Сумма продажи».
14.8. Увеличить размер DBGrid1 для отображения нового поля.
Перейдите в режим выполнения. Введите различные значения для проверки работы созданного вычисляемого поля.
15. Сохраните проект.
Лабораторная работа 3. Связанные таблицы. Мультиформы.
1. В Вашем подкаталоге создайте таблицу Students.db, в которой содержится информация о студентах математического факультета РГПУ им.А.И.Герцена. Таблица имеет следующие поля:
-
Наименование поля
Тип
Примечание, поясняющее назначение поля
Id_Stud
S*
Код студента
Name
A60
Фамилия, имя, отчество
Course
S
Курс
Group
S
Номер группы
Date_birth
D
Дата рождения
Adress
A255
Адрес проживания
Каждая запись таблицы содержит информацию об одном студенте. Поля, помеченные знаком «*», называются ключевыми. Ключевые поля используются для реализации связей между таблицами БД. Ключевые поля таблицы БД не могут иметь одинаковых значений! Ключ, формируемый указанным образом, называется еще первичным ключом.
2. Создайте таблицу Subjects.db, в которой содержатся изучаемые дисциплины. Таблица имеет следующие поля:
-
Наименование поля
Тип
Примечание, поясняющее назначение поля
Id_Subj
S*
Код дисциплины
Name
A60
Наименование дисциплины
3. Создайте таблицу Marks.db, в которой содержится информация об итогах сдачи студентами сессии. Таблица имеет следующие поля:
-
Наименование поля
Тип
Примечание, поясняющее назначение поля
Id_Stud
S*
Код студента
Date_Sem
D*
Дата завершения сессии
Id_Subj
S*
Код дисциплины (из справочника дисциплин)
Mark
S
Оценка
Date_Exam
D
Дата сдачи экзамена
В данном случае используется составной первичный ключ, т.е. ключ, состоящий из нескольких записей. Поле Id_Stud должно быть ключевым для обеспечения связи с таблицей Students.db. Ключевые поля Date_Sem и Id_Subj позволяют в таблице Marks.db хранить информацию об успеваемости студентов в нескольких семестрах по нескольким дисциплинам. В СУБД Paradox ключевые поля могут быть заданы, начиная с первого поля.
4. Создайте новый проект, сохраните его под именем Multi_Pr, а форму под именем Main.
5. Создайте на форме меню из трех пунктов: «Дисциплины», «Студенты», «Выход».
Для этого поставьте на форму компонент MainMenu со страницы Standard и щелкните по нему дважды. В появившемся окне введите для первого пункта меню в свойство Caption значение Дисциплины, нажмите Enter и т.д. Закройте окно. Запустите проект, щелкните последовательно по каждому пункту меню. Перейдите в режим разработки.
6. Измените работу проекта таким образом, чтобы при нажатии на пункт меню выводилось сообщение с наименованием пункта.
Вставьте соответствующий программный код в метод, вызываемый по событию OnClick.
7. Создайте новую форму для отображения таблицы Subjects.db, вызываемую при нажатии на пункт меню «Дисциплины».
Для этого:
7.1. Выполните команду File/New Form для создания новой формы (Form2).
7.2. Сохраните программный модуль формы по команде Save As под именем Subj.
7.3. Присоедините модуль к проекту по команде Project/Add to project.
7.4. Измените метод, вызываемый по событию OnClick пункта меню «Дисциплины» на Form2.ShowModal.
8. Разработайте форму (Form2), которая позволяет просматривать и редактировать таблицу Subjects.db.
Для этого выполните следующие действия:
8.1. Поставьте компонент Table. Выберите из списка нужные значения двух свойств компонента: DatabaseName (указание псевдонима, определяющего каталог БД) и TableName (имя конкретной таблицы). Выберите из списка нужные значения свойств. Задайте значение Тrue свойству Active для открытия связи с физической таблицей. Задайте свойству Name значение taSubj.
8.2. Поставьте на форму компонент DataSource. Выберите нужное значение для свойства DataSet из списка. Задайте свойству Name значение dsSubj.
8.3. В центре формы поставьте визуальный компонент DBGrid. Выберите нужное значение для свойства DataSource из списка.
9. Запустите проект. Введите в таблицу дисциплин 5 записей с кодами от 1 до 5. Попробуйте ввести одинаковые коды.
При попытке повторного ввода одного и того же кода появится сообщение об ошибке «Key violation», и ввод записи не будет разрешен. Для отказа от внесения изменений необходимо нажать клавишу Esc.
10. Перейдите в режим разработки. Измените названия столбцов в отображении таблицы соответственно на Код и Наименование дисциплины. Запустите проект.
Для этого щелкните дважды по компоненту DBGrid - появится окно для редактирования столбцов визуального отображения таблицы. По правому щелчку мыши из короткого меню выберите строчку Add All Fields. Воспользуйтесь свойством Title/Caption для изменения наименований столбцов.
11. Добавьте на форму Form2 Навигатор для работы с таблицей дисциплин.
Для свойства DataSource Навигатора выберите из списка имя источника данных, связанного с таблицей Subjects.db - dsSubj. Запустите проект.
12. Создайте новую форму Form3 для работы с таблицей Students.db, вызываемую при нажатии на пункт меню «Студенты».
Для этого создайте новую форму, сохраните программный модуль формы под именем Stud, присоедините модуль к проекту. Измените метод, вызываемый по событию OnClick пункта меню «Студенты», на Form3.ShowModal. Сохраните изменения.
13. Поставьте на форму Form3 компоненты Table, DataSource, DBNavigator, которые позволяют просматривать и редактировать таблицу Students.db. Задайте необходимые значения свойствам. Дайте компонентам названия taStud и dsStud.
14. Поставьте на верхнюю часть формы компоненты DBEdit со страницы для просмотра записей таблицы в виде «карточки» и соедините их с нужными полями таблицы.
Для каждого компонента задайте нужное значение свойству DataSource и выберите из списка поле таблицы. Перед каждым компонентом DBEdit поставьте метку, поясняющую назначение поля. Например, код, ФИО и т.д.
15. Запустите проект. Введите 5 записей в таблицу Students.db с кодами от 1 до 5 соответственно.
16. Добавьте на форму Form3 компоненты Table, DataSource для просмотра и редактирования таблицы Marks.db. Задайте необходимые значения свойствам. Дайте компонентам названия taMarks и dsMarks. Добавьте компонент DBGrid и измените наименования столбцов.
17. Свяжите таблицу taStud с таблицей taMarks связью один-ко-многим.
Связь один-ко-многим (one-to-many) подразумевает, что каждой записи главной таблицы (Мaster Тable) может соответствовать несколько записей подчиненной таблицы (Detailed Тable). Связь устанавливается по значениям ключевых полей. Например, в данном случае по значению поля Id_Stud. Такая таблица позволяет для текущей записи главной таблицы отображать только связанные с ней записи подчиненной таблицы, что обеспечивает удобный интерфейс пользователя.
Для реализации этой связи необходимо:
17.1. Для компонента taMarks выбрать для свойства MasterSource значение dsStud для обеспечения связи с таблицей taStud.
17.2. Ключевые поля, по которым осуществляется связь, задаются в свойстве MasterFields. При щелчке по этому свойству появляется окно с указанием всех полей двух таблиц. Необходимо в левом и правом окне щелкнуть по полю Id_Stud, нажать кнопку Add и затем Ok.
18. Запустите проект. Введите по 2-3 записи с оценками каждому студенту.
Обратите внимание, что значение поля Id_Stud в таблице taMarks не надо редактировать. Значение в этом поле появляется автоматически и совпадает со значением ключевого поля связанной записи. Начинайте заполнение записи в таблице taMarks с поля Date_Sem.
19. Удалите запись из таблицы taStud.
Обратите внимание, что при удалении записи из таблицы taStud удаляются связанные записи из таблицы taMarks. Таким образом, обеспечивается целостность информации в связанных таблицах БД.
20. Перейдите в режим разработки и удалите столбец в таблице taMarks с наименованием Код студента.
Для этого щелкните дважды по компоненту DBGrid, выделите в появившемся окне поле Id_Stud, нажмите правую кнопку мыши и выберите команду Delete. Удаление столбца не ведет к удалению поля из таблицы! При необходимости его можно опять добавить к визуальному отображению.
Запустите проект.
21. Организуйте переключение навигатора на активную таблицу.
Для этого в метод, вызываемый по событию OnEnter для DBGrid, вставьте код DBNavigator1.DataSource:=dsMarks. В метод, вызываемый по событию OnEnter для компонента DBEdit, связанного с полем Id_Stud, вставьте код:
DBNavigator1.DataSource:=dsStud.
Событие OnEnter происходит, когда связанный с ним визуальный компонент становиться активным.
22. Добавьте в таблицу taMarks связанное поле (Lookup Field), с помощью которого можно при редактировании выбирать из справочника дисциплин нужную дисциплину по ее наименованию.
Связанное (Lookup) поле используется для визуального отображения в одной таблице значения поля какого-либо поля другой таблицы. Для этого должны быть определены правила, по которым каждой записи исходной (отображаемой или обрабатываемой) таблицы ставится в соответствие одна запись другой таблицы (обычно эти таблицы называются справочными). Такая связь называется один-к-одному (one-to-one).
Для создания требуемого Lookup поля необходимо:
22.1. Добавить на форму компонент Table с именем taSubj, представляющий таблицу Subjects.db.
22.2. Щелкнуть дважды по компоненту taMarks, нажать правую кнопку мыши и в появившемся коротком меню выбрать команду New Field.
22.3. В появившемся окне New Field задать значения следующих реквизитов:
Field properties/Name – имя нового поля, Name_Subj;
Field properties/Type – тип нового поля, String;
Field properties/Size – наибольшая длина строки, 20;
Field type – выбрать значение Lookup;
Lookup Definition/Key Fields – выбрать из списка полей таблицы taMarks поле Id_Subj (данное поле используется для связи с таблицей- справочником);
Lookup Definition/DataSet – выбрать из списка таблицу taSubj (компонент Table, представляющий таблицу-справочник).
Lookup Definition/Lookup Keys – выбрать из списка полей таблицы taSubj поле Id_Subj (данное поле используется для связи с исходной таблицей: связываются записи, в которых значения выбранных полей исходной таблицы и таблицы-справочника совпадают).
Lookup Definition/Result Field – выбрать из списка полей таблицы taSubj поле Name (значение данного поля должно совпадать со значением указанного поля исходной таблицы).
Новое поле не появляется в физической таблице БД, а только в компоненте, ее представляющем! Это поле можно удалить без изменения информации в физической таблице БД. Связь осуществляется только по значению поля Id_Subj.
23. Добавьте в DBGrid новый столбец для представления поля Name_Subj. Измените соответствующим образом название нового столбца. Запустите проект. Введите новые записи в таблицу Marks.db, пользуясь выбором из справочника нужной дисциплины.
Запустите проект, выберите новые дисциплины из справочника по наименованию. Добавьте новые записи.
Обратите внимание, что значение поля Id_Subj формируется автоматически из таблицы-справочника.
24. Удалите из DBGrid столбец для представления поля Id_Subj.
25. Создайте новую форму-календарь и подключите вызов календаря по двойному щелчку по полям Date_Sem и Date_Exam.
Воспользуйтесь указаниями к предыдущей лабораторной работе.
26. Реализуйте закрытие приложения по пункту меню «Выход».
Для этого вставьте следующий программный код в метод, вызываемый по нажатию данного пункта меню:
if MessageDlg('Закончить работу с программой?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then Close;
Функция MessageDlg в данном случае возвращает значение Тrue, если нажата кнопка OК, и значение False в противном случае. Подробности использования этой функции могут быть получены по встроенной помощи.
Сохраните проект.
Лабораторная работа 4
Создайте базу данных и таблицу, содержащую следующие поля:
- город
- дата
- средняя температура за день (С)
- среднее давление (мм. рт. ст.)
- среднее количество осадков (мм.)
2. В новом проекте разместите на новой форме визуальный компонент DBGrid и подсоедините к нему созданную таблицу. Дата вводится с помощью календаря.
3. Добавьте на форму элемент навигации (DBNavigator).
4. Разместите на форме 3 кнопки, которые будут выполнять следующие функции:
- фильтр конкретного города (выводятся все данные по данному городу);
- фильтр по температуре (выводятся все данные при температуре больше заданной);
- фильтр, возвращающий все данные для заданной даты.
Создайте кнопку, при помощи которой подсчитывается средняя температура для указанного города.
Создайте кнопку для вывода максимального давления по всей таблице.
Создайте кнопку, возвращающую общее количество осадков за указанную дату.
Создайте вычисляемое поле, которое зависит от температуры соответствующей записи. При температуре выше +20 градусов поле должно принимать значение «Тепло», при значении температуры от +5 до +20 «средне», при значении от -10 до +5 «прохладно» и при температуре от -10 и ниже «холодно».
Лабораторная работа 5
Пусть даны БД, представляющие информацию о книгах, хранящихся в библиотеке, представляют следующие таблицы: Authers (информация об авторах), Books (информация о книгах), Publ (информация об издательствах), Country (справочник стран), TypeBook (справочник направлений литературных произведений, например, поэзия, проза, критика и т.д.).
Структура таблиц следующая.
Authers
Наименование поля |
Тип |
Примечание |
Id |
S* |
Код автора |
Fio |
A 60 |
Фамилия, имя, отчество автора |
Date_Birth |
D |
Дата рождения |
Date_Dearth |
D |
Дата смерти |
Id_Country |
S |
Код страны проживания |
Books
Наименование поля |
Тип |
Примечание |
Id_Aut |
S* |
Код автора |
Id |
S* |
Код книги |
Name |
A 255 |
Название книги |
Id_Publ |
S |
Код издательства |
Id_Type |
S |
Код литературного направления |
Year_Publ |
S |
Год издания |
Pages_Book |
S |
Кол-во страниц |
Number |
S |
Тираж |
Publ
Наименование поля |
Тип |
Примечание |
Id |
S* |
Код издательства |
Name |
A 60 |
Название издательства |
Id_Country |
S |
Код страны |
Country
Наименование поля |
Тип |
Примечание |
Id |
S* |
Код страны |
Name |
A 60 |
Название страны |
TypeBook
Наименование поля |
Тип |
Примечание |
Id |
S* |
Код типа произведения |
Name |
A 60 |
Название типа |
Разработайте следующие запросы.
Список всех авторов по алфавиту, книги которых имеются в библиотеке.
Список всех авторов по алфавиту, книги которых имеются в библиотеке с указанием количества книг.
Список всех авторов по алфавиту, у которых книги выходили в заданном издательстве.
Список всех книг, опубликованных в заданном году с указанием автора и издательства, упорядоченный по наименованию издательства, затем по фамилии автора и наименованию книги
Все книги данного автора, опубликованные после указанного года
Максимальный тираж по издательствам в заданном году
Суммарный тираж в страницах за заданный год заданного издательства
Все книги французских авторов, изданных заданным издательством
Поэтические сборники английских авторов, изданных в заданном году
Самый молодой поэт, произведения которого опубликованы заданным издательством