Show/Hide Toolbars

Руководство администратора

Настройка внешнего вида

Ссылки Назад Вверх Вперед

Выравнивание по сетке для выгрузки в Excel

При выгрузке отчета в Excel могут создаваться "лишние" строки и столбцы, которые мешают дальнейшей работе с данными. Они возникают из-за того, что элементы отчета не выровнены по сетке или "пересекаются" друг с другом. Поэтому после завершения разработки отчета рекомендуется выравнивать все созданные объекты по сетке и между собой.

Шаг выравнивания задается в настройках отчета и действует для всех страниц отчета.

fr_grid

Настройка шага выравнивания для отчета.

fr_grid_bad

Выгрузка отчета без выравнивания элементов по сетке, в результате появляется лишняя колонка.

fr_grid_good

Выгрузка отчета после выравнивания элементов по сетке.

Условное выделение

Часто в общем списке или в таблице значений нужно выделить отдельные элементы, соответствующие каким-либо условиям. Например, отрицательные значения в таблице выделять красным цветом; ячейки, в которых факт превышает план, подсвечивать желтым фоном, и т.п. Для этих целей используется условное выделение.

1. Чтобы настроить условное выделение, кликните мышью по нужному полю или ячейке таблицы и нажмите кнопку Условное выделение на панели инструментов. Откроется окно, в котором можно настраивать одно или несколько условий.
fr_tips_conv_1_zoom65

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

2. Чтобы добавить условие, нажмите кнопку Добавить и в открывшемся окне введите условие (проверочное выражение). В выражении можно обращаться к источникам данных, параметрам отчета, системным переменным, функциям и итогам.
fr_tips_conv_2_zoom75

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

3. После сохранения условия настройте для него стиль выделения — шрифт, фон и пр.

fr_tips_conv_3

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

Для обращения к значению полей отчета или ячеек таблицы используйте параметры Value или Text. Обращайте внимание на типы полей и значений.

Например:

Value > 100  — поле будет выделено, если значение самого поля больше 100;

ToInt32(Cell21.Value) > ToInt32(Cell32.Value) — поле будет выделено, если значение ячейки 21 больше значения ячейки 32;

Length(Cell11.Text) > 3 - поле будет выделено, если ячейка 11 содержит больше 3 символов.

Использование нескольких полей в проверочном выражении

Если надо сравнить значения нескольких полей отчета или ячеек таблицы — например, выделить красным фактические значения, если они превышают плановые — надо учитывать порядок заполнения полей и ячеек. К моменту проверки все поля/ячейки, к которым вы обращаетесь в проверочном выражении, должны быть уже сформированы и иметь значения.

Например, для сводной таблицы на скриншоте ниже проверку ToInt32(CellFact.Value) > ToInt32(CellPlan.Value) можно использовать в ячейке CellPlan, но не в CellFact, поскольку к моменту вывода CellFact значение в CellPlan для данной задачи еще не сформировано.

fr_tips_highlight_pivot

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

Для сводной таблицы может играть роль также порядок "отрисовки" — свойство Layout. Если Layout = DownThenAcross, то таблица выводится сверху вниз, а если Layout =  AcrossThenDown, то слева направо.

Границы ячеек таблицы

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

I способ

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

fr_grid_1

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

II способ

Сделать заливку (фон) ячеек не прозрачным, а белым или цветным. Тогда границы ячеек не отображаются жирным даже при наложении.

fr_grid_2

Настройка границ и фона для ячеек таблицы

warning_icon  Если фон ячейки не прозрачный (например, при условном выделении определенных значений), то для нее нужно рисовать все границы

Условное выделение в сводной таблице

В сводной таблице для условного выделения цветом отдельных ячеек используется свойство ячейки Value. Например, если надо выделить красным цветом значения меньше 100, то условие проверки будет выглядеть так:

  Value < 100

Если же надо сравнить значения нескольких ячеек — например, выделить красным фактические значения, если они превышают плановые — то необходимо обращаться к ячейке по ее названию. В этом случает выражение вида Cell123.Value возвращает тип "объект", который надо преобразовать к нужному типу, например, так:

  ToInt32(CellFact.Value) > ToInt32(CellPlan.Value)

