Интерактивный отчет FastReport

22 2

В DirectumRX используется весьма неплохой генератор отчетов FastReport. Он имеет мощный инструмент -- Матричный отчет, об использовании которого я писал здесь. Отчет может содержать нефиксированное количество колонок. Причем отчеты могут быть с суммированием (агрегированием), так и без него -- так называемые кросс-отчеты. Этой и многих других фич не имеют Сводные таблица от Microsoft Office Excel, а с применением PivotTable могут быть сложности практического использования. Также генератор имеет интерактивные возможности (пример). Это уже даже не отчет, а по сути интерактивная форма с детализацией как в Microsoft Office Access. Но, к сожалению, не все они могут быть использованы в нашем дизайнере как описано в справочнике: надо пробовать и иногда искать обходные пути. Поэтому экспериментируйте.

К слову сказать, расстраивает, что прямо из нашего дизайнера невозможно в процессе разработки отчета сделать preview изменений. Приходится тратить много времени: делать долгую сборку, запуск и смотреть устраивает ли даже мелкое изменение например размера шрифта и общей компоновки. Хотя в собственном дизайнере FastReport это возможно.

previewWindow

Предлагаю общую схему решений по аннотации

1. Реализация отчета план-фактного анализа аудиторских проверок (т.е. отчет без т.н. суммирования).

2. Превращение отчета в по сути интерактивную сводную форму с детализацией.

 

Пример реализации отчета план-фактного анализа

Опишу как я реализовал отчет план-фактного анализа аудиторских проверок (т.е. отчет без т.н. суммирования). Конечное представление - файл Excel. Ячейки данных должны раскрашиваться цветами фона в зависимости от своевременности проверок, показывать дату проверки и по гиперссылке в ячейке открывать документ акта проверки.

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

А вот с обработкой ячейки, использующей три значения -- цвет, дата и гиперссылка на док -- пришлось делать "костыль", т.к. переданные отдельно эти три значения почему-то не воспринимались матричным отчетом (хотя должны, переписка с техподдержкой генератора продолжается). "Костыль" в следующем: на стороне функции все три значения склеил в одну текстовую строку, а в обработчике события ячейки отчета добавил обратное расщепление:

private void Cell23_BeforePrint(object sender, EventArgs e)
{
  if (Cell23.Value != null)
  {
    char str = Cell23.Value.ToString()[0];
    if (str == 'з' || str == 'ж' || str == 'к' || str == 'л') 
    {
      Cell23.Text = Cell23.Value.ToString().Substring(1,5);  
      Cell23.Hyperlink.Value = Cell23.Value.ToString().Substring(6);
    }
  }  
}

Окрашивание фона

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

В результате получился такой отчет

 

Превращение отчета в интерактивную сводную форму 

Теперь более интересная возможность - превращение отчета в по сути интерактивную сводную форму с детализацией. В DRX скудный набор контролов для формы. Нет например интерактивного календаря для планирования как в Microsoft Outlook. А нам захотелось отображать текущую ситуацию с бронированием переговорок в более наглядном виде. Чтобы сотрудник выбирал нужное дату/время и переговорку в подобии календаря и кликал на ячейке. Эта операция должна отправить команду в DRX - создать бронь и присвоить подразумеваемые время и место.

Оказывается в DirectumRX есть такая возможность! Ее подсказал мне сотрудник техподдержки Вологжанин Павел: 

1. Создать клиентскую функцию в модуле;
2. Добавить для нее атрибут вида [Hyperlink]
3. В отчете формировать ссылку вида: http://localhost/DirectumRxLocal?module.id=05ed3b6f-3202-423d-bcbd-059a1e4264f1&module.func=createdocsfromoutlook&docId=12&counterpartyId=123, где:
   ● http://localhost/DirectumRxLocal - путь до сервера приложений;
   ● module.id=05ed3b6f-3202-423d-bcbd-059a1e4264f1 – guid модуля в котором реализована клиентская функция;
   ● module.func=createdocsfromoutlook - наименование клиентской функции;
   ● docId=12&counterpartyId=123 – параметры принимаемые клиентской функцией

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

Задача красиво решена, сотрудники довольны 

Александр Волошин

Добрый день. Чтобы не ошибиться в составлении гиперссылки на функцию можно воспользоваться классом Sungero.Core.Hyperlinks.Functions. Вызов следующий:

var url = Sungero.Core.Hyperlinks.Functions.Имя_Вашей_Функции();

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

Сергей Королев

Александр, это подразумевалось, приведен конкретный пример для простоты.

Сергей Королев: обновлено 22.10.2020 в 10:36

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