Как настроить OLAP в Delphi и использовать срезы данных для решения аналитических задач

21.10.2026

Как настроить OLAP в Delphi и использовать срезы данных для решения аналитических задач

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

  • складского учета и управления остатками;
  • производственного анализа и расчета себестоимости;
  • анализа продаж и временных рядов.

Например, OLAP-кубы (FastCube) позволяют решать эти задачи быстро, наглядно и без написания сложных SQL-запросов. В отличие от двухмерных таблиц, многомерные сводные таблицы дают возможность рассматривать данные под разными углами (срезами) в режиме реального времени.

В этой статье пошагово разберём процесс создания аналитического приложения в Delphi с использованием компонентов TfrGrid (для исходных данных) и TfcxSliceGrid (для построения сводки). 

 


 


Шаг 1. Визуализация сырых данных через TfrGrid

Прежде чем строить аналитику, необходимо увидеть исходную выборку. Для примера возьмем данные машиностроительного предприятия за 2025 год.

Нам понадобится компонент TfrGrid, он входит в состав FastReport VCL и доступен бесплатно в демоверсии.

  1. Найдите компонент TfrGrid на палитре инструментов Delphi.
  2. Поместите его на форму и установите свойство Align = alBottom (для закрепления внизу формы).
  3.  

Добавление компонента TfrGrid на форму

  1. Привяжите сетку к источнику данных (TDataSource) через контекстное меню frGrid1TableView1.

Привязка сетки к источнику данных через контекстное меню


 

Шаг 2. Настройка отображения и редактирования компонента

Главная особенность компонента-сетки — прямое редактирование ячеек (изменение исходных данных в поле БД). В FastGrid это реализовано через автоматическую подстановку редакторов в зависимости от типа поля. Например:

  • для дат – выпадающий календарь.
  • для чисел – SpinEdit.

Как настроить колонки

  1. Локализация. Нажмите на заголовок колонки, чтобы переименовать поля с технических названий на русский (например, Product → Название детали).

Добавление локализации для столбца «Дата»

  1. Ширина. Отрегулируйте ширину колонок вручную (режим Design-Time).

Ручная регулировка ширины столбцов в компоненте

  1. Стиль. Для улучшения читаемости установите разные цвета для четных и нечетных строк (BackgroundColorEven / BackgroundColorOdd).

Выбор стилей для чередования цвета строк

  1. Детальная настройка редакторов. При необходимости, точечно настройте свойства каждой колонки, выбрав один из вариантов редактора в свойстве под названием «Properties».

Детальная настройка редакторов через свойство «Properties»

Важно: на данном этапе мы получили интерфейс для просмотра и ручной коррекции исходных данных. Это ещё не конечный результат аналитики.

 


 

Шаг 3. Построение многомерного куба (OLAP) через FastCube

Теперь перейдем к главному инструменту — сводной таблице. Для этого используем компонент TfcxSliceGrid и привяжем его к тому же источнику данных, что и TfrGrid.

  1. Поместите на форму TfcxSliceGrid и установите Align = alClient (растянуть компонент на всю оставшуюся область).
  2. Добавьте разделитель TSplitter между TfrGrid и TfcxSliceGrid. Это позволит пользователю изменять размеры компонентов. Размер одного объекта будет увеличиваться за счет размера другого.

Добавление разделителя TSplitter

  1. Для связки с источником данных положите на форму цепочку компонентов:
  • TfcxDBDataSet → указываем DataSet (наш основной набор данных).
  • TfcxDataSource → связываем с TfcxDBDataSet. Через правый клик выбираем «Add all fields» (создать все поля).
  • TfcxCube → указываем DataSource и устанавливаем CubeSource = fccs_DataSource. Включаем свойство Active = True.
  • TfcxSlice → связываем свойство Cube с TfcxCube, а TfcxSliceGrid.Slice с TfcxSlice.

 

Шаг 4. Детальная настройка измерений (DateSplitPaths)

Для удобства работы с временными периодами необходимо настроить дробление даты:

  1.    В коллекции fcxDataSource.Fields выберите поле Date.

Список полей в коллекции fcxDataSource.Fields

  1. В свойстве SourceFieldProperties.SplitProperty.DateSplitPaths включите опции: Year, Month, Day. Это позволит использовать дату для иерархической группировки (год → месяц → день).

 


 

Шаг 5. Программная инициализация структуры отчета

Далее мы напишем обработчик события OnShow формы чтобы каждый раз при запуске не перетаскивать поля мышкой.

Код инициализации:

uses …, fcxTypes;
procedure TForm1.FormShow(Sender: TObject);
var
  LIndex: Integer;
begin
  fcxSlice1.BeginUpdate;
  try
