Вылетает Terrasoft

Доброго времени суток.

Возникла проблема с вылетом террасофта.
Что собственно происходит.
Есть Edit, две кнопки(поиск, очистить) и два грида завязаных на DBDataset'ы.
В Edit вводится строка. По клику "поиск" строка дробится на слова путем split(' '); на базе полученного массива в SelectQuery двух гридов создаются фильтры типа Like и параматеры. Потом они все включаются и датасет открывается. С этим все нормально, все работает стабильно.
При нажатии на "Очистить" соотвественно фильтры и параметры удаляются и снова переоткрываются датасеты. На этом моменте террасофт иногда вылетает. Долго не мог повторить эту ошибку, которая у клиента появлялась довольно часто, но тут они прислали слово по которому вначале ищут, а потом чистят и террасофт вылетает стабильно, ничего при этом не говоря.
При чем слово "цельное", то есть в результате создается только один фильтр типа Like.
При использовании дэбагера - прохожу по всему телу функции - все отрабатывает и вылетает сразу на выходе из функции...
Зацикливания никакого как бы нет...
тестировали на строке из 20 слов - все работает, и вот на некоторых вылетает. Подскажите чего б такого попробовать?

Заранее спасибо.

Версия 3.2.2.3

Нравится

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

Можно попробовать сделать видео запись воспроизведения ошибки. А мы уже посмотрим и что-то придумаем. Плюс к этому было бы не лишним показать скрипт функции, где, собственно, все и происходит.

ну в видео, собственно, все будет просто...
Нажимаю на кнопку - захожу в дэбагер - прохожу все тело функции - F10 пытаюсь выйти из функции - террасофт моментально вылетает...

Сам скрипт вот:

function btnClearFilterOnClick(Control) {                     
	debugger;
edtFilterOfferings.Value = '';
	var WordsArray = new Array();
	if (cbFilterMainGrid.IsChecked) {
		var GridWindow = wndGridData.Window;
		var GridDataset = GridWindow.ComponentsByName('dlData').Dataset;
		FilterDatasetByWordArray(WordsArray, GridDataset, 'tbl_FinalTempPrice', 'Name');
	}
	if (cbFilterDetailGrid.IsChecked) {
		var DetailWindow = Self.ComponentsByName('wndPIOfferings').Window;
		var DetailDataset = DetailWindow.ComponentsByName('dlOfferings').Dataset;
		FilterDatasetByWordArray(WordsArray, DetailDataset, 'tbl_ISOffering', 'ISOfferingName');
	}	
 
} // вот тут нажать на F10 и террасофт вылетает

если поможет могу показать скрипт
FilterDatasetByWordArray()

Нет ну я вообще не понимаю:
"LX.TQG0X.159" - вылетает
"LX TQG0X 159" - вылетает
"LXTQG0X159" - не вылетает
"L X . T Q G 0 X . 1 5 9" - не вылетает.

Добрый день, Юрий!
Запустите профайлер - какие идут запросы? И какие при этом Вы получаете результаты? Можно их посмотреть?

Запросы при поиске:

exec sp_executesql N'SELECT
	[tbl_ISOffering].[ID] AS [ID],
	[tbl_ISOffering].[ISOfferingName] AS [ISOfferingName],
	[tbl_ISOffering].[CategoryID] AS [CategoryID],
	[tbl_ISOffering].[IsTreated] AS [IsTreated]
FROM
	[dbo].[tbl_ISOffering] AS [tbl_ISOffering]
WHERE(((tbl_ISOffering.IsDeleted = 0) OR 
(tbl_ISOffering.IsDeleted IS NULL)) AND
	([tbl_ISOffering].[ISOfferingName] LIKE @P1))',N'@P1 nvarchar(14)',N'%LX.TQG0X.159%'
 
 
 
exec sp_executesql N'SELECT TOP 40
	[tbl_FinalTempPrice].[ID] AS [ID],
	[tbl_FinalTempPrice].[Name] AS [Name],
	[tbl_FinalTempPrice].[Price] AS [Price],
	[tbl_FinalTempPrice].[IsAvailable] AS [IsAvailable],
	[tbl_FinalTempPrice].[SupplierID] AS [SupplierID],
	[Supplier].[Name] AS [SupplierName],
	[tbl_FinalTempPrice].[OldPrice] AS [OldPrice],
	[tbl_FinalTempPrice].[CurrencyBool] AS [CurrencyBool],
	[tbl_FinalTempPrice].[Currency] AS [Currency],
	[tbl_FinalTempPrice].[Expired] AS [Expired]
FROM
	[dbo].[tbl_FinalTempPrice] AS [tbl_FinalTempPrice]
