Пользовательское окно фильтрации отчета

Добрый день.
Помогите пожалуйста решить вот такую прорблему.
Делаю пользовательское окно фильтрации для отчета.
В это окно на закладку подключил окно wnd_SimpleLookupReportFilter

Скрипт обработки этого окна привожу ниже
Проблема в том что выдается пустое окно, т.е. никакаие словари не инициализируются в окно wnd_SimpleLookupReportFilter

У меня версия 3.2.0.33

var FilterEngine = new Object();


function wnd_TimeExpendByProjectOnPrepare(Window) {
  debugger;
        FilterEngine.ReportPreviewer = GetAttribute(Window, 'ReportPreviewer');
        FilterEngine.Report = FilterEngine.ReportPreviewer.Report;
       
        FilterEngine.dsOpportunities = Services.GetNewItemByUSI('ds_Opportunity');
        FilterEngine.OpportunityFilterWindow = wnd_OpportunityFilter.Window;
        PrepareReportFilterWindow(FilterEngine.OpportunityFilterWindow,
        FilterEngine.dsOpportunities, 'ID', 'Title', 'OpportunityFilters');
         
        FilterEngine.dsOwners = Services.GetNewItemByUSI('ds_Contact');
        FilterEngine.OwnerFilterWindow = wnd_OwnerFilter.Window;
        PrepareReportFilterWindow(FilterEngine.OwnerFilterWindow,
        FilterEngine.dsOwners, 'ID', 'Name', 'OwnerFilters');
       
        FilterEngine.DateFilterWindow = wnd_DateFilter.Window;         

}


function StartPreview() {
        var ReportDatasetUSI = GetAttribute(Self, 'ReportDatasetUSI');
        FilterEngine.dsFilteredDataset = FilterEngine.ReportPreviewer.DatasetByUSI(ReportDatasetUSI);
       
        ApplyReportFilterWindow(FilterEngine.OwnerFilterWindow, FilterEngine.dsFilteredDataset, 'ContactID');
        ApplyReportFilterWindow(FilterEngine.OpportunityFilterWindow, FilterEngine.dsFilteredDataset, 'OpportunityID');
       
        FilterEngine.DateFilterWindow.ScriptControl.Run('AddDataset', FilterEngine.dsFilteredDataset,
                 'StartDate');
        FilterEngine.DateFilterWindow.ScriptControl.Run('ApplyFilter');
       
        SendNotify(Self, MSG_OK);      

}



// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------


function wnd_FilterTasksListOnPrepare(Window) {
debugger;
        PrepareWindow(Window);
}

function btOkOnClick(Control) {
        //TODO
        StartPreview();
}

function btnCanselOnClick(Control) {
  Self.Close();

        //TODO
}

Нравится

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

Так а функцию

function wnd_TimeExpendByProjectOnPrepare(Window) {
 ...
}

Вы в каком месте скрипта вызываете?

Может быть её нужно вызывать в

function wnd_FilterTasksListOnPrepare(Window) {
 ...
}

а не PrepareWindow(Window) ?

Добрый день.
Функция wnd_TimeExpendByProjectOnPrepare(Window) вызывается потом как раз в PrepareWindow(Window)

Мне кажется что проблемы в

PrepareReportFilterWindow(FilterEngine.OpportunityFilterWindow,      FilterEngine.dsOpportunities, 'ID', 'Title', 'OpportunityFilters');

В Scr_ReportUtils есть функция

