Технические вопросы
Разработка

Передача условий фильтрации отчета в параметры запроса отчета

Здравствуйте!

[build: 3.2.0.86]
Проектирую отчет, который позволит увидеть сводные данные о деятельности пользователя на рабочем месте. Соответственно информацию о деятельности пользователя беру из различных источников. Например, количестве зарегистрированных заказов беру из таблицы tbl_Order, данные о количестве зарегистрированных документах из таблицы tbl_Document и т.д.
Естественно интересует информация за какой-то задаваемый период (т.е. от StartDate до DueDate). Данные за период должны фильтровать опять же от StartDate до DueDate и выводится в виде агрегированных данных (например: общее количество заказов за период зарегистрированных в период с StartDate до DueDate).

Думаю обрисовал решаемую мной задачу, теперь перейдем к на мой взгляд основной и единственной проблеме, которая мешает решить мне задачу:
Не могу передать данные из окна фильтрации в параметр запроса, чтобы потом их использовать во всех вложенных запросах получающих агрегированные данные.

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

Пожалуйста, разъясните как мне решить описанную выше проблему или предложите альтернативное решение. Заранее спасибо.

Нравится

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

Если я правильно понял Вашу задачу следующий код должен помочь. В отчете используется два датасета которые в начале фильтруются а уже потом передаются в отчет.
[javascript]
var StartDate = edtStartDate.Value;
var EndDate = edtEndDate.Value;
if (StartDate >= EndDate)
{
ShowInformationDialog('Дата окончания периода должно быть больше начала!');
return;
}

var ActDataset = dlAct.Dataset;
var InvoiceDataset = dlInvoice.Dataset;
var Report = GetSingleItemByCode('fr_AktVerify');//сервис отчета
var ReportPreviewer = GetSingleItemByCode('wnd_BaseFastReportPreview');//ээ.. не знай превьювер отчета походу
var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');//Аттрибут
SetAttribute(ReportPreviewer, 'Report', Report);
Report.Attributes('StartDate') = StartDate;
Report.Attributes('EndDate') = EndDate;
ApplyDatasetFilter(ActDataset, 'StartDate', StartDate, true);
ApplyDatasetFilter(ActDataset, 'EndDate', EndDate, true);
ApplyDatasetFilter(ActDataset, 'ID', ContractID, true);

ApplyDatasetFilter(InvoiceDataset, 'StartDate', StartDate, true);
ApplyDatasetFilter(InvoiceDataset, 'EndDate', EndDate, true);
ApplyDatasetFilter(InvoiceDataset, 'ContractID', ContractID, true);

RefreshDataset(ActDataset);
RefreshDataset(InvoiceDataset);
ReportPreviewer.Build();
ReportPreviewer.Prepare();
ReportPreviewerComponent.DatasetByUSI('ds_Prerensiya') = ActDataset;//TODO
ReportPreviewerComponent.DatasetByUSI('ds_AktVerify') = InvoiceDataset;//TODO
[/javascript]

Спасибо, Иван.
Скорее всего вы используете "свое" окошко для фильтрации. Общую идею понял! действительно годится.

Сам реализовал другим образом. Создал специальное представление на сервере, которое собирает сведения из необходимых мне таблиц. В запросе отчета (построенном на основе представления) я сгруппировал необходимым мне образом данные.

Даты (StartDate, DueDate) для отображения непосредственно в самом отчете передавал из стандартного окошка для фильтрации (scr_BaseFastReportPreview):
[javascript]
function wnd_BaseFastReportPreviewOnNotify(ScriptableService, Sender, Message, Data) {

var Report = frpMain.Report;
var ReportCode = System.ExtractUSICode(Report.USI);

if (ReportCode == 'fr_ManagerActivity') // указываем код нашего отчета
{
var FilterBuilder = Sender.ComponentsByName('fbcMain');

var StartDate = FilterBuilder.DataFieldsList.Items(1).DisplayValue;
var DueDate = FilterBuilder.DataFieldsList.Items(2).DisplayValue;
Report.Attributes('StartDate') = StartDate;
Report.Attributes('DueDate') = DueDate;
}
ProcessNotify(Sender, Message);
}
[/javascript]

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

Конфигурация:
TSCRM 3.2.0.87
Microsoft SQL Server 2005
ClientOS: Windows XP

Геннадий, в дополнение к теме, могу посоветовать ознакомиться с http://www.community.terrasoft.ua/blogs/7286

Спасибо, Алексей!
Действительно хорошее и очень подробное дополнение.

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