Однако при таким обращении следует учитывать, что к моменту проверки обе эти ячейки должны быть уже сформированы и иметь значения. Например, для таблицы на рисунке ниже такую проверку можно использовать в ячейке CellPlan, а не CellFact, поскольку к моменту вывода CellFact значение в CellPlan для данной задачи TaskName еще не сформировано.

fr_tips_highlight_pivot

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

Может играть роль также порядок "отрисовки" сводной таблицы — ее свойство Layout. Если Layout = DownThenAcross, то таблица выводится сверху вниз, а если Layout =  AcrossThenDown, то слева направо.

Скрытие\отображение строк и колонок в сводной таблице в зависимости от условий

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

Скрытие полей или бэндов отчета

Пример: для подробного отчета отображается бэнд с детализацией данных, а для сокращенного представления этот бэнд скрывается.

fr_tips_displayed

Скрытие бэнда с подробными данными в зависимости от выбранного пользователем параметра фильтра

Чтобы управлять отображением и скрытием поля на странице отчета, достаточно присвоить нужное значение свойству Visible:

Data1.Visible = true

или

Data1.Visible = false

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

Пример 2: в отчете о трудозатратах пользователь может выбрать, какие данные он хочет просматривать: плановые трудозатраты (план), фактические трудозатраты (факт), остаток (т.е. план — факт). В зависимости от полей, отмеченных пользователем в фильтре, должны скрываться /отображаться колонки таблицы со сводными данными.

fr_tips_table_displayed

Скрытие колонки сводной таблицы в зависимости от выбранного пользователем параметра фильтра

Для строк и колонок сводной таблицы (pivot) использование свойства Visible не дает нужного результата. В этом случае можно использовать изменение ширины колонки или высоты строки:

// видимость колонки "Осталось" в зависимости от выбранной в фильтре детализации
     if (Report.GetParameterValue("FilterColumns").ToString().Contains("осталось") == false)
       ColumnRest.Width = 0;
     else
       ColumnRest.Width = 40;

Ширина колонки или высота строки в примере выше указывается в пикселях, но можно использовать и преобразование в сантиметры:

ColumnRest.Width = Units.Centimeters * 2; // 2 см

Обратите внимание, что для корректной работы этого способа скрытия/отображения колонок и строк необходимо следующее:

Отступы (Padding) в нужных колонках и строках должны быть убраны. Для колонок необходимо убрать отступы справа и слева, а для строк — отступы сверху и снизу

fr_tips_table

Нулевые отступы необходимы для скрытия строки\столбца

У колонок и строк свойство Autosize должно быть равно False. Чтобы отключить Autosize у колонок или строк, необходимо сначала отключить это свойство у всей таблицы. Также у колонок свойство MinWidth должно быть равно 0, а у строк свойство MinHeight должно быть равно 0.

fr_tips_table_2     fr_tips_table_3

Параметр Autosize для строки/столбца, которые необходимо скрывать, должен быть отключен

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

По умолчанию при выводе отчета он разбивается на страницы. Чтобы отчет выводился без разбиения на страницы, включите для страницы опцию unlimited height. Если в отчете несколько страниц, опции надо включать для каждой из них.

fr_tips_paging_2

Вывод отчета с разбиением на страницы

fr_tips_paging_3

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

Опцию unlimited width необходимо включать для сводных таблиц (pivot), которые "растут" в ширину.

Кликните мышью для просмотра изображения в полном размере

Вывод матрицы

Таблица в таблице

В дизайнере FastReport таблицы не могут быть вложены одна в другую. Если необходимо вывести отчет вида "таблица в таблице" (см рисунок ниже), то  это можно сымитировать с помощью текстовых полей.

fr_tips_table_inside_ex

Вложенная таблица

В этом отчете средняя часть выводится с помощью таблицы, а колонки слева и справа — с помощью текстовых полей. У текстовых полей есть свойство Duplicates, которое определяет отображение повторяющихся значений. В данном случае у всех текстовых полей этот параметр установлен в значение Merge, что означает объединение повторяющихся значений.

fr_tips_table_inside

Формирование вложенной таблицы

Спойлеры в отчете

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

Пусть в отчете выводится список групп, а по клику на символ + рядом с названием группы выводится список ее участников.

