AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.04.2023, 10:02   #1  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
332 / 913 (31) +++++++
Регистрация: 23.10.2012
Совсем забыл...речь идет о Version 6.0.947.9033.

Да, создать нужный объект мне тоже хотелось и это было бы решением, если бы (много бы) утилита умела валидировать целостность БД и продолжать выполнение с момента предыдущего прерывания. У нее 2 состояния - создать новую БД или использовать существующую.

Проблемы, на самом деле две:
Первая - в коде исполняемого файла, в функции Microsoft.Dynamics.AX.Tracing.TraceParser.Presentation.DatabaseRegister.CollectDatabaseRegistrationConnectionString. Изображение прикрепил, стрелками синего цвета отмечен путь в случае когда БД есть, серого - БД нет.
Вторая - можно вызвать "Microsoft.Dynamics.AX.Tracing.Data.DatabaseHelper.CreateDatabase" через то же консольное приложение, но там "затык" уже в самих запросах к БД. Первым запросом идет "create database" - снова "свалится", БД же есть к этому моменту.

Вижу 2.5 путей решения:
1. Разобраться с генерацией названия PK;
2. Видоизменить проблемный код в библиотеке;
2.5. Запустить скрипты по подготовке БД самостоятельно.
Понятное дело, что 1-ый вариант вызывает интерес. Для эксперимента взял другую машину (SQL другой, ОС другая) результат - "PK__TraceLin__9FC961DFECC085B4". Документации официальной на тему правил генерации наименований не вижу, может кто-то владеет такой информацией?
Миниатюры
Нажмите на изображение для увеличения
Название: traceparsercodeswitch.jpg
Просмотров: 179
Размер:	173.6 Кб
ID:	13558  

Последний раз редактировалось Товарищ ♂uatr; 06.04.2023 в 11:54.
Старый 06.04.2023, 12:16   #2  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
332 / 913 (31) +++++++
Регистрация: 23.10.2012
Насколько понял принцип генерации - симбиоз sessionID и timestamp.

Спасибо Logger'у, теперь у меня есть с чем сравнить и просто "повезло нарваться" на "правильную" версию, видимо она устарела в современных реалиях (SQL server).
В 6.0.947.9033:
X++:
ALTER TABLE [dbo].[QueryBindParameters] DROP CONSTRAINT [FK_QueryBindParameters_TraceLines]

    ALTER TABLE [dbo].[XppParameters] DROP CONSTRAINT [FK_XppParameters_TraceLines]

    ALTER TABLE [dbo].[TraceLines] DROP CONSTRAINT [PK__TraceLin__9FC961DF25869641]

    ALTER TABLE [dbo].[TraceLines] ADD  CONSTRAINT [PK__TraceLin__9FC961DF25869641] PRIMARY KEY NONCLUSTERED
    (
    [TraceLineId] ASC
    )
В 6.3.164.0:
X++:
ALTER TABLE [dbo].[QueryBindParameters] DROP CONSTRAINT [FK_QueryBindParameters_TraceLines]

ALTER TABLE [dbo].[XppParameters] DROP CONSTRAINT [FK_XppParameters_TraceLines] 

declare @tempPkName nvarchar(128);

SELECT @tempPkName = idx.name
FROM
	sys.indexes idx
	INNER JOIN sys.tables tbl
		ON idx.object_id = tbl.object_id
WHERE
	tbl.name = 'TraceLines'
	AND idx.is_primary_key = 1

exec(
'ALTER TABLE [dbo].[TraceLines] DROP CONSTRAINT ' + @tempPkName);

