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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.08.2005, 16:53   #1  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
Post добраться из ClassFactory "обратно" до класса
Hello All!

Как узнать в ClassFactory, какой именно класс работает?

Например, если при запуске класса, основанного на RunBase, в SysSetupFormRun посмотреть this.name(), увидим dialog, а classId2Name(classIdGet(this)) есть SysSetupFormRun. Args пустой, соответственно и caller() нельзя получить.

А хотелось бы узнать имя класса, который extends RunBase.

Смысл: например, чтобы для отслеживания запусков форм/отчётов модифицировать только ClassFactory, а не каждый отслеживаемый класс.
Старый 09.08.2005, 17:49   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
Re: добраться из ClassFactory "обратно" до класса
Цитата:
Изначально опубликовано somebody
Как узнать в ClassFactory, какой именно класс работает?
Странный вопрос. Не могли бы Вы сформулировать его в терминах ООП?
Цитата:
Например, если при запуске класса, основанного на RunBase, в SysSetupFormRun посмотреть this.name(), увидим dialog, а classId2Name(classIdGet(this)) есть SysSetupFormRun. Args пустой, соответственно и caller() нельзя получить.
Конечно, ведь мы видим форму, сгенерированную объектом класса dialog
Цитата:
А хотелось бы узнать имя класса, который extends RunBase.
Каким именно образом? Из кода или увидеть в SysSetupFormRun?
Цитата:
Смысл: например, чтобы для отслеживания запусков форм/отчётов модифицировать только ClassFactory, а не каждый отслеживаемый класс.
Что значит: "отслеживать запуск форм/отчетов"?
__________________
Isn't it nice when things just work?
Старый 09.08.2005, 18:08   #3  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
1) зачем?
2) no comment
3) что значит "увидеть в SysSetupFormRun"?
4) no answer
Старый 09.08.2005, 18:18   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Видимо, г-н somebody хочет отслеживать предка, который вызвал тот или иной класс/отчет. Типа стека вызовов.
Хм. чуствуется подход после Java

С Уважением,
Георгий
Старый 09.08.2005, 18:21   #5  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Изначально опубликовано somebody
3) что значит "увидеть в SysSetupFormRun"?
Ошибся, имел в виду форму SysSetupForm
__________________
Isn't it nice when things just work?
Старый 09.08.2005, 18:25   #6  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Изначально опубликовано George Nordic
Видимо, г-н somebody хочет отслеживать предка, который вызвал тот или иной класс/отчет. Типа стека вызовов.
Хм. чуствуется подход после Java

С Уважением,
Георгий
Георгий, судя по уточнениям к вопросу:
Цитата:
Изначально опубликовано George Nordic
1) зачем?
2) no comment
4) no answer
,
господина somebody вообще не интересуют ответы.
__________________
Isn't it nice when things just work?
Старый 10.08.2005, 11:14   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Я попробую сформулировать за автора проблему с которой он столкнулся. Возможно, ее можно решить и без использования ClassFactory.

AXPTA 2.5 SP3

С момента введения в эксплуатацию AXAPTA было введено множество самых разных модификаций. Принимались на работу и уволнялись как собственные (самой компании) разработчики, так и менялись программисты Columbus вносившие свои модификации. Приходили и уходили начальники самых разных отделов, которые считали, что вот они-то как раз наведут во всем порядок, но для этого надо ввести еще вот такую и такую функциональность. После их ухода (а иногда и ДО) про эту функциональность благополучно забывали. Иногда еще до ее внедрения.

В результате, имеем в системе огромное количество самых разных объектов.

Сама задача заключается в следующем.

Необходимо определить, какие же объекты реально используются в системе, а какие - нет.

Пока остановились на задаче определения факта использования классов, форм и отчетов. Это основная масса объектов, где скопился "мусор".

Под термином "используются" в данном случае понимается факт открытия (вызова) соответствующего объекта. В момент открытия (вызова) объекта надо "скинуть" в некий лог информацию следующего содержания:

тип объекта
имя объекта
дата и время обращения

Для справки (т.е. не обязательно) можно еще добавить

пользователь
компания

Каким образом можно организовать заполнение этого лога? Другими словами, журналирование использования объектов AXAPTA?
Старый 10.08.2005, 12:46   #8  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
Интересная задача :-) Как в общем виде решить, не знаю. Но что касается наследников от Runbase, то imho, достаточно переопределить в Runbase, метод new и в нем писать в лог данные, получаемые через:
classidget(this)
и
classId2Name(classidget(this))
__________________
Isn't it nice when things just work?
Старый 10.08.2005, 13:58   #9  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Рискну предложить исследование использования объектов в построенных перекрестных ссылках. Очевидно, что тк
Цитата:
Под термином "используются" в данном случае понимается факт открытия (вызова) соответствующего объекта.
и
Цитата:
но для этого надо ввести еще вот такую и такую функциональность
можно сделать вывод, что большинство объектов - потенциально мусорных сделаны в слое выше dis (для примера - usr). Соответственно, очевидно, что отбирать нужно из объектов, которые лежат в этом слое (usr). Далее делается некий анализ - какие классы запускаются из пунктов меню и что это за меню - и кто пользует данный отчет (правда тут уже процесс неавтоматизированный получается)
очевидно, что если есть класс, не имеющий наследников, и ни один метод из этого класса не запускается, то класс - скорее всего мусорный.
Конечно - такой процесс долгий и нудный.... однако теоретически может привести к результатам.
В отношении лога можно добавить что есть классы, которые вообще никогда не запускаются, однако запускаются их наследники (как напр RunBase).
Старый 10.08.2005, 16:01   #10  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
А может профайлер приспособить под это дело, при логине включать скртыно? Или, покопавшись в нем, разобраться - как он определеят всю нужную информацию.
Старый 10.08.2005, 16:44   #11  
maximus is offline
maximus
Участник
 