LEFT OUTER JOIN
	[dbo].[tbl_Account] AS [Supplier] ON [Supplier].[ID] = [tbl_FinalTempPrice].[SupplierID]
WHERE([tbl_FinalTempPrice].[SupplierID] = @P1 AND
	([tbl_FinalTempPrice].[Name] LIKE @P2))
ORDER BY
	4 ASC',N'@P1 nvarchar(38),@P2 nvarchar(14)',N'{CA628C41-76F6-4A73-B3E7-C50615E79678}',N'%LX.TQG0X.159%'

Запросы при очистке:

exec sp_executesql N'SELECT TOP 40
	[tbl_FinalTempPrice].[ID] AS [ID],
	[tbl_FinalTempPrice].[Name] AS [Name],
	[tbl_FinalTempPrice].[Price] AS [Price],
	[tbl_FinalTempPrice].[IsAvailable] AS [IsAvailable],
	[tbl_FinalTempPrice].[SupplierID] AS [SupplierID],
	[Supplier].[Name] AS [SupplierName],
	[tbl_FinalTempPrice].[OldPrice] AS [OldPrice],
	[tbl_FinalTempPrice].[CurrencyBool] AS [CurrencyBool],
	[tbl_FinalTempPrice].[Currency] AS [Currency],
	[tbl_FinalTempPrice].[Expired] AS [Expired]
FROM
	[dbo].[tbl_FinalTempPrice] AS [tbl_FinalTempPrice]
LEFT OUTER JOIN
	[dbo].[tbl_Account] AS [Supplier] ON [Supplier].[ID] = [tbl_FinalTempPrice].[SupplierID]
WHERE([tbl_FinalTempPrice].[SupplierID] = @P1)
ORDER BY
	4 ASC',N'@P1 nvarchar(38)',N'{CA628C41-76F6-4A73-B3E7-C50615E79678}'
 
 
SELECT
	[tbl_ISOffering].[ID] AS [ID],
	[tbl_ISOffering].[ISOfferingName] AS [ISOfferingName],
	[tbl_ISOffering].[CategoryID] AS [CategoryID],
	[tbl_ISOffering].[IsTreated] AS [IsTreated]
FROM
	[dbo].[tbl_ISOffering] AS [tbl_ISOffering]
WHERE(((tbl_ISOffering.IsDeleted = 0) OR 
(tbl_ISOffering.IsDeleted IS NULL)))

в результате поиска в одном гриде пусто в другом одна запись;
в результате очистки - в одном так же пусто а в другом пару тысяч.
но, я думаю, результаты тут ни причем...

Запросы в норме... А вот что с результатами? Я думаю что в них проблема...

"Осауленко Александр" написал:А вот что с результатами? Я думаю что в них проблема..

Результаты при очистке всегда одинаковы при любых словах..
Просто переоткрываются датасеты с начальными фильтрами.

Т.е. результаты скажем Query Analizer всегда одни и те же? Это как? А какая у Вас версия сервера? Опубликуйте пожалуйста, select @@version.

Ну я имею ввиду, что запросы при очистке всегда идут одни и те же, значит выборка будет одинаковой.
версия сервера:

Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) Apr 14 2006 01:12:25 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

А результаты поиска в каком виде - в виде дерева?

Нет. Обычный грид, ничего сверхъестественного. Поиск всегда отрабатывает корректно.

А расскраска грида есть?

Раскраски тоже нет.

Юрий, а Call Stack в Log-е есть? Если есть, то покажите его пожалуйста.

Сергей, никаких ошибок(логов) террасофт не говорит.
Просто так "тихонько" вылетает.

А если убрать вызов FilterDatasetByWordArray?

Ну тогда все нормально. Получается, что функция ж по-сути ничего не делает...
Может я в самой функции чего-то не так написал?
Вот код:

