Показать сообщение отдельно
Старый 09.02.2018, 12:43   #15  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Недавно словили эту багу при работе в 2009-й аксапте.
В итоге разработали способ как это просто вылечить не удаляя слой.

Пусть для определенности у нас кривая вьюха на usr слое.
При любых попытках что-то сделать с ней аос падает по причине Падает служба Dynamics AX

1. Тогда берем другое приложение. Заходим там на usp слой. Создаем там вьюху с таким же именем и идентификатором.
2. Перекладываем usp слой в проблемное приложение.
3. Рестартуем аос
4. В итоге прямая вьюха на usp слое закрывает кривую вьюху и аос перестает падать.

Дальше лечим usr слой.
Запускаем на сервере джобик:
X++:
static server void main(Args _args)
{
    UtilElements        utilElements;
    Tableid             viewId = 50900; // поставить свой id вьюхи
    UtilEntryLevel      utilEntryLevel = UtilEntryLevel::usr;
    Identifiername      name    = 'Metadata'; // имя узла надо предварительно перепроверить при просмотре в обозревателе таблички UtilElements
    
    str                 str2Scan;
    void locView(str _str2Scan)
    {
        int     i;
        str     s;
        int     charCode;
        ;

        _str2Scan = strRem(_str2Scan, "\n\r");

        for (i = 1; i<= strlen(_str2Scan); i += 2)
        {
            charCode = str2int('0x' + substr(_str2Scan, i, 2));
            s += num2char(charCode);
        }

        info(s);
    }
    ;

    ttsbegin;
    flush utilElements;
    utilElements.disableCache(true);
    utilElements.skipTTSCheck(1);
    utilElements.ttsbegin();

    select forupdate utilElements
        where   utilElements.utilLevel  == utilEntryLevel
            &&  utilElements.parentid   == viewId
            &&  utilElements.name       == name // по идее может сработать и без этого условия
            &&  utilElements.recordType == UtilElementType::ViewQuery;
            
    str2Scan = BinData::dataToString(UtilElements.code);
    locView(str2Scan);
// throw info("Ну очень стремно удалять");
    utilElements.doDelete();
    utilElements.ttscommit();
    ttscommit;
}
В итоге кривизна вьюхи на usr слое вычищена.
Можно удалять usp слой.

P.S.
Возможно, что сработает и без манипуляция с usp слоем - я не пробовал. Нет желания повторять.

Если в джобе поставить переменную с типом utilIdElements то почему-то не срабатывает - отказывается редактировать или удалять запись с такими сообщениями:

Цитата:
Невозможно удалить запись в Application Model (UtilIdElements).
Номер записи не соответствует первоначальному номеру. Если таблицей используется весь кэш таблицы, это может быть вызвано тем, что этот кэш был сброшен. В этом случае следует перезапустить задание.
Цитата:
Невозможно отредактировать запись в Application Model (UtilIdElements).
Номер записи не соответствует первоначальному номеру. Если таблицей используется весь кэш таблицы, это может быть вызвано тем, что этот кэш был сброшен. В этом случае следует перезапустить задание.
Т.е. UtilElements и UtilIdElements ведут себя по-разному.
Интересно, почему так.

Последний раз редактировалось Logger; 09.02.2018 в 13:04.
За это сообщение автора поблагодарили: DSPIC (10), Pasha_x (1), gl00mie (10), fed (5), raz (5), _scorp_ (10).