// Добавление полей в область Фильтров
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Machine'], 'Machine', 'Станок');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Date'], 'Date', 'Дата');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Department'], 'Department', 'Участок');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Shift'], 'Shift', 'Смена');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Operator'], 'Operator', 'Оператор');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Product'], 'Product', 'Изделие');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Product_Category'], 'Product_Category', 'Категория изделия');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Work_Order'], 'Work_Order', 'Заказ изделия');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Downtime_Reason'], 'Downtime_Reason', 'Причина простоя');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Plant'], 'Plant', 'Цех');
 
// Добавление полей в область Строк
    fcxSlice1.YAxisContainer.AddDimension(fcxSlice1.SliceFields.ItemByName['Supervisor'], 'Supervisor', 'Мастер');
 
// Задание полей с данными
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Planned_Qty'], 'Planned_Qty', 'План, шт', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
    fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Produced_Qty'], 'Produced_Qty', 'Выпущено, шт', af_Sum);
    fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Defective_Qty'], 'Defective_Qty', 'Брак, шт', af_Sum);
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Operating_Hours'], 'Operating_Hours', 'Время работы, ч', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Downtime_min'], 'Downtime_min', 'Простой, мин', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Unit_Cost'], 'Unit_Cost', 'Себестоимость', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
 
// Добавление полей в область Данных
    fcxSlice1.XAxisContainer.AddMeasuresField;
  finally
// Перестроение таблицы происходит только здесь
    fcxSlice1.EndUpdate;
  end;
end;

Использование BeginUpdate и EndUpdate критически важно для производительности, так как предотвращает многократные перерисовки интерфейса при добавлении каждого поля.

 


 

Шаг 6. Бизнес-выводы на основе полученных срезов

Сгенерировав отчет, мы можем мгновенно находить аномалии, просто перетаскивая поля мышью (Drag-and-Drop). Рассмотрим 3 примера того, как OLAP помогает в реальных задачах.

Пример 1. Выявление лучших сотрудников

В полученной сетке выставляем следующие группировки: «Мастер» по оси Y, «Брак» по оси X.

Пример 1. Выявление лучших сотрудников

Делаем вывод. Если у мастера Смирнова уровень брака подозрительно низкий, это сигнал к изучению его методов работы или повод для премирования. Данные подсказывают, где искать лучшие практики.

 

Пример 2. Оценка эффективности смен

Меняем правила группировки. Теперь «Смена» — в оси Y; «План, Выпуск, Брак» — в оси X.

Пример 2. Оценка эффективности смен

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

 

Пример 3. Анализ оборудования (уровень брака)

Ещё раз меняем параметры группировки. На этот раз «Тип станка» по оси Y, «Брак» по оси X.

Пример 3. Анализ оборудования (уровень брака)

Резюмируем. Если у конкретного типа станков значение брака существенно превышает средний показатель, необходима замена оснастки или ремонт.

 


 

Возможности для углубленного анализа

Демонстрация использования FastCube для глубокого анализа данных

FastCube позволяет строить множество срезов различной сложности:

  • себестоимость по категориям и наименованиям изделий;
  • динамика простоев (например, рост простоев летом из-за отпусков);
  • факторный анализ (себестоимость шестерни оказалась самой высокой).

Важные функции:

  • Детализация (Drill-down). Двойной клик по ячейке сводной таблицы показывает список исходных строк, из которых состоит агрегат.
  • Агрегация в FastGrid. TfrGrid тоже умеет показывать суммы и средние значения, но FastCube делает это более гибко.

 


 

Заключение

Связка FastGrid + FastCube в среде Delphi/Lazarus — это готовое решение для внедрения BI-аналитики в корпоративные приложения. Вы получаете:

  1. Редактирование сырых данных через FastGrid.
  2. Мгновенную многомерную аналитику через FastCube без сложностей с SQL.
  3. Визуализацию скрытых закономерностей для принятия решений.

Попробуйте все перечисленные функции в демонстрационной версии FastReport VCL на нашем сайте.

VCL FastCube OLAP Delphi FastGrid
26 октября 2026

TfrImageComboBox: выпадающий список с изображениями и текстовыми подписями в FastReport VCL

TfrImageComboBox из FastEditors VCL: выпадающий список с иконками и подписями для FastReport VCL. Свойства, события и примеры использования в Delphi.
26 октября 2026

Прогресс-бар в Delphi: компоненты TfrProgressBar и TfrxProgressBar из FastReport VCL

Разбираем компоненты TfrProgressBar и TfrxProgressBar из FastReport VCL: настройка шкалы прогресса, пороги и маркеры, привязка к данным и пример на Delphi.
23 октября 2026

FastGrid изнутри: объект View, колонки и события компонента сетки Delphi

Внутреннее устройство FastGrid: объект View, свойство Appearance, колонки, события и режимы работы с данными DB и Unbound в Delphi. Разбор на примере демо-проекта GridDemo.dpr.

Не является публичной офертой
© 1998-2026 ООО «Быстрые отчеты»