Показать сообщение отдельно
Старый 10.11.2015, 09:01   #1  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Red face Разное количество индексов в axapta и sql
Добрый день.

Предыстория:
Переносил процедуру с тестовой SQL на рабочую и при компиляции получил ошибку, что SQL не знает такого индекса. Думаю, ладно может новый индекс и его не перенесли на рабочею, но не тут-то было. Индекс коробочной аксапты и находиться на слое SYS. Через форму администрирования пересоздал этот индекс. Все стала хорошо и SQL принял процедуру как родную.

Тут у меня появилась мысль, а сколько еще индексов не хватает в SQL.



Сделал запрос в SQL:
PHP код:
select count(*)
from sysobjects t 
inner join sysindexes i on t
.id i.id where i.name like 'I_%' 
вернул число 5496.

Хорошо, теперь нужно как-то понять, сколько индексов должно быть.
Нашел в системных таблицах UtilIdElements и UtilElements.
Вопрос к сообществу №1: В чем разница между UtilIdElements и UtilElement?
Через обозреватель таблиц на первый взгляд информация одинаковая.

X++:
static void utilIdElementsCount(Args _args)
{
    UtilIdElements  utilIdElements;
    ;
    select count(RecId)
        from utilIdElements order by parentId
        where utilIdElements.recordType == UtilElementType::TableIndex;

    
    info(int2str(utilIdElements.RecId));
}
вернул число 6623.

Тут я совсем расстроился и что-то приуныл. В SQL не хватает 1/6 индексов.

Далее мое извращенное сознание извергла следующий алгоритм:
X++:
static void getListIndexNameSql(Args _args)
{
    UtilIdElements  utilIdElements;
    DictTable       dictTable;
    str             textRow = 'Имя таблицы SQL;Имя таблицы;Имя индекса SQL;Имя индекса;Код таблицы;Код индекса\n';
    ;
    while select utilIdElements order by parentId
        where utilIdElements.recordType == UtilElementType::TableIndex
    {
        if(tableId2Name(utilIdElements.parentId) != 'UNKNOWN')
        {
            dictTable = new DictTable(utilIdElements.parentId);

            textRow += strFmt('%1;%2;%3;%4;%5;%6\n', 
                              dictTable.name(DbBackend::Sql), 
                              dictTable.name(), 
                              dictTable.indexName(utilIdElements.id, DbBackend::SQL), 
                              utilIdElements.name, 
                              utilIdElements.parentId, 
                              utilIdElements.id);
        }
    }

    info(textRow);
}
Вопрос к сообществу №2: Насколько корректны полученные данные? Если другой способ получение индексов, которые должны быть по версии axapta?

P.S. AX2009, SQL 2008