function FilterDatasetByWordArray(WordsArray, Dataset, TableName, FieldName) {
	var SelectQuery = Dataset.SelectQuery;
	var SelectQueryParameters = SelectQuery.Parameters;
	var SelectQueryLikeFilterNode = Dataset.SelectQuery.Items(0).Filters.ItemsByCode('LikeFilters');
	var FinalTempPriceTable = GetSingleItemByCode(TableName)
	var NameField = FinalTempPriceTable.Fields.ItemsByName(FieldName);
	while (SelectQueryLikeFilterNode.Count != 0) {
		SelectQueryLikeFilterNode.Remove(SelectQueryLikeFilterNode.Items(0));
	}
	for (var i = 0; i < SelectQueryParameters.Count; i++) {
    	var CurrentParameter = SelectQueryParameters.Items(i);
		var CurrentParameterName = CurrentParameter.Name;
		if ((CurrentParameterName != 'SupplierID') &&
			(CurrentParameterName != 'ID') &&
			(CurrentParameterName != 'CategoryID') &&
			(CurrentParameterName != 'ISOfferingName') &&
			(CurrentParameterName != 'Name') &&
			(CurrentParameterName != 'NameLike') &&
			(CurrentParameterName != 'IsDeleted') &&
			(CurrentParameterName != 'CurrencyBool')) {
			SelectQueryParameters.Remove(CurrentParameter);
			i--;
		}
	}
	var EnableLikesFilter = false;
	for (i = 0; i < WordsArray.length; i++) {
		if (WordsArray[i] != '') {
			var CurrentLikeFilter = SelectQueryLikeFilterNode.CreateLikeFilter();
			var CurrentParam = SelectQueryParameters.CreateItem();
			var FilterName = 'LikeFilter' + i;
			CurrentParam.KeyValue =  FilterName;
			CurrentParam.Name =  FilterName;
			CurrentParam.Value = WordsArray[i];
			CurrentParam.ParamType = 0;
			SelectQueryParameters.Add(CurrentParam);
			CurrentLikeFilter.Code = FilterName;
			CurrentLikeFilter.LikeType = 1;
			var FieldFilterExpression = CurrentLikeFilter.CreateFieldFilterExpression();
			FieldFilterExpression.Field = NameField;
			var ParamFilterExpression = CurrentLikeFilter.CreateParamFilterExpression();
			ParamFilterExpression.Parameter = CurrentParam;
			CurrentLikeFilter.TestExpression = FieldFilterExpression;
			CurrentLikeFilter.ValueExpression = ParamFilterExpression;
			SelectQueryLikeFilterNode.Add(CurrentLikeFilter);
			EnableLikesFilter = true;
		}
	}
	EnableFilter(Dataset.SelectQuery.Items(0).Filters, 'LikeFilters', EnableLikesFilter);
	Dataset.DisableEvents();
	RefreshDataset(Dataset);	
	Dataset.EnableEvents();
}

Вот записал видео..

Ну конечно же i-- внутри for с i++ в глаза бросается. Я бы посоветовал переделать этот цикл на while, и делал бы проход с конца в начало. Но я не думаю что в этом сама проблема...

Сергей, дебажил функцию не раз, параметры удаляются правильно.
Сама функция отрабатывает, свал происходит не на ней, а на выходи из функции... на видео видно..

А не зависит ли свал от количества введенных слов. Например при четном количестве не валится, а при нечетном валится...

LX . T Q G 0 X . 1 5 9 - 11 "слов" - не валится.

Я бы попробовал на 1, 2, 3, 4 словах. Этого достаточно

фыв - не вылетает
фыв фывыв - не вылетает
фвы фывфы фыввав - не вылетает
фвы фывый фавыыв фыфвфайв - не вылетает

Видать не в количестве дело, а именно в слове ... или я даже не знаю, что думать ... :|

Возможно что при формировании запроса какой то из символов является маской для LIKE. Может попробовать его вычислить? Удалять по одному, и станет ясно какой это символ

Я выше показывал запросы. Они нормально отрабатывают.
Да сам объект SelectQuery собирается и выполняется верно.
Кнопка "Очистить" возвращает SelectQuery к начальному состоянию.. и идут запросы которые также выполняются в менеджмент студии корректно.

Вы имеете ввиду, что SelectQuery генерирует некорректный запрос? или при формировании самого SelectQuery что-то не так?
Если второе, то разве значение параметра может потянуть за собой такой "летальный" исход(при чем параметр удален)?

Думаю, что Вам нужно выгрузить нам необходимую часть сервисов, чтобы воспроизвести ошибку у нас. Передайте эти сервисы на тех. поддержку: support@tscrm.com. Если ошибка воспроизведется -- то исправить рекурсию в ядре (я думаю, что именно она провоцирует свал) будет не сложно. :)

Вобщем, кажется починил. Починил, но все равно не понимаю от чего такое поведение.

Дело в том, что одним из желания заказчика было отключить в нижнем гриде постраничную выгрузку, что вываливало в датасет около 40 000 записей.

Если включаю вывод по 40 - свала нет ...

Такой вопрос, в данном проекте есть места, где у датасета отключена постраничная загрузка(они как привязаны к гридам так и просто используются внутри кода)... может ли это в дальнейшем привести к каким-то странностям?
Ну и, в принципе, как датасеты реагируют на большие выборки?

С подобными ошибками не сталкивался -- реестр всегда нормально работает с большим количеством данных, т.к. для реализации реестров используем VirtualTreeView.

Но я настоятельно НЕ рекомендую отключать постраничное отображение реестров (т.е. устанавливать в SelectQuery Top=-1). Сейчас у Вас 40 000 записей -- представьте какая будет нагрузка на сервер через год-два.

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