Show/Hide Toolbars

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

Примеры работы в Fast Report

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

Гиперссылка на карточку задачи

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

Способ 1

Гиперссылка формируется в настройках элемента.

fr_tips_link

Настройка гиперссылки на карточку задачи, 1 способ

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

[Settings.ApplicationPath]+"/MainTaskForm.aspx?TaskID="+ToString([Table.TaskID])

где [Table.TaskID] надо заменить на поле, содержащее ID задачи.

Для ссылки на профиль пользователя можно использовать такое выражение:

[Settings.ApplicationPath]+"/UserInfo.aspx?UserID="+ToString([Table.UserID])

где [Table.UserID] надо заменить на на поле, содержащее ID пользователя.

warning_icon  Для работы таких гиперссылок в источники данных должна быть добавлена служебная таблица Settings из вашей базы данных

fr_tips_settings

Добавление таблицы Settings как источника данных

Способ 2

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

fr_tips_link2

Настройка гиперссылки на карточку задачи, 2 способ

Внешний вид ссылки

Чтобы ссылка отображалась как гиперссылка (синим цветом и подчеркнутым шрифтом), надо отметить флажок "Изменить внешний вид объекта, чтобы он выглядел как ссылка". Если флажок не отмечен, то ссылка будет изменять вид лишь при наведении на нее мыши:

fr_tips_link_displayed

Отображение гиперссылки в режиме пользователя

Очистка от служебных символов и тегов

Если в настройках категории включен флажок "Разрешить HTML в тексте задачи", то при выводе в отчет теги могут приводить к некорректному отображению текста задачи (не все теги корректно распознаются FastReport-ом; при обрезании первых N символов текста может потеряться закрывающий тег, и т.п.).

Чтобы избежать этого, можно использовать функцию fnStripTags, которая удаляет из текста все теги (все, что находится между символами < и >).

Примеры использования:

SELECT dbo.fnStripTags(T.TaskText) as TaskText FROM TasksInSubcat11Denormalized T

Замена лишних символов в полном названии категории

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

