Передача условий фильтрации отчета в параметры запроса отчета
Здравствуйте!
[build: 3.2.0.86]
Проектирую отчет, который позволит увидеть сводные данные о деятельности пользователя на рабочем месте. Соответственно информацию о деятельности пользователя беру из различных источников. Например, количестве зарегистрированных заказов беру из таблицы tbl_Order, данные о количестве зарегистрированных документах из таблицы tbl_Document и т.д.
Естественно интересует информация за какой-то задаваемый период (т.е. от StartDate до DueDate). Данные за период должны фильтровать опять же от StartDate до DueDate и выводится в виде агрегированных данных (например: общее количество заказов за период зарегистрированных в период с StartDate до DueDate).
Думаю обрисовал решаемую мной задачу, теперь перейдем к на мой взгляд основной и единственной проблеме, которая мешает решить мне задачу:
Не могу передать данные из окна фильтрации в параметр запроса, чтобы потом их использовать во всех вложенных запросах получающих агрегированные данные.
Видел темы на форуме, в которых описано как передавать данные в сам объект отчета, но вот как получить доступ из отчета к запросу для меня остается загадкой.
Пожалуйста, разъясните как мне решить описанную выше проблему или предложите альтернативное решение. Заранее спасибо.
Нравится
Если я правильно понял Вашу задачу следующий код должен помочь. В отчете используется два датасета которые в начале фильтруются а уже потом передаются в отчет.
[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
Спасибо, Алексей!
Действительно хорошее и очень подробное дополнение.