Добрый день!
Возникла следующая проблема:
есть окно, в нём есть LookupControl'ы и у каждого контрола свойство SelectWindowUSI = wnd_SelectDataEx. Контролов штук 10, с одним и тем же датасетом.
В функции события контролов LookupOnPrepareSelectWindow фильтруется этот датасет для каждого окна отедльно
debugger;
var FieldName = LookupControl.Caption;
if (FieldName == '') {
FieldName = 'Дальнейшие действия'
}
var TaskID = Self.ComponentsByName('dlData').Dataset.Values('TaskID');
var TaskDataset = Services.GetNewItemByUSI('ds_Task');
ApplyDatasetFilter(TaskDataset, 'ID', TaskID, true);
TaskDataset.Open();
var DepartmentID = TaskDataset.Values('ChannelID');
var DirectID = TaskDataset.Values('DirectID');
var FBDataset = Services.GetNewItemByUSI('ds_MeetingReportFieldByDepartment');
ApplyDatasetFilter(FBDataset, 'DepartmentID', DepartmentID, true);
ApplyDatasetFilter(FBDataset, 'FieldName', FieldName, true);
FBDataset.Open();
if ((FBDataset.RecordsCount == 1 ) && FBDataset.Values('DirectID') == null) {}
else {
FBDataset.Close();
ApplyDatasetFilter(FBDataset, 'DepartmentID', DepartmentID, true);
ApplyDatasetFilter(FBDataset, 'DirectID', DirectID, true);
ApplyDatasetFilter(FBDataset, 'FieldName', FieldName, true);
}
FBDataset.Open();
var FieldByDepartmentID = FBDataset.Values('ID');
var Dataset = LookupControl.LookupDatasetLink.Dataset;
ApplyDatasetFilter(Dataset, 'FieldByDepartmentID', FieldByDepartmentID, true);
ApplyDatasetFilter(Dataset, 'FieldName', FieldName, true);
}
а потом с каждым новым заполненным полем (в любом порядке, в любой последовательности) система начинает виснуть на OpenSelectDataDataset() в функции скрипта scr_SelectData
OpenSelectDataDataset();
LocateByKeyValue();
UpdateEditStatus();
SetFocusToEdit();
if (GetAttribute(Window, 'ExistsProductCategoryInOpportunity')) {
Timer.IsEnabled = true;
}
}
датасет не большой, около 15 записей, фильтруется в итоге правильно, но на последнем контроле виснет минут на 5, хотя первые окна для выбора открываются мгновенно. при этом во время подвисания нет запросов к базе (по крайненй мере, их не видно в профайлере).
Что делать и как искать проблему? спасибо.
Нравится
Виснет на OpenSelectDataDataset();
>Невижу нигде Dataset.Close() - да вроде и не нужно его закрывать, тем более что в моей функции он и не открывается.
"Росинская Лена" написал:Виснет на OpenSelectDataDataset();
а вы дебаггером не можете зайти внутрь функции и посмотреть, в каком месте там она зависает?
в скрипте scr_SelectData
сразу после функции Initialize(Window);
function wnd_SelectDataExOnPrepare(Window) { Initialize(Window); //тормоза здесь }
дальше код идёт в функцию
function wnd_SelectDataExOnShow(Window) { OpenSelectDataDataset(); LocateByKeyValue(); UpdateEditStatus(); SetFocusToEdit(); if (GetAttribute(Window, 'ExistsProductCategoryInOpportunity')) { Timer.IsEnabled = true; } }
в функции
OpenSelectDataDataset();
function OpenSelectDataDataset() { var IsFiltered = !IsEmptyStr(edtSearchFor.Value); if (SelectData.IsDBDataset){ if (IsFiltered) { SetSearchFilter(); } else { RemoveLikeFilters(); } } else { SelectData.Dataset.IsFiltered = false; if (IsFiltered) { SelectData.Dataset.IsFiltered = true; } } if (SelectData.NeedRefreshDataset) { RefreshDataset(SelectData.Dataset); } }
function RefreshDataset(Dataset) { CheckAssigned(Dataset, 'Dataset'); Dataset.Close(); Dataset.Open(); //тормоза здесь }
тормоза после Dataset.Open() во время выполнения
function dlDataOnDatasetAfterOpen(Dataset) { UpdateButtonsByDataset(Dataset); //тормоза здесь }
причем именно в функцию dlDataOnDatasetAfterOpen(Dataset) заходит количество раз равное по счету заполненному LookUpControl'у.
Видимо, из этого следует, что ошибка связана с тем, что во всех контролах используется один и тот же датасет с разным параметром фильтра, но не пойму где именно проблема.
Если я правильно понял - подвисает после UpdateButtonsByDataset
Тогда:
По всей видимости у вас к каждому окну выбора привязывается один и тот же экземпляр датасета.
Посмотрите срипт инициализации датасета\даталинка вашего wnd_SelectDataEx (если где-то есть GetSingleItemByUSI - заменить на Services.GetNewItemByUSI). В wnd_SelectData проблема росла бы отсюда:
function InitializeDataset(Window) { var SelectDataDatasetUSI = GetAttribute(Window, 'DatasetUSI'); if (!IsEmptyStr(SelectDataDatasetUSI)) { SelectData.Dataset = Services.GetNewItemByUSI(SelectDataDatasetUSI); // тут } else { SelectData.Dataset = GetAttribute(Window, 'Dataset'); // или тут } if (!GetAttribute(Window, 'CanNotModify')) { if (IsEmptyValue(SelectData.Dataset.Attributes('EditWindowUSI'))) { SelectData.EditWindowUSI = GetEditWindowUSIByDatasetUSIDef(SelectData.Dataset.USI); } else { SelectData.EditWindowUSI = SelectData.Dataset.Attributes('EditWindowUSI'); } } else { SelectData.EditWindowUSI = null; } SelectData.IsDBDataset = (SelectData.Dataset.ServiceTypeCode == 'DBDataset'); } function InitializeGlobalDatalinks() { if (!SelectData.IsDBDataset) { fbcFilters.DatasetLink = System.EmptyValue; } dlData.Dataset = SelectData.Dataset; // и потом тут }
не знаю механизмов вызова Dataset.Open() из Datalink'a, поэтому есть два варианта - у вас к одному экземпляру dlData (в wnd_SelectDataEx) привязывается много датасетов, либо наоборот ко многим dlData привязан один экземпляр датасета...
и еще вопрос (к разработчикам) - каким методом открывается окно выбора из лукап-контрола
а еще после OnDatasetAfterOpen отрабатывает OnDatasetAfterPositionChange - мб у вас есть это событие
Дмитрий, обычным Dataset.Open(). У справочного поля есть источник данных (указывается при добавлении справочного поля в датасет). При нажатии на лупу в даталукап-контроле именно этот датасет открывается. В обработчике OnPrepareSelectWindow можно дополнительно наложить фильтры.
Елена, сообщите, пожалуйста, удалось ли Вам решить проблему?
"Олейник Дмитрий" написал:обычным Dataset.Open()
Дмитрий, как бы мне этого не хотелось :wink:, не могу поверить, что окно выбора для лукап-контрола открывает таким образом
>и еще вопрос (к разработчикам) - каким методом открывается окно выбора из лукап-контрола
Если я правильно поняла Ваш вопрос, то в свойство контрола SelectWindowUSI надо прописать wnd_SelectData или wnd_MultiSelectData.
В событии OnPrepareSelectWindow можно фильтрвоать датасет, который отобюраджается в окне выбора:
как-то так
var Dataset = LookupControl.LookupDatasetLink.Dataset; ApplyDatasetFilter(Dataset, 'FieldByDepartmentID', FieldByDepartmentID, true); ApplyDatasetFilter(Dataset, 'FieldName', FieldName, true);
свою проблему ещё не пробовала рещшать. Как только будут результаты (или их отсутствие), отпишусь.
ок, во избежание...
я знаю, про SelectWindowUSI и как отрываются датасеты - мне не понятно, что вызывается при нажатии на "лупу" - какой механизм считывает этот самый SelectWindowUSI и каким методом/функцией открывается окно справочника, но это уже не сабжу - я создам отд. тему
функция "откуда проблемы" выглядит так:
function InitializeDataset(Window) { var SelectDataDatasetUSI = GetAttribute(Window, 'DatasetUSI'); if (!IsEmptyStr(SelectDataDatasetUSI)) { SelectData.Dataset = Services.GetNewItemByUSI(SelectDataDatasetUSI); } else { SelectData.Dataset = GetAttribute(Window, 'Dataset'); } if (!GetAttribute(Window, 'CanNotModify')) { if (IsEmptyValue(SelectData.Dataset.Attributes('EditWindowUSI'))) { SelectData.EditWindowUSI = GetEditWindowUSIByDatasetUSIDef(SelectData.Dataset.USI); } else { SelectData.EditWindowUSI = SelectData.Dataset.Attributes('EditWindowUSI'); } } else { SelectData.EditWindowUSI = null; } SelectData.IsDBDataset = (SelectData.Dataset.ServiceTypeCode == 'DBDataset'); }
так что менять нечего. Что ещё можно попробовать?
Если в окне разбить контролы на 2 группы и в них указывать разные LookupDatasetLink, то начиная с контрола с новым линком (но тем же датасетом в линке) снова работает и открывает окно выбора быстро.
"Росинская Лена" написал:Если в окне разбить контролы на 2 группы и в них указывать разные LookupDatasetLink, то начиная с контрола с новым линком (но тем же датасетом в линке) снова работает и открывает окно выбора быстро.
Видимо, при нажатии на лупу срабатывает некое недокументированное (или я не нашел) событие/функция (к моему вопросу http://www.community.terrasoft.ru/forum/topic/10140), вызывающее инициализацию далалинка (который у вас получается уже проинициализированным n раз) с последующим открытием окна выбора.
Других причин не вижу, прямого решения тоже не вижу - это вопрос к разработчикам.
Варианты:
1) для каждого контрола сделать свой DatasetLink
2) попробовать следующее - для лукап-контролов на OnPrepareSelectWindow добавить
Control.LookupDatasetLink = Self.ComponentsByName('ВАШ_LookupDatasetLink');
а на OnChange
Control.LookupDatasetLink = System.EmptyValue;
Елена, напишите, пожалуйста, в ЛС номер телефона и время удобное для Вас. Хотелось бы подключиться посмотреть.
Спасибо!