logo

[ELMA3] Нумерация строк и колонок в матричном отчёте

Как создавать матричные отчёты описано здесь: https://www.elma-bpm.ru/kb/article-505.html

Часто возникает ситуация, когда строки и/или колонки в таком отчёте требуется пронумеровать. Сделать это можно, используя программный код на странице Code (слева внизу на Рисунке 1).

В качестве примера создадим простой запрос в источнике данных отчёта:

select FULLNAME ФИО, month(EmployDate) Месяц, count(*) Количество
from "User"
group by fullname, month(EmployDate)

Затем перейдём на вкладку Макет отчёта и создадим Matrix-компонент в полоске Page Header. Для этого обратите внимание на вертикальную панель объектов отчёта слева. В ней нужно выбрать объект Matrix, нажать левой кнопкой мыши, переместить курсор мыши на полоску Page Header и нажать ещё раз левой кнопкой мыши. Таким образом, объект Matrix (сводная таблица) будет добавлена в отчёт. Подробнее о составе вкладки Макет отчёта можно узнать из справки.

– добавление сводной таблицы в отчет.

Перенесём поля ФИО, Месяц и Количество на матрицу из панели Data.

Рисунок 1

Подготовим код для нашего отчёта в закладке Code (слева внизу на Картинке 1):

using System;
using System.Collections;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using FastReport;
using FastReport.Data;
using FastReport.Dialog;
using FastReport.Barcode;
using FastReport.Table;
using FastReport.Utils;
namespace FastReport
{
  public class ReportScript
  {
    // метод, вызываемый в объекте Matrix в событии AfterData
    private void Matrix1_AfterData(object sender, EventArgs e)
    {
      // снятие метода AfterData для объекта ResultTable, если он был назначен ранее
      Matrix1.ResultTable.AfterData -= Matrix1ResultTable_AfterData;
     // назначение метода AfterData для объекта ResultTable
      Matrix1.ResultTable.AfterData += Matrix1ResultTable_AfterData;
    }
    
    private void Matrix1ResultTable_AfterData(object sender, EventArgs e)
    {
     // получаем таблицу результатов из sender
      TableResult table = sender as TableResult;

       
      // ------------------- новая строка с нумерацией колонок  ---------
      TableRow newRow = new TableRow();
     // добавляем строку в таблицу результатов
      table.Rows.Insert(1, newRow);
       // пробегаемся по всем ячейкам новой строки
      for (int i = 0; i < table.ColumnCount; i++)
      {
        // установить стиль для новых ячеек, используя стиль верхней левой ячейки
        table[i, 1].SetStyle(table[0,0]);
        // установить текст (# - для первого столбца и номер для остальных)
        table[i, 1].Text = i == 0 ? "#" : i.ToString();
      }
        
      // ------------------- новая колонка с нумерацией -------------------
      TableColumn newColumn = new TableColumn();
     // добавить новую колонку в таблицу результатов
      table.Columns.Insert(1, newColumn);
      // пробегаемся по всем ячейкам нового столбца
      for (int i = 0; i < table.RowCount; i++)
      {
       // установить стиль для новых ячеек, используя стиль верхней левой ячейки 
        table[1, i].SetStyle(table[0,0]);
        // проставим текст для каждой ячейки, кроме первой (это заголовок, оставим его пустым)
        if (i > 1)
          table[1, i].Text = (i - 1).ToString();
      }
      
      // количество фиксированных колонок увеличить на 1
      table.FixedColumns = 2;
      table.FixedRows = 2;
      
    }

  }
}

После того, как добавим этот код, пройдём в объект Matrix в отчёте.

Для этого надо нажать на значок в верхнем левом углу объекта Matrix. Справа внизу появятся свойства объекта:

В свойствах надо нажать на значок и откроются события этого объекта:

Здесь необходимо выбрать событие AfterData и выбрать из выпадающего меню метод Matrix_AfterData. Таким образом мы зададим обработчик события после получения данных в объекте Matrix.

Для проверки результата можете нажать вверху кнопку отладка:

В результате мы получим дополнительную строку с нумерацией колонок и колонку с нумерацией строк.