Передача параметров в отчет

Здравствуйте.
Вопрос такой... Создаю отчет в фаст репорт, используя фильтр по 4м параметрам. Получаю нормальный, отфильтрованный датасет, который благополучно выводится в отчет.
Но вот вопрос - каким образом мне бы передать в отчет параметры этого фильтра???
Фильтр идет по поставщику, клиенту и датами начала и конца.
Вот эти 4 параметра мне и нужно видеть в отчете.

Нравится

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

Добрый день, Евгений!
Проще всего передать в отчет эти параметры через атрибуты отчета, например ReportPreviewer.Report.Attributes('StartDate') = new Date().getVarDate().

А вывести значение StartDate в отчете можно прописав в элементе управления [StartDate]. Уточните, пожалуйста, какую форму фильтрации Вы используете. Настраиваете в сервисе отчета стандартную или вызываете свое окно фильтрации? От этого зависит, как Вы будете получать значение интересующих Вас переменных перед записыванием их в атрибуты.

"Агутин Алексей" написал:ReportPreviewer.Report.Attributes('StartDate') = new Date().getVarDate().

Ну т.е. в скрипте я пишу

function btnOKOnClick(Control) {
var ReportWork = Services.GetNewItemByUSI('fr_CheckingActWork');
var ReportPrevWork = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');

//-----------------------
var ReportPreviewerComponent = ReportPrevWork.Attributes('ReportPreviewer');
SetAttribute(ReportPrevWork, 'Report', ReportWork);
//-----------------------

var ActsDS = Services.GetNewItemByUSI('ds_CheckingActWork');
var Param = ActsDS.SelectQuery.Parameters;
Param.ItemsByName('AccountID').Value = edAccount.Value;
Param.ItemsByName('SupplierID').Value = edSupplier.Value;
Param.ItemsByName('From').Value = edFrom.Value;
Param.ItemsByName('To').Value = edTo.Value;
ActsDS.Open();

ReportWork.Report.Attributes('MyAccount') = edAccount.Value;

ReportPrevWork.Build();
ReportPrevWork.Prepare();
ReportPreviewerComponent.DatasetByComponentName('ds_CheckingActWork') = ActsDS;
}

А потом в самом отчете просто кидаю текстовый объект c надписью [MyAccount] ??????

Так не работает :(

"Раловец Ольга" написал:А вывести значение StartDate в отчете можно прописав в элементе управления [StartDate]. Уточните, пожалуйста, какую форму фильтрации Вы используете. Настраиваете в сервисе отчета стандартную или вызываете свое окно фильтрации? От этого зависит, как Вы будете получать значение интересующих Вас переменных перед записыванием их в атрибуты.

Свое окно фильтрации

Попробуйте ReportPreviewerComponent.Report.Attributes('MyAccount') = edAccount.Value;

Ура!!!! Получилось вот так!!! Спасибо за выбор пути решения

function btnOKOnClick(Control) {
var ReportWork = Services.GetNewItemByUSI('fr_CheckingActWork');
var ReportPrevWork = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');

//-----------------------
var ReportPreviewerComponent = ReportPrevWork.Attributes('ReportPreviewer');
SetAttribute(ReportPrevWork, 'Report', ReportWork);
//-----------------------

var ActsDS = Services.GetNewItemByUSI('ds_CheckingActWork');
var Param = ActsDS.SelectQuery.Parameters;
Param.ItemsByName('AccountID').Value = edAccount.Value;
Param.ItemsByName('SupplierID').Value = edSupplier.Value;
Param.ItemsByName('From').Value = edFrom.Value;
Param.ItemsByName('To').Value = edTo.Value;
ActsDS.Open();

SetAttribute(ReportWork, 'MyAccount', edAccount.Value);

ReportPrevWork.Build();
ReportPrevWork.Prepare();
ReportPreviewerComponent.DatasetByComponentName('ds_CheckingActWork') = ActsDS;
}

Упс.... сейчас другой встал вопрос - в переменной [MyAccount] находится идентификатор... Можно ли по нему получить имя контрагента?

Если это LookupControl, то edtAccount.LookupDatasetLink.Dataset('Name').

Ольга, огромное спасибо :)

