Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛБ(ПРИС)_Файл-сервер_2016.doc
Скачиваний:
5
Добавлен:
17.06.2023
Размер:
5.49 Mб
Скачать
  1. Отчёты и обработки

Отчёты в ИС – это специальным образом обработанные данные, которые пользователь может вывести на печать. Отчёт может включать динамическую обработку данных или же выдавать статичную информацию на какую-то определённую дату.

Существует множество различных способов построения отчётов с помощью стандартных компонентов, однако для простого пользователя всегда проще выгружать отчётные данные в офисные приложения, а из них их уже выводить на печать. В нашем случае будем выгружать в 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 - Запуск построителя выражений

Запросы, содержащие вычисления на всем диапазоне записей (по строкам)

  1. Создайте новый запрос и добавьте в него необходимые таблицы, запросы.

  2. Выберете необходимые поля из таблиц, запросов.

  3. Нажмите кнопку Групповые операции (Totals) на панели инструментов. В бланк запроса добавляется строка Групповая операция (Total), содержащая по умолчанию в каждой ячейке операцию Группировка (Group By).

  4. Теперь нужно в строке Групповая операция (Total) задать необходимые статистические функции только для тех полей, для которых эти функции будут выполняться.

Например, необходимо посчитать количество заказов и общую сумму заказов того или иного клиента. Для поля "КодЗаказа" выбираем из списка функцию Сount, а для поля "Отпускная цена" — Sum, для всех остальных полей оставляем значение Группировка (Group By).