fr_tips_spoiler_1

Отчет со спойлером в интерфейсе пользователя

В дизайнере отчетов необходима группировка по названию группы. Для вывода символа свернутой/развернутой группы можно использовать элемент управления "флажок" (CheckBox). По умолчанию он отображается в виде галочки, но можно заменить его свойства CheckedSymbol  и UncheckedSymbol на плюс и минус соответственно.

fr_tips_spoiler_3

Отчет со спойлером в дизайнере отчетов

Также для флажка нужно настроить гиперссылку — при обработке клика по флажку из нее можно будет получить ID выбранной группы.

fr_tips_spoiler_2

Свойство Hyperlink для элемента CheckBox1

Также необходимо настроить автоматизацию: для заголовка группы — обработку события BeforePrint, а для флажка — события Click:

public class ReportScript
{
  private void GroupHeader1_BeforePrint(object sender, EventArgs e)
  {
    string groupId = ToString((Int32)Report.GetColumnValue("Table.GroupID"));
    bool groupVisible = expandedGroups.Contains(groupId);         // Получаем Id группы
   
    Data1.Visible = groupVisible;                                 // Устанавливаем видимость данных в соответствии с видимостью группы
    CheckBox1.Checked = !groupVisible;                             // Устанавливаем состояние флажка в зависимости от видимости группы
  }
  private List<string> expandedGroups = new List<string>();
 
  private void CheckBox1_Click(object sender, EventArgs e)
  {
    string groupId = (sender as CheckBoxObject).Hyperlink.Value;   // Получаем Id группы из гиперссылки
    if (expandedGroups.Contains(groupId))                         // Если список видимых групп содержит выбранную группу
      expandedGroups.Remove(groupId);                             // То удалить из списка видимых групп выбранную
    else
      expandedGroups.Add(groupId);                                 // Иначе добавить группу в список видимых
    Report.Refresh();                                             // Обновить отчет
  }
}

warning_icon При сворачивании и разворачивании группы отчет полностью обновляется. На больших объемах данных обновление может выполняться долго. Поэтому использовать спойлеры имеет смысл для небольших объемов данных.

Изображения из БД

В "Первой Форме" файлы, вложенные в задачи и в ДП "Файл", хранятся в отдельных файловых БД. Для каждого файлового провайдера создается отдельная БД, ее название можно посмотреть в настройках. В такой БД, как правило, содержится единственная таблица UploadFiles, в которой хранятся загруженные файлы.

Чтобы в отчетах использовать изображения, вложенные в задачу или в ДП "Файл", можно использовать объект "Рисунок" (Picture), а в свойстве DataColumn этого объекта указать поле FileContent из таблицы UploadFiles.

warning_icon  Чтобы изображение отображалось корректно, важно, чтобы в используемом файловом провайдере не было включено сжатие данных. Если изображения хранятся в ДП "Файл", для такого ДП можно использовать отдельный файловый провайдер с отключенной опцией сжатия.

Например, файлы, вложенные в задачу, можно получить с помощью такой процедуры (где @TaskID — номер задачи):

ALTER PROCEDURE [dbo].[take_files]
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX), @DB_NAME NVARCHAR(MAX)
 

-- выбираем файл-провайдера по умолчанию, в нем хранятся файлы, вложенные в задачи
select @DB_NAME = P.Name from dbo.FileProviders P where P.UseToWriteFiles = 1
 

-- формируем запрос к нужной файловой БД
set @SQL = 'SELECT U.FileContent, T.Description TaskText
     FROM  dbo.Tasks AS T

         INNER JOIN dbo.FileStorageFileToTaskLinks AS FT ON FT.TaskId = T.TaskID

         INNER JOIN dbo.FileStorageFileVersions AS FV ON FT.FileId = FV.FileId INNER JOIN ' +
         @DB_NAME + '.dbo.UploadFiles AS U ON FV.FileProviderKey = U.id
     WHERE (T.TaskID = @TaskID) AND (FT.IsDeleted = 0)'
 
EXEC (@SQL)
END

Файлы, вложенные в ДП в задаче, можно получить с помощью такой процедуры (где @TaskID — номер задачи, @ExtParamID — номер ДП "Файл"):

