Добрый день.
Помогите пожалуйста решить вот такую прорблему.
Делаю пользовательское окно фильтрации для отчета.
В это окно на закладку подключил окно wnd_SimpleLookupReportFilter
Скрипт обработки этого окна привожу ниже
Проблема в том что выдается пустое окно, т.е. никакаие словари не инициализируются в окно wnd_SimpleLookupReportFilter
У меня версия 3.2.0.33
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
}
Нравится
Так а функцию
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');
и применить к нему нужную фильтрацию.