Не за что :)

А как можно передать некое значение в отчет, который вызывается с помощью ShowSingleRecordReport('fr_Report', 'ds_Report', ID) в обработчике напр. btnOkOnClick ?
При создании ds_Report в вычислемого поля в его изменить не удаётся:sad:

Можно отредактировать функцию ShowSingleRecordReport, добавив в неё нужное Вам значение, а потом передать его отчёту через атрибуты:

function ShowSingleRecordReport(ReportCode, FilteredDatasetCode, GridDatasetID, ValueForReport) {
var Report = Services.GetNewItemByUSI(ReportCode);
var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
ReportPreviewer.Attributes('ValueForReport') = ValueForReport;

var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
SetAttribute(ReportPreviewer, 'Report', Report);
ApplyDatasetFilter(ReportDataset, 'ID', GridDatasetID, true);
ReportPreviewer.Build();
ReportPreviewer.Prepare();
ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

Либо же создать свою функцию по аналогии с ShowSingleRecordReport.

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

Заработало, если только вместо

ReportPreviewer.Attributes('ValueForReport') = ValueForReport;
Report.Attributes('ValueForReport') = ValueForReport;

Спасибо!

"Раловец Ольга" написал:Уточните, пожалуйста, какую форму фильтрации Вы используете. Настраиваете в сервисе отчета стандартную или вызываете свое окно фильтрации? От этого зависит, как Вы будете получать значение интересующих Вас переменных перед записыванием их в атрибуты.

А можно пример передачи параметров в отчет при использовании стандартной формы фильтрации?

UPD: Поспешил:razz: Нашел вот здесь [url]http://community.terrasoft.ua/forum/topic/1210[/url]

В случае стандартной формы фильтрации параметры в отчёт можно передавать при обработке событий OnPrepare или OnPreview отчёта.

Если Вы хотите в отчёт передать значения из стандартной формы фильтрации, необходимо в обработчик события btnOKOnClick скрипта wnd_ReportFiltersScript после выполнения fbcMain.ApplyFilter() добавить строчку:

Self.Attributes('NotifyObject').Attributes('ReportPreviewer').FilterWindow = Self;

После этого в обработчике события OnPreview отчёта Вы сможете обратиться к окну фильтрации и его свойству FiltersBuilder так:

var FilterWindow = ReportPreviewer.FilterWindow;
var FiltersBuilder = FilterWindow.ComponentsByName('fbcMain').FiltersBuilder;

Через эти объекты появится возможность получить значения, которые пользователь укажет в окне фильтрации.

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

"Лабьяк Олег Игоревич" написал:После этого в обработчике события OnPreview отчёта Вы сможете обратиться к окну фильтрации и его свойству FiltersBuilder

А если нужно использовать данные ещё для некоторых вычислений, т.е. хотелось внести передаваемые параметры в датасет отчёта?

Во время обработки события OnPreview отчёта у Вас уже доступно окно фильтрации вместе с фильтрами и их значениями, указанными пользователем. Также есть возможность получить любой датасет отчёта:

var ReportDataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);

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

А можно поподробнее описать как в wnd_ReportFiltersScript
передать значение, например "fbcMain.DataFieldsList.Items(0).DisplayValue", и получить его в обработчике OnPreview?
А то уже пальцы стер с вариантами:confused:

Попробуйте ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).DisplayValue

Должно сработать, если Вы в скрипте wnd_ReportFiltersScript установили свойство FilterWindow для ReportPreviewer, как я рекомендовал в посте за 24 февраля.

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

