Добрый день.
С системой работаем недавно, поэтому даже тривиальные вещи вызывают вопросы :)
Есть следующая задача: при открытии формы редактирования Контрагента (Юрлица) вызвать окно с перечнем задач, определенных для этого Юрлица.
В процессе реализации возникло несколько вопросов.
В событии OnShow окна wnd_AccountEdit прописано wnd_BaseDBEditOnShow.
Вопрос 1: чтобы реализовать свой код в событии OnShow мне необходимо сначала вызвать базовую функцию (т.е. wnd_BaseDBEditOnShow) и только после этого писать свой код?
Вопрос 2: делаю так
// пока пробуем без фильтрации
taskWindow.Prepare();
taskWindow.Show();
окно задач отображается, однако оно пусто, и только после того как я сделаю переключение "Мои задачи" - "Все задачи" появляются задачи. Такое впечатление что не открывается Dataset.
С чем может быть связано такое поведение?
Заранее благодарен за помощь.
Нравится
"Сасин Артем Сергеевич" написал:Вопрос 1: чтобы реализовать свой код в событии OnShow мне необходимо сначала вызвать базовую функцию (т.е. wnd_BaseDBEditOnShow) и только после этого писать свой код?
Все верно.
"Сасин Артем Сергеевич" написал:
Вопрос 2: делаю такvar taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
// пока пробуем без фильтрации
taskWindow.Prepare();
taskWindow.Show();
окно задач отображается, однако оно пусто, и только после того как я сделаю переключение "Мои задачи" - "Все задачи" появляются задачи. Такое впечатление что не открывается Dataset.
Попробуйте так:
var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea'); // пока пробуем без фильтрации taskWindow.Prepare(); var dataset = taskWindow.ComponentsByName('dlData').Dataset; //ApplyDatasetFilter(dataset, 'AccountID', AccountID, true); dataset.Open(); taskWindow.Show();
"Валерий Андрусик" написал:Попробуйте так:
var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
// пока пробуем без фильтрации
taskWindow.Prepare();
var dataset = taskWindow.ComponentsByName('dlData').Dataset;
//ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);
dataset.Open();
taskWindow.Show();
Большое спасибо, все заработало.
Возникла еще одна проблема.
"Валерий Андрусик" написал:ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);
Фильтр отрабатывает только если в задачах есть хоть одна запись с указанным AccountID.
Если в задачах нет записей с указанным AccountID, то выводятся все задачи из таблицы.
В какую сторону смотреть?
Заранее благодарен за помощь.
Попробуйте такой вариант, это будет правильнее:
var taskWindow = Services.GetNewItemByUSI('wnd_TasksGridArea'); taskWindow.Attributes('ParentItemFieldName') = 'AccountID'; taskWindow.Attributes('ParentItemID') = AccountID; taskWindow.Prepare(); var dataset = taskWindow.ComponentsByName('dlData').Dataset; dataset.Open(); taskWindow.Show();
"Валерий Андрусик" написал:Попробуйте такой вариант, это будет правильнее:
var taskWindow = Services.GetNewItemByUSI('wnd_TasksGridArea');
taskWindow.Attributes('ParentItemFieldName') = 'AccountID';
taskWindow.Attributes('ParentItemID') = AccountID;
taskWindow.Prepare();
var dataset = taskWindow.ComponentsByName('dlData').Dataset;
dataset.Open();
taskWindow.Show();
К сожалению проблема не решилась.
Если использовать приведенный код, то отображаемая форма всегда показывает ВСЕ задачи.
Если же к нему добавить
ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);
То опять фильтр работает только если есть хоть одна запись с указанным AccountID.
Вообще странное поведение. Я посмотрел sql-запрос - вроде бы никаких подводных камней.
Заранее благодарен за помощь.
Проблема в том, что в sq_Task фильтр с кодом "AccountID" не простой фильтр сравнения, а набор фильтров. Для вашей задачи лучше сделать в sq_Task свой фильтр сравнения с кодом, например, "AccountID2" (и соответствующий параметр в sq_Task, м включать его вызовом ApplyDatasetFilter
"Валерий Андрусик" написал:Для вашей задачи лучше сделать в sq_Task свой фильтр сравнения с кодом, например, "AccountID2" (и соответствующий параметр в sq_Task, м включать его вызовом ApplyDatasetFilter
Спасибо огромное, все получилось.
Есть еще один общий вопрос. Добавил проверку не пуст ли Dataset, и если не пуст, то только потом показываю окно:
if (!IsDatasetEmpty(taskDataset)) { taskWindow.ShowModal(); }
Но перед этим у меня в любом случае выполняется:
taskWindow.Prepare();
Не нужно ли каким-то образом выполнять освобождение ресурсов, если я не собираюсь показывать окно?
Заранее благодарен за помощь.
Здравствуйте Артем Сергеевич,
В наших проектах мы память при вызове ShowModal() явным образом, не освобождаем.
С точки зрения экономии ресурсов создавать и не показывать окно плохо. Можно попробовать так:
var taskDataset = Services.GetNewItemByUSI('ds_Task'); ApplyDatasetFilter(taskDataset, 'AccountID2', AccountID, true); taskDataset.Open(); if (taskDataset.IsEmptyPage) { taskDataset.Close(); } else { var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea'); taskWindow.Prepare(); taskWindow.ComponentsByName('dlData').Dataset = taskDataset; taskWindow.Show(); }