
- •Лабораторная работа №1 Тема: Анализ предметной области задачи. Проектирование структуры базы данных
- •Постановка задачи
- •Лабораторная работа №2 Тема: Создание таблиц бд инструментальным способом
- •Задания:
- •Лабораторная работа №5 Тема: Определение отношений между таблицами
- •Задание:
- •Лабораторная работа №6 Тема: Создание таблиц бд реляционным способом
- •Задание:
- •Лабораторная работа №7 Тема: Навигация нд. Модификация нд
- •Задание:
- •Лабораторная работа №9 Тема: Поиск записей
- •Лабораторная работа №10 Тема: Запросы
- •Задание:
- •Лабораторная работа №11 Тема: Запросы с параметром. Динамический запрос
- •Задание:
- •Лабораторная работа №12 Тема: Простой отчет (Rave Report, qReport)
- •Задание:
- •Создание простейшего отчёта с помощью qReport
- •Лабораторная работа №13 Тема: Отчет с группировкой. Отчет со связанными таблицами
- •Задание:
- •Создание отчёта с группировкой (qReport)
- •Создание отчёта с группировкой (Rave Report)
- •Создание отчёта для связных нд (qReport)
- •Лабораторная работа №14 Тема: Экспорт и импорт данных в Word, Excel
- •Задание:
- •Экспорт в ms excel
- •Экспорт в ms Word
- •Лабораторная работа №15 Тема: Экспорт и импорт данных в Calc, Writer
Лабораторная работа №7 Тема: Навигация нд. Модификация нд
Цель: Изучить способы перемещения по записям набора данных (Table и Query), возможности модификации набора данных для приложений с базами данных Paradox и MS Access.
Задание:
Изучить способы перемещения по записям НД.
Выполнить перемещение по записям НД.
Изучить команды модификации НД.
Выполнить модификацию НД.
Перемещение по набору данных.
В Delphi существует ряд процедур и функций, которые обеспечивают перемещение указателя текущей записи (курсора) по набору данных. Курсор указывает на запись, которую необходимо отредактировать или удалить.
Перед началом перемещения указателя набор данных автоматически переводится в режим просмотра. Если при этом производилось редактирование какой - либо записи, то все изменения автоматически запоминаются.
Ниже приводятся методы, которые используются для перемещения указателя текущей записи по набору данных.
Метод First устанавливает курсор на первую запись.
Метод Next перемещает курсор на следующую запись (если в текущий момент времени указатель установлен на последнюю запись, то перемещения не происходит).
Метод Last устанавливает указатель на последнюю запись.
Метод Prior перемещает курсор на предыдущую запись (если указатель установлен на первую запись, перемещение не осуществляется).
Метод MoveBy (Distance: Integer): Integer перемещает указатель на число записей, задаваемое параметром Distance. Положительное значение данного параметра определяет перемешение курсора вперед, а отрицательное - назад. Курсор будет установлен на последнюю запись при попытке переместить его на запись с номером, большим чем номер последней записи. Аналогично, курсор устанавливается на первую запись при попытке его перемещения на запись с номером, меньшим единицы. Данная функция возврашает в качестве результата число записей, на которое сместился указатель.
Информация об общем количестве записей набора данных содержится в свойстве RecordCount.
Свойство RecNo содержит номер текущей записи, то есть определяет текущее положение курсора.
Свойства ВОF и ЕОF служат для определения начала и конца набора данных соответственно. Свойство ВОЕ имеет значение True, если указатель установлен на первую запись, иначе – False. В свою очередь, свойство ВОР равно True только в том случае, если курсор указывает на последнюю запись набора данных.
Перемещение по записям навигационным способом:
Создаём форму следующего вида:
Код программы:
procedure TForm11.Button1Click(Sender: TObject);
begin
DataModule2.TSpec.First;
button3.Enabled:=false;
button4.Enabled:=true;
end;
procedure TForm11.Button3Click(Sender: TObject);
begin
if DataModule2.TSpec.RecNo<>1 then
begin
Button4.Enabled:=true;
DataModule2.TSpec.Prior;
if DataModule2.TSpec.RecNo=1 then button3.Enabled:=false;
end;
end;
procedure TForm11.Button4Click(Sender: TObject);
begin
if DataModule2.TSpec.RecNo<>DataModule2.TSpec.RecordCount then
begin
Button3.Enabled:=true;
DataModule2.TSpec.Next;
if DataModule2.TSpec.RecNo=DataModule2.TSpec.RecordCount then button4.Enabled:=false;
end;
end;
procedure TForm11.Button2Click(Sender: TObject);
begin
DataModule2.TSpec.last;
button4.Enabled:=false;
button3.Enabled:=true;
end;
procedure TForm11.Button5Click(Sender: TObject);
begin
DataModule2.TSpec.MoveBy(strtoint(Edit1.Text));
edit1.Text:='';
end;
Модификация набора данных.
Модификация НД представляет собой методы, позволяющие программно добавлять, удалять и редактировать записи набора данных.
Наряду с возможностями визуального изменения набора данных при помощи компонента DBGrid, пользователь может вручную добавлять, удалять или редактировать записи. Для выполнения подобных операций в качестве вспомогательного компонента может также использоваться навигатор DBNavigator.
Чтобы набор данных можно было изменять, он должен быть модифицируем. Это определяется значением соответствующих свойств наборов данных.
Для компонента Table возможность модификации задается присвоением свойству ReadOnly значения False (по умолчанию). Если данное свойство равно True, то любые изменения таблицы (как визуальные, так и программные) будут запрещены. Изменить значение этого свойства можно только при условии, что набор данных не активен в текущий момент времени. Другими словами, перед изменением свойства ReadOnly набор данных должен быть закрыт.
Свойство CanModify (Воо1еаn) используется для того, чтобы в ходе выполнения приложения проверить, можно ли модифицировать набор данных. Это свойство доступно только для чтения. Если оно имеет значение True, то набор данных можно модифицировать, в противном случае - модификация запрещена.
Существует также возможность запретить автоматический переход в режим редактирования набора данных при работе пользователя с визуальными компонентами, такими как DBGrid или DBEdit. Для этого необходимо установить значение False свойству AutoEdit (тип Воо1еаn) источника данных DataSource.
Метод Edit служит для перевода набора данных в режим редактирования.
Метод Post записывает изменения, внесенные пользователем при редактировании. Данный метод автоматически вызывается при перемещении указателя текущей записи, например, с помощью использования методов First, Last, Next, Prior или MoveBy.
Метод Cancel позволяет отменить изменения, сделанные при редактировании до того момента, пока они не были сохранены с помощью метода Post.
Метод SetFields (const Values: array of const) используется для изменения значений всех или некоторых полей текущей записи. Параметр Values представляет собой массив значений, которые присваиваются полям текущей записи. Порядок заданных значений соответствует порядку полей в наборе данных. Если количество значений, заданных параметром Values, меньше числа полей набора данных, то эти значения присваиваются первым полям, а остальные поля не изменяются. Если же количество заданных значений превышает число полей, то при выполнении данного метода будет сгенерирована исключительная ситуация. Чтобы не изменять значение какого-либо поля, ему необходимо присвоить значение Nil. В этом случае прежнее значение поля будет сохранено без изменения. Следует различать значения Nil и Null. Если вместо Nil будет указано Null, то поле будет изменено и получит значение Null.
После выполнения метода SetFields набор данных автоматически переводится в режим просмотра.
Ниже приводятся методы, позволяющие добавить новую запись к набору данных.
Метод Insert переводит набор данных в режим вставки и добавляет пустую запись в позицию, на которой находится указатель текущей записи. После вызова данного метода необходимо заполнить поля новой записи. Это осуществляется с помощью метода SetFields. Для сохранения сделанных изменений вызывается метод Post.
Метод InsertRecord (const Values: array of const) вставляет новую запись в текущую позицию курсора и одновременно задает значения всех или некоторых ее полей.
Методы Append и AppendRecord абсолютно аналогичны методам Insert и InsertRecord соответственно. Единственным отличием является то, что оба эти метода добавляют новую запись в конец набора данных, а не в позицию, на которую указывает курсор.
Для удаления текущей записи применяется метод Delete, который работает только с модифицируемым набором данных.
Для компонента Query SQL позволяет осуществлять редактирование записей путем изменения значений полей в группе записей. Для этого используется оператор UPDATE, который описывается следующим образом:
UPDATE Имя_таблицы
SET Имя поля = Выражение,
Имя_поля= Выражение
[WHERE Условие_отбора]
Результатом выполнения этого оператора будет изменение значений заданных полей для всех записей, удовлетворяющих условию отбора. Выражение определяет новое значение указанного поля.
Добавление новых записей в таблицу производится с помощью оператора INSERT, имеющего следующий формат:
INSERT INTO Имя_таблицы
(Имя_поля,…, Имя_поля)
VALUES (Значение, … , Значение)
В результате выполнения данного оператора к указанной таблице будет добавлена одна запись с заполнением перечисленных в списке полей. Значения для них будут взяты из списка значений VALUES.
Существует также возможность одновременного добавления нескольких записей, значения полей для которых выбираются из других таблиц. В этом случае оператор описывается следующим образом:
INSERT INTO Имя_таблицы
(Имя_поля, … , Имя_поля)
SELECT...
В таблицу будут добавлены записи, для которых значения указанных полей заполняются на основе значений полей записей, отобранных с помощью оператора SELECT. Количество добавленных в таблицу записей будет равно количеству выбранных записей. Количество и тип отбираемых полей должно соответствовать числу и типу полей, указанных в теле оператора INSERT.
Оператор DELETE дает возможность удалить записи и имеет такой синтаксис:
DELETE FROM Имя_таблицы
[WHERE Условие_отбора]
При выполнении данного оператора из указанной таблицы удаляются все записи, которые удовлетворяют условию отбора.
Модификация НД:
Создаём форму следующего вида:
Код программы:
var
Form12: TForm12;
z:boolean;
plb, plk, srok:real;
implementation
{$R *.dfm}
procedure TForm12.Proverka;
begin
z:=false;
if Edit1.Text<>'' then
begin
try
srok:=StrToFloat(Edit3.Text);
plb:=StrToFloat(Edit4.Text);
plk:=StrToFloat(Edit5.Text);
except
on EConvertError do
begin
MessageDlg('Ошибка при задании числовых значений!',mtError,[mbOK],0);
exit;
end;
end;
z:=true;
end
else MessageDlg('Код специальности не задан!', mtError, [mbOK], 0);
end;
procedure TForm12.Button1Click(Sender: TObject);
begin
Proverka;
if z then
begin
if not DataModule2.TSpec.Locate('kod_spec', Edit1.Text, [])
then DataModule2.TSpec.InsertRecord([Edit1.Text, Edit2.text, srok, plb, plk])
else MessageDlg ('Специальность с таким кодом уже существует!' , mtInformation, [mbOK], 0);
end;
end;
procedure TForm12.Button2Click(Sender: TObject);
var
Nom_zap:Integer;
begin
Proverka;
if z then
begin
Nom_zap:=DataModule2.TSpec.RecNo;
if not DataModule2.TSpec.Locate('kod_spec', Edit1.Text, [])then
begin
DataModule2.TSpec.Edit;
DataModule2.TSpec.SetFields([Edit1.Text,Edit2.text, srok, plb, plk]);
DataModule2.TSpec.Post;
end
else
begin
if Nom_zap=DataModule2.TSpec.RecNo then
begin
DataModule2.TSpec.Edit;
DataModule2.TSpec.SetFields([Edit1.Text,Edit2.text, srok, plb, plk]);
DataModule2.TSpec.Post;
end
else MessageDlg ('Такая специальность уже существует!', mtInformation, [mbOK],0);
end;
end;
end;
procedure TForm12.Button3Click(Sender: TObject);
begin
if MessageDlg('Удалить текущую запись?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
DataModule2.TSpec.Delete;
end;
procedure TForm12.Button5Click(Sender: TObject);
begin
Table1.Close;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('update specialnost');
Query1.SQL.Add('set plata_k=24000,plata_b=400');
Query1.SQL.Add('where srok_ob=46');
Query1.ExecSQL;
Table1.Open;
DBGrid1.DataSource:=DataSource1;
end;
procedure TForm12.Button4Click(Sender: TObject);
begin
Table1.Close;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('insert into specialnost');
Query1.SQL.Add('(kod_spec,nazvanie,srok_ob,plata_b,plata_k)');
Query1.SQL.Add('values(''1906'',''Экономика'',''36'',''300'',''22000'')');
Query1.ExecSQL;
Table1.Open;
DBGrid1.DataSource:=DataSource1;
end;
procedure TForm12.Button6Click(Sender: TObject);
begin
Table1.Close;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('DELETE from specialnost WHERE srok_ob=36');
Query1.ExecSQL;
Table1.Open;
DBGrid1.DataSource:=DataSource1;
end;
end.
Лабораторная работа №8
Тема: Сортировка и фильтрация НД
Цель: Изучить способы сортировки и фильтрации НД.
Краткие рекомендации:
Задание:
Изучить способы сортировки НД (с помощью индексов и реляционным способом).
Выполнить сортировку НД для приложений с базами данных Paradox и MS Access.
Изучить способы фильтрации НД.
Выполнить фильтрацию всеми способами для приложений с базами данных Paradox и MS Access.
Сортировка набора данных.
Сортировка – это упорядочивание записей по определённому полю в порядке возрастания или убывания содержащихся в нём значений.
Сортировка набора данных Table выполняется автоматически по текущему индексу, при смене индекса происходит автоматическое упорядочивание записей.
Задать индекс, по которому выполняется сортировка записей, можно с помощью следующих свойств:
IndexName
IndexFieldNames
Свойство IndexName и IndexFieldNames не допускают совместного использования. При внесении значения в одно из этих свойств, другое свойство автоматически очищается.
В качестве значения свойства IndexName указывается имя индекса, установленное при его создании.
При использовании свойства IndexFieldNames указываются имена полей, образующих соответствующий индекс.
Свойство индекса определяется параметром Options, имеющим следующий тип.
type TIndexOption = (ixPrimary, ixUnique, ixDescending,
ixCaselnsensitive, ixExpression, ixNonMaintained);
Важнейшие значения параметра Options перечислены ниже.
Значение |
Свойство индекса |
ixPrimary ixUnique ixDescending ixCaselnsensitive |
Первичный индекс Все значения индексных полей уникальны Сортировка по индексу выполняется в порядке убывания Процесс сортировки нечувствителен к регистру содержимого текстовых полей |
Для компонента Query сортировка или упорядочение записей по возрастанию (убыванию) значений полей осуществляется с помощью операнда ORDER BY. После него приводится список полей, по которым должна производиться сортировка. Записи будут упорядочены в зависимости от порядка указания полей. Вначале осуществляется сортировка по первому указанному полю; затем для записей, имеющих одинаковое значение первого поля, происходит упорядочение по второму полю и т.д.
Сортировка осуществляется как для индексированных, так и для неиндексированных полей. Поля в списке обозначаются именами или номерами, соответствующими порядку расположения полей в списке после ключевого слова SELECT.
По умолчанию производится сортировка в порядке возрастания значений поля. Чтобы упорядочить записи по убыванию, необходимо после имени (номера) поля указать описатель DESC.
Выполнение сортировки:
Создаём форму следующего вида:
Код программы:
procedure TForm13.RadioGroup1Click(Sender: TObject);
begin
DBGrid1.DataSource:=DataModule2.DSSpec;
with DataModule2.TSpec do
case RadioGroup1.ItemIndex of
0:IndexName:='';
1:IndexName:='Ind_nazvanie';
2:IndexName:='Ind_srok';
end;
end;
procedure TForm13.RadioGroup2Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Table1.Close;
case RadioGroup2.ItemIndex of
0:Query1.SQL.add('SELECT Kod_spec, Nazvanie, Srok_ob, Plata_b, Plata_k FROM "Specialnost.DB" Specialnost ORDER BY Kod_spec');
1:Query1.SQL.add('SELECT Kod_spec, Nazvanie, Srok_ob, Plata_b, Plata_k FROM "Specialnost.DB" Specialnost ORDER BY Nazvanie DESC');
2:Query1.SQL.add('SELECT Kod_spec, Nazvanie, Srok_ob, Plata_b, Plata_k FROM "Specialnost.DB" Specialnost ORDER BY Srok_ob');
end;
Query1.Open;
DBGrid1.DataSource:=DataSource1;
end;
Фильтрация набора данных.
Фильтрация набора данных предназначена для отбора записей удовлетворяющих условию установленного фильтра. Delphi позволяет осуществлять два вида фильтрации:
фильтрация по выражению;
фильтрация по диапазону.
При использовании фильтра по выражению в набор данных попадают записи, удовлетворяющие выражению фильтра. Фильтрация по выражению применима ко всем полям БД, даже к индексированным. Для задания условия фильтра используется свойство Filter. Но, при задании условия фильтра, набор данных не будет содержать записи, удовлетворяющие условию фильтра. Для того чтобы включить режим фильтрации нужно воспользоваться свойством Filtered логического типа. Это свойство "включает" и "выключает" фильтрацию. По умолчанию это свойство имеет значение False и условия фильтра игнорируются.
Фильтр представляют собой строковое выражение, в состав которого входят имена полей, операции сравнения, возможные арифметические и логические операции, круглые и квадратные скобки. Квадратные скобки, в основном, применяются тогда, когда имя поле БД содержит пробелы.
В качестве операторов сравнения используются отношения: < (меньше), > (больше), = (равно), >= (больше или равно), <= (меньше или равно), <> (не равно). В качестве арифметических операций используются: + (сложение), - (вычитание), * (умножение), / (деление). А в качестве логических операторов: AND, OR, NOT, то есть логические И, ИЛИ, НЕ.
Фильтрацию можно проводит также и на этапе разработки приложения через Инспектор объектов. Если выражение фильтра содержит ошибку, то это приводит к возникновению исключительной ситуации. Для дополнительной обработки процесса фильтрации можно использовать событие onFilterRecord.
В качестве параметров фильтрации можно использовать следующие параметры:
foCaseInsensitive - Регистр букв не учитывается.
foNoPartialCompare - Проверки на полное соответствие содержимого поля.
По умолчанию все параметры отключены. Для того чтобы отобразить все записи набора данных после фильтрации можно установить свойству Filtered значение False, либо в качестве условия фильтра указать пустое значение. Если известны только первые символы значения некоторого поля, то в этом случае нужно указать символ * (звездочка) после значения условия фильтрации. Рассмотрим пример простой фильтрации:
Так как явно задать строковое значение полю БД не возможно, то перед фильтрацией это значение нужно обрамить апострофами. На практике чаще значение фильтра задается самим пользователем. Для этого нужно создать отдельную форму, на которой разместить некоторое число переключателей, соответствующих полям Базы Данных и такое же число однострочных редакторов, для указания значения фильтра. Вот небольшой грубый пример создания условия фильтра пользователем.
При использовании фильтрации по диапазону в набор данных попадают те записи, значения которых входят в диапазон заданного значения фильтра. Данный вид фильтрации работает быстрее, потому что производиться только для индексированных полей. При попытке произвести фильтрацию для не индексированного поля возникает исключительная ситуация. Для включения режима фильтрации используется поля метод ApplyRange, а для выключения - метод CancelRange.
Метод SetRangeStart устанавливает нижнюю границу диапазона, а метод SetRangeEnd - верхнюю границу диапазона. При использовании данных методов не нужно указывать никаких параметров, а для задания диапазона используется обычное присваивание. Не менее интересным свойством является свойство KeyExclusive логического типа. Если этому свойству установить значение False, то в набор данных попадут записи, у которых значения совпадают со значениями указанного диапазона, а если установить значение True, то в набор данных такие записи не попадут. Но не нужно забывать, что это свойство действительно отдельно для каждой границы значения указанного диапазона. Если не будет задана нижняя часть диапазона, то она будет равна максимально возможному значению, а если не задана верхняя граница, то она будет равно минимально возможному значению.
Для набора данных Query фильтрация может быть произведена двумя способами: при помощи специального SQL-запроса, либо одноименными методами, как у набора данных Table.
Нужно обратить внимание на одну из команд SQL-запроса WHERE. Данная команда как раз и отвечает за отбор записей из набора данных, а точнее она задает критерий отбора записей из набора данных. При задании выражения фильтрации оно также должно состоять из имен полей БД, арифметических и логических операций, различных скобок, а также специальных функций.
В SQL-запросе также можно применять сложные критерии отбора записей Базы Данных. При помощи оператора LIKE можно задать шаблон поиска записей для отбора из набора данных. Если известны только первые символы значения некоторого поля, то в этом случае нужно указать символ % (процент) в значении условия фильтрации, означающий неограниченное число символов. Для указания одного неизвестного символа нужно указать символ _ (подчеркивание).
Для отбора записей с нулевыми значениями в каком-либо поле Базы Данных используется оператор IS NULL. При помощи данного оператора также можно выполнять проверку на присутствие полей, в которых вообще отсутствует какое-либо значение.
Для отбора записей входящих в диапазон заданных значений существует оператор BETWEEN. При помощи данного оператора также можно осуществить фильтрацию набора данных по диапазону.
Выполнение фильтрации:
Создаём форму следующего вида:
Код программы:
var
Form14: TForm14;
forma:string;
implementation
{$R *.dfm}
procedure TForm14.RadioGroup1Click(Sender: TObject);
begin
DBGrid1.DataSource:=DataModule2.DSStydent;
with DataModule2 do
case RadioGroup1.ItemIndex of
0:begin
TStydent.Filter:='fio='''+Edit1.Text+'''';
TStydent.Filtered:=true;
end;
1:begin
forma:=ComboBox1.Text;
TStydent.Filter:='forma_ob='''+forma+'''';
TStydent.Filtered:=true;
end;
2:begin
TStydent.Filter:='nazvanie_gr='''+Edit3.Text+'''';
TStydent.Filtered:=true;
end;
3:begin
TStydent.IndexFieldNames:='kod_styd';
TStydent.SetRangeStart;
TStydent.FieldByName('kod_styd').AsString:=Edit2.Text;
TStydent.SetRangeEnd;
TStydent.FieldByName('kod_styd').AsString:=Edit4.Text;
TStydent.ApplyRange;
end;
4:begin
TStydent.Filtered:=False;
TStydent.CancelRange;
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
ComboBox1.ItemIndex:=-1;
end;
end;
end;
procedure TForm14.RadioGroup2Click(Sender: TObject);
begin
case RadioGroup2.ItemIndex of
0:begin
Query1.Filter:='fio='''+Edit1.Text+'''';
Query1.Filtered:=true;
end;
1:begin
forma:=ComboBox1.Text;
Query1.Filter:='forma_ob='''+forma+'''';
Query1.Filtered:=true;
end;
2:begin
Query1.Filter:='nazvanie_gr='''+Edit3.Text+'''';
Query1.Filtered:=true;
end;
3:begin
Query1.Filter:='kod_styd >= ' + Edit2.Text + 'AND kod_styd <= ' + Edit4;
Query1.Filtered:=true;
end;
4:begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
ComboBox1.ItemIndex:=-1;
Query1.Filtered:=false;
end;
end;
end;
end.