153 / 10 (1) +
Регистрация: 16.03.2005
Разверну идею, поданую macklakov.

Создаете новую таблицу с полем единственным полем ClassID. Из new пишите в нее ClassID. Потом сажаете несколько человек на тестирование всех стандартных операций в системе. Тестируете и получаете ClassID всех используемых. Далее любым известным способом формируете разность - все классы минус используемые.
Из числа оставшихся возможно предположить 2-3% тех, которые нужны, но функционал просто забыли протестировать. Далее перекрестными ссылками ищутся все определения каждого конкретного класса из числа разностных классов и коментарятся. Коментарий дополняется двумя спец. макросами. Первый нужен, чтобы все такие комментарии можно было найти для удаления, второй - все с использованием такого класса для восстановления в случае ошибки.

Постепенно кол-во оставшихся классов сведется к 0. В финале, тестируете еще раз и вытираете комментарии. Работа долгая и потная, но чудес не бывает По крайней мере, это системный подход..
Старый 10.08.2005, 17:48   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Еще пара идей:
*статически проанализировать граф вызовов при помощи Xref и выявить недостижимые объекты
*пройтись по достижимым кастомизированным методам и вставить автоматически в начало каждого метода (или только для new классов, но тогда надо создавать new и корректно перекрывать) что-то типа
PHP код:
int хренВыСделаетеТакойДругойИдентификатор=MyCoolLogger::AddUsage("НазваниеОбъекта"); // эту строку снести после анализа 
Старый 11.08.2005, 15:22   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да. Речь идет только и исключительно об объектах созданных в слое USR. Не измененных, а именно созданных. Получить их список можно через таблицу UtilElements или UtilIdElements.

Да. Перехват в RunBase позволит выявить достаточно большую часть используемых объектов. Однако это далеко не все классы и отчеты.

Предварительный анализ показал, что на базе RunBase сделано примерно 2/3 всех классов слоя USR. При этом никак не учитываются формы, а отчеты лишь частично, если они запускаются через RunBaseReport (это примерно 2/5 всех отчетов слоя USR)

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

PPS: то, что написал belugin я вообще не понял.
Старый 11.08.2005, 15:45   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
какая конкретна буква непонятна?

1. Можно проанализировать перекрестные ссылки по данным хранящимся в таблицах XRef* и выяснить статически, какие классы не вызываются.

2. Можно пройтись инструментом, который будет вставлять в начало всех методов (через TreeNode ) фрагмент, логгирующий вызовы. А после окончание логгирования его убрать.
Старый 11.08.2005, 16:12   #15  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Изначально опубликовано belugin
2. Можно пройтись инструментом, который будет вставлять в начало всех методов (через TreeNode ) фрагмент, логгирующий вызовы. А после окончание логгирования его убрать.
Хм, а как определить, в каком месте метода завершается объявление переменных?
__________________
Isn't it nice when things just work?
Старый 11.08.2005, 16:21   #16  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Если командир не может предотвратить объявление переменных, он должен его возглавить.

См. код в 1 моём сообщении
Старый 11.08.2005, 16:25   #17  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Изначально опубликовано belugin
Если командир не может предотвратить объявление переменных, он должен его возглавить.

См. код в 1 моём сообщении
Точно. Гениально!
__________________
Isn't it nice when things just work?
Старый 11.08.2005, 18:02   #18  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Изначально опубликовано belugin
Если командир не может предотвратить объявление переменных, он должен его возглавить.

См. код в 1 моём сообщении
PHP код:
/*
А здесь комментарии 
И старый кусок начала
void new()
{
}
*/
void new(Par1 _par1,
    
Par2 _par2,
    
Par3 _par3)
{
...

Как возглавлять будем? Поиск до первой фигурной скобки?
Старый 11.08.2005, 18:07   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
не могу придумать случая, когдабы поиск до первойфигурной не сработал. (если отсеять комментарии). комментарии может отсеять, например XPPParser или регулярное выражение.

Или можно отсеят комментарии просто обнаруживая символы комментария до скобки и ругаясь на них. Поруганные места править руками.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
"Запущен сайт о Microsoft Dynamics AX 4.0 новой системе класса ERP" GM2005 DAX: База знаний и проекты 46 08.02.2007 11:47
"Серверный" экземпляр класса SysExcelApplication Bug DAX: Программирование 4 13.01.2006 13:32
"Программный" вызов метода класса!? axaLearner DAX: Программирование 13 16.08.2005 08:12
Не могу добраться до класса Application ?! 3oppo DAX: Программирование 1 05.07.2005 07:56
"LIKE" и "OR" в "qbds" @x DAX: Программирование 14 20.01.2004 13:20
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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