function PrepareReportFilterWindow(Window, Dataset, LookupKeyFieldName, 
		LookupDisplayFieldName, UniqueFilterCode) {
	Dataset.Open();
	Window.Attributes('UniqueFilterCode') = UniqueFilterCode;
	Window.Prepare();		
	Window.Attributes('LookupDataset') = Dataset;
	Window.Attributes('LookupKeyFieldName') = LookupKeyFieldName;
	Window.Attributes('LookupDisplayFieldName') = LookupDisplayFieldName;	
	Window.Notify(Window, 'SelectDataFromDataset', null);	

Как я понимаю после вызова

Window.Notify(Window, 'SelectDataFromDataset', null);	

в моем окне должен сработать какой-то обработчик, но похоже ничего не срабатывает.

А примеров использования пользовательского окна фильтрации я не нашел.

Добрый день!

Проверьте, пожалуйста, в отладчике: после вызова Window.Notify(Window, 'SelectDataFromDataset', null) Вы должны попасть в скрипт wnd_SimpleLookupReportFilterScript на обработчик события wnd_SimpleLookupReportFilterOnNotify, а после него в функцию

function ProcessNotify(ASender, AMessage, Data) {
switch (AMessage) {
case 'SelectDataFromDataset':
InternalSelectDataFromDataset();
break;
case 'ApplyFilter':
InternalApplyFilter();
break;
case 'FillIncludeFilter':
FillIncludeFilter(ASender, Data);
break;
}
}

Проверьте, пожалуйста, происходит ли вход в эту функцию и как она дальше отрабатывает.

Добрый день.

Ну вот никуда она и не попадает.
После вызова Window.Notify ничего не происходит и отладчиком во внутрь зайти нельзя :-(

Кирилл, добрый день.

Вы не редактировали сервис окна wnd_SimpleLookupReportFilter? Проверьте, пожалуйста, определены ли для этого окна обработчики событий OnPrepare и OnNotify, а также совпадают ли эти обработчики с функциями wnd_SimpleLookupReportFilterOnPrepare и wnd_SimpleLookupReportFilterOnNotify в скрипте wnd_SimpleLookupReportFilterScript.

Добрый день, Олег.
Спасибо за помощь.
Сервис я не редактировал.
Для окна оба события определены.
функции в скрипте определены и совпадают. При этом событие OnPrepare выполняется, а onNotify нет.

Событие OnNotify ловится когда нажимаешь на кнопку Ok.
т.е. оно все-таки иногда срабатывает ... Ж8-[

Событие OnNotify и должно выполняться по нажатии кнопки OK. Вы ж его вызываете только в функции StartPreview: SendNotify(Self, MSG_OK). А эта функция срабатывает в обработчике btnOKOnClick.

Кстати, у Вас кнопка ОК называется "btnOk" или "btOk"? Я заметил в Вашем скрипте, что обработчик этой кнопки определён как btOkOnClick(Control). Проверьте, пожалуйста, в сервисе окна - указан ли этот обработчик на событие OnClick, или он всё-таки называется btnOkOnClick?

Если проблема не в этом, и всё прописано верно, выложите, пожалуйста, сервисы окна фильтрации и его скрипта для анализа проблемы. Заранее спасибо.

Добрый день.

Кнопка называется btOk и обработчики определены правильно.

В прикрепленном файле лежат сервисы моего окна со скриптом (wnd_TimeExpandByProject)
И на всякий случай сервисы с окном wnd_SimpleLookupReportFilter

Кирилл, добрый день.

На самом деле, в ядре реализовано так, что невозможно отправить нотификацию окну, у которого свойство IsVisible равно false. Поэтому она и не срабатывает во время OnPrepare.

Попробуйте решить проблему с помощью стандартного окна фильтрации, которое можно вызвать в окне дизайнера отчёта FastReport. Для этого необходимо, чтобы датасет отчёта содержал Lookup'ное поле связи с сущностью, по которой Вы хотите фильтровать отчёт (в Вашем случае OwnerID и OpportunityID). Дальше вызываете окно фильтрации (см. Screen1.bmp), добавляете в него нужное поле из датасета, по котором необходимо фильтровать (см. Screen2.bmp и Screen3.bmp). Для выбора значений вызывается окно wnd_MultiSelectData(Screen4.bmp), которое по функциональности лучше, чем wnd_SimpleLookupReportFilter.

Спасибо.
К сожалению с помощью стандартного окна фильтрации я решить проблему не могу. ;-( Т.к. проблемой, в значительной мере, является как раз разобраться как работает не стандартное окно... ;-)
Ну и главное там даты, я не могу их вставить в датасет. В запросе у меня суммы по группам, а группировать не по всем полям нельзя.
Попробую как-нибудь сделать это окно видимым или отправить это сообщние попозже.
В любом случае спасибо.

Можно попробовать, конечно, перед вызовом Window.Notify(Window, 'SelectDataFromDataset', null); вставить проверку:
if (!Window.IsVisible) {
Window.Show();
}
После этого нотификация сработает, я проверял.

На самом деле мы давно не используем окно wnd_SimpleLookupReportFilter в отчётах. Оно осталось ещё с версии 3.0.0 (скорее всего, для корректной работы отчётов, в которых оно использовалось). При создании отчётов лучше использовать по возможности стандартные фильтры, как я это описывал выше. Если же ими не обойтись, проще использовать своё окно. В обработчике btnOkOnClick можно получить отчёт: var Report = Self.Attributes('ReportPreviewer').Report;
в который при необходимости можно передать параметры из окна:
Report.Attributes('AttributeName') = edtControl.Value;

Также Вы можете получить датасет отчёта:
var Dataset = ReportPreviewer.DatasetByUSI('ds_ReportDataset');
и применить к нему нужную фильтрацию.

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