В нашей сегодняшней статье мы рассмотрим создание интерактивных отчетов.

FastReport предлагает несколько вариантов интерактивности, основные – использование группировочных бэндов и гиперссылки.

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

Вариант 1. Группировочные бэнды

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

Создадим новый запрос ODACQuery3 с текстом:

select *

  from trn      

 where trunc(dtrntran)>=to_date(:cus_date,'DD.MM.RRRR')

   and (ctrnaccd=:caccacc or ctrnaccc=:caccacc)                                                                   

 order by dtrntran, itrndocnum

Свяжем его с запросом по счетам: зададим значение свойства Master = ODACQuery2 (Рис. 1.). Значение параметра начальной даты выписки будем брать из переменной отчета, номер счета – по имени поля ведущего запроса (cACCacc) (Рис. 2.)

 

Рис. 1.

 

Рис. 2.

 

Добавим на страницу Page1 нашего отчета группировочные бэнды (Заголовок группы GroupHeader1 и бэнд с данными 3 уровня SubDetailData1). (Рис. 3.)

Рис. 3.

 

При создании заголовка группы нам будет предложено ввести условие прерывания группы (Рис. 4.)

Рис. 4.

 

В нашем случае – это номер счета из данных 2 уровня.

В бэнд заголовка группы скопируем поля из нашего бэнда данных 2 уровня (номер счета и остаток на нем), а сам бэнд данных 2 уровня DetailData1 скроем, причем сделаем это изменением высоты бэнда Height в 0, а не свойством Visible=false. Это делается для того, чтобы бэнд данных 3 уровня отображался, так как если мы выключим видимость бэнда 2 уровня – его детализация также будет скрыта при формировании печатной формы отчета. (Рис. 5.)

Рис. 5.

 

На бэнде с данными 3 уровня разместим поля из запроса ODACQuery3 – дату проводки, счета дебета и кредита, назначение платежа и сумму проводки в номинале и рублевом эквиваленте.

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

Обратим особое внимание на то, что при разворачивании группы отчет заново формируется (FastReport считает, что печатная форма уже готова, и для ее изменения необходимо провести полный перерасчет данных). Поэтому необходимо выполнить следующие действия:

1. В обработке нажатия кнопки ОК в диалоговом окне нужно выключить видимость диалога, чтобы он не выводился на экран всякий раз при разворачивании/сворачивании группы:

procedure Button1OnClick(Sender: TfrxComponent);
begin
  case ComboBox1.ItemIndex of
    0: ct:=1;
    1: ct:=2;
    2: ct:=4;
    3: ct:=-1;
  else
    ct:=-1;                            
  end;
  cd:=DateToStr(DateEdit1.Date);
  1. Visible := CheckBox1.Checked;
  2. Visible := False;
end;

2. В блоке запуска отчета нам необходимо перечитывать состояние полей диалогового окна, так как диалог нам повторно не показывается, а значения переменных, заполняемых из полей диалога – обнуляются при пересоздании печатной формы отчета:

begin
  if not DialogPage1.Visible then
    begin
      case ComboBox1.ItemIndex of
        0: ct:=1;
        1: ct:=2;
        2: ct:=4;
        3: ct:=-1;
      else
        ct:=-1;                            
      end;
      cd:=DateToStr(DateEdit1.Date);
    end;             

 Теперь при предпросмотре отчета мы видим наш обычный отчет (Рис. 6.)

Рис. 6.

Но при нажатии на строку с номером счета получаем следующий вид (Рис. 7.)

Рис. 7.

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

Вариант 2. Гиперссылки

В FastReport VCL 5 был добавлен способ управления интерактивностью отчетов без написания кода - объекту TfrxView добавили свойство Hyperlink: TfrxHyperlink (далее "гиперссылка"). Это свойство пришло на смену свойству TfrxView.URL из FastReport 4 и расширило его возможности.

У TfrxHyperlink есть два основных свойства - Kind и Value, и несколько вспомогательных - ValuesSeparator, ReportVariable, Expression, DetailPage, DetailReport.

Свойство Kind - это вид гиперссылки. Оно имеет тип TfrxHyperlinkKind и может принимать следующие значения:

  • hkURL - строка для запуска в ShellExecute (ссылка на сайт, документ, программу...);
  • hkAnchor - якорь (специальная именная метка, по которой определяется номер страницы и позиция на странице для перехода по гиперссылке; ее, например, удобно использовать для создания страницы с содержанием отчета);
  • hkPageNumber - номер страницы;
  • hkDetailPage - дополнительные страницы отчета (например, скрытая страница шаблона с детальным отчетом);
  • hkDetailReport - дополнительный отчет;
  • hkCustom - свойство Hyperlink игнорируется (например, если необходимо обработать только OnPreviewClick).