В таблице Subcategories есть поле FullPath, которое хранит полный путь к категории, с названиями всех разделов и подразделов. В качестве символа-разделителя между названиями разделов используется служебный символ '\u2044' (это сделано для того, чтобы отличать символ '\' в названии категории от символа-разделителя).

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

REPLACE(Subcategories.FullPath, '\u2044', '\') as SubcatName

Исключение задач из служебных категорий

В таблице Tasks хранятся задачи из всех категорий, в том числе из служебных категорий "Общение" (чаты), "Календарь", "Личные задачи". В запросах иногда необходимо исключить эти задачи из отбора. Для этого можно использовать конкретные ID категорий в вашей базе данных, но в этом случае отчет будет не тиражируемым. Чтобы обеспечить возможность переноса отчета в другие базы данных, можно использовать служебную таблицу Settings, в которой хранятся ID этих служебных категорий:

поле CalendarSubcatID хранит ID категории "Календарь"

поле ChatSubcatID хранит ID категории "Общение"

поле PrivateSubcatID хранит ID категории "Личные задачи"

В запрос к таблице Tasks можно добавить строку:

WHERE (@SubcatExcludeID not like '%,'+CAST(Tasks.SubcatID as varchar(max))+',%')

где значение параметра @SubcatExcludeID задается, например, таким выражением:

  ","+ToString([Settings.ChatSubcatID])+","+ToString([Settings.CalendarSubcatID])+","

кликните мышкой по изображению чтобы увеличить его

Список значений, преобразованный в строку

warning_icon  Таблица Settings должна быть явно добавлена в отчет как источник данных (т.е. должна присутствовать в объекте Connection)

fr_tips_settings

Добавление таблицы Settings в источники данных

Множественный выбор по ID в фильтрах

Если параметр выбирается в фильтре как значение выпадающего списка с включенным признаком множественного выбора или как значение типа "Пользователь", "Орг.единица", "Группа" или "Категория", то такой параметр передается в отчет в виде строки со списком ID выбранных значений, разделенных запятыми:

123,456,789

warning_icon  Если ни одно значение не выбрано в выпадающем списке, то в отчет передается null, а если в значении типа "Пользователь", "Орг.единица", "Группа" или "Категория", то пустая строка.

Для работы со множеством значений в запросе можно использовать такой способ:

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

fr_tips_param_string

Дополнение значения параметра запятыми в начале и в конце

Результатом будет преобразование строки со списком значений к виду:

,123,456,789,

Если же в фильтре не было выбрано ни одно значение, т.е. изначально была передана пустая строка или null, то в параметре будет строка вида

,,

2. Теперь каждое значение в строке выделено запятыми с обеих сторон. Для проверки, входит ли ID в список выбранных в фильтре и переданных в параметр значений, достаточно дополнить значение самого проверяемого ID запятыми слева и справа и проверить, входит ли такая подстрока в строку со списком значений. Например, входит ли в строку ',123,456,789,' подстрока ',456,' где 456 — это проверяемый ID.

В SQL-запросе для проверки такого параметра можно использовать выражение вида:

WHERE ((@subcat = ',,') OR (CHARINDEX(','+CAST(T.SubcatID as varchar(max))+',', @subcat) > 0))

или

WHERE ((@subcat = ',,') OR (@subcat like '%,'+CAST(T.SubcatID as varchar(max))+',%'))

или функцию GetMultiValues:

WHERE ((@subcat = ',,') OR (CAST(T.SubcatID as varchar(max)) IN (SELECT [Value] FROM [dbo].[GetMultiValues](@subcat, ',')))

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

В шапке отчета, как правило, выводится список значений, выбранных в фильтре:

fr_tips_list

Список значений, преобразованный в строку

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

SELECT
 (select REPLACE(S.FullPath, '\u2044','\') +';  '
     FROM Subcategories S
     WHERE CHARINDEX(','+CAST(S.SubcatID as varchar(max))+',', @subcat) > 0
     FOR XML PATH('')
  ) as SubcatNames
FROM Subcategories

В примере таблица называется SubcatSelected. В шапке отчета текст может формироваться, например, следующим образом:

для пользователей в группах: [[FilterSubcat]==",,"?" — ":[SubcatSelected.SubcatNames]]

Примеры аналогичных таблиц и выражений для фильтра по пользователям и по категориям:

По пользователям

По группам

Если проверку вхождения значения в список выбранных в фильтре нужно добавить в код, можно использовать выражение вида:

// если в списке отображаемых показателей отмечен показатель "план"
if (Report.GetParameterValue("FilterColumns").ToString().Contains("план"))

warning_icon  Чтобы каждый элемент списка выводился с новой строки, для более удобного восприятия, используйте тег переноса строки

Перенос строки

Для переноса строки можно использовать html тег <br/>.

fr_tips_br_1

Использование тега <br/> в текстовом поле

Однако если тег используется не напрямую в поле, а в запросе, символы '<' и '>' подменяются на '&lt;' и '&gt;', и перенос строки не выполняется. Чтобы исправить это, в запрос можно добавить обратную замену символов.

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

SELECT REPLACE(  REPLACE(
  (select G.Descr+', <br/>'
  FROM Groups G
  WHERE CHARINDEX(','+CAST(G.GroupID as varchar(max))+',', @GroupID) > 0
  FOR XML PATH('')
  ), '&lt;', '<' ), '&gt;', '>' ) as GroupNames
FROM Groups

В этом случае шапка отчета будет выглядеть так:

fr_tips_br_2

Отображение результатов после обратной замены для тега <br/> в запросе

warning_icon Для поля должны быть включены html-теги:

fr_tips_br_3

Включение html-тегов для поля

Рабочие минуты как строка

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

Передаваемый в нее параметр — число рабочих минут. Оно может рассчитываться в SQL-запросе с помощью хранимой функции  dbo.tc_DiffWorkingMinutes(StartTime, EndTime).

В данной функции учитывается системная настройка "Число рабочих минут в дне". Поэтому для работы в отчет необходимо добавить таблицу Settings вашей базы данных.

fr_tips_settings

Добавление таблицы Settings в источники данных

Код функции для преобразования рабочих минут в строку

Эта функция может использоваться в текстовом поле или в ячейке таблицы:

fr_tips_diff_str

Использование функции в ячейке отчета.

Результат выглядит так:

fr_tips_diff_str_display

Отображение результата в ячейке отчета

Объем времени как строка

Если в отчете необходимо отобразить объем времени, затраченный на какую-то операцию, то обычно подсчет времени ведется в минутах, а полученный результат преобразуется в строку. Для такого преобразования можно использовать следующее выражение:

[TimeTotal] мин.    
([Format("{0:00} дн. {1:00} ч. {2:00} мин.", TimeSpan.FromMinutes([TimeTotal]).Days, TimeSpan.FromMinutes([TimeTotal]).Hours,

TimeSpan.FromMinutes([TimeTotal]).Minutes)])

Результат имеет вид:

853 мин.

(00 дн. 14 ч. 13 мин.)

Выгрузка в Excel с формулами

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

Имя колонки по номеру

Для автоматизации формирования формулы удобно использовать функцию, которая возвращает имя (букву) колонки по ее номеру (наприме, для 1 — A, для 2 — B и т.д.).

Имя колонки в Excel по номеру

Последовательность расчета формул

Если пользователи в дальнейшем будут работать с выгруженным файлом Excel, в том числе будут менять значения ячеек, то данные должны пересчитываться по формулам. В этом случае может быть важна последовательность расчета формул. Чтобы учесть эту последовательность, можно использовать следующее решение: В начало каждой формулы помещается цифра, определяющая очередность выполнения. Например, все формулы, начинающиеся с цифры 1, будут выполняться в первую очередь, все формулы, начинающиеся с 2 — во вторую очередь и т.д. Порядок выполнения формул в рамках одной очереди неважен.
Пример процедур в отчете

Для запуска очередности выполнения формул можно использовать макрос Excel. Этот макрос может быть сохранен в отдельном файле .xlam и загружаться/запускаться как AddIn.

Пример макроса