Лабораторные работы по базам данных в Delphi

Лабораторные работы по базам данных в Delphi

Лабораторная работа № 1

Цель работы:

Ознакомить с утилитой Database Desktop.

Усвоить процесс создания и редактирования таблиц с помощью Database Desktop. 

Database Desktop - это утилита, которая поставляется вместе с Delphi для интерактивной работы с таблицами различных форматов локальных баз данных - Paradox и dBase, а также SQL-серверных баз данных InterBase, Oracle, Informix, Sybase (с использованием SQL Links). Исполняемый файл утилиты называется DBD32.EXE. Для запуска Database Desktop просто дважды щелкните по ее иконке.

Запуск Database Desktop:

Запустить Delphi

В меню Delphi выбрать раздел Tools 

В появившемся списке выбрать строку Database Desktop

Щелкнуть по кнопке Пуск 

Из главного меню выбрать строку Программы 

В появившемся списке выбрать строку Delphi 7

В следующем списке выбрать строку Database Desktop

После запуска Database Desktop на экране появится окно: 



Создание таблиц в Database Desktop:

Запускаем программу Database Desktop;

В появившемся окне выбираем: File►New►Table. 



Формат таблицы выбираем Paradox.  После этого появится окно создания таблицы, в котором можно определить поля таблицы и их тип:



