28.08.2020, 19:43 | #20 |
Участник
|
Цитата:
В скрипте есть ошибка. Не учитывается что табличка может жить на нескольких слоях. Поправил, чтобы учитывался слой. Дописал в 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 |
|
|