30.12.2022, 13:57 | #1 |
Участник
|
Как по имени индекса 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 |
Участник
|
А в UtilElements / SQLDictionary этого нет?
|
|
30.12.2022, 14:40 | #3 |
Участник
|
SQLDictionary - только таблица и поля. Информации по индексам - нет
UtilElements - только имена Axapta. Имен SQL - нет
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
30.12.2022, 14:57 | #4 |
Участник
|
Привет.
Можно распарить имя индекса, отделить 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 |
Участник
|
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 |
Участник
|
Тут логичнее сделать обратное преобразование. По значениям из выборки (name+ParentId+AXID) сконструировать имя SQL по указанным правилам
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
30.12.2022, 15:37 | #7 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
dax2012
Есть некий скрипт в SQL результатом работы которого является список имен индексов. Разумеется, имена SQL Как теперь "перевести" имя индекса SQL в имя индекса Axapta? Там же, в скрипте SQL, но без обращения к Axapta? Т.е. подключиться к Axapta и вызвать dictIndex.name(DbBackend::Sql) - не получиться
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
30.12.2022, 16:06 | #8 |
Участник
|
Если очень хочется точности, то можно сделать простенькую сборку на C#, которая будет залезать в аксапту и вытаскивать имя индекса по его наименованию в БД. Зарегистрировать её (сборку) в БД и дёргать, передавая в неё sql-ное название индекса. Но неявно всё равно придётся залезть в аксапту, да.
Последний раз редактировалось dim-gin; 30.12.2022 в 16:09. Причина: уточнил) |
|
30.12.2022, 16:49 | #9 |
Участник
|
Пока получается, что непосредственно в среде 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 |
|
|