Добрый день!
Возникла следующая проблема:
есть окно, в нём есть 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);
[javascript]
function wnd_SelectDataExOnPrepare(Window) {
Initialize(Window);
//тормоза здесь
}
[/javascript]
дальше код идёт в функцию
[javascript]
function wnd_SelectDataExOnShow(Window) {
OpenSelectDataDataset();
LocateByKeyValue();
UpdateEditStatus();
SetFocusToEdit();
if (GetAttribute(Window, 'ExistsProductCategoryInOpportunity')) {
Timer.IsEnabled = true;
}
}
[/javascript]
в функции
[javascript]
OpenSelectDataDataset();
[/javascript]
[javascript]
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);
}
}
[/javascript]
[javascript]
function RefreshDataset(Dataset) {
CheckAssigned(Dataset, 'Dataset');
Dataset.Close();
Dataset.Open();
//тормоза здесь
}
[/javascript]
тормоза после Dataset.Open() во время выполнения
[javascript]
function dlDataOnDatasetAfterOpen(Dataset) {
UpdateButtonsByDataset(Dataset);
//тормоза здесь
}
[/javascript]
причем именно в функцию dlDataOnDatasetAfterOpen(Dataset) заходит количество раз равное по счету заполненному LookUpControl'у.
Видимо, из этого следует, что ошибка связана с тем, что во всех контролах используется один и тот же датасет с разным параметром фильтра, но не пойму где именно проблема.
Если я правильно понял - подвисает после UpdateButtonsByDataset
Тогда:
По всей видимости у вас к каждому окну выбора привязывается один и тот же экземпляр датасета.
Посмотрите срипт инициализации датасета\даталинка вашего wnd_SelectDataEx (если где-то есть GetSingleItemByUSI - заменить на Services.GetNewItemByUSI). В wnd_SelectData проблема росла бы отсюда:
[javascript]
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; // и потом тут
}
[/javascript]
не знаю механизмов вызова Dataset.Open() из Datalink'a, поэтому есть два варианта - у вас к одному экземпляру dlData (в wnd_SelectDataEx) привязывается много датасетов, либо наоборот ко многим dlData привязан один экземпляр датасета...
и еще вопрос (к разработчикам) - каким методом открывается окно выбора из лукап-контрола
а еще после OnDatasetAfterOpen отрабатывает OnDatasetAfterPositionChange - мб у вас есть это событие
Дмитрий, обычным Dataset.Open(). У справочного поля есть источник данных (указывается при добавлении справочного поля в датасет). При нажатии на лупу в даталукап-контроле именно этот датасет открывается. В обработчике OnPrepareSelectWindow можно дополнительно наложить фильтры.
Елена, сообщите, пожалуйста, удалось ли Вам решить проблему?
"Олейник Дмитрий" написал:обычным Dataset.Open()
Дмитрий, как бы мне этого не хотелось :wink:, не могу поверить, что окно выбора для лукап-контрола открывает таким образом
>и еще вопрос (к разработчикам) - каким методом открывается окно выбора из лукап-контрола
Если я правильно поняла Ваш вопрос, то в свойство контрола SelectWindowUSI надо прописать wnd_SelectData или wnd_MultiSelectData.
В событии OnPrepareSelectWindow можно фильтрвоать датасет, который отобюраджается в окне выбора:
как-то так
[javascript]
var Dataset = LookupControl.LookupDatasetLink.Dataset;
ApplyDatasetFilter(Dataset, 'FieldByDepartmentID', FieldByDepartmentID, true);
ApplyDatasetFilter(Dataset, 'FieldName', FieldName, true);
[/javascript]
свою проблему ещё не пробовала рещшать. Как только будут результаты (или их отсутствие), отпишусь.
ок, во избежание...
я знаю, про SelectWindowUSI и как отрываются датасеты - мне не понятно, что вызывается при нажатии на "лупу" - какой механизм считывает этот самый SelectWindowUSI и каким методом/функцией открывается окно справочника, но это уже не сабжу - я создам отд. тему
функция "откуда проблемы" выглядит так:
[javascript]
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');
}
[/javascript]
так что менять нечего. Что ещё можно попробовать?
Если в окне разбить контролы на 2 группы и в них указывать разные LookupDatasetLink, то начиная с контрола с новым линком (но тем же датасетом в линке) снова работает и открывает окно выбора быстро.
"Росинская Лена" написал:Если в окне разбить контролы на 2 группы и в них указывать разные LookupDatasetLink, то начиная с контрола с новым линком (но тем же датасетом в линке) снова работает и открывает окно выбора быстро.
Видимо, при нажатии на лупу срабатывает некое недокументированное (или я не нашел) событие/функция (к моему вопросу http://www.community.terrasoft.ru/forum/topic/10140), вызывающее инициализацию далалинка (который у вас получается уже проинициализированным n раз) с последующим открытием окна выбора.
Других причин не вижу, прямого решения тоже не вижу - это вопрос к разработчикам.
Варианты:
1) для каждого контрола сделать свой DatasetLink
2) попробовать следующее - для лукап-контролов на OnPrepareSelectWindow добавить
[javascript]
Control.LookupDatasetLink = Self.ComponentsByName('ВАШ_LookupDatasetLink');
[/javascript]
а на OnChange
[javascript]
Control.LookupDatasetLink = System.EmptyValue;
[/javascript]
Елена, напишите, пожалуйста, в ЛС номер телефона и время удобное для Вас. Хотелось бы подключиться посмотреть.
Спасибо!