exec('ALTER TABLE [dbo].[TraceLines] ADD  CONSTRAINT '+ @tempPkName + ' PRIMARY KEY NONCLUSTERED 
(
	[TraceLineId] ASC
)');

Последний раз редактировалось Товарищ ♂uatr; 06.04.2023 в 13:49.
Старый 06.04.2023, 15:32   #3  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
332 / 913 (31) +++++++
Регистрация: 23.10.2012
Воспроизвел исходную ошибку данной темы.
Валится здесь:
X++:
			IQueryable<XppAggregate> source = (from t in entities.TraceLines
			join m in entities.MethodNames on t.MethodHash equals (long?)m.MethodHash
			where t.UserSessionProcessId >= startSessionId && t.UserSessionProcessId <= endSessionId
			group t by new
			{
				t.MethodHash,
				m.Name
			} into topXppGroup
			orderby topXppGroup.Sum((TraceLine x) => x.IsRecursive.Value ? 0 : x.InclusiveDurationNano) descending
			select new XppAggregate
			{
				Name = topXppGroup.Key.Name,
				Count = topXppGroup.Count(),
				InclusiveTotal = (double)topXppGroup.Sum((TraceLine x) => x.IsRecursive.Value ? 0 : x.InclusiveDurationNano) / 10000.0,
				ExclusiveTotal = (double)topXppGroup.Sum((TraceLine x) => x.IsRecursive.Value ? 0 : x.ExclusiveDurationNano) / 10000.0,
				InclusiveRpcTotal = topXppGroup.Sum((TraceLine x) => x.IsRecursive.Value ? 0 : x.InclusiveRpc),
				DatabaseCallsTotal = topXppGroup.Sum((TraceLine x) => x.IsRecursive.Value ? 0 : x.DatabaseCalls)
			}).Take(top);
			List<XppAggregate> list = source.ToList();
Как SQL оно выглядит так:
X++:
exec sp_executesql N'SELECT TOP (5) 
[Project1].[C5] AS [C1], 
[Project1].[Name] AS [Name], 
[Project1].[C2] AS [C2], 
[Project1].[C6] AS [C3], 
[Project1].[C7] AS [C4], 
[Project1].[C3] AS [C5], 
[Project1].[C4] AS [C6]
FROM ( SELECT 
	[GroupBy1].[A1] AS [C1], 
	[GroupBy1].[A2] AS [C2], 
	[GroupBy1].[A5] AS [C3], 
	[GroupBy1].[A6] AS [C4], 
	[GroupBy1].[K2] AS [Name], 
	1 AS [C5], 
	 CAST( [GroupBy1].[A3] AS float) / cast(10000 as float(53)) AS [C6], 
	 CAST( [GroupBy1].[A4] AS float) / cast(10000 as float(53)) AS [C7]
	FROM ( SELECT 
		[Filter1].[K1] AS [K1], 
		[Filter1].[K2] AS [K2], 
		SUM([Filter1].[A1]) AS [A1], 
		COUNT([Filter1].[A2]) AS [A2], 
		SUM([Filter1].[A3]) AS [A3], 
		SUM([Filter1].[A4]) AS [A4], 
		SUM([Filter1].[A5]) AS [A5], 
		SUM([Filter1].[A6]) AS [A6]
		FROM ( SELECT 
			[Extent1].[MethodHash] AS [K1], 
			[Extent2].[Name] AS [K2], 
			CASE WHEN ([Extent1].[IsRecursive] = 1) THEN cast(0 as bigint) ELSE [Extent1].[InclusiveDurationNano] END AS [A1], 
			1 AS [A2], 
			CASE WHEN ([Extent1].[IsRecursive] = 1) THEN cast(0 as bigint) ELSE [Extent1].[InclusiveDurationNano] END AS [A3], 
			CASE WHEN ([Extent1].[IsRecursive] = 1) THEN cast(0 as bigint) ELSE [Extent1].[ExclusiveDurationNano] END AS [A4], 
			CASE WHEN ([Extent1].[IsRecursive] = 1) THEN 0 ELSE [Extent1].[InclusiveRpc] END AS [A5], 
			CASE WHEN ([Extent1].[IsRecursive] = 1) THEN 0 ELSE [Extent1].[DatabaseCalls] END AS [A6]
			FROM  [dbo].[TraceLines] AS [Extent1]
			INNER JOIN [dbo].[MethodNames] AS [Extent2] ON [Extent1].[MethodHash] = [Extent2].[MethodHash]
			WHERE ([Extent1].[UserSessionProcessId] >= @p__linq__0) AND ([Extent1].[UserSessionProcessId] <= @p__linq__1)
		)  AS [Filter1]
		GROUP BY [K1], [K2]
	)  AS [GroupBy1]
)  AS [Project1]
ORDER BY [Project1].[C1] DESC',N'@p__linq__0 int,@p__linq__1 int',@p__linq__0=26,@p__linq__1=26
Ну и очень хорошо воспроизводится - это проблема данных в БД. Предположу, что причиной является конкретный лог трассировки.
Миниатюры
Нажмите на изображение для увеличения
Название: parser.jpg
Просмотров: 203
Размер:	202.6 Кб
ID:	13559  

Последний раз редактировалось Товарищ ♂uatr; 06.04.2023 в 16:06.
Теги
ax2009, trace parser

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxse: KB3163813 CU12 Known Issue – Incorrect Posting amounts – Shipment Packing slip posting Blog bot DAX Blogs 0 13.03.2017 18:11
dynamicscpm: Management Reporter bugs now available in LCS Issue Search Blog bot DAX Blogs 0 13.06.2015 00:14
Странное поведение при закрытии склада-ошибка в коде? Aquarius DAX: Программирование 11 27.06.2013 13:37
axinthefield: Choosing a Single Deployment or Multiple Deployments of AX2009 Blog bot DAX Blogs 0 15.06.2011 03:25
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:03.