Цитата:
Сообщение от
Stainless
Коллеги, нам удалось исправить данную проблему копированием поля Properties таблицы ModelElementsData базы модели и одной базы в другую, пример скрипта:
Спасибо.
В скрипте есть ошибка. Не учитывается что табличка может жить на нескольких слоях.
Поправил, чтобы учитывался слой.
Дописал в 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;
}
пример исправления для таблички SalesTable
База образец называется 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("Не забыть рестартовать аос.");
}