Как заполучить данные, введенные в окне фильтрации отчета, и использовать их в скрипте и запросе, а только потом уже формировать сам отчет?
Нравится
Если при регистрации отчета в разделе "Отчеты" Вы укажете нужное окно фильтрации, то в обработчике события нажатия его кнопки ОК, например, Вы сможете передать отчету атрибуты следующим образом:
var ReportPreviewer = Self.Attributes('ReportPreviewer'); ReportPreviewer.Report.Attributes(AttributName) = AttributValue;
тогда в сервисе отчета Fastreport Вы можете создать поле, которое будет отображать значение этого атрибута, явно указав в поле его имя в квадратных скобках ([AtributName]).
Аналогичным образом Вы можете добраться до датасета отчета и что-то передать ему.
Как вариант решение такое для штатного окна фильтра:
Допустим, в окне фильтрации (штатном, добавленном через FastReport) есть только один фильтр по дате. В отчете нужно получить отображение указанного там значения.
1. берем скрипт scr_BaseFastReportPreview
2. правим функцию ProcessNotify(ASender, AMessage)
function ProcessNotify(ASender, AMessage) { if (AMessage == MSG_OK) { AddFilterParametersToReport(ASender, frpMain.Report); Self.Show(); } else if (AMessage == MSG_CANCEL){ Self.Close(); } }
3. Теперь сама функция:
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') = ' ' ; } } }
В результате в отчете можно будет пользоваться новой переменной [StartDate]
Если фильтров в окне фильтра много, то ловим их значения аналогично, они идут по-порядку: Items(0), Items(1)...
ООО "Лайнсервис"
kudryashov@ls-crm.ru
Например, для того, чтобы из формы фильтрации передать период дат в отчет, можете попробовать выполнить следующее:
В скрипте scr_BaseFastReportPreview в обработчике события OnNotify для окна фильтрации – функции wnd_BaseFastReportPreviewOnNotify() прописать код следующего вида:
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') = ''; } }
Возможно, в случае справочников проблема в DisplayValue, так как для справочника DisplayValue - это название или номер, а фильтрация идёт по Value (уникальный идентификатор). Попробуйте присваивать FilterBuilder.DataFieldsList.Items(3).DisplayValue;
Извиняюсь.
В смысле, вместо FilterBuilder.DataFieldsList.Items(3).DisplayValue;
использовать
FilterBuilder.DataFieldsList.Items(3).Value;