По умолчанию сразу после открытия окна в правой его части в списке Table properties выбран пункт Validity Chekcs, что позволяет контролировать содержимое полей. С помощью флажка Required Fields можно потребовать обязательного заполнения поля при вводе новой записи. Также можно контролировать минимальное и максимальное значение числового поля в строках Minimum Value и Maximum Value. В строке Default Value можно указать значение поля по умолчанию – при вводе новой записи значение в это поле поместит BDE.С помощью строки Picture можно задать шаблон для автоматического форматирования значения поля. Например, если задан шаблон (###)###-#### и в поле введена строка 9054005647, она будет автоматически преобразована к виду (905)400-5647. 

Кнопки предназначены для:

Borrow… – осуществляет копирование структуры таблицы из другой таблицы  

Save as… – сохраняет изменения в структуре таблицы

Cancel – выход без сохранения

Help – вызов справки

Чтобы определить структуру таблицы в этом окне необходимо заполнить следующие графы:

Field Name - Имя поля. 

Type - Тип поля. Вызывает список допустимых типов, щелчком правой кнопки мыши или клавишей пробел.

Size - Размер. Определяет размер поля. Не все типы полей имеют размер. Большинство типов имеют стандартный размер, который не может быть изменен. Размер в основном меняется у строковых типов (Alpha), бинарных (Binary) и др.

Key - Ключ. Двойной щелчок мышью определяет ключевое поле. Ключевыми могут быть только первые поля, то есть второе поле сможет быть ключевым только вместе с первым.

Типы полей формата Paradox

Alpha

строка длиной 1-255 байт, содержащая любые печатаемые символы

Number

числовое поле длиной 8 байт, значение которого может быть положительным и отрицательным. Диапазон чисел - от 10-308 до 10308 с 15 значащими цифрами

$ (Money)

числовое поле, значение которого может быть положительным и отрицательным. По умолчанию, является форматированным для отображения десятичной точки и денежного знака

Short

числовое поле длиной 2 байта, которое может содержать только целые числа в диапазоне от -32768 до 32767

Long Integer

числовое поле длиной 4 байта, которое может содержать целые числа в диапазоне от -2147483648 до 2147483648

# (BCD)

числовое поле, содержащее данные в формате BCD (Binary Coded Decimal). Скорость вычислений немного меньше, чем в других числовых форматах, однако точность - гораздо выше. Может иметь 0-32 цифр после десятичной точки

Date

поле даты длиной 4 байта, которое может содержать дату от 1 января 9999 г. до нашей эры - до 31 декабря 9999 г. нашей эры. Корректно обрабатывает високосные года и имеет встроенный механизм проверки правильности даты 

Time

поле времени длиной 4 байта, содержит время в миллисекундах от полуночи и ограничено 24 часами

@ (Timestamp)

обобщенное поле даты длиной 8 байт - содержит и дату и время

Memo

поле для хранения символов, суммарная длина которых более 255 байт. Может иметь любую длину. При этом размер, указываемый при создании таблицы, означает количество символов, сохраняемых в таблице (1-240) - остальные символы сохраняются в отдельном файле с расширением .MB

Formatted Memo

поле, аналогичное Memo, с добавлением возможности задавать шрифт текста. Также может иметь любую длину. При этом размер, указываемый при создании таблицы, означает количество символов, сохраняемых в таблице (0-240) - остальные символы сохраняются в отдельном файле с расширением .MB. Однако, Delphi в стандартной поставке не обладает возможностью работать с полями типа Formatted Memo

Graphic

поле, содержащее графическую информацию. Может иметь любую длину. Смысл размера - такой же, как и в Formatted Memo. Database Desktop “умеет” создавать поля типа Graphic, однако наполнять их можно только в приложении

OLE

поле, содержащее OLE-данные (Object Linking and Embedding) - образы, звук, видео, документы - которые для своей обработки вызывают создавшее их приложение. Может иметь любую длину. Смысл размера - такой же, как и в Formatted Memo. Database Desktop “умеет” создавать поля типа OLE, однако наполнять их можно только в приложении. Delphi “напрямую” не умеет работать с OLE-полями, но это легко обходится путем использования потоков

Logical

поле длиной 1 байт, которое может содержать только два значения - T (true, истина) или F (false, ложь). Допускаются строчные и прописные буквы

+ (Autoincrement)

поле длиной 4 байта, содержащее нередактируемое (read-only) значение типа long integer. Значение этого поля автоматически увеличивается (начиная с 1) с шагом 1 - это очень удобно для создания уникального идентификатора записи (физический номер записи не может служить ее идентификатором, поскольку в Парадоксе таковой отсутствует. В InterBase также отсутствуют физические номера записей, но отсутствует и поле Autoincrement. Его с успехом заменяет встроенная функция Gen_id, которую удобней всего применять в триггерах)

Binary

поле, содержащее любую двоичную информацию. Может иметь любую длину. При этом размер, указываемый при создании таблицы, означает количество символов, сохраняемых в таблице (0-240) - остальные символы сохраняются в отдельном файле с расширением .MB. Это полнейший аналог поля BLOb в InterBase

Bytes

строка цифр длиной 1-255 байт, содержащая любые данные

Создадим таблицу с данными о студентах. Укажем такие данные, как: ФИО, дата рождения, на основании какого приказа студент принят в университет, номер зачетки, специальность, курс, стипендия. Во всех текстовых полях, необходимо указать размер.



Созданную таблицу сохраняем под названием Student.db и закрываем окно создания таблиц. 

Иногда может понадобиться отредактировать уже созданную таблицу для того, чтобы добавить, изменить или удалить некоторые поля, изменить свойства таблицы. 

Редактирование таблицы:

	Определение вторичных индексов.

		Открыть таблицу Student.db (File►Open►Table) 

		Из меню Table выбрать пункт Restructure. Откроется окно редактирования полей таблицы. 

		В выпадающем списке Table properties выбрать Secondary Indexes и нажать кнопку Define. В окне Define Secondary Index определяются вторичные индексы: 

	

	С помощью флажков группы Index options можно определить следующие особенности индекса:

	Unique – индекс будет содержать уникальные значения;

	Maintained – индексные поля сортируются по возрастанию значений;

	Case sensitive – индекс чувствителен к регистру букв в текстовых полях;

	Descending – индексные поля сортируются по убыванию значения.

		Выбрать «SFio» из списка Fields и нажать кнопку с изображенной стрелкой вправо.  В списке Indexed fields (индексированные поля) появится «SFio». То же самое проделать с полями «SSpec» и «SKurs».

		Закрыть окно “Define Secondary Index”

		В появившемся окне ввести имя индекса  IDFio  и нажать "OK".    



Теперь, так как на факультете всего две специальности, то можно переопределить тип поля «SSpec». Для работы будет гораздо удобнее, чтоб это поле было типа Logical. 

Навести курсор на тип поля «SSpec» и написать тип поля «L».

Определим языковой драйвер. Это следует делать для правильного отображения русскоязычного текста. 

		Открыть окно редактирования полей таблицы Student.db.

		В выпадающем списке Table properties выбрать Table Language и нажать кнопку Modify. 

		В появившемся окне выбрать из списка Pdox ANSI Cyrillic.

		Сохранить таблицу.

Для логического типа значение по умолчанию зададим False.

Заполнение данными в таблице Student.db:

		Открыть таблицу (File ► Open ► Table)

		Выбрать Table ► Edit data или нажать клавишу F9. 

		Создать несколько записей.

Создание псевдонима:

Псевдоним указывает местонахождение файлов БД и представляет собой специальное имя для обозначения каталога. Использование псевдонимов существенно облегчает перенос файлов БД в другие каталоги и на другие компьютеры. При этом не требуется изменять приложение, которое осуществляет доступ к таблицам БД. Если в приложение местонахождения таблицы указано с помощью псевдонима, то после перемещения БД для обеспечения работоспособности приложения достаточно изменить путь, на который указывает псевдоним. Если же в приложение путь к БД указан в явном виде, то есть без псевдонима, то после перемещения БД нужно перемещать само приложение – вносить изменения в исходный код и заново его транслировать.         

Регистрация псевдонима: 

Воспользуемся приложением SQL Explorer, запускаемым командой Database►Explore. В левой части окна приводится список всех зарегистрированных в системе BDE баз данных, в правой – свойства текущей базы, выбранной в списке. 

Создадим псевдоним для базы данных. Для этого выполним команду Object►New и в диалоговом окне выбора драйвера укажем значение Standart.



После щелчка на кнопке ОК в списке появится новый элемент, помеченный зеленым треугольником. 



По умолчанию формируется имя базы данных Standard1, изменим его на Student. 

Убедимся, что в свойствах Default Driver (Драйвер по умолчанию) стоит значение Paradox. В свойстве Path укажем каталог, в котором хранится наши таблица.

Теперь зарегистрированную в системе BDE базу сохраним, выбрав для этого Apply в контекстном меню объекта Student. 

На вопрос о необходимости сохранения изменений нажать Yes. Теперь таблица доступны из среды BDE под именем Student.  

Закройте Sql  Explorer.

Лабораторная работа № 2

Цель работы:

		Изучить начальные этапы создания приложения для работы с базами данных в среде Delphi:

	ознакомить с компонентами доступа к БД: TTable, TDataSource;

	ознакомить с компонентами управления БД: TDBGrid, TDBNavigator.

		Усвоить ввод и редактирование текста.

Методика создания приложения для работы с базой данных ничем не отличается от методики создания обычной программы: к форме добавляются необходимые компоненты, устанавливаются значения свойств компонентов, разрабатываются необходимые процедуры обработки событий.

Приложение работы с базой данных должно содержать компоненты, обеспечивающие доступ к данным, возможность просмотра и редактирования содержимого полей. Компоненты доступа к данным находятся на вкладке Data Access и BDE палитры компонентов, а компоненты отображения данных — на вкладке Data Controls.

Основные компоненты доступа и управления к базам данных:

Компоненты доступа к базам данных:

TTable  - обеспечивает взаимодействие с таблицей БД, т.е. компонент TTable указывает, откуда брать данные и какие поля будут составлять набор данных.  Компонент TTable имеет следующие основные свойства:

			DatabaseName – база данных

			TableName - имя таблицы

			Active – активация таблицы (значение True активирует ее)

Свойство DatabaseName определяет базу данных, в которой находится таблица. Это свойство может содержать:

псевдоним (псевдоним)

путь для локальных БД

путь и имя файла базы данных для Local InterBase

локальный псевдоним, определенный через компонент TDatabase.

Свойство TableName определяет имя таблицы базы данных.

TDataSource  - определяет связь между базой данных и компонентами управления данными, то есть компонент TDataSource является промежуточным звеном между компонентом Table1, соединенным с реальной БД и визуальными компонентами DBGrid1 и DBNavigator1, с помощью которых пользователь взаимодействует с таблицей.  

В большинстве случаев, все, что нужно сделать с DataSource - это указать в свойстве DataSet  соответствующий TTable. Затем, у визуального компонента вроде DBGrid или DBNavigator в свойстве DataSource указывается TDataSource, который используется в настоящее время.

Компоненты управления данными с палитры Data Contorls:

TDBGrid  - отображает содержимое таблицы БД в виде сетки, в котором столбцы соответствуют полям, а строки записям таблицы.

Компонент имеет следующие свойства:

		Data Source – содержит ссылку на компонент типа TDataSource, служащий источником данных;

		Editor Mode – если содержит true, пользователь может редактировать ячейку после нажатия клавиши F2 или Enter. Игнорируется, если свойство Option включает значение goEditing или goAlwaysShowEditor;

		Option – определяет вид и поведение компонента;

			dgEditing – разрешает изменение набора данных;

			dgAlwaysShowEditor – автоматически переводит столбец в режим редактирования при его выделение;

			dgTitles – показывает заголовки столбцов;

			dgIndicator – показывает индикатор текущей строки в самом левом фиксированном столбце;

			dgColumnResize – разрешает пользователю вручную изменять ширину столбцов;

			dgColLines – показывает разделяющие вертикальные линии;

			dgRowLines – показывает разделяющие горизонтальные линии;

			dgTabs – разрешает переход от столбца к столбцу с помощью клавиши Tab;

			dgRowSelect – разрешает выделение цветом всей выбранной строки;

			dgAlwaysShowSelection – выделение текущей строки сохраняется, если компонент теряет фокус ввода;

			dgConfirmDelete – удаление строки должно подтверждаться;

			dgCancelOnExit – если пользователь вставил пустую строку и покинул ее, она не помещается в набор данных;

			dgMultiSelect – разрешает множественный выбор строк.

TDBNavigator  - осуществляет перемещение и редактирование записей (вид и назначение кнопок указаны в пункте DBNavigator). С помощью свойства DataSource компонент  связывается с нужным источником данных ТDataSource – это все, что необходимо для его нормальной работы. Свойство ConfirmDelete управляет отображением диалогового окна с просьбой подтвердить удаление записи (значение True этого свойства выводит окно).

Создание приложения:

	Запустить Delphi.

	В свойстве Caption изменить имя формы на Студенты.

	Установить на форму компоненту TTable. 

	Определить следующие свойства компоненты Table1.

		определить псевдоним - выбрать в свойстве DatabaseName инспектора объектов псевдоним «Student».  

		задать имя таблицы - выбрать в свойстве TableName таблицу Student.

		активизировать таблицу - установить в свойстве Active значение true (это будет возможно после выполнения пункта 4).

	Разместить на форму компоненту DataSource с  закладки Data Access и в свойстве DataSet инспектора объектов выбрать компоненту Table1. 

	Расположить на форме компоненту DBGrid с закладки Data Controls и в свойстве DataSource выбрать DataSource1.

Если вы внесли несколько записей, то форма Студенты примет вид:





Редактор полей:

Для управления отображением данных таблицы используют специальный редактор полей - Editor Field. 



Для вызова Editor Field следует: 

Дважды щелкнуть по Table1. 

Для открывшегося окна вызвать контекстное меню и выбрать пункт Add All Field, если необходимо добавить все поля таблицы. 

Add Field для выбора отдельного поля. 

Редактор полей имеет следующие свойства:

DisplayLabel – задает имя полю;

DisplayWidth – определяет количество символов, которое будет выводится в поле;



Определим свойства для полей таблицы Student.db.  

		Выбрать в окне редактора полей таблицы поле SFio и в свойстве DisplayLabel инспектора объектов изменить SFio на ФИО. Выбрать свойство DisplayWidth и заменить размер на 35. 

		Так же поменять свойства  других полей таблицы.

		Для полей логического типа в свойстве DisplayValues можно написать варианты для значений True и False. В поле SSpec в этом свойстве написать «Математика;Физика» (без пробела, разделяя «;»). Получиться как показано на рисунке.

		Если возникнет необходимость можно скрыть любое поле, выбрав его и в свойстве Visible инспектора объектов установив значение false. 

После выполненных действий сетка DBGrid1 будет выглядеть так:

	

Ввод данных:

Компоненты для организации доступа к таблицам БД позволяют выполнять всевозможные операции с наборами данных: добавлять или удалять записи, перемещаться по ним. При этом следует иметь в виду, что в любой момент времени доступна для выполнения конкретных действий только одна запись, называемая текущей. В этой лабораторной работе рассматриваются наиболее часто используемые методы компоненты Table.  

Основные методы для организации доступа компоненты Table:

Append – добавить новую запись в конец таблицы.

Delete – удалить текущую строку.

Edit – перейти в режим редактирования. После этого можно изменять значения полей.

Insert – вставить новую строку в таблицу.

Post – принять все изменения.

Refresh – обновить информацию о данных. 

UpdateRecord – обновить текущую запись.

Откроем созданное приложение.

Разместим на форме три компоненты SpeedButton из палитры Additional. Одна из кнопок будет добавлять запись, другая – изменять данные в записи, третья – удалять. Назовем их соответственно.



Создадим новую форму, которая будет вызываться нажатием кнопки «Добавить». На форме расположены 4 компоненты Edit, компонент DateTimePicker с закладки Win32, компонент CheckBox и компонент RadioGroup.

 

Текст процедуры для события OnClick кнопки «Добавить» на форме Студенты:

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

	Form2.ShowModal; //открывает форму «Добавление записи»

      end;	   

Текст процедуры для события OnClick кнопки «ОК» на форме Добавление записи:

procedure TForm2.Button1Click(Sender: TObject);

begin

     Form1.Table1.Insert;

     Form1.Table1.FieldByName('SFio').Text:=Edit1.Text;

     Form1.Table1.FieldByName('SOsn').Text:=Edit2.Text;

     Form1.Table1.FieldByName('SNom').Text:=Edit3.Text;

     Form1.Table1.FieldByName('SKurs').Text:=Edit4.Text;

     Form1.Table1.FieldByName('SData').AsDateTime:=DateTimePicker1.Date;

     if CheckBox1.Checked then

         Form1.Table1.FieldByName('SStip').Text:='да'

            else

               Form1.Table1.FieldByName('SStip').Text:='нет';

    		//при нажатии на флажок полю SStip (Стипендия) передается  

               //значение True, в противном случае вводится передается

                     //значение False

     case RadioGroup1.ItemIndex of

    0: Form1.Table1.FieldByName('SSpec').Text:='Математика';

    1: Form1.Table1.FieldByName('SSpec').Text:='Физика';

    end;

    if form1.Table1.Modified

        then form1.Table1.Post;

    close; 

	Комметарий: в строке Form1.Table1.Insert вызывается метод, который допускает вставку новой строки в таблицу, которая находится на форме «Студенты». Без вызова этого метода дальнейшая работа по вставке записи в таблицу невозможна. Запись Form1.Table1.FieldByName('SFio').Text:=Edit1.Text означает, что текст, который находится в Edit1 по нажатии кнопки будет перенесен в таблицу на форме «Студенты» в новую запись в текстовое поле ФИО. Остальные записи в процедуре работают аналогичным образом. Запись if form1.Table1.Modified then form1.Table1.Post сохраняет изменения в таблице. Close – закрывает форму «Добавление записи».

По нажатии кнопки Cancel осуществляется выход. То же и на форме «Редактирование записи».

Текст процедуры для события OnClick при нажатии клавиши «Удалить» на форме Студенты:

procedure TForm1.SpeedButton3Click(Sender: TObject);

begin

  	Table1.Delete		//удаляет текущую запись в таблице

     end;

Редактирование данных:

Компоненты, отражающие информацию, делятся на две категории – те, которые не связаны с таблицами БД, и компоненты, связанные с таблицами и обменивающиеся с ними информацией. В первую категорию входят обычные компоненты Delphi. Компоненты второй категории расположены на странице Data Controls. Почти каждая из них имеет аналог среди обычных компонент; основные отличия заключаются в том, что они могут работать с данными, хранящимися в БД. К этой группе относится компонента DBEdit, которая используется для ввода текстовой однострочной информации.         

Чтобы компонент DBEdit видел данные из поля таблицы, следует указать в свойствах: 

DataSource – источник данных;

DataField – поле для редактирования.

Этот компонент с заданными уже свойствами может появиться автоматически при перетаскивании имени поля из окна редактора полей. 

	Создадим новую форму: Редактирование записи.

 

	В случае перетаскивания поля логического типа, на форме автоматически устанавливается компонента DBCheckBox, что не всегда удобно. 

Установим на форму компоненту DBRadioGroup с закладки Data Control. 

В свойстве DataSource укажем DataSource1.

В свойстве DataField укажем SSpec.

	Текст процедуры для события OnClick при нажатии клавиши «Изменить» на форму Студенты:

begin

Form3.ShowModal //вызов Form3

end;

	Текст процедуры для события OnClick при нажатии клавиши «Сохранить» на форму Редактирование:

begin

if form1.Table1.Modified

 			 then form1.Table1.Post;        //все изменения в таблице сохраняются

close;

end;

	Пользователь имеет возможность редактировать записи в таблице напрямую. Чтобы это предотвратить используется свойство компоненты DBGrid dgEditing. Нужно выделить DBGrid1 и в свойстве Options► dgEditing инспектора объектов поставить false.

	Лабораторная работа № 3

Цели работы:

Ознакомиться с сортировкой записей в базе данных.

Поиск полей с помощью методов Locate и Lookup;

Сортировка:

Порядок расположения записей в таблице БД может быть неопределенным. По умолчанию записи не отсортированы или сортируются, например, для таблиц Paradox по ключевым полям, а для таблиц dBase в порядке их поступления в файл таблицы. 

С отсортированными записями набора данных работать более удобно. Сортировка заключается в упорядочивании записей по определенному полю в порядке возрастания или убывания содержащихся в нем записей. 

Сортировка набора данных TTable выполняется автоматически по текущему индексу. При смене индекса происходит переупорядочивание записей. Таким образом, возможна по полям, для которых создан индекс. Для сортировки по нескольким полям нужно создать индекс, включающий эти поля. 

Задать индекс, по которому выполняется сортировка записей, можно с помощью свойств:

IndexName – указывается имя индекса, установленное при его создании; 

IndexFieldName – указываются имена полей, образующий соответствующий индекс.

Откроем приложение.

Добавим на форму компоненты ComboBox и Button. 



В свойстве Items компоненты ComboBox запишем параметры сортировки: Фамилия, Специальность, Курс, Дата рождения, Номер зачетки.

Условия сортировки задаются вторичными индексами. То есть сортировка по фамилии происходит по вторичному ключу IDFio так как в него первым входит поле SFio. Для того, чтобы сортировка проходила по выбранным параметрам необходимо вхождение соответствующих полей  в разные вторичные ключи. 

Текст процедуры для события OnClick при нажатии кнопки «Сортировка» на форме Студенты:

begin

   Case ComboBox1.ItemIndex of

      0: Table1.IndexFieldNames:='SFio'; //при выборе строки «Фамилия»

			//сортировка идет по вторичному индексу IDFio

      1: Table1.IndexFieldNames:='SSpec';

      2: Table1.IndexFieldNames:='SKurs';

      3: Table1.IndexFieldNames:='SData';

      4: Table1.IndexFieldNames:='SNom';

   end;

end;

Замечание: во вторичный индекс IDFio входят поля: SFio, SKurs, SSpec. То есть при совпадении фамилии сортировка идет уже по курсу и т.д. 

Пример:



Поиск:

Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена, делает ее текущей. В этом случае в качестве результата возвращается значение True. Если запись не найдена, возвращается значение False и курсор не меняет своего положения.

function Locate (const KeyFields: String; const KeyValues: Variant;

         Options: TLocateOptions): Boolean; 

Список полей, по которым ведется поиск, задается в параметре KeyFields, поля разделяются точкой с запятой. Параметр KeyValues типа Variant указывает значение полей для поиска. Если поиск ведется по одному полю, то параметр содержит одно значение, соответствующие типу поля, заданного для поиска.

Параметр Options позволяет задать значение, которое обычно используется при поиске строк. Этот параметр принадлежит к множественному типу TLocateOptions и принимает комбинации следующих значений:

LoCaseInsensitive –регистр букв не учитывается;

LoPartialKey – допускается частичное совпадение.

На форму добавить компоненту  Edit. 



Текст процедуры для события OnChange компоненты Edit на форме Студенты:

begin

    table1.Locate('SFio',Edit1.Text,[loPartialKey]);

end;

Поиск записи по фамилии организован. Регистр букв не учитывается.

Метод Lookup находит запись, удовлетворяющую условию поиска, но не делает ее текущей, а возвращает значения некоторых ее полей. Независимо от результата поиска записи указатель текущей записи в НД не изменяется. В отличие от метода Locate, метод Lookup осуществляет поиск только на точное соответствие критерию поиска значения поля поиска записи. 

function Lookup (const KeyFields: String; const KeyValues: Variant;

         const ResultFields: String): Variant; 

В параметре ResultFields перечисляются поля, значения которых требуется получить в случае успешного поиска. Тип результата – Variant или вариантный массив. 

Добавить на главную форму новую кнопку «Поиск».

Открыть новую форму и ввести компоненты как показано на рисунке. Эта форма вызывается нажатием кнопки поиска на главной форме.



Поиск будет происходить по фамилии введенной в компоненте Edit1 после нажатия кнопки на форме «Поиск методом Lookup».

procedure TForm5.Button1Click(Sender: TObject);

var  LookupResult: Variant;

begin

LookupResult:=Form1.Table1.Lookup('SFio', Edit1.Text, 'SData; SOsn; SNom; SSpec; SKurs');	 //ищем поля  'Дата рождения'

//’Основание’, ’Номер зачетки’, ’Специальность’, ’Курс’

  		 if VarIsArray (LookupResult) then

  			 begin

   			 Edit2.Text:=LookupResult[0]; //записывает значения

    			Edit3.Text:=LookupResult[1]; // в искомых полях в

    			 Edit4.Text:=LookupResult[2]; //соответствующие

    			Edit5.Text:=LookupResult[3]; //компоненты

    			if Edit5.Text='False' then

       				Edit5.Text:='Физика'   //поиск полей логического типа

      					 else Edit5.Text:='Математика';

    			Edit6.Text:=LookupResult[4];

   			end;

end;

Лабораторная работа № 4

Цели:

Ознакомиться с фильтрацией записей.

Фильтрацию можно отнести к одному из методов поиска. Потому что фильтрация – выбор из набора данных только тех записей, которые удовлетворяют конкретным условиям. Например, можно указать отображение только записей, в которых поле «Фамилия» содержит значение «Иванов». Применение фильтра к набору данных определяется свойством Filtered логического типа. Значение True определяет применение в качестве фильтра выражения, указанного в свойстве Filter: 

Поле [Оператор сравнения] ‘Значение’

Например, если отобразить все записи, в которых поле «Фамилия» равно значению «Сидоров», то нужно указать:

Table1.Filter:=’Фамилия=’’Сидоров’’’;

Фильтрация записей:

Открыть приложение.

Добавить на форму компоненту TEdit.

Текст процедуры для события OnChange:

begin

   Table1.Filtered:=true;		//включение фильтрации 

   Table1.Filter:='SNom = ‘+Edit2.Text; 

//задает критерий фильтрации

end;



Этот способ фильтрации пригоден только для числовых полей.

При применении фильтра можно указать свойства:

foCaseInsensitive – нечувствительность к регистру букв;

foNoPartialCompare – поиск на точное соответствие.

Для фильтрации текстовых полей, например по полю «Фамилия» необходимо изменить текст процедуры.

procedure TForm1.Edit2Change(Sender: TObject);

begin

   Table1.Filtered:=true;

   Table1.Filter:='SFio='+#39+Edit2.Text+'*'+#39;

end;

В этом случае фильтрация проходит по текстовому полю. Знак «#39» означает знак апострофа, так как ввод фамилии при использовании фильтра происходит в апострофах. А символ «*» означает любые символы, то есть при вводе только одной буквы на экране появятся все фамилии начинающиеся на  букву.





Лабораторная работа № 5

Цели: 

Усвоить возможность связи таблицам.

Установка связи между таблицами:

Для демонстрации связи между таблицами необходимо создать  еще одну таблицу. Создайте таблицу успеваемости студентов. В нее войдут поля: учебный год, сессия (зима или лето), предмет, ФИО преподавателя, дата аттестации по предмету, дата сдачи, оценка. 

Эта таблица будет дочерней для таблицы Студенты. В таблице Успеваемость надо ввести дополнительно числовое поле и определить его вторичным ключом.

Разместите таблицу успеваемости на форме Студенты. 

В свойстве компоненты Table2 Master Source написать Data Source1. Это означает, что вторая таблица станет дочерней для первой.

Двойным щелчком по свойству Master Fields вызовем окно Field Link Designer (Дизайнер поля связи):



Выбрать в списке Available Index (Доступные индексы) из окна Field Link Designer индекс IDGod (это вторичный индекс второй таблицы). 

В левом списке Detail Field выделить IdU, а в правом списке Master Field (Основа) выделить Ind. 

Нажать на кнопку Add (Добавить) и закрыть окно.



Таким образом между таблицами установилась связь. Она называется связь один ко многим. 

К дочерней таблице добавить кнопки для ввода и редактирования данных также как и для таблицы Студенты.



Лабораторная работа № 6

Цели работы:

Ознакомиться с возможностью создания отчета.

Создание отчетов:

Отчет — это печатный документ, содержащий записи БД. В Delphi для создания отчетов служит генератор отчетов QuickReport, содержащий обширный набор компонентов. Компоненты, предназначенные для создания отчетов, находятся на закладке QReport палитры компонентов.

Главным элементом отчета является компонент-отчет QuickRep, представляющий собой   основу,    на   которой   размещаются   другие   компоненты.   Компонент QuickRep обычно размещается на отдельной форме, предназначенной для создания отчета.

Свойства компоненты QuickRep:

Bands – здесь указываются компоненты размещаемые в QuickRep.

DataSet – здесь указывается набор данных из которой отчет будет брать данные.

Frame – здесь указывается параметры рамки.

Options – здесь доступны три параметра. Если FirstPageHeader равно true, то заголовок печатается только на первой странице отчета. Если LastPageFooter равен true, то нижний колонтитул печатается только на последней странице отчета. Если установить свойство Compression в true, то отчет будет сохраняться в сжатом виде.

ReportTitle – здесь находится заголовок печатаемого документа.

SnapToGrid – нужно ли выравнивать компоненты по установленной сетке.

Zoom – масштаб отображения данных.

Настройку параметров отчета можно выполнить с помощью окна Report Settings, вызываемый двойным щелчком мыши по компоненте QuckRep. Предпочтительно пользоваться именно этим окном, так как здесь всегда можно просмотреть будущий результат. 



Открыть приложение «Студенты».

Добавить на главную форму кнопку «Создание отчета».

Создать новую форму «Отчет», которая будет вызываться нажатием на кнопку «Создание отчета».

На форму установить компоненту QuickRep с закладки QReport. Выделить этот компонент и в объектном инспекторе включить параметры HasTitle и HasDetail свойства Bands.



Расположим компоненты в секциях QuickRep1, которые будут отображать нужную информацию отчета. На закладке QReport палитры компонентов доступны следующие компоненты, которые можно расположить в этих разделах:

QRLabel – надпись. Этот компонент похож на стандартный компонент TLabel и просто отображает нужные данные.

QRDBText – данные. Этот компонент тоже похож на TLabel, только он предназначен для отображения значения какого либо поля из базы данных. 

QRSysData – системная информация. Это опять копия TLabel только с возможностью отображать системную информацию – дату, время, номер страницы, номер строки в таблицы, общее количество страниц и т.д.

QRImage – картинка. Компонент схожий с TImage.

Увеличить область заголовка Title. В верхний угол поместите один компонент QRSysData. Выделить его и в свойстве Data выбрать значение qrsDateTime. Теперь этот компонент будет отображать в правом, верхнем углу дату распечатки документа. 

В центре области Tittle установить компонент QRLabel, увеличь шрифт в свойстве Font и написать в свойстве Caption текст «Студенты».

Расположить в области Tittle компоненты QRLabel и дать им заголовки: ФИО, Дата рождения, Номер зачетки, Специальность, Курс.

Перейти к области Detail. Под заголовками поставить пять компонентов QRDBText. Установить в свойстве DataSet компонентов QRDBText набор данных - Form1.Table1, а в свойстве DataField для QRDBText1 указать SFio. У всех остальных компонентов QRDBText указать соответствующие имена полей.



Перейти в главный модуль и по нажатию кнопки “Печать” написать следующий код. 

procedure TForm1.SpeedButton5Click(Sender: TObject);

begin

Form4.QuickRep1.Preview; //вызывается метод Preview 

//компонента QuickRep. Этот метод показывает окно 

//предварительного просмотра созданного  документа.

еnd; 

Запустить программу, выделить какую-нибудь строку и нажать кнопку печати. Откроется окно предварительного просмотра.



Выделить компонент QuickRep1 и в свойстве DataSet указать таблицу Form1.Table1. 

Если сделать это, то компонент QuickRep1 автоматически будет перебирать все записи из этой таблицы и использовать их в компонентах, которые стоят в  блоке DetailBand1.

После этого в отчете появятся все записи таблицы:



Установить на форму отчета компонент – QRSubDetail с закладки QReport. Этот компонент предназначен для перебора данных относящихся к подчиненным таблицам. 

Установить следующие свойства: DataSet – Form1.Table2, чтобы связать блок с таблицей Uspevaemost.db, которая является подчиненной к основной Studenti.db.

В свойстве Master нужно указать главный компонент с основными данными. Выбрать в этом свойстве QuickRep1.

Расположить на компоненте QRSubDetail компоненты QRDBText в свойстве указав, к каким полям подчиненной таблицы они обращаются.

Получится следующий вид отчета: