AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.04.2013, 12:58   #1  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Баг SysInfoAction_MenuItemRun_RU
Сегодня нашел баг в классе SysInfoAction_MenuItemRun_RU. Воспроизводится в версиях 3, 4 2009. За 2012 сказать не могу. Смысл в следующем:
Хочется сделать так, чтобы по двойному клику в инфологе пользователь переходил к конкретной записи в нужной форме. Класс, как я понимаю, для этого и задумывался. Но в нем не пакуется args. Соответственно работает только запуск нужного MenuItem, а все параметры, переданные в args - теряются.

Лечится добавлением параметров для сериализации данных из args в методы pack и unpack класса SysInfoAction_MenuItemRun_RU. Например:

X++:
public container pack()
{
    return [#CurrentVersion,#CurrentList, args.lookupField(), args.lookupValue(), args.record(), super()];
}

public boolean unpack(container _packedClass, Object _object = null)
{
    Integer     version = RunBase::getVersion(_packedClass);
    Container   con;
    FieldId     loockupField;
    str         lookupValue;
    Common      common;
    ;

    switch (version)
    {
        case #CurrentVersion:

            [version, #CurrentList, loockupField, lookupValue, common, con] = _packedClass;
            args.lookupField(loockupField);
            args.lookupValue(lookupValue);
            args.record(common);
            super(con, _object);

            break;

        default:
            return false;
    }

    return true;
}
За это сообщение автора поблагодарили: Logger (5), IvanS (1), alex55 (3), S.Kuskov (2).
Старый 08.04.2013, 13:45   #2  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1238 (44) ++++++++
Регистрация: 11.04.2008
X++:
sysInfoAction_Formrun = SysInfoAction_Formrun::newFormname(formstr(AssetDepBookJournalTable));

sysInfoAction_Formrun.parmCallerBuffer(_assetDepBookJournalTable);

info(strfmt("@SYS86501", _numberOfTransactions, _assetDepBookJournalTable.JournalId), '', sysInfoAction_Formrun);
or

Цитата:
SysInfoAction_FormName_RU(custTableFound,formStr(CustTable)));
Про последнюю не уверен - даже не знаю, стандартый ли это класс.
Старый 08.04.2013, 13:55   #3  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Женя, привет.

Запускать через форму конечно можно, но как же права доступа?
Старый 08.04.2013, 14:10   #4  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1238 (44) ++++++++
Регистрация: 11.04.2008
Привет.
Согласен, но я бы забил. В стандарте на это забили 50\50.
Кстати, а зачем там pack\unpack ?
Старый 08.04.2013, 15:15   #5  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Кстати, а зачем там pack\unpack ?
Смотри метод info.add. Четвертым параметром в этот метод передается класс, наследник от SysInfoAction. Дальше в этом методе есть такой код:
X++:
        if (_sysInfoAction)
        {
            packedAction  = _sysInfoAction.pack();
            actionClassId = classidget(_sysInfoAction);
        }
        else
        {
            packedAction  = connull();
            actionClassId = 0;
        }

        this.addSysInfoAction(_helpUrl, actionClassId, packedAction);
Т.е. переданный класс пакуется, запоминается конкретный Id класса и все это сохраняется во временную таблицу SysInfolog:
X++:
void addSysInfoAction(
    str _helpUrl,
    int actionClassId,
    container action)
{
    tmpInfoTable.HelpUrl       = _helpUrl;
    tmpInfoTable.Action        = action;
    tmpInfoTable.ActionClassId = actionClassId;

    tmpInfoTable.insert();
    tmpActionId[this.line()+1] = tmpInfoTable.RecId;
}
Форма, которая отображает infolog - это SysInfologBrowser. Эта форма содержит вышеописанную временную таблицу. По двойному клику на инфологе происходит позиционирование на конкретном курсоре временной таблицы, создание экземпляра класса по сохраненному classId, распаковка класса, согласно сохраненным данным и запуск класса:
X++:
void executeAction()
{
    DictClass     dictClass;
    SysInfoAction sysInfoAction;
    HelpGenerator helpGenerator;

    if (sysInfolog.ActionClassId)
    {
        dictClass = new DictClass(sysInfolog.ActionClassId);
        sysInfoAction = dictClass.makeObject();
        sysInfoAction.unpack(sysInfolog.Action, infolog.infoActionObject());
        sysInfoAction.run();
    }
    else
    {
        helpGenerator = infolog.helpGenerator();
        if (sysInfolog.HelpUrl)
            helpGenerator.showURL(sysInfolog.HelpUrl);
        else
            helpGenerator.showURL('INFOLOG:\\\\'+int642str(sysInfolog.RecId));
    }
}
И здесь как раз засада - args не пакуется, следовательно класс не отрабатывает как ему положено.
За это сообщение автора поблагодарили: dn (4), DSPIC (10).
Старый 08.04.2013, 16:05   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,435 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Интересно, что в версии AX2012 класс Args поддерживает интерфейс SysPackable, т.е. имеет методы pack/unpack
http://msdn.microsoft.com/en-us/library/args.pack.aspx
Старый 22.05.2013, 15:06   #7  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Хочу добавить свои 5 копеек по этому поводу.
Данный Pack,unpack хорошо работает только если передается в args.record строка. А если нужно, чтобы открывалась форма и находила нужную запись, то есть использовались параметры lookupField и lookValue, то выдается ошибка "Неправильный тип элемента в вызове ConIns";
Поэтому данные значения перенес в CurrentList и все стало работать.
Выглядит это так:
X++:
class SysInfoAction_MenuItemRun_RU extends SysInfoAction
{
    MenuItemType    menuItemType;
    MenuItemName    menuItemName;
    Args            args;
    FieldId         loockupField;
    str             lookupValue;
    Common          common;

#define.CurrentVersion(3)
#localmacro.CurrentList
     menuItemType,
     menuItemName,
     loockupField,
     lookupValue,
     common
#endmacro
}

public void new(MenuItemType _menuItemType, MenuItemName _menuItemName, Args _args = null)
{

    ;
    menuItemType = _menuItemType;
    menuItemName = _menuItemName;

    if(_args)
    {
        args = _args;
        loockupField = _args.lookupField();
        lookupValue  = _args.lookupValue();
        common       = _args.record();
    }
    else
    {
        args = new Args();
    }
}

//Bugfix исправление потери дополнительных параметров
public container pack()
{
    ;
    return [#CurrentVersion, #CurrentList]+ super();
}

//Bugfix исправление потери дополнительных параметров
public boolean unpack(container _packedClass, Object _object = null)
{
    Integer     version = RunBase::getVersion(_packedClass);
    Container   con;
    ;

    switch (version)
    {
        case #CurrentVersion:

            [version, #CurrentList, con] = _packedClass;
            args.lookupField(loockupField);
            args.lookupValue(lookupValue);
            args.record(common);
            super(con, _object);

            break;

        default:
            return false;
    }

    return true;
}
За это сообщение автора поблагодарили: dn (4), _scorp_ (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
SalesPurchReport_RU. Баг? Fornit DAX: Программирование 2 23.07.2012 21:13
AX2009_RU: баг в InventUpd_Financial.financialReceiptQueryRun_W() EVGL DAX: Функционал 2 04.08.2010 10:58
Баг на форме "Проводки по сопоставлению" S.Kuskov DAX: Программирование 12 29.04.2009 19:19
ALEG: Блог переехал на новую площадку tools4cio.ru Blog bot DAX Blogs 0 23.02.2009 18:05
Вопрос по классу SalesPurchReport_RU Кирилл DAX: Программирование 4 27.02.2004 13:28

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:44.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.