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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.07.2011, 16:21   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Как лучше отлаживать код с временными таблицами, recordset'ами, set'ами, map'ами и прочими сложными структурами?
В связи с этими ветками
Просмотр [временных] таблиц в отладчике.
ax2009 метод toString() в отладчике
Использование Table Browser в момент отладки
[ANN] Tabax 0.1 -- панель задач для Axapta

хотелось бы начать обсуждение вопроса

Как лучше отлаживать код с временными таблицами, recordset'ами, set'ами, map'ами и прочими сложными структурами?

===============
лично я предпочитаю превращать в container
и смотреть непосредственно в отладчике.

для этого в классе appl я завел переменную DebugCon и метод для установки значения в эту переменную класса.

Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 444
Размер:	32.4 Кб
ID:	7025
Методика такая:
1. в коде вставляю вызов этого метода и ставлю точку останова
2. в отладчике в окне Watch (или в Variables) смотрю переменную класса appl.DebugCon
3. причем в окне Watch могу перечислить конкретные поля записей для отслеживания
4. а также могу изменить значения нужных мне переменных, если буду использовать этот контейнер в отладке дальше

Но этот способ неудобен, если с кодом работает несколько человек одновременно. Да, конечно, можно завести нескольк переменных для каждого разработчика... но...

А какова ваша методика отладки кода со сложными структурами?
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: trud (2).
Старый 29.07.2011, 18:08   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Если с кодом работает несколько человек то вставки только для себя можно обрамлять
if (curUserID() == "mazzy")
{
// блаблабла
}

if (curUserID() == "logger")
{
// бебебебе
}

друг другу мешать не будет.
Старый 29.07.2011, 18:11   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Перечитал внимательнее и не совсем понял какие проблемы создает это
Цитата:
Но этот способ неудобен, если с кодом работает несколько человек одновременно. Да, конечно, можно завести нескольк переменных для каждого разработчика... но..
При одновременной работе нескольких программистов у каждого из них свой экземпляр глобального касса application хотя они и на сервере живут.
Так что проблем быть не должно.
Старый 29.07.2011, 18:55   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
4. а также могу изменить значения нужных мне переменных, если буду использовать этот контейнер в отладке дальше
Это вряд ли.
Вы ведь работаете с упакованной копией значений полученной при вызове table2con(), а не со ссылкой.

Последний раз редактировалось Logger; 29.07.2011 в 19:10.
Старый 29.07.2011, 19:01   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вот еще пример класса, который принимает по ссылке произвольный объект и отображает нужную информацию в отладчике через toString()

Написано было изначально чтобы ловить изменение состояния объектов, у которых нельзя перекрыть toString() (какие то паразиты придумали делать его final )
Также не всегда бывает удобно использовать toString() для ядреных объектов, надо создавать наследника и с ним работать. Для xrecord - toString() можно перекрыть, но почему-то результат его вывода отладчик игнорирует.

Поэтому возникла идея создать свой класс, который позволит отобразить в отладчике информацию для таких "неудобных" объектов.

Думаю его можно и для обсуждаемых целей применять. Можно смотреть их значения посредством toString(), если их не очень много конечно.

Если много - то в методе toString() вызываем упаковку интересующего нас объекта в контейнер-переменную и
(!!!)
ядро дергает из отладчика метод toString() при перерисовке окна, а мы заодно обновляем состояние внутренних переменных класса
вытаскивая в контейнер содержимое объекта, таким образом
получаем актуальную версию состояния наблюдаемого объекта.
Т.е. для обновления контейнера не надо самим из отлаживаемого кода кода дергать map.pack() или как в примере маззи table2con()
ядро это сделает за нас вызывая toString()

Таким образом мы в любой момент времени видим актуальные значения без дополнительного кодирования.Вложение 7026
Вложения
Тип файла: xpo SharedProject_GRD_DebuggerViewObjectProperties.xpo (6.4 Кб, 584 просмотров)
За это сообщение автора поблагодарили: mazzy (5), gl00mie (15), alex55 (3), Kabardian (3).
Старый 29.07.2011, 19:08   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вот скрины как все это в отладке выглядит
Миниатюры
Нажмите на изображение для увеличения
Название: GRD_11.png
Просмотров: 624
Размер:	80.4 Кб
ID:	7028   Нажмите на изображение для увеличения
Название: GRD_12.png
Просмотров: 579
Размер:	82.5 Кб
ID:	7029  

Нажмите на изображение для увеличения
Название: GRD_13.png
Просмотров: 506
Размер:	84.6 Кб
ID:	7030  
Теги
временная таблица, законченный пример, как правильно, классы коллекций, отладка, отладчик

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Классы коллекций (инициализация, сериализация): List, Set, Map. petergunn DAX: База знаний и проекты 12 06.11.2024 18:38
update_recordset не работает с системными полями и таблицами? Alexx7 DAX: Программирование 42 19.10.2009 09:39
daxis: What’s new in Set based operations in Dynamics Ax 2009 Blog bot DAX Blogs 0 01.04.2009 18:05
Как перенести данные между временными таблицами MSSQL и АОТ velk DAX: Программирование 5 08.08.2006 17:27
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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