Передача условий фильтрации отчета в параметры запроса отчета
Здравствуйте!
[build: 3.2.0.86]
Проектирую отчет, который позволит увидеть сводные данные о деятельности пользователя на рабочем месте. Соответственно информацию о деятельности пользователя беру из различных источников. Например, количестве зарегистрированных заказов беру из таблицы tbl_Order, данные о количестве зарегистрированных документах из таблицы tbl_Document и т.д.
Естественно интересует информация за какой-то задаваемый период (т.е. от StartDate до DueDate). Данные за период должны фильтровать опять же от StartDate до DueDate и выводится в виде агрегированных данных (например: общее количество заказов за период зарегистрированных в период с StartDate до DueDate).
Думаю обрисовал решаемую мной задачу, теперь перейдем к на мой взгляд основной и единственной проблеме, которая мешает решить мне задачу:
Не могу передать данные из окна фильтрации в параметр запроса, чтобы потом их использовать во всех вложенных запросах получающих агрегированные данные.
Видел темы на форуме, в которых описано как передавать данные в сам объект отчета, но вот как получить доступ из отчета к запросу для меня остается загадкой.
Пожалуйста, разъясните как мне решить описанную выше проблему или предложите альтернативное решение. Заранее спасибо.
Нравится
Если я правильно понял Вашу задачу следующий код должен помочь. В отчете используется два датасета которые в начале фильтруются а уже потом передаются в отчет.
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
Спасибо, Иван.
Скорее всего вы используете "свое" окошко для фильтрации. Общую идею понял! действительно годится.
Сам реализовал другим образом. Создал специальное представление на сервере, которое собирает сведения из необходимых мне таблиц. В запросе отчета (построенном на основе представления) я сгруппировал необходимым мне образом данные.
Даты (StartDate, DueDate) для отображения непосредственно в самом отчете передавал из стандартного окошка для фильтрации (scr_BaseFastReportPreview):
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); }
При этом обязательно нужно создать переменные в отчете (еле нашел как это делается))) ).
Конфигурация:
TSCRM 3.2.0.87
Microsoft SQL Server 2005
ClientOS: Windows XP
Геннадий, в дополнение к теме, могу посоветовать ознакомиться с http://www.community.terrasoft.ua/blogs/7286
Спасибо, Алексей!
Действительно хорошее и очень подробное дополнение.