Выбор subreport для печати

Добрый день. Возникла проблема печати отчета различной структуры, то есть в зависимости от условия (например, тип документа), должен выводится один из 2-х отчетов. Я сделала их в subreport, но не знаю, как мне выводить один нужный мне?

Нравится

22 комментария

Всё, разобралась сама.

Скажите, а можно в коде отчета наложить на датасет какой-нибудь дополнительный фильтр? Есть у dataset свойство Filter или что-нибудь подобное?

Свойство Filters есть у элементов SelectQuery, с которым связан датасет. К нему можно обратиться так: Dataset.SelectQuery.Items(i).Filters.

Если в SelectQuery есть соответствующий фильтр, применить его можно с помощью функции ApplyDatasetFilter(Dataset, FilterCode, FilterValue, Enabled), которая находится в скрипте scr_DB.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

я имела ввиду в коде отчета. к примеру у меня есть MasterData. К связанному с ней датасету я обращаюсь как MasterData3.DataSet. А как мне наложить на этот датасет дополнительный фильтр?

Я думаю, лучше применять фильтр до формирования отчёта, в скриптах Terrasoft (например, при обработке события OnPrepare отчёта). Если же задача требует применения фильтра именно в коде FastReport, это можно попробовать реализовать следующим образом:

1) Создаём окно, в качестве скрипта которого указываем нужный нам скрипт (в данном случае scr_DB).
2) Вызвать нужную функцию из кода отчёта можно так:

procedure MasterData3OnBeforePrint(Sender: TfrxComponent);
var Window: Variant;
begin
  Connector := MasterData3.Dataset.GetConnector();
  Window := Connector.Services.GetNewItemByUSI('wnd_OurWindow');
  Window.ScriptControl.Run('ApplyDatasetFilter',
       MasterData3.Dataset, FilterCode, FilterValue, Enabled);
end;

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо большое. Только он не понимает почему-то Connector.Services. Пишет Services undeclared identifier.

И ещё, скажите пожалуйста, где находится OnPrepare отчета???

OnPrepare нашла, но думаю, что не подойдёт. Ваш второй вариант мне очень подходит, вот только объект Services не воспринимается. Помогите пожалуйста.

Попробуйте обращаться к датасету напрямую (только не по USI, а по его свойству Name в сервисе FastReport): Connector := DatasetName.GetConnector();

Также добавьте объявление Connector:

procedure MasterData3OnBeforePrint(Sender: TfrxComponent);
var Window: Variant;
    Connector: Variant;
...

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо, теперь Services определяется. Но вылазит дебаггер, что Count есть null или не является объектом в функции

function EnableSelectQueryFilters(SelectQuery, Enabled, FilterCodesArray) {
	for (var i = 0; i < SelectQuery.Count; i++) {
		EnableFilters(SelectQuery.Items(i).Filters, Enabled, FilterCodesArray);
	}
}

Там почему-то SelectQuery undefined.
Функцию вызываю так :
Window.ScriptControl.Run('ApplyDatasetFilter',SingleMT, 'TypeID',MasterData3.DataSet.Value('TypeID') , True);

SingleMT это мой датасет

MasterData3.DataSet - это то же самое, что SingleMT, или это другой датасет? Убедитесь, что он открыт, иначе не получится установить значение для фильтрации. Также замените Value на Values.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

Ну тогда попробуйте так:

procedure MasterData3OnBeforePrint(Sender: TfrxComponent);
var Window: Variant;
    Dataset: Variant;
    Connector: Variant;
 
begin
  Connector := SingleMT.GetConnector();
  Window := Connector.Services.GetNewItemByUSI('wnd_OurWindow');
  Dataset := Connector.Services.GetNewItemByUSI(SingleMT.USI);                                                                                                      
  Window.ScriptControl.Run('ApplyDatasetFilter',
      Dataset, FilterName, FilterValue, true);      
end;

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Не получается у меня реализовать мою задачку. У меня в отчет на вход передаётся несколько ID-ов ТЗ. И мне нужно, чтобы в зависимости от типа ТЗ печатались отчеты. Т.е. к примеру я передаю 3 ID: 2 ID одного типа и 1 ID другого. Мне нужно, чтобы у меня напечатался отчет, в котором на первой и второй страницах будет одна структура с данными, а на третей странице другая (в зависимости от типа ТЗ). Это можно как-то реализовать в fastreport???

Думаю, эту задачу можно решить, не применяя фильтр в коде FastReport. Если вся необходимая информация содержится в одном датасете, создайте в отчёте FastReport два (или больше) объекта Dataset, которые будут ссылаться на один и тот же датасет программы Terrasoft. В обработчике события OnPrepare отчёта получаем эти датасеты по их коду в FastReport и применяем для каждого из них свой фильтр. В сервисе FastReport создаём разные страницы для каждого типа, в каждой из которых будет использоваться свой датасет. Далее в коде FastReport проверяем, содержат ли датасеты данные (например, в обработчике события OnStartReport отчёта), и если нет, устанавливаем свойство Visible соответствующей страницы равным false.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Скажите, а каким образом в обработчике события OnPrepare отчёта можно получить датасеты по их коду в FastReport?

Попробуйте так:

var Dataset = ReportPreviewer.DatasetByComponentName('...');

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

А несколько объектов Dataset могут ссылаться на один и тот же датасет программы? У меня вылазит дебаггер, что даталинк уже существует. А в fastreport указывается только USI, даталинк не указывается.

С данной проблемой разобралась, модифицировав немного скрипт wnd_ReportFiltersScript. Похоже это то, что надо. Спасибо большое за помощь.

А ещё такой нюанс. Если в скрипте wnd_ReportFiltersScript сделать так, чтобы при одинаковых USI датасета Datalink был разный, то фильтры, которые накладываются перед печатью отчета в окне фильтров, применяются только для одного датасета, а для второго нет. Но я могу получить список нужных мне параметров, только как мне применить для датасета фильтр, если у меня не один параметр, а целый массив??

Всё, разобралась сама. Спасибо за помощь.

Показать все комментарии