13.02.2014, 13:03 | #21 |
Талантливый разгвоздяй
|
А кто-нибудь может забэкапить таблицу ModelElementData из чистого стандарта AX 2012 CU7 и выложить сюда, если не сложно? :-)
У меня под рукой нет такой системы, а разворачивать долго... |
|
17.02.2014, 18:30 | #22 |
Участник
|
Чистой CU7 под рукой нет
Ответил саппорт Microsoft - предложение такое же как выше в ветке с заменой Set md.Properties = md_base.Properties
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: Kabardian (2). |
19.11.2018, 16:05 | #23 |
Участник
|
Предложенный способ помогает, но как-то уже надоело время от времени это чинить.
3-4 раза перестоишь перекрестные ссылки и "ага" Не выходило ли каких-либо хостфиксов по этой проблеме, которые бы решили это? У нас CU13 и обновления до мая этого года. |
|
28.08.2020, 19:43 | #24 |
Участник
|
Цитата:
В скрипте есть ошибка. Не учитывается что табличка может жить на нескольких слоях. Поправил, чтобы учитывался слой. Дописал в SysDictTable такой метод (он автоматически генерирует исправляющий скрипт) X++: public static server str sqlQueryRestoreTablePropsByTempl_MRC( TableId _tableId, str _modelDBNameTemplate, boolean _elementHandleEquel = false ) { SysModelElement sysModelElement; SqlStatementExecutePermission permission; Statement statement; ResultSet resultSet; TableName tableName = tableId2name(_tableId); str dbo = "[" + xSession::getDbSchema() + "]"; str modelDBName = "[" + SqlSystem::modelDatabaseBackendName() + "]"; str modelDBNameTemplate; str elementHandleGood; str elementHandleBad; str queryText; str queryTextForElementHandleGood; ; if (_modelDBNameTemplate) { modelDBNameTemplate = "[" + _modelDBNameTemplate + "]"; } else { throw error("Нужно указать имя базы образца!"); } select sysModelElement where sysModelElement.AxId == _tableId && sysModelElement.Name == tableName && sysModelElement.ElementType == UtilElementType::Table; if (!sysModelElement.RootModelElement) { throw error("Не смогли определить RootModelElement"); } elementHandleBad = int642str(sysModelElement.RootModelElement); if (_elementHandleEquel) { elementHandleGood = elementHandleBad; } else { queryTextForElementHandleGood = strFmt( @"SELECT RECID FROM %3.%1.[SYSMODELELEMENT] AS GOOD_BASE WHERE GOOD_BASE.ElementType = 44 /* Table */ AND GOOD_BASE.Name = N'%2' AND GOOD_BASE.PARENTMODELELEMENT = 0" ,dbo // 1 ,tableName // 2 ,modelDBNameTemplate // 3 ); permission = new SqlStatementExecutePermission(queryTextForElementHandleGood); permission.assert(); try { //BP Deviation documented statement = new Connection().createStatement(); resultSet = statement.executeQuery(queryTextForElementHandleGood); if (resultSet.next()) { elementHandleGood = int642str(resultSet.getInt64(1)); } } catch { info(strfmt("Error %1. Error text: %2", statement.getLastError(), statement.getLastErrorText())); } } if (!elementHandleGood) { throw error(strFmt("Не удалось определить ElementHandle для таблички в базе образце.")); } queryText = strFmt(@" UPDATE %2.%1.[ModelElementData] SET %2.%1.[ModelElementData].Properties = GOOD_BASE.Properties FROM %2.%1.[ModelElementData] AS BAD_BASE LEFT JOIN %3.%1.[ModelElementData] AS GOOD_BASE ON BAD_BASE.ElementHandle = %5 AND GOOD_BASE.ElementHandle = %4 WHERE GOOD_BASE.ElementHandle = %4 AND GOOD_BASE.LayerId = (SELECT MAX(LayerId) from %3.%1.[ModelElementData] AS GOOD_BASE2 where GOOD_BASE2.ElementHandle = %4) AND BAD_BASE.LayerId = (SELECT MAX(LayerId) from %2.%1.[ModelElementData] AS BAD_BASE2 where BAD_BASE2.ElementHandle = %5) ", dbo, // 1 modelDBName, // 2 modelDBNameTemplate, // 3 elementHandleGood, // 4 elementHandleBad // 5 ); return queryText; } База образец называется AXJW12_TEST_model X++: static void fixTableDefinition(Args _args) { info(SysDictTable::sqlQueryRestoreTablePropsByTempl_MRC(tableNum(SalesTable), "AXJW12_TEST_model")); // AifChangeTracking::executeDirectSqlUpdate(SysDictTable::sqlQueryRestoreTablePropsByTempl_MRC(tableNum(SalesTable), "AXJW12_TEST_model")); // для тех кто не боится info("Не забыть рестартовать аос."); } |
|
|
За это сообщение автора поблагодарили: mazzy (5), pedrozzz (2). |
21.07.2021, 13:04 | #25 |
Участник
|
Может быть у кого-то есть джобик для периодического автоматического поиска таких "сломанных" вьюшек и мэпов ?
__________________
Дмитрий |
|
28.03.2022, 13:04 | #26 |
Участник
|
Цитата:
Она крутилась и ловила смену типа объекта AOT. И она выявила интересную особенность. Было много "ложных" срабатываний, в разы больше чем зафиксированных случаев "мутаций" табличных типов (таблица, вью, мап). Из этого можно сделать вывод, что в памяти структура аота повреждается намного чаще, но не все такие повреждения сбрасываются в базу модели. |
|
28.03.2022, 13:07 | #27 |
Участник
|
А кто-нибудь разбирал бинарный формат поля для табличного узла ?
Есть идея, повесить триггер на табличку. Он бы при обновлении "выкусывал" тип объекта и если тип меняется то откатывал бы транзакцию. Думаю, так было бы намного лучше. Там правда не только тип меняется. Иногда слетают Primary / Cluster ключи. Но тут тоже можно придумать что-нибудь. |
|
28.03.2022, 18:50 | #28 |
Участник
|
да.
mazzy: Разбираюсь, как можно уменьшить размер model-базы в ax2012, чтобы ускорить Аксапту в виртуалке. Цитата:
https://www.youtube.com/watch?v=ZhO_qROBGX0 в общем, такой себе путь. |
|
27.01.2024, 14:57 | #29 |
Участник
|
Цитата:
Сообщение от Logger
А кто-нибудь разбирал бинарный формат поля для табличного узла ?
Есть идея, повесить триггер на табличку. Он бы при обновлении "выкусывал" тип объекта и если тип меняется то откатывал бы транзакцию. Думаю, так было бы намного лучше. Там правда не только тип меняется. Иногда слетают Primary / Cluster ключи. Но тут тоже можно придумать что-нибудь. Защита от повреждения типа таблицы в Аксапте 2012 R3 |
|
|
За это сообщение автора поблагодарили: alex55 (3). |
28.01.2024, 13:53 | #30 |
Участник
|
Вообще, после того как после построения перекрестных ссылок мы стали перезапускать АОС, проблема вроде ушла.
Главное, чтобы именно никто не успел после построения перекрестных ссылок что-то сделать с таблицами, вьюхами, мапами. |
|
28.01.2024, 14:08 | #31 |
Участник
|
Цитата:
Коллега, обнаружил, что сбор перекрестных ссылок и глобальную компиляцию лучше делать в монопольном режиме на аосе, тогда проблема практически не возникает. Мы высадили эти процедуры на отдельный аос и все стало значительно лучше. Но триггер тоже не помешает. |
|
Теги |
ax2012, ax2012r2, map, table |
|
|