Скрипты
Разработка

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

Добрый день!

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

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

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

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

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

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