Отчет - запрос, скрипт

Как заполучить данные, введенные в окне фильтрации отчета, и использовать их в скрипте и запросе, а только потом уже формировать сам отчет?

Нравится

8 комментариев

Если при регистрации отчета в разделе "Отчеты" Вы укажете нужное окно фильтрации, то в обработчике события нажатия его кнопки ОК, например, Вы сможете передать отчету атрибуты следующим образом:

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') = ''; 
}
}

Спасибо всем, получилось через FilterBuilder.DataFieldsList.Items(х).

Поправка.
С датами получилось отлично, а вот с данными справочников не выходит. Вроде все ок - выбираю данные из справочника в фильтр, а считывается - пустое значение.

ап

Возможно, в случае справочников проблема в DisplayValue, так как для справочника DisplayValue - это название или номер, а фильтрация идёт по Value (уникальный идентификатор). Попробуйте присваивать FilterBuilder.DataFieldsList.Items(3).DisplayValue;

Извиняюсь.

В смысле, вместо FilterBuilder.DataFieldsList.Items(3).DisplayValue;
использовать
FilterBuilder.DataFieldsList.Items(3).Value;

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