08.04.2013, 12:58 | #1 |
Участник
|
Баг 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 |
Боец
|
X++: sysInfoAction_Formrun = SysInfoAction_Formrun::newFormname(formstr(AssetDepBookJournalTable)); sysInfoAction_Formrun.parmCallerBuffer(_assetDepBookJournalTable); info(strfmt("@SYS86501", _numberOfTransactions, _assetDepBookJournalTable.JournalId), '', sysInfoAction_Formrun); Цитата:
SysInfoAction_FormName_RU(custTableFound,formStr(CustTable)));
|
|
08.04.2013, 13:55 | #3 |
Участник
|
Женя, привет.
Запускать через форму конечно можно, но как же права доступа? |
|
08.04.2013, 14:10 | #4 |
Боец
|
Привет.
Согласен, но я бы забил. В стандарте на это забили 50\50. Кстати, а зачем там pack\unpack ? |
|
08.04.2013, 15:15 | #5 |
Участник
|
Смотри метод info.add. Четвертым параметром в этот метод передается класс, наследник от SysInfoAction. Дальше в этом методе есть такой код:
X++: if (_sysInfoAction)
{
packedAction = _sysInfoAction.pack();
actionClassId = classidget(_sysInfoAction);
}
else
{
packedAction = connull();
actionClassId = 0;
}
this.addSysInfoAction(_helpUrl, actionClassId, packedAction); 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; } 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)); } } |
|
|
За это сообщение автора поблагодарили: dn (4), DSPIC (10). |
08.04.2013, 16:05 | #6 |
Участник
|
Интересно, что в версии AX2012 класс Args поддерживает интерфейс SysPackable, т.е. имеет методы pack/unpack
http://msdn.microsoft.com/en-us/library/args.pack.aspx |
|
22.05.2013, 15:06 | #7 |
Участник
|
Хочу добавить свои 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). |