ALTER PROCEDURE [dbo].[take_files_ep]
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX), @DB_NAME NVARCHAR(MAX), @DB_NAME_EP NVARCHAR(MAX), @DB_NAME_DEFAULT NVARCHAR(MAX)
 

-- выбираем файл-провайдера для нужного ДП или берем файл-провайдера по умолчанию
select @DB_NAME_EP = P.Name from dbo.ExtParamsFileSettings S JOIN dbo.FileProviders P ON S.FileProviderID = P.ID where S.ExtParamID = @ExtParamID
select @DB_NAME_DEFAULT = P.Name from dbo.FileProviders P where P.UseToWriteFiles = 1
set @DB_NAME = IsNull(@DB_NAME_EP, @DB_NAME_DEFAULT)

 

-- формируем запрос к нужной файловой БД
set @SQL = 'SELECT U.FileContent, T.Description TaskText
     FROM  dbo.Tasks AS T

         INNER JOIN dbo.FileStorageFileToExtParamLinks AS FEP ON FEP.TaskId = T.TaskID AND FEP.ExtParamID = @ExtParamID

         INNER JOIN dbo.FileStorageFileVersions AS FV ON FEP.FileId = FV.FileId INNER JOIN ' +
          @DB_NAME + '.dbo.UploadFiles AS U ON FV.FileProviderKey = U.id
     WHERE (T.TaskID = @TaskID) AND (FEP.IsDeleted = 0)'
 
EXEC (@SQL)
END

Вы можете сначала создать хранимые процедуры и вызывать их в отчете при создании источника данных (например, exec take_files или exec take_files_ep) или можете поместить текст запроса непосредственно в окно источника данных:

fr_files_table

Текст запроса в окне создания источника данных

Если при создании такого источника данных поля не определились автоматически, их нужно создать вручную, указав значение Calculated = False:

fr_files_fields

Настройка полей для источника данных

fr_files_layout

Пример макета отчета

fr_files_result

Результат

Изменение порядка сортировки

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

В примере ниже по нажатию на шапку столбца данные в таблице сортируются по данному столбцу по убыванию значений.

fr_sorting

Сортировка данных в столбцах по клику на название столбца

Функция привязана к событию Click для элемента TextPlan — поля шапки столбца. Здесь Data1 — это название бэнда данных, Table — название таблицы-источника данных. В метод Sort.Add() передаются два параметра: название поля и порядок сортировки (true означает сортировку по убыванию, false — по возрастанию).

private void TextPlan_Click(object sender, EventArgs e)
   {
     Data1.Sort.Clear();
     Data1.Sort.Add(new Sort("[Table.Plan]", true));
     Report.Refresh();
   }

Таблица может быть отсортирована по двум и более столбцам, в этом случае потребуется последовательно вызвать метод Sort.Add() несколько раз. Аналогичные функции могут быть созданы, например, и для элементов TextFact, TextName и др. (см. скриншот выше).

Обратите внимание, что в текущей версии FastReport действуют следующие ограничения:

Изменение сортировки из кода работает только на главной странице отчета; если у отчета есть детальные страницы, то для них такой код сгенерирует ошибку;

Поле с названием (шапкой) столбца должно быть не ячейкой таблицы, а текстовым полем (Label).

Несколько разных страниц в отчете

Если в отчете выводится документ с несколькими разными разделами, для каждого раздела настраивается своя страница. По умолчанию при выгрузке в Word каждая новая страница отчета печатается с новой страницы. Чтобы новый раздел начал печататься на той же странице, где закончился предыдущий раздел, у соответствующей страницы отчета надо включить свойство PrintOnPreviousPage.

fr_diff_pages

Первая страница данного раздела продолжит печататься на той же странице, что и последняя страница предыдущего раздела

Сохранение форматирования при выгрузке в текстовый файл

При создании печатных форм документов особенно важно сохранять форматирование текстовых полей при выгрузке отчета в файл. Оптимальным решением является выгрузка отчета в формате RFT — он лучше сохраняет исходное форматирование (переносы строк, переносы между страницами, нестандартные шрифты или междустрочное расстояние, и т.п.), чем форматы DOCX или PDF.