Свойство Value содержит значение, которое используется для перехода по клику на гиперссылку. Например, в нём можно указать имя якоря при Kind=hkAnchor, строку для запуска в ShellExecute при Kind=hkURL, номер страницы при Kind=hkPageNumber. Его значение может заполняться динамически с помощью формулы заданной в свойстве Expression.

Свойство DetailPage содержит название страницы в текущем шаблоне. При Kind= hkDetailPage по клику на гиперссылку в диалоге предварительного просмотра открывается дополнительная закладка в которую загружается часть отчета, которая сформирована на основании страницы шаблона, имя которой указано в свойстве DetailPage.

Свойство DetailReport содержит название шаблона в формате FastReport. При Kind=hkDetailReport по клику на гиперссылку в диалоге предварительного просмотра открывается дополнительная закладка, в которую загружается отчет сформированный по шаблону, указанному в свойстве DetailReport. При этом если в дополнительном отчете есть переменная с именем, указанным в свойстве ReportVariable, то ей присваивается значение свойства Value.

В нашем примере мы будем использовать вариант с Kind= hkDetailPage.

Для начала – создадим запрос ODACQuery4 без привязки к остальным запросам отчета. Текст запроса выглядит следующим образом:

select *
  from trn      
 where trunc(dtrntran)>=to_date(:cus_date,'DD.MM.RRRR')
   and (ctrnaccd=:p10 or ctrnaccc=:p10)                                                                   
 order by dtrntran, itrndocnum

В качестве параметров мы будем использовать переменную отчета cd для даты начала выписки и системную переменную отчета P10 для номера счета (Рис. 8.)

Рис. 8.

 

Далее создадим новую страницу отчета Page2 и разместим на ней шапку выписки и непосредственно бэнд с данными первого уровня MasterData2 (Рис. 9.)

Рис. 9.

 

Бэнд данных привяжем к нашему новому запросу ODACQuery4, в шапку выписки же будем передавать данные из переменных отчета.

Настало время для создания гиперссылки.

Для этого на бэнде детализации данных по клику правой кнопки мыши на поле номера счета (ODACQuery2.«CACCACC») выберем пункт «Гиперссылка…». Дизайнер отчетов предложит нам следующее окно настройки гиперссылки. Тип гиперссылки мы выбираем «Детальная страница отчета», в свойствах выставляем Страницу отчета – созданная нами на предыдущем шаге Page2 (можно выбрать из выпадающего списка), а для передачи значения поля (номера счета) используем переменную отчета Р10. Чтобы в нее передавался номер счета нажмем на кнопку справа от поля «или введите выражение, возвращающее значение переменной». В редакторе выражений перейдем на закладку «Поля БД» и выберем поле CACCACC из запроса ODACQuery2, дважды кликнув по нему мышкой.

Если вы хотите, чтобы поле при формировании отчета выглядело как гиперссылка – необходимо поставить соответствующую галочку в редакторе гиперссылки (внизу формы редактора) (Рис. 10).

Рис. 10.

 

Ну и остается последний штрих – заполнить переменные для шапки данными, для этого в переменные отчета добавим 2 переменных dt1 и dt2 типа string, а в блоке запуска отчета добавим 2 строки по их заполнению (выделены красным):

begin

  if not DialogPage1.Visible then
    begin
      case ComboBox1.ItemIndex of
        0: ct:=1;
        1: ct:=2;
        2: ct:=4;
        3: ct:=-1;
      else
        ct:=-1;                            
      end;
      cd:=DateToStr(DateEdit1.Date);
      dt1:=cd;
      dt2:=DateToStr(Now);                                           
    end;             

 

В окне предварительного просмотра при нажатии на номер счета теперь будет открываться дополнительная закладка отчета со страницей выписки по счету (Рис. 11.)

Рис. 11.

 

В нашей следующей статье мы рассмотрим создание CrossTab отчетов.

Узнать дополнительную информацию о функционале генератора отчетов FastReport, а так же задать интересующие вас вопросы, Вы всегда можете, обратившись в службу технической поддержки компании Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.