
- •Задание к работе.
- •Задание к работе:
- •Задание к работе.
- •Задание к работе:
- •InitialDir – позволяет установить начальный каталог поиска в Инспекторе объектов.
- •Задание к работе:
- •Задание к работе:
- •Задание к работе:
- •VarArrayOf(['Иванов', 'Иван']), [loCaseInsensitive]);
- •Метод Lookup
- •Фильтрация данных
- •Задание к работе:
- •Содержание отчета:
VarArrayOf(['Иванов', 'Иван']), [loCaseInsensitive]);
Метод Lookup
Метод Lookup, в отличие от Locate, не меняет положение курсора в таблице. Вместо этого он возвращает значения некоторых ее полей. Причем в отличие от Locate, этот метод осуществляет поиск лишь на точное соответствие. Такой способ поиска востребован реже, однако в иных случаях этим методом очень удобно пользоваться. Рассмотрим синтаксис этого метода.
function Lookup (const KeyFields: String;
const KeyValues: Variant;
const ResultFields: String) : Variant;
Как вы видите, первые два параметра такие же, как у Locate. А вот третий параметр и возвращаемое значение отличаются. В строке ResultFields через точку с запятой перечисляются поля таблицы, значения которых метод должен вернуть. Возвращаются эти значения в виде вариантного массива. Проблема в том, что вернуться может значение Null, то есть, ничего, или Empty (пустой) и это нужно проверять.
Фильтрация данных
Фильтрацию данных применяют не реже а, пожалуй, даже чаще, чем поиск. Разница в том, что при поиске данных пользователь видит все записи таблицы, при этом курсор либо переходит к искомой записи, либо он получает данные этой записи в виде результата работы функции. При фильтрации дело обстоит иначе. Пользователь в результате видит только те записи, которые удовлетворяют условиям фильтра, остальные записи становятся скрытыми. Конечно, таким образом искать нужные данные проще. Можно указать в условиях фильтра, что требуется вывести всех сотрудников, чья фамилия начинается на "И". Пользователь увидит только их. Воспользуемся событием onFilterRecord
Это событие возникает при установке значения True в свойстве Filtered. Применение этого способа имеет большой плюс, и большой минус. Плюс в том что, сгенерировав это событие, программист получает возможность задать гораздо более сложные условия фильтрации. Минус же заключается в том, что проверка заключается перебором всех записей таблицы. Если таблица содержит очень много записей, процесс фильтрации может затянуться.
В событие передаются два параметра. Первый параметр - набор данных DataSet. С ним можно обращаться, как с именем фильтруемой таблицы. Второй параметр - логическая переменная Accept. Этой переменной нужно передавать результат условия фильтра. Если условие возвращает False, то запись не принимается, и не будет отображаться. Соответственно, если возвращается True, то запись принимается.
Задание к работе:
Откройте проект. Перейдите на модуль DM, где хранятся компоненты доступа к базе данных. Процедуру поиска реализуем в этом модуле, а чтобы с ней можно было работать из других форм, опишем ее в разделе public:
public
procedure MLocate(s: string);
В процедуру передается параметр - строка. В ней мы будем передавать искомую фамилию.
В процедуру пропишите следующий код:
procedure TDM.MLocate(s: string);
begin
TLichdata.Locate('Fam',s,[loPartialKey]);
end;
Таким образом, при нахождении подходящей записи курсор будет перемещаться к ней.
На главной форме выделите компонент Edit, предназначенный для поиска по фамилии. Создайте для него событие onChange, которое наступает при изменении текста в поле компонента. В созданной процедуре пропишите вызов поиска:
procedure TForm1.Edit1Change(Sender: TObject);
begin
DM.MLocate(Edit1.Text);
end;
Далее организуем поиск методом Lookup.
Для поиска воспользуемся кнопкой с надписью "Найти", расположенной в верхней части главной формы. Идея такова: пользователь вводит в поле Edit1 какую то фамилию и нажимает кнопку "Найти". Событие onClick этой кнопки собирает в строковую переменную значения четырех указанных полей найденной записи. Причем после каждого значения в строку добавляется символ "#13" (переход на новую строку), формируя многострочный отчет. Затем эту строку мы выведем на экран функцией ShowMessage().
Для этого сгенерируем событие onClick по кнопке «Найти».
procedure TForm1.BitBtn1Click(Sender: TObject);
var
mlookup:variant;
s: string;
begin
mlookup:=dm.TLichData.Lookup('Fam',edit1.Text,'Fam;im;ot;Obraz');
if varType(mlookup)=varnull then
showmessage('Сотрудник с такой фамилией не найден')
else if vartype (mlookup)= varEmpty then
showmessage('Запись не найдена')
else if varisarray(mlookup) then begin
s:=mlookup[0]+#13+mlookup[1]+#13+ mlookup[2]+#13+
mlookup[3];
showmessage(s);
end;
end;
Помимо поиска организуем фильтрацию.
Добавьте компонент Edit2 на главную форму.
Перейдите к модулю данных и создайте глобальную переменную Ed.
var
DM: TDM;
ed:string;
Далее выделите TLichData. На вкладке Events (События) инспектора объектов найдите событие onFilterRecord и дважды щелкните по нему, сгенерировав процедуру.
В процедуре запишите следующий код:
procedure TDM.TLichDataFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
s:string;
begin
s:=Copy (DataSet['Fam'],1,length(ed));
accept:=s=ed;
end;
Перейдите на главную форму и сгенерируйте событие onChange компонента Edit2
procedure TForm1.Edit2Change(Sender: TObject);
begin
if Edit2.text<>' ' then begin
DM.TLichData.Filtered:=False;
ed:=Edit2.text;
dm.TLichData.Filtered:=True;
end
else dm.TLichData.Filtered:=false;
end;
Содержание отчета:
Номер, тема, цель лабораторной работы.
Задание к работе.
Интерфейс приложения
Текст программы.
Вывод о проделанной работе.
Лабораторная работа №14
Тема: «Поиск данных с помощью статических и динамических запросов».
Цель: приобретение практических навыков создания программ, позволяющих выполнять поиск записей в базе данных с помощью компонента TQuery.
Задание к работе:
Откройте проект. Создайте 4 форму. На первой форме создайте кнопку «Расширенный поиск», открывающую форму 4.
Осуществим поиск адреса сотрудников по введенному городу. Для этого на форму 4 поместим компоненты 2 Label,Edit, Button, DBGrid
Перейдите на модуль DM, где хранятся компоненты доступа к базе данных. Добавьте в модуль компонент Query и DataSource.
Переименуйте их в QAdres и DSQAdres соответственно.
У компонента QAdres выберете псевдоним Otdel в свойстве DataBase Name и DSLichData в свойстве DataSource (ссылается на компонент TDataSource, из набора данных которого задаются значения параметров).
У компонента DSQAdres в свойстве Data Set QAdres.
У компонента DBGrid в свойстве DataSource укажите DM.DSQAdres.
Далее пропишите процедуру нажатия кнопки
procedure TForm4.Button1Click(Sender: TObject);
begin
DM.QAdres.Close;
DM.QAdres.SQL.Clear;
DM.QAdres.SQL.Add('SELECT Fam,Im,Ot,Gorod,Dom_adr');
DM.QAdres.SQL.Add('FROM LichData,Adres ');
DM.QAdres.SQL.Add('Where (Adres.gorod='+QuotedSTR(Edit1.Text)+')');
DM.QAdres.SQL.Add('AND(LichData.ID=Adres.Sotr)');
DM.QAdres.Open;
end;
Осуществим расчет среднего стажа всех сотрудников и разобьем эти данные по отделам. Для этого будем использовать агрегатную функцию AVG.
На форму 4 добавим компоненты label, button, DBGrid.
Перейдите на модуль DM, где хранятся компоненты доступа к базе данных. Добавьте в модуль компонент Query и DataSource.
Переименуйте их в QStag и DSQStag соответственно.
У компонента QStag выберете псевдоним Otdel в свойстве DataBase Name и DSLichData в свойстве DataSource. В свойстве SQL укажите следующие команды
У компонента DSQStag в свойстве Data Set QStag.
У компонента DBGrid в свойстве DataSource укажите DM.DSQStag.
Далее пропишите процедуру нажатия кнопки
procedure TForm4.Button2Click(Sender: TObject);
begin
DM.QStag.Close;
DM.QStag.Open;
end;
Осуществим поиск сотрудников по введенной должности и стаж работы которых находится введенных пределах.
Для этого на форму 4 добавим 3 компонента Edit, 1 Button, 5 Label b 1 DBGrid
Перейдите на модуль DM. Добавьте в модуль компонент Query и DataSource.
Переименуйте их в QDoljn и DSQDoljn соответственно.
У компонента QDoljn выберете псевдоним Otdel в свойстве DataBase Name и DSLichData в свойстве DataSource.
У компонента DSQDoljn в свойстве Data Set QDoljn.
У компонента DBGrid в свойстве DataSource укажите DM.DSQDoljn.
Далее пропишите процедуру нажатия кнопки
procedure TForm4.Button3Click(Sender: TObject);
begin
DM.QDoljn.Close;
DM.QDoljn.SQL.Clear;
DM.QDoljn.SQL.Add('SELECT Fam,Im,Ot,Doljn,Otdel');
DM.QDoljn.SQL.Add('FROM LichData,Doljnost ');
DM.QDoljn.SQL.Add('Where (Doljnost.doljn='+QuotedSTR(Edit2.Text)+')');
DM.QDoljn.SQL.Add('AND(LichData.ID=Doljnost.Sotr)');
DM.QDoljn.SQL.Add('AND (lichdata.stag BETWEEN '+ Edit3.Text+' AND '+ Edit4.Text+')');
DM.QDoljn.Open;
end;
Создайте еще один динамический или статический запрос на ваше усмотрение
Содержание отчета:
Номер, тема, цель лабораторной работы.
Задание к работе.
Интерфейс приложения
Текст программы.
Вывод о проделанной работе.
Лабораторная работа №15
Тема: «Создание отчета».
Цель: приобретение практических навыков создания приложений, позволяющих выполнять просмотр и печать отчетов с помощью Quick Report.
Задание к работе:
Откройте проект. Если пакет Quick Report еще не установлен (на палитре компонентов отсутствует вкладка QReport), то загрузите Delphi и закройте все открытые проекты (File -> Close All).
Выбрерите пункт меню "Component -> Install Packages".
Нажмите кнопку "Add" и выберите пакет "dclqrt70.bpl", который по умолчанию устанавливается по адресу: c:\Program Files\Borland\Delphi7\bin\dclqrt70.bpl
Нажмите кнопку "Открыть". Далее, нажмите кнопку "ОК" - пакет компонентов Quick Report установится, и его вкладка будет самой последней на Палитре компонентов. При желании можно перетащить ее мышью на другое место, поближе к началу.
На главной форме установите компонент Main Menu и создайте разделы
Раздел |
Подраздел |
Файл |
Выход |
Отчеты |
Кадры, по телефонам, по адресам |
Создайте новую форму и подключите к ней модуль данных.
Установите QuickRep на новую форму, и он примет вид разлинованного листа.
Выделите QuickRep и обратите внимание на его свойства. В самом верху находится свойство Bands (Ленты, полосы - англ.). Это раскрывающееся свойство, оно содержит шесть параметров. Щелкните по плюсу слева от свойства, чтобы раскрыть его. По умолчанию, все параметры имеют значение False, то есть, не установлены. Если какой-либо параметр перевести в значение True, на холсте появится соответствующая полоса. Попробуйте установить все параметры. Разберемся с их назначением.
HasColumnHeader - Заголовки колонок. Здесь мы будем вписывать названия колонок таблицы.
HasDetail - Детальная информация. На этой ленте формируются строки таблицы.
HasPageFooter - Подвал (нижний колонтитул). Здесь можно установить информацию, которая будет появляться в нижней части каждой страницы.
HasPageHeader - Шапка (верхний колонтитул). Здесь можно установить информацию, которая будет появляться в верхней части каждой страницы.
HasSummary - Суммарная информация. Содержимое этой полосы печатается один раз в самом конце отчета.
HasTitle - Заголовок отчета.
Переведите в True полосы HasPageHeader, HasTitle, HasColumnHeader, HasDetail и HasPageFooter. Не установленной останется только полоса HasSummary. Если вы дважды щелкните мышью по свободному месту холста, появится настроечное окно:
В этом окне можно выполнить большинство настроек, причем в Инспекторе объектов соответствующие свойства будут изменены автоматически. Как видите, установленные нами полосы отмечены "галочкой" в разделе Bands окна. Выше располагается раздел Page frame, в котором можно задать обрамление для верхней (Top), нижней (Bottom), левой (Left) и правой (Right) границ холста, а также изменить цвет и ширину обрамления. Те же действия можно выполнить в Инспекторе объектов с помощью параметров раскрывающегося свойства Frame(пока открыто окно настроек, менять свойства в Инспекторе Объектов не получится).
Еще выше располагается раздел Other, где можно установить общие данные для холста - шрифт, размер шрифта и единицы измерения (по умолчанию mm - миллиметры). В Инспекторе объектов за это отвечают свойства Font и Units.
Далее находится раздел Margins (Границы, края), где можно задать расстояния от краев листа до рабочей части холста. На самом верху окна располагается раздел Paper size (Размер бумаги), где задаются тип листа и его размеры. Данные этих двух разделов можно изменить в Инспекторе объектов в раскрывающем свойстве Page.
Еще следует обратить внимание на свойство Options, которое имеет три параметра:
FirstPageHeader - Разрешает печать заголовков (шапку) первой страницы, если равно True.
LastPageFooter - Разрешает печать подвала последней страницы, если равно True.
Compression - Разрешает сжатие отчета при формировании из него метафайла (отчет представляет собой изображение), если равно True.
Свойство PrintIfEmpty разрешает (True) или запрещает (False) печатать отчет, если в нем нет никаких данных.
Свойство ShowProgress разрешает или запрещает показывать индикатор процесса печати отчета. По умолчанию индикатор разрешен.
Свойство SnapToGrid разрешает или запрещает привязывание компонентов к сетке. По умолчанию привязка разрешена.
Свойство Zoom имеет тип Integer и позволяет изменить масштаб отображения отчета при его разработке. Значение 100 указывает, что отчет показывается в 100% от листа бумаги. Изменение этого свойства не влияет на масштаб печати отчета или его предварительного просмотра.
Теперь приступим к формированию отчета. На холсте у нас уже должны быть расположены пять полос. Теперь мы можем на эти полосы устанавливать другие компоненты. На самом верху холста находится полоса Page Header, которая, как мы уже знаем, является верхним колонтитулом. Установите в левой части этой полосы компонент QRSysData - компонент с различного рода системной информацией. Нас интересует свойство Data этого компонента. Data содержит несколько свойств, формирующих отображаемую информацию. Разберем эти свойства.
qrsDate (Вывод текущей даты)
qrsDateTime (Вывод текущих даты и времени)
qrsDetailCount (Количество строк формируемой таблицы)
qrsDetailNo (Номер текущей строки таблицы)
qrsPageNumber (Номер текущей страницы отчета)
qrsReportTitle (Заголовок отчета)
qrsTime (Вывод текущего времени)
Установим для этого свойства значение qrsDateTime, чтобы пользователь мог видеть, когда был сформирован отчет. Далее выделим всю полосу Page Header и в свойстве Frame переведем в True параметр DrawBottom. Это свойство позволяет задать обрамление выделенной полосе, а параметр DrawBottom рисует линию в нижней части полосы. То есть, мы визуально отделили колонтитул от данных листа.
В нижней части холста располагается полоса Page Footer (подвал). Здесь желательно установить верхнюю линию в свойстве Frame, отделив от данных нижний колонтитул. А по центру полосы установить еще один компонент QRSysData, установив свойство Data в значение qrsPageNumber. Этот компонент будет выводить номер текущей страницы в нижней части листа.
Напишем заголовок отчета. Для этого установите компонент QRLabel в центре полосы Title. В его свойстве Caption напишите "Отчет по кадрам". Чтобы заголовок был красивым, щелкните дважды по свойству Font, чтобы открылось окно шрифта. Здесь установите шрифт Times New Roman, начертание выберите жирное, а размер шрифта пусть будет 18.
Далее займемся полосой Column Header (Заголовки колонок). Здесь установите рядом пять компонентов QRLabel, в свойстве Caption которых напишите
Фамилия
Имя
Отчество
Дата рождения
Образование
Это будут названия колонок таблицы. Шрифт этих компонентов также желательно сделать крупнее, но не больше заголовка.
Далее займемся полосой Detail, на которой, собственно, и будет формироваться таблица. Здесь нам нужно будет в самом крайнем положении слева установить компонент QRSysData, в свойстве Data которого выбрать qrsDetailNo - перед каждой строкой будет выходить ее номер. Далее установите пять компонентов QRDBText, в которых будут отражаться данные из соответствующих полей таблицы. Эти компоненты соответствуют обычному DBText, с которым мы неоднократно сталкивались. Расположите их точно под названиями столбцов, чтобы таблица была красивой. При этом может оказаться, что компонент QRSysData "наплывает" на QRDBText - ничего страшного, данные все равно не будут мешать друг другу. Выделите все QRDBText, и в их свойстве DataSet выберите нашу таблицу fDM.TLichData, затем поочередно в свойстве DataField этих компонентов выберите соответствующие поля таблицы:
Fam
Im
Ot
Dtr
Obraz
Кроме того, сам компонент QuickRep1, который является "холстом" отчета, также должен знать, из какой таблицы ему нужно брать данные. Поэтому выделите его, и в свойстве DataSet также выберите нашу таблицу DM.TLichData. Если этого не сделать, то в отчете будет выходить лишь текущая запись таблицы, а не все ее записи.
Вернитесь в главное окно проекта и сгенерируйте обработку команды меню "Отчеты - Кадры".
procedure TForm1.N5Click(Sender: TObject);
begin
form5.QuickRep1.PreviewModal;
end;
На вкладке QReport имеется компонент QRShape, который позволяет рисовать простейшие линии и фигуры. Он имеет свойство Shape, в котором можно задать нужную фигуру. Возможные значения этого свойства:
qrsCircle (Круг)
qrsHorLine (Горизонтальная линия)
qrsRectangle (Прямоугольник)
qrsRightAndLeft (Прямоугольник с очерченными левым и правым краями)
qrsTopAndBottom (Прямоугольник с очерченными верхним и нижним краями)
qrsVertLine (Вертикальная линия)
Этот компонент можно использовать по-разному. Например, можно установить по одной горизонтальной линии сверху и снизу полосы Detail, а затем вертикальными линиями отделить каждый столбце страницы. Можно проще: каждый столбец заключил в прямоугольник (шесть компонентов QRShape), а чтобы QRShape не перекрывал текст, щелкните по ним правой кнопкой и выберите команду Control -> Send to Back (поместить на задний план).
Создадим отчет по телефонам. Для этого создайте в проекте новую форму,подключите модуль с наборами данных DM.
Установите на новую форму основу отчета QuickRep.В свойстве DataSet компонента-основы выберите DM.TLichData, то есть, таблицу с личными данными.
Теперь создайте на основе полосы Page Header, Title, Column Header и Detail.
На верхнюю полосу Page Header установите по краям два компонента QRSysData, в свойстве Data у первого выберите qrsDateTime, а у второго qrsPageNumber. Кроме того, переведите в True параметр DrawBottom у свойства Frame полосы Page Header, чтобы отделить линией верхний колонтитул.
Далее, на полосу Title установите один компонент QRLabel, на котором напишите заголовок "Отчет по телефонам сотрудников". Измените шрифт, начертание и размер, как в прошлом примере, и отцентрируйте заголовок по полосе.
Ниже идет полоса Column Header с заголовками таблицы. Как и в прошлом примере, требуется из компонентов QRLabel сформировать заголовки столбцов, но в этот раз ограничимся только тремя заголовками: "Фамилия", "Имя" и "Отчество".
Далее у нас идет полоса Detail, на которой нам нужно разместить три компонента QRDBText, которые привязать к соответствующим полям (не забудьте про свойства DataSet и DataField этих компонентов). Еще в свойстве Frame полосы Detail желательно перевести параметр DrawTop в True, чтобы каждая запись отчета отделялась линией.
Теперь добавим в отчет связанные данные из другой таблицы. Установите компонент QRSubDetail - эта полоса должна быть самой нижней. Сначала нужно выбрать главный по отношению к этому компонент: в свойстве Master выберите QuickRep1. Кроме того, полоса QRSubDetail должна знать, откуда листать данные, поэтому в свойстве DataSet полосы выберите DM.TTelephones.
Далее установим на полосу один компонент QRLabel, напишем на нем "Телефон:".
Слева от него установите два компонента QRDBText, в свойстве Dataset которых выберите fDM.TTelephones, а в свойстве DataField выберите соответственно, поля "Телефон" и "Примечание". Теперь мышью немного перетащите нижний край полосы, чтобы сделать ее поуже.
Создайте процедуру вызова этого окна в команде главного меню Отчеты -> По телефонам, и пропишите там вызов Form6.QuickRep1.PreviewModal;
Отчет по адресам сотрудников создается точно таким же образом, сделайте его самостоятельно.
Отчет можно не только распечатать. Его также можно сохранить в специальном формате *.qrp, а затем загрузить в окно предварительного просмотра. Для этого соответственно служат кнопки "Save Report" и "Load Report" на панели инструментов окна предварительного просмотра.
Однако бывают случаи, когда отчет желательно сохранить в каком-нибудь общем формате, например, в текстовом, или html (web-страница). Тогда отчет можно было бы просмотреть в стандартном Блокноте или web-броузере, переслать сотруднику, у которого ваша программа не установлена. На вкладке QReport имеются компоненты, которые позволяют это сделать.
QRTextFilter - позволяет сохранить отчет в виде текстового файла.
QRCSVFilter - позволяет сохранить отчет в специальном формате CSV (Comma Separated).
QRHTMLFilter - позволяет сохранить отчет в формате web-страницы.
Это не визуальные компоненты, на отчете они не отобразятся. Достаточно установить один из них (или все вместе) на основу отчета QuickRep, и при сохранении отчета пользователю станут доступны соответствующие форматы.
Причем если у вас в проекте имеется несколько окон с отчетами, компоненты добавляются только в один из них, в остальных отчетах эти форматы также станут доступны.