Добрый день. Возникла проблема печати отчета различной структуры, то есть в зависимости от условия (например, тип документа), должен выводится один из 2-х отчетов. Я сделала их в subreport, но не знаю, как мне выводить один нужный мне?
Нравится
Свойство Filters есть у элементов SelectQuery, с которым связан датасет. К нему можно обратиться так: Dataset.SelectQuery.Items(i).Filters.
Если в SelectQuery есть соответствующий фильтр, применить его можно с помощью функции ApplyDatasetFilter(Dataset, FilterCode, FilterValue, Enabled), которая находится в скрипте scr_DB.
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Я думаю, лучше применять фильтр до формирования отчёта, в скриптах 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.
Попробуйте обращаться к датасету напрямую (только не по 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);
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.
Попробуйте так:
var Dataset = ReportPreviewer.DatasetByComponentName('...');
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
А ещё такой нюанс. Если в скрипте wnd_ReportFiltersScript сделать так, чтобы при одинаковых USI датасета Datalink был разный, то фильтры, которые накладываются перед печатью отчета в окне фильтров, применяются только для одного датасета, а для второго нет. Но я могу получить список нужных мне параметров, только как мне применить для датасета фильтр, если у меня не один параметр, а целый массив??