Да, так получилось для дат.
По ходу выполнения появились ещё два вопроса:
1.Для фильтра по полю справочника при DataFieldsList.Items(х).DisplayValue - поле для отображения из датасета(так и должно быть)
а если узнать ID = DataFieldsList.Items(х).Values - пустое поле..
2.Полученные значения нужно внести в вычисляемое поле датасета отчета:

var ReportDataset = ReportPreviewer.DatasetByUSI('ds_MyReport');
ReportDataset.DisableEvents();
try {
ReportDataset.Values('DateFrom') = DateFrom.getVarDate();
ReportDataset.Post();
} finally {
ReportDataset.EnableEvents();
}

Ошибка: Невозможно изменить значение вычисляемого поля.

По первому вопросу - у меня работает так:

ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).Values.Items(0);

В результате получаем нужное значение ID. Также доступны значения

ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).Values.CommaText;
ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).Values.Text;

из которых можно получить ID выбранных значений.

Что касается второго вопроса - может быть, будет лучше передавать значение не в вычисляемое поле, а через параметр отчёта? Насколько я вижу, данные у Вас не зависят от полей датасета, а приходят извне, поэтому вполне можно обойтись параметрами.

Если же параметров отчёта недостаточно, попробуйте так:

ReportDataset.DisableEvents();
try {
ReportDataset.Open();
... <Ваши действия>
ReportDataset.Attributes(AttributeName) = AttributeValue;
ReportDataset.CalcDataFields();
} finally {
ReportDataset.Close();
ReportDataset.EnableEvents();
}

В обработчике события OnDatasetCalcFields заполняем вычисляемые поля:

function ds_AccountsListOnDatasetCalcFields(Dataset) {
	Dataset.Values(CalcFieldName) = Dataset.Attributes(AttributeName);
}

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

Всем доброго времени суток!
Подскажите, как передать ID выделенного документа в отчёт???

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

Спасибо:) работает

Прошу прощения, а как передать в отчёт даты из Workspace(dlDatePeriod).
У меня есть счета отфильтрированные за текущую неделю в разделе(еженедельный отчёт).
Как мне в отчёте отобразить за какую неделю этот отчёт, без использования доп окна фильтрации.
тобишь dlDatePeriod.Dataset.Values('From') и dlDatePeriod.Dataset.Values('From').
Заранее благодарен за ответ.

В меню "Отчеты" пункты добавляются динамически и вызывается базовый обработчик нажатия на них. Предлагаю исхитриться и при формировании этого списка (возможно, он формируется при первом обращении к меню) переопределить обработчик нажатия пункта меню, соответствующего Вашему отчету, и описать его в скрипте текущего раздела, то есть вместо стандартного вызвать свой. А в нем вызвать ShowReport(), ShowSingleRecordReport() или ShowSelectedRecordsReport() из scr_ReportUtils, смотря какая больше подойдет, но перед ее вызовом передать Ваши даты аналогичным образом:

ReportPreviewer.Attributes('ValueForReport') = ValueForReport;

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

список отчётов формируеться динамически при помощи скритого пукта Action Menu, но никто не мешает рядом добавить свой пункт вручную через редактирование форкспейса в администраторе.
Создал в воркспейсе свой пункт отчёта и прописал на него следуйщее

function amiSTIOnExecute(ActionMenuItem, Sender) {
 var SelItemsID = [ListToArray(Self.ComponentsByName('wndGridData').Window.ComponentsByName('grdData').SelectedIDs)];
 ShowSelectedRecordsSTIReport('fr_ReportSTI', 'ds_ReportAirticketsCard', SelItemsID, dtcFromDate.Value, dtcToDate.Value);	
}

при єтом функция ShowSelectedRecordsSTIReport получает два параметра dtcFromDate.Value, dtcToDate.Value и обрабатывает их следующим образом:

function ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode,
	GridDatasetIDs, FromDate, ToDate) {
	var Report = Services.GetNewItemByUSI(ReportCode);
	var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
	var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');

ReportPreviewer.Attributes('DateFrom') = FromDate;
ReportPreviewer.Attributes('DateTo') = ToDate;

        var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
	SetAttribute(ReportPreviewer, 'Report', Report);	
	var Select = GetSelectQueryPrimarySelect(ReportDataset.SelectQuery);
	var Filters = Select.Filters;
	Filter = Filters.ItemsByCode('IDs');
	if (!Assigned(Filter)) {
	    Filter = Filters.CreateIncludeFilter();
	    Filter.Code = 'IDs';
	    Filters.Add(Filter);
		Filter.TestExpression =
			Filter.CreateFieldFilterExpression();
		Filter.TestExpression.TableAlias =
			Select.FromTableAlias;
		Filter.TestExpression.Field =
			Select.FromTable.Fields.ItemsByName('ID');
	}
	var Enabled = (GridDatasetIDs.length > 0);
	ApplyDatasetIncludeFilter(ReportDataset, 'IDs', GridDatasetIDs, Enabled);		
	ReportPreviewer.Build();
	ReportPreviewer.Prepare();
	ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

Но если я вписываю в отчёте [DateFrom] и [DateTo], - отчёт открывается с ошибкой неизвестного определителя [DateFrom] и [DateTo]

Александр, добрый день.
Вы почти всё сделали правильно, за исключением строк, в которых присваиваете отчёту атрибуты.
Вместо:

ReportPreviewer.Attributes('DateFrom') = FromDate;
ReportPreviewer.Attributes('DateTo') = ToDate;

нужно написать:

Report.Attributes('DateFrom') = FromDate;
Report.Attributes('DateTo') = ToDate;

Пожалуйста, обратите внимание на комментарий Fishi от 15 февраля 2010 - 17:03.
Желаю успехов!

Спасибо Дмитрий, но пробовал делать как написано в комментарии от Fishi, - приводит к ошибке.
К тому же при множественном выборе возникает другая ошибка. Скрин во вложении.

В таком случае вставляйте первой строкой в функции ShowSelectedRecordsReport слово debugger, запускайте систему и отчёт и отлаживайтесь построчно.
Функции ToArray в стандартной версии не нашёл.
Есть предположение, что вместо строки:
var SelItemsID = [ToArray(Self.ComponentsByName('wndGridData').Window.ComponentsByName('grdData').SelectedIDs)];
нужно написать:
var SelectedIDs = wndGridData.Window.ComponentsByName('grdData').SelectedIDs;
var SelItemsID = GetArrayByCollection(SelectedIDs);

Только отладка построчно с просмотром значений в переменных подскажет, где ошибка. Идеологически путь передачи параметров выбран правильный.

"Гамора Дмитрий" написал:Функции ToArray в стандартной версии не нашёл

Сорри, копипаст глюконул :smile:- ListToArray();
Дебаггер подтвердил длинну массива 2 - и два индификатора в обработчике ShowSelectedRecordsReport.
Так же пришлось даты определить как:

 var DateFrom = dlDatePeriod.Dataset.Values('From');
 var DateTo = dlDatePeriod.Dataset.Values('To');

а не

var DateFrom = dtcFromDate.Value
var DateTo = dtcToDate.Value

И в результате вторая ошибка с Передачей параметров в отчёт исчезла(Передавались пустые даты).
Осталась только первая ошибка с множественным выбором.

Может нужно добавить инклуд фильтр IDs, но вроде он должен сам создаваться.Завтра отпишусь.

upd:Первая ошибка исчезла после замены:

"Гамора Дмитрий" написал:Есть предположение, что вместо строки:
var SelItemsID = [ListToArray(Self.ComponentsByName('wndGridData').Window.ComponentsByName('grdData').SelectedIDs)];
нужно написать:
var SelectedIDs = wndGridData.Window.ComponentsByName('grdData').SelectedIDs;
var SelItemsID = GetArrayByCollection(SelectedIDs);

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

Можно ли считать, что вопрос успешно решён?

Да, вопрос успешно решён.
Ещё раз спасибо.

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