Показать сообщение отдельно
Старый 28.08.2020, 19:43   #24  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,534 / 2479 (90) +++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от 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("Не забыть рестартовать аос.");
}
За это сообщение автора поблагодарили: mazzy (5), pedrozzz (2).