Тормоза системы при открытии датасета

Добрый день!

Возникла следующая проблема:

есть окно, в нём есть LookupControl'ы и у каждого контрола свойство SelectWindowUSI = wnd_SelectDataEx. Контролов штук 10, с одним и тем же датасетом.
В функции события контролов LookupOnPrepareSelectWindow фильтруется этот датасет для каждого окна отедльно

function LookupOnPrepareSelectWindow(LookupControl, SelectWindow) {
        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

function  wnd_SelectDataExOnShow(Window) {


        OpenSelectDataDataset();
        LocateByKeyValue();
        UpdateEditStatus();
        SetFocusToEdit();
        if (GetAttribute(Window, 'ExistsProductCategoryInOpportunity')) {
                Timer.IsEnabled = true;
        }
}

датасет не большой, около 15 записей, фильтруется в итоге правильно, но на последнем контроле виснет минут на 5, хотя первые окна для выбора открываются мгновенно. при этом во время подвисания нет запросов к базе (по крайненй мере, их не видно в профайлере).

Что делать и как искать проблему? спасибо.

Нравится

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

А на какой конкретно строке виснет?

Виснет на 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, то начиная с контрола с новым линком (но тем же датасетом в линке) снова работает и открывает окно выбора быстро.

может сервисы прикрепите?:smile:

"Росинская Лена" написал:Если в окне разбить контролы на 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;

Елена, напишите, пожалуйста, в ЛС номер телефона и время удобное для Вас. Хотелось бы подключиться посмотреть.
Спасибо!

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