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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.03.2015, 12:11   #1  
dit31 is offline
dit31
Участник
 
12 / 13 (1) ++
Регистрация: 16.01.2015
Как в отладчике посмотреть значение parm-метода?
(AX 2012 R2)
Подскажите, пожалуйста, как в отладчике посмотреть значение parm-метода?
parm-методы по сути являются оберткой для переменных класса.
Как в отладчике можно посмотреть их текущие значения.
Конкретно интересует element.args()
Старый 04.03.2015, 13:48   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
element.args() - это не parm-метод, это свойство объекта ядра (формы), а то, что лежит в Args, - это свойства другого объекта ядра, который является значением свойства формы. Отладчик в общем случае не умеет показывать значения свойств объектов ядра, таких как форма. Но в Args заглянуть отчасти может - если вытащить ссылку на них в переменную в calssDeclaration формы либо какого-то метода на ней. При этом отображаемое "содержимое" Args - это то, что сам класс показывает в ответ на вызов toString(). Из объектов ядра сколь-нибудь подробно отладчик умеет показывать разве что свойства FormControl'ов.
За это сообщение автора поблагодарили: dit31 (1).
Старый 04.03.2015, 14:02   #3  
dit31 is offline
dit31
Участник
 
12 / 13 (1) ++
Регистрация: 16.01.2015
А значения обычных самописных parm-методов отладчик может показывать? Для этого метод должен начинаться на "parm"?
Старый 04.03.2015, 14:24   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Нет, для отладчика X++ что parm-метод, что любой другой - это именно метод. Отладчик штатно умеет вызывать только метод toString() объектов. Чтобы посмотреть "значение" parm-метода, надо знать, что именно тот возвращает, и если это - какая-то переменная класса, то в отладчике развернуть соотв. объект в окне Locals и найти в нем эту переменную. Если отладчик находится в коде объекта, "значение" parm-метода которого надо посмотреть, то разворачивать надо this.
За это сообщение автора поблагодарили: Dreadlock (1).
Старый 04.03.2015, 15:27   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
можно "провалится" в метод сделав шаг и там посмотреть, что возвращается
Старый 04.03.2015, 15:30   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Это есть parm-метод вызывается непосредственно в отлаживаемом коде
Старый 04.03.2015, 16:15   #7  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Еще можно добавить в АОТ небольшой класс и использовать его при отладке:

X++:
 class ParmMethodViewer
{
    Object object;
     Map parmMethodName2Value;
}
 
 void initMap()
{
    DictClass    dictClass;
    int          methodIdx;
    str          methodName;
    Object       parmObject;
    Common       parmCommon;
    anytype      parmPrimitive;
    Types        type;
    ;
 
     parmMethodName2Value = new Map(Types::String, Types::String);
 
     dictClass = new DictClass(classidget(object));
     for(methodIdx = 1; methodIdx <= dictClass.objectMethodCnt(); methodIdx++)
    {
        methodName = dictClass.objectMethod(methodIdx);
         if (!strStartsWith(methodName, 'parm'))
        {
            continue;
        }
 
         type = typeOf(dictClass.callObject(methodName, object));
 
        switch (type)
        {
            case Types::Class:
                parmObject = dictClass.callObject(methodName, object);
                parmMethodName2Value.insert(
                    methodName,
                    classId2Name(classidget(parmObject)));
                break;
 
             case Types::Record:
                parmCommon = dictClass.callObject(methodName, object);
                parmMethodName2Value.insert(
                    methodName,
                        strFmt('Table %1, RecId %2',
                            tableid2name(parmCommon.TableId),
                            parmCommon.RecId));
                break;
 
             case Types::String,
                 Types::Date,
                 Types::Guid,
                 Types::Int64,
                 Types::Integer,
                 Types::Real,
                 Types::Time,
                 Types::UtcDateTime:
                parmPrimitive = dictClass.callObject(methodName, object);
                parmMethodName2Value.insert(
                    methodName,
                    strFmt('%1', parmPrimitive));
                break;
        }
    }
}
 
 void new(Object _object)
{
    ;
     object = _object;
 
     this.initMap();
}
Примеры использования:

X++:
 public static void main(Args _args)
{
    Args             args;
    InventTable      inventTable;
     ParmMethodViewer parmMethodViewer;
    ;
 
     args = new Args();
    args.parm('qwerty');
    args.parmEnumType(enumnum(NoYes));
    args.parmObject(new SalesFormLetter_Invoice());
 
     parmMethodViewer = new ParmMethodViewer(args);
     breakpoint;
 
     select firstonly inventTable;
     parmMethodViewer = new ParmMethodViewer(AxInventTable::newInventTable(inventTable));
     breakpoint;
}
На первой точке остановки переменная parmMethodName2Value будет иметь значение ["parm"->"qwerty","parmEnumType"->"61469","parmObject"->"SalesFormLetter_Invoice"]

На второй:

["parmAltConfigId"->"","parmAltInventColorId"->"","parmAltInventSizeId"->"","parmAltItemId"->"","parmAssetGroupId_RU"->"","parmAssetId_RU"->"","parmBatchNumGroupId"->"","parmBOMCalcGroupId"->"","parmBOMLevel"->"0","parmBOMUnitId"->"pcs", ...

Но тут нужно быть уверенным, что все parm-методы объекта написаны по бест-практисам и ничего другого не делают.
За это сообщение автора поблагодарили: Logger (3), dit31 (1).
Теги
ax2012

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Значение display метода по его названию Андрей К. DAX: Программирование 41 25.11.2020 06:52
Значение поля "Открытое значение" и сопоставление складских проводок Dimitry DAX: Функционал 0 23.07.2013 17:23
из Display метода на одном DS получить текущее значение другого приджойненного alvares DAX: Программирование 15 15.11.2012 14:52
значение из realControl DmitryK DAX: Программирование 8 21.02.2012 14:43
X++ иногда не контролирует тип результата метода Logger DAX: Программирование 2 03.03.2005 18:28

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:32.