Как заполучить данные, введенные в окне фильтрации отчета, и использовать их в скрипте и запросе, а только потом уже формировать сам отчет?
Нравится
Если при регистрации отчета в разделе "Отчеты" Вы укажете нужное окно фильтрации, то в обработчике события нажатия его кнопки ОК, например, Вы сможете передать отчету атрибуты следующим образом:
[javascript]
var ReportPreviewer = Self.Attributes('ReportPreviewer');
ReportPreviewer.Report.Attributes(AttributName) = AttributValue;
[/javascript]
тогда в сервисе отчета Fastreport Вы можете создать поле, которое будет отображать значение этого атрибута, явно указав в поле его имя в квадратных скобках ([AtributName]).
Аналогичным образом Вы можете добраться до датасета отчета и что-то передать ему.
Как вариант решение такое для штатного окна фильтра:
Допустим, в окне фильтрации (штатном, добавленном через FastReport) есть только один фильтр по дате. В отчете нужно получить отображение указанного там значения.
1. берем скрипт scr_BaseFastReportPreview
2. правим функцию ProcessNotify(ASender, AMessage)
[javascript]
function ProcessNotify(ASender, AMessage) {
if (AMessage == MSG_OK) {
AddFilterParametersToReport(ASender, frpMain.Report);
Self.Show();
} else
if (AMessage == MSG_CANCEL){
Self.Close();
}
}
[/javascript]
3. Теперь сама функция:
[javascript]
function AddFilterParametersToReport(FiltersForm, Report) {
// проверяем что нотифай отправлен окном фильтра
if (System.ExtractUSICode(FiltersForm.USI) != 'wnd_ReportFilters') {
return;
}
var ReportCode = System.ExtractUSICode(Report.USI);
var FilterBuilder = FiltersForm.ComponentsByName('fbcMain');
// Добавляем проверку по названию отчета
if (ReportCode == 'fr_Нужный_Отчет') {
if ((FilterBuilder.DataFieldsList.Items(0).Enabled)
&& (!IsEmptyValue(FilterBuilder.DataFieldsList.Items(0).Value))) {
Report.Attributes('StartDate') =
FilterBuilder.DataFieldsList.Items(0).Value;
} else {
Report.Attributes('StartDate') = ' ' ;
}
}
}
[/javascript]
В результате в отчете можно будет пользоваться новой переменной [StartDate]
Если фильтров в окне фильтра много, то ловим их значения аналогично, они идут по-порядку: Items(0), Items(1)...
ООО "Лайнсервис"
kudryashov@ls-crm.ru
Например, для того, чтобы из формы фильтрации передать период дат в отчет, можете попробовать выполнить следующее:
В скрипте scr_BaseFastReportPreview в обработчике события OnNotify для окна фильтрации – функции wnd_BaseFastReportPreviewOnNotify() прописать код следующего вида:
[javascript]
var Report = frpMain.Report;
var ReportCode = System.ExtractUSICode(Report.USI);
if (ReportCode == 'fr_ReportTasksByPeriod') // указываем код нашего отчета
{
var FilterBuilder = Sender.ComponentsByName('fbcMain');
if (FilterBuilder.DataFieldsList.Items(3).Enabled)
{
Report.Attributes('startOfPeriod') = FilterBuilder.DataFieldsList.Items(3).DisplayValue;
// startOfPeriod – название переменной; 3 – порядковый номер фильтра в окне фильтрации, начиная с // 0
}
else
{
Report.Attributes('startOfPeriod') = '';
}
}
[/javascript]
Возможно, в случае справочников проблема в DisplayValue, так как для справочника DisplayValue - это название или номер, а фильтрация идёт по Value (уникальный идентификатор). Попробуйте присваивать FilterBuilder.DataFieldsList.Items(3).DisplayValue;
Извиняюсь.
В смысле, вместо FilterBuilder.DataFieldsList.Items(3).DisplayValue;
использовать
FilterBuilder.DataFieldsList.Items(3).Value;