10.11.2015, 09:01 | #1 |
Участник
|
Разное количество индексов в axapta и sql
Добрый день.
Предыстория: Переносил процедуру с тестовой SQL на рабочую и при компиляции получил ошибку, что SQL не знает такого индекса. Думаю, ладно может новый индекс и его не перенесли на рабочею, но не тут-то было. Индекс коробочной аксапты и находиться на слое SYS. Через форму администрирования пересоздал этот индекс. Все стала хорошо и SQL принял процедуру как родную. Тут у меня появилась мысль, а сколько еще индексов не хватает в SQL. Сделал запрос в SQL: PHP код:
Хорошо, теперь нужно как-то понять, сколько индексов должно быть. Нашел в системных таблицах 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)); } Тут я совсем расстроился и что-то приуныл. В 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); } P.S. AX2009, SQL 2008 |
|
10.11.2015, 09:28 | #2 |
Участник
|
Наличие в Аксапте конфигурационных ключей и временных таблиц вы не учитываете?
Пробегитесь по DictTable и связанными с таблицами DictIndex, с учетом isSql() - тогда узнаете, сколько Аксаптовских объектов сохранено в БД
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: demianimp (1). |
10.11.2015, 09:39 | #3 |
Участник
|
Цитата:
X++: ... if(dictTable.isSql()) { dictIndex = new DictIndex(utilIdElements.parentId, utilIdElements.id); if(!dictIndex.isSql()) { ... } } ... |
|
10.11.2015, 10:03 | #4 |
Участник
|
Не совсем)
isSql() показывает, что объект ДОЛЖЕН быть сохранен в сиквеле, с точки зрения Аксапты. Т.е. для отключенных конф. ключем объектов и временных таблиц isSql() вернет false А вот сохранен фактически он или нет - можно узнать только сделав запрос к метаданным самого сиквела
__________________
Axapta v.3.0 sp5 kr2 |
|
10.11.2015, 10:20 | #5 |
Участник
|
Цитата:
Сообщение от AndyD
Не совсем)
isSql() показывает, что объект ДОЛЖЕН быть сохранен в сиквеле, с точки зрения Аксапты. Т.е. для отключенных конф. ключем объектов и временных таблиц isSql() вернет false А вот сохранен фактически он или нет - можно узнать только сделав запрос к метаданным самого сиквела Чем больше с умными людьми общаюсь, тем больше понимаю на сколько ничтожны мои знания |
|
10.11.2015, 10:28 | #6 |
Модератор
|
Неправильно. Нужно один раз синхронизовать БД и перестать использовать индексные подсказки
__________________
-ТСЯ или -ТЬСЯ ? |
|