|
11.02.2014, 22:47 | #1 |
Программатор
|
Сорри, значит был не прав
|
|
12.02.2014, 13:36 | #2 |
Участник
|
Решение
Коллеги, нам удалось исправить данную проблему копированием поля Properties таблицы ModelElementsData базы модели и одной базы в другую, пример скрипта:
X++: USE AX60_DEV_model UPDATE [dbo].[ModelElementData] SET [dbo].[ModelElementData].Properties = GOOD_BASE.Properties FROM [dbo].[ModelElementData] AS BAD_BASE LEFT JOIN [AX60_TST_model].[dbo].[ModelElementData] AS GOOD_BASE ON BAD_BASE.ElementHandle = GOOD_BASE.ElementHandle WHERE GOOD_BASE.ElementHandle = 185644 Ссылка на тему с аналогичной проблемой: http://community.dynamics.com/ax/f/3...71/249240.aspx PS. Удобный сайт для форматирования SQL-операторов: http://poorsql.com/ Последний раз редактировалось Stainless; 12.02.2014 в 13:40. Причина: Очепятка |
|
|
За это сообщение автора поблагодарили: mazzy (2), AlGol (2), Oz (2), db (10), sukhanchik (20), Logger (8), b_nosoff (2), Raven Melancholic (5), Sada (4), leva (1), Ivanhoe (5), oip (2), gl00mie (15), Stitch_MS (6), Kabardian (6), Dreadlock (1), pedrozzz (1). |
28.08.2020, 19:43 | #3 |
Участник
|
Цитата:
В скрипте есть ошибка. Не учитывается что табличка может жить на нескольких слоях. Поправил, чтобы учитывался слой. Дописал в 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). |
Теги |
ax2012, ax2012r2, map, table |
|
|