- •Методические указания к выполнению лабораторных работ по дисциплине
- •1. При проектировании используйте примеры программного кода непосредственно из исходных текстов программ, а не из методических описаний (*.Doc файла)
- •2. Имена отдельным модулям лучше давать по их функциональности, а не оставлять так как они даются по умолчанию (Unit1.Pas, Unit2.Pas и т.Д.)
- •3. При возникновении каких-либо ошибок в процессе выполнения работы проверьте по исходному примеру, все ли модули подключены в разделах interface и implementation, подразделе uses.
- •Теоретическое введение
- •Создание структуры таблиц бд
- •3.3 Синтез иконки прикладного приложения
- •3.4 Размеры экранных форм и их положение на экране
- •3.5 Разработка подчинённых форм
- •Создание формы
- •Размеры и положение
- •Работа приложения с бд
- •Доступ к таблицам бд. Компоненты доступа к данным. Приложение
- •AdoDataSet (Набор данных) или adoQuery (Запрос)
- •Сохранение пути к бд
- •Работа с данными
- •Обработка данных
- •Сортировка
- •Отчёты и обработки
- •Запросы, содержащие вычисления на выделенных записях таблицы (по столбцам)
- •В обработке события OnClick кнопки Button необходимо прописать следующее:
- •Разграничение прав доступа для различных пользователей
- •Организация многопользовательского режима
Отчёты и обработки
Отчёты в ИС – это специальным образом обработанные данные, которые пользователь может вывести на печать. Отчёт может включать динамическую обработку данных или же выдавать статичную информацию на какую-то определённую дату.
Существует множество различных способов построения отчётов с помощью стандартных компонентов, однако для простого пользователя всегда проще выгружать отчётные данные в офисные приложения, а из них их уже выводить на печать. В нашем случае будем выгружать в Microsoft Office Excel.
Так как предметная область не большая, то сделаем не сложный отчёт, без каких-либо обработок. Создадим отчёт о увлеченности хобби.
Для этого создадим новую подчинённую форму. Поместим на неё панель поиска, компонент DBGrid с вкладки Data Controls, компонент HeaderControl с вкладки Win32, компонент PopupMenu с вкладки Standart и компонент SaveDialog с вкладки Dialogs.
В результате должна получиться форма представленная ниже на рисунке 22.
Рисунок 22 – Форма отчёта
Добавим в модуль данных компоненты ADOQuery с вкладки ADO, и DataSource с вкладки Data Access. Назовём их RepADOQuery и RepDataSource соответственно. В RepADOQuery будет храниться запрос отчёта.
Значения свойства DBGrid DataSource установить в DM.RepDataSource. В свойстве PopupMenu следует указать из выпадающего списка значение PopupMenu1.
Данное свойство появления выпадающего списка при нажатии правой клавиши мыши может быть определено для любого компонента формы, если в этом есть необходимость.
Дважды щёлкнув по компоненту PopupMenu1 откроем редактор меню и создадим всего один лишь пункт «Экспорт в Excell», как показано на рисунке 23.
Рисунок 23 – Редактор меню
Так по щелчку правой кнопки мыши, во время работы приложения, по DBGrid будет появляться это контекстное меню.
В событии создания формы в отличие от справочника «Сотрудники» запрос будет выглядеть другим образом. Код приведён ниже:
//формирование запроса DM.RepADOQuery.SQL.Add('SELECT HOBBY.H_ID, HOBBY.H_Name, Count(HOBBY.H_Name) AS [Count-H_Name] FROM SOTR INNER JOIN (HOBBY INNER JOIN HOBBY_SOTR ON HOBBY.H_ID = HOBBY_SOTR.H_ID) ON SOTR.S_ID = HOBBY_SOTR.S_ID GROUP BY HOBBY.H_ID, HOBBY.H_Name ORDER BY Count(HOBBY.H_Name) DESC;');
|
В событии onClick компонента PopupMenu1 нужно вызвать диалог сохранения, а потом путь указанного файла следует передать в процедуру экспорта данных из компонента ADOQuery. Код события onClick:
if SaveDialog1.Execute then SendtoExcel(SaveDialog1.FileName,DM.SotrQuery); |
Код самой процедуры приведён ниже:
Procedure SendtoExcel(ShFile: String; Querys: TADOQuery); Var ExcelApp, Workbook, Range, Cell1, Cell2,Cell3, ArrayData: Variant; BeginCol, BeginRow, j: integer; RowCount, ColCount: Integer; Begin BeginCol := 1; BeginRow := 1; // Размеры выводимого массива данных RowCount := Querys.RecordCount+1; ColCount := Querys.FieldDefs.Count; // Создание Excel ExcelApp := CreateOleObject('Excel.Application'); // Отключаем реакцию Excel на события, чтобы ускорить вывод информации ExcelApp.Application.EnableEvents:= false; // Создаем Книгу (Workbook) // Если заполняем шаблон, то Workbook := ExcelApp.WorkBooks.Add; WorkBook.SaveAs(ShFile); ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant); // Заполняем массив Querys.DisableControls; Querys.First; // заполняем шапку таблицы For J := 1 To Querys.FieldDefs.Count Do ArrayData[1, J]:=ReportForm.HeaderControl1.Sections.Items[j-1].Text; While Not Querys.eof Do Begin For J := 1 To Querys.FieldDefs.Count Do Begin ArrayData[Querys.RecNo+1,J]:=Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value; End; Querys.Next; End; Querys.EnableControls; // Зададим ширину колонок WorkBook.WorkSheets[1].Columns[1].ColumnWidth := 5; WorkBook.WorkSheets[1].Columns[2].ColumnWidth := 16; WorkBook.WorkSheets[1].Columns[3].ColumnWidth := 14; WorkBook.WorkSheets[1].Columns[4].ColumnWidth := 18; WorkBook.WorkSheets[1].Columns[5].ColumnWidth := 17; // Левая верхняя ячейка области, в которую будем выводить данные Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol]; // Правая нижняя ячейка области, в которую будем выводить данные Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1, BeginCol + ColCount - 1]; // Правая верхняя ячейка области Cell3 :=WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol + ColCount - 1]; // Область, в которую будем выводить данные Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2]; // А вот и сам вывод данных // Намного быстрее поячеечного присвоения Range.Value := ArrayData; // Делаем рамку Range.Borders.LineStyle:=1; // Выравнивам по центру по горизонтали Range.HorizontalAlignment := 3; // Задаём новый диапазон Range := WorkBook.WorkSheets[1].Range[Cell1, Cell3]; // Делаем шапку таблицы жирным шрифтом Range.Font.Bold := True; // Делаем Excel видимым ExcelApp.Visible := True; End; |
Для создания другого отчёта можно использовать эту же форму или же создать новую.
Создание запросов для отчетов
Все запросы, используемые в Delphi, сначала могут быть созданы в MS Access на вкладке Запросы.
При написании SQL-запросов в процессе выполнения работы, мы не пользовались MS Access, т.к. эти запросы были просты в исполнении и не требовали предварительной проработки.
Отчеты же обычно представляют собой сложные запросы, которые лучше всего отработать в конструкторе запросов MSAccess, а полученные результат использовать уже непосредственно в приложении Delphi.
После создания запроса MS Access, в режиме конструктора необходимо правой клавишей нажать на поле запроса и выбрать пункт “Режим SQL”, как показано на рисунке 24.
Рисунок 24 - Переход в режим SQL
После чего запрос появится в виде, представленном на рисунке 25. Полученный запрос копируется в Delphi с внесением некоторых коррективов, если это необходимо.
Рисунок 25 – Запрос в MS Access в режиме SQL
Использование построителя выражений в Access
Выражение — это сочетание нескольких (или всех) из указанных элементов: встроенные или пользовательские функции (Процедура Function. Процедура, которая возвращает значение и может быть использована в выражении. Описание такой процедуры начинается с инструкции Function и заканчивается инструкцией End Function.), идентификаторы (Идентификатор (выражения). Элемент выражения, определяющий ссылку на значение поля, элемента управления или свойства. Например, Forms![Заказы]![КодЗаказа] является идентификатором для значения элемента управления «КодЗаказа» в форме «Заказы».), операторы (Оператор. Знак или символ, задающий тип вычисления в выражении. Существуют математические, логические операторы, операторы сравнения и ссылок.) и константы (Константа. Постоянное (не вычисляемое) значение. Например, число 210 и текст «Квартальная премия» являются константами. Выражение и результат вычисления выражения константами не являются.) (рисунок 26). При вычислении выражения выводится одно значение.
Рисунок 26 - Выражение
Идентификаторы в выражениях. Общая форма идентификатора в выражении выглядит следующим образом:
[Имя семейства]![Имя объекта].[Имя свойства].
! Достаточно указать такое количество частей идентификатора, чтобы он был уникален в контексте выражения. Часто форма идентификатора принимает вид [Имя объекта].
Идентификатор включает имя идентифицируемого элемента, а также имя элемента к которому он принадлежит.
Примером идентификатора служит выражение: [Клиенты]![ДеньРождения].
Операторы идентификаторов. Существует три оператора, которые можно использовать в идентификаторах.
Оператор «восклицательный знак» (!)
Оператор «точка» (.)
Оператор «квадратные скобки» ([ ])
Каждая часть идентификатора заключается в квадратные скобки, а затем объединяется с другими частями с помощью операторов «восклицательный знак» и «точка». Например, идентификатор для поля «Фамилия» в таблице «Сотрудники» выглядит следующим образом: [Сотрудники]![Фамилия]. Оператор «восклицательный знак» означает, что следующий за ним элемент является объектом, принадлежащим семейству, предшествующему оператору «точка». В данном случае [Фамилия] — это объект-поле, принадлежащее семейству [Сотрудники], которое является объектом-таблицей.
! Не всегда обязательно заключать идентификатор или его часть в квадратные скобки. Если в идентификаторе не содержится пробелов или других специальных знаков, квадратные скобки будут добавлены автоматически. Однако самостоятельное включение квадратных скобок является хорошей практикой, так как позволяет избежать ошибок, а также служит визуальным обозначением идентификатора в выражении.
Функции в выражениях. Общая форма выражения, использующего функцию, выглядит следующим образом: Function(аргумент, аргумент), где один из аргументов обычно является идентификатором или выражением.
! Для некоторых функций аргументы не требуются.
Перед использованием конкретной функции просмотрите соответствующий раздел справки для более детальных сведений об используемом этой функцией синтаксисе.
! Если функция имеет более одного аргумента, эти аргументы разделяются запятыми.
Операторы в выражениях. Общая форма выражения, использующего оператор, выглядит следующим образом: Идентификатор оператор идентификатор.
Константы в выражениях. Общая форма выражения, использующего константу, выглядит следующим образом: Идентификатор оператор_сравнения константа.
В Access существуют четыре часто применяемых константы:
True Определяет значение, соответствующее логическому значению «Истина».
False Определяет значение, соответствующее логическому значению «Ложь».
Null Определяет неизвестное значение.
"" (пустая строка) Определяет известное пустое значение.
! Следует соблюдать осторожность при использовании константы Null. В большинстве случаев использование константы Null совместно с оператором сравнения будет приводить к ошибке. Если в выражении требуется сравнить значение с константой Null, используйте оператор Is Null или Is Not Null.
Построитель выражений выглядит так, как показано на рисунке 27.
Рисунок 27 - Построитель выражений
1. Поле выражения
2. Кнопки операторов
3.Элементы выражения
Запуск построителя выражений в запросе
В режиме конструктора, в бланке запроса выберите ячейку, которая будет содержать выражение. Например, выберите ячейку Условия столбца, для которого требуется установить условие, или выберите ячейку Поле столбца, в котором необходимо создать вычисляемое поле.
На вкладке Конструктор в группе Настройка запроса нажмите кнопку Построитель. Или нажмите правую клавишу мыши и выберите “Построить…” – рисунок 28 .
Рисунок 28 - Запуск построителя выражений
Запросы, содержащие вычисления на всем диапазоне записей (по строкам)
Создайте новый запрос и добавьте в него необходимые таблицы, запросы.
Выберете необходимые поля из таблиц, запросов.
Нажмите кнопку Групповые операции (Totals) на панели инструментов. В бланк запроса добавляется строка Групповая операция (Total), содержащая по умолчанию в каждой ячейке операцию Группировка (Group By).
Теперь нужно в строке Групповая операция (Total) задать необходимые статистические функции только для тех полей, для которых эти функции будут выполняться.
Например, необходимо посчитать количество заказов и общую сумму заказов того или иного клиента. Для поля "КодЗаказа" выбираем из списка функцию Сount, а для поля "Отпускная цена" — Sum, для всех остальных полей оставляем значение Группировка (Group By).