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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.12.2022, 13:57   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как по имени индекса SQL узнать имя индекса в Axapta в среде SQL
dax2012

Есть некий скрипт в SQL результатом работы которого является список имен индексов. Разумеется, имена SQL

Как теперь "перевести" имя индекса SQL в имя индекса Axapta? Там же, в скрипте SQL, но без обращения к Axapta? Т.е. подключиться к Axapta и вызвать dictIndex.name(DbBackend::Sql) - не получиться

В идеале, желательно получить id-индекса в Axapta...

PS: Вариант синтаксического разбора имени вида "там отрезать, здесь добавить" - не предлагать Слишком не надежно...

PPS: Вариант с джобом, который сбросит в SQL пары имен индексов в Axapta и в SQL - если только уж совсем ничего другого нет
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 30.12.2022 в 14:09.
Старый 30.12.2022, 14:18   #2  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
А в UtilElements / SQLDictionary этого нет?
Старый 30.12.2022, 14:40   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
SQLDictionary - только таблица и поля. Информации по индексам - нет
UtilElements - только имена Axapta. Имен SQL - нет
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 30.12.2022, 14:57   #4  
DarkSpirit22 is offline
DarkSpirit22
Участник
Аватар для DarkSpirit22
 
13 / 94 (4) ++++
Регистрация: 07.11.2013
Адрес: СПб
Привет.
Можно распарить имя индекса, отделить TableId от имени. Если имя индекса длинное, то в конце еще будет добавлен AxId индекса.

Таблицы и ее индексы есть в БД модели:
X++:
select * 
from SYSMODELELEMENT t1
join SYSMODELELEMENT t2 on t2.RecId = t1.PARENTMODELELEMENT and t2.ELEMENTTYPE = 44
where t1.ELEMENTTYPE = 43
    --and t2.Name = 'InventTrans'
    --and t1.Name = 'OpenItemIdx'
order by t2.name, t1.Name
Старый 30.12.2022, 15:18   #5  
axm2017 is offline
axm2017
Участник
 
1,928 / 313 (14) ++++++
Регистрация: 15.05.2017
https://learn.microsoft.com/en-us/do...dictindex-name
?
public virtual string name (Microsoft.Dynamics.Ax.Xpp.DbBackend _db);
A DbBackend value that specifies the type of name to return. This can be DbBackend::Native for the native name of the index or DbBackend::Sql for the SQL name of the index. If db is not specified, DbBackend::Native is use
Но не проверял

Последний раз редактировалось axm2017; 30.12.2022 в 15:27.
Старый 30.12.2022, 15:34   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от DarkSpirit22 Посмотреть сообщение
Можно распарить имя индекса, отделить TableId от имени. Если имя индекса длинное, то в конце еще будет добавлен AxId индекса.

Таблицы и ее индексы есть в БД модели:
Тут логичнее сделать обратное преобразование. По значениям из выборки (name+ParentId+AXID) сконструировать имя SQL по указанным правилам
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 30.12.2022, 15:37   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
dax2012

Есть некий скрипт в SQL результатом работы которого является список имен индексов. Разумеется, имена SQL

Как теперь "перевести" имя индекса SQL в имя индекса Axapta? Там же, в скрипте SQL, но без обращения к Axapta? Т.е. подключиться к Axapta и вызвать dictIndex.name(DbBackend::Sql) - не получиться
Речь идет не о том, как получить имя SQL находясь в среде Axapta, а о том, как получить имя Axapta, находясь в среде SQL
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 30.12.2022, 16:06   #8  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
Если очень хочется точности, то можно сделать простенькую сборку на C#, которая будет залезать в аксапту и вытаскивать имя индекса по его наименованию в БД. Зарегистрировать её (сборку) в БД и дёргать, передавая в неё sql-ное название индекса. Но неявно всё равно придётся залезть в аксапту, да.

Последний раз редактировалось dim-gin; 30.12.2022 в 16:09. Причина: уточнил)
Старый 30.12.2022, 16:49   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Пока получается, что непосредственно в среде SQL имя индекса не хранится и его значение проще сконструировать самостоятельно

X++:
/*
Имя индекса в SQL

Пример:	I_007CustomerPaymentFeeLedgerDimensionI7 для таблицы BankAccountTable

1. "I_" - константа (буква i). Указывается у всех индексов
2. 007 - значение TableId, но не менее 3 знаков. Недостающая длина дополняется ведущими нулями.
3. CustomerPaymentFeeLedgerDimensionI - имя индекса в Axapta. Имя может быть обрезано с конца. См п.4
4. 7 - если общая длина из первых 3 частей превышает 40 символов, то в конец добавляется значение Id индекса как есть, 
а общая длина имени уменьшается до 40 символов за счет обрезания концевой части имени индекса в Axapta (п.3) 
*/

select 
	t2.AXID as tabId,
	t2.NAME	as tableName,
	t1.AXID	as indexId,
	t1.NAME	as indexName,
	iif(len('I_' + format(t2.AXID, 'd3') + t1.NAME) <= 40
		,'I_' + format(t2.AXID, 'd3') + t1.NAME
		,substring('I_' + format(t2.AXID, 'd3') + t1.NAME, 1, 40 - len(cast(t1.AXID as nvarchar(10)))) + cast(t1.AXID as nvarchar(10))
		) as indexNameSQL
	 
from SYSMODELELEMENT t1
join SYSMODELELEMENT t2 on t2.RecId = t1.PARENTMODELELEMENT and t2.ELEMENTTYPE = 44
where t1.ELEMENTTYPE = 43
    and t2.Name = 'BankAccountTable'
    --and t1.Name = 'CustomerPaymentFeeLedgerDimensionIdx'
order by t2.name, t1.Name
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Logger (3), trud (5), iCloud (2).
Теги
dax2012, index, sql

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Получить имя индекса в БД demianimp DAX: Программирование 2 16.08.2015 06:18
Как узнать имя выведенного отчета eugenet DAX: Программирование 3 25.08.2010 19:59
Axapta SP3 и Sql 2005 каких ожидать проблем mike1 DAX: Администрирование 1 30.11.2006 17:38
mazzy: Сравнительное тестирование производительности Microsoft Axapta v.3.0. CУБД Microsoft SQL Server 2005 и Microsoft SQL Server 2000 Blog bot DAX Blogs 0 28.10.2006 17:22
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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