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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.10.2017, 16:16   #1  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,785 / 3660 (180) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
А как в ax7 код метода получить?
Занимаюсь апгрейдом класса.
Раньше замечательно работало сравнение с OLD-слоем.
Фиг с ним, сделал себе функцию вывода контента методов в текстовый файл.

Для ax2012 все тупо, просто, быстро.
А вот в ax7 выяснилось, что DictMethod.getSource - obsolete.

хорошо, напрягся, переписал на Metadata.
но и в нем axMethod.Source - пустой.
Хотя axCalss.Declaration - вполне себе X++ код показывает.

Ветку Channel9: Peter Villadsen and Gustavo Plancarte: X++ to MSIL
Мне не нужен .net код, мне нужен X++ код.

как можно получить?


================================
ax2012
X++:
static void Job2(Args _args)
{
    SysDictClass dc = new SysDictClass(classNum(EInvoiceCFDIXMLDocReader_MX));
    TextBuffer text = new TextBuffer();

    SetEnumerator se = dc.methods().getEnumerator();
    SysDictMethod dm;

    Map mm = new Map(Types::String, Types::String);
    MapEnumerator me;

    while( se.moveNext() )
    {
        dm = se.Current();
        mm.insert(dm.name(), dm.getSource());
    }

    me = mm.getEnumerator();
    while( me.moveNext() )
    {
        text.appendText(me.currentValue());
        text.appendText('\n');
    }

    text.toClipboard();
    info("done.");
}

ax7.1 :
X++:
class ClassMethods
{
    public static void main(Args _args)
    {
        TextBuffer text = new TextBuffer();
    
        str packageDir = 'C:\AOSService\PackagesLocalDirectory';

        //or
        var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment();
        packageDir = environment.get_Aos().get_PackageDirectory();

        // it's kind of magic
        var runtimeProviderConfiguration = New Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration(packageDir);
        var metadataProviderFactory =  New Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory();
        Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider provider = metadataProviderFactory.CreateRuntimeProvider(runtimeProviderConfiguration);




        Map mm = new Map(Types::String, Types::String);

        Microsoft.Dynamics.AX.Metadata.MetaModel.AxClass c = provider.Classes.Read('EInvoiceXMLDocReader_MX');
        for(int i=0; i<c.MethodCount(); ++i)
        {
            Microsoft.Dynamics.AX.Metadata.MetaModel.AxMethod m = c.GetMethod(i);
            mm.insert(m.Name, m.Source);
        }

        MapEnumerator me = mm.getEnumerator();
        while( me.moveNext() )
        {
            text.appendText(me.currentValue());
            text.appendText('\n');
        }
        
        File::SendStringAsFileToUser(text.toString(), 'methods.txt');
        info("done.");
    }

}
Миниатюры
Нажмите на изображение для увеличения
Название: ax7.PNG
Просмотров: 19
Размер:	65.7 Кб
ID:	11674  
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 06.10.2017, 16:34   #2  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,785 / 3660 (180) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
похоже, что работающий ответ - работать с XML-файлом исходного кода напрямую, без ансамбля Аксапты.

тогда вопрос скорее чисто теоретический - а можно ли получить исходный код из аксапты?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 07.10.2017, 13:59   #3  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,740 / 573 (23) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от mazzy Посмотреть сообщение
похоже, что работающий ответ - работать с XML-файлом исходного кода напрямую, без ансамбля Аксапты.

тогда вопрос скорее чисто теоретический - а можно ли получить исходный код из аксапты?
Логически рассуждая ( я честно пытаюсь ) исходного кода в аксапте больше не находится.
Раньше он было внутри (AOD, потом база), а сейчас файловая система (wеb директория) которая
снаружи. Вернее AOD тоже было во файловой системе но это была внутренняя "сборка", а не лежащий для сборки код.

Самое практичное что-то типа Notepad++ для сравнения текстовых файлов. То что в AX2012 xpo, в AX7 это axpp. То есть экспортируем один и тот же проект с двух приложений и сравниваем как два текстовых файла. Так интереснее сравнивать не отдельные классы, а сразу много обьектов за раз. И без всяких возможных ошибок связанных с разрезами слоев и моделей.

Эволюция
файлы AOD -> база -> xml файлы
довольно занятная.
Сезон два "Долгий путь к Java"

P.S. И показательна жизнь и смерть моделей в аксапте. Натуральный триллер.
Скоро изобретут пространство вложенных "моделей" так чтобы полное имя совпадало с физическим файловым путем. Может назовут как нибудь хитро чтобы все прониклись.

Последний раз редактировалось ax_mct; 07.10.2017 в 14:15.
Старый 07.10.2017, 14:35   #4  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,740 / 573 (23) +++++++
Регистрация: 10.10.2005
Адрес: PHP
В принципе стандартный путь в секте BDSM это TFS
"compare files and folders across branches in Team Foundation Server"

там где контекстное "Compare with baseline" не подходит.

Но это совсем не KISS. Я бы выгружал в текст и сравнивал чем потупее.
Старый 07.10.2017, 15:30   #5  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,785 / 3660 (180) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
1.
как много и все не по делу.

2.
разработчиков аксапты никто не просил класть именно в файлы.
и уж точно никто не просил уменьшать функционал.
они сделали так, как считали нужным для себя.
но сделали так, что не работают ни старые аксаптовские инструменты, ни стандартные c#...

3.
пока получается так, как на скриншоте ниже.
пытаюсь отладить методику.

4.
вопрос остается: можно ли получить свой исходный код из самой ax7?


PS насколько же проще работать на ax2012.
PSS и все таки, лучшей была ax2009
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 50
Размер:	195.7 Кб
ID:	11675  
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 07.10.2017 в 15:35.
Старый 07.10.2017, 17:16   #6  
DSPIC is offline
DSPIC
Боец
Аватар для DSPIC
MCP
Лучший по профессии 2017
Лучший по профессии 2014
Лучший по профессии 2009
 
979 / 990 (35) +++++++
Регистрация: 11.04.2008
Адрес: Минск
Вероятно уже нельзя (без чтения XML, так или иначе).
Ранее AX сама компилировала код, вплоть до 2012. Сама генерила .net CIL. Для этого был нужен доступ и исходному коду изнутри.
Сейчас, если я правильно понимаю архитектуру, то эти функции на себя взяла VS, работающая только с исходным XML и выдавая .net на выходе. Т.е., вероятно AX не в курсе своего исходного кода, который, по сути ей больше не нужен. (Функции, с run-time генерацией кода и его выполнением, как я понимаю больше не работают?).
Да и исходный код более не привязан к конкретному методу. Сейчас, открывая код конкретного метода открывается полностью исходник всего обьекта - считай, голый текст. И пока он не скомпилится, по сути метода, как такового не существует. А все классы, методы и остальные артефакты АОТ - результат работы инструментария VS, на входе которого голый XML.
Это размышления.
__________________
Мой блог

Последний раз редактировалось DSPIC; 07.10.2017 в 17:25.
За это сообщение автора поблагодарили: ax_mct (3), mazzy (2).
Старый 07.10.2017, 17:38   #7  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,740 / 573 (23) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от mazzy Посмотреть сообщение
1.
можно ли получить свой исходный код из самой ax7?
В случае если под ax7 подразумевается ее обьектная модель, то для систем собирающих исполняемые сборки из редактируемого кода лежащего в файловой системе - это нелогично.

В случае если под ax7 подразумевается ее среда разработки, то это не только VS но и TFS. И если по их науке то TFS как раз для такого и предназначена если элементарное сравнение в VS не подходит.
То что они будут рекомендовать сравнение выгруженных проектов в бесплатном текстовом редакторе - это нелогично, не их уровень.

Прошу прощения за свою блондинкастую логику Я не задираюсь, я просто увлекаюсь
За это сообщение автора поблагодарили: mazzy (2).
Старый 07.10.2017, 22:18   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,011 / 2151 (80) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Я бы тут заменил "Runtime" на "DesignTime" .
Код:
    var runtimeProviderConfiguration = New Microsoft.Dynamics.AX.Metadata.Storage.**Runtime.Runtime**ProviderConfiguration(packageDir);
    var metadataProviderFactory =  New Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory();
    Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider provider = metadataProviderFactory.Create**Runtime**Provider(runtimeProviderConfiguration);
Честно говоря,не знаю в чем дело, но если бы я писал систему, я бы рантаймовую метадату максимально облегчил от груза дизайнтаймовых свойств.
Старый 07.10.2017, 22:23   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,011 / 2151 (80) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
тогда вопрос скорее чисто теоретический - а можно ли получить исходный код из аксапты?
А зачем? Зачем вообще использовать X++ для того, для чего он не предназначен? Твой код был бы на C# короче
Старый 07.10.2017, 22:25   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,011 / 2151 (80) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от ax_mct Посмотреть сообщение
P.S. И показательна жизнь и смерть моделей в аксапте.
Они ж остались. Просто поверх них есть модули/пакеты.

Цитата:
Натуральный триллер.
Скоро изобретут пространство вложенных "моделей" так чтобы полное имя совпадало с физическим файловым путем. Может назовут как нибудь хитро чтобы все прониклись.
Неймспейсов не хватает.
Старый 08.10.2017, 03:54   #11  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,785 / 3660 (180) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от belugin Посмотреть сообщение
А зачем? Зачем вообще использовать X++ для того, для чего он не предназначен?
о, как!
почти 20 лет с ней живем, и нормально было. И тут бац! бац!
http://axapta.mazzy.ru/lib/names/

зачем? да чтоб не геморроится с файлами тем, кто в ажуре работает.

Цитата:
Сообщение от belugin Посмотреть сообщение
Твой код был бы на C# короче
сомневаюсь.

в c# мне еще предстоит освоить библиотеку, которая делает удобной работу с параметрами пользователя.

пока на Powershell для ax7 и X++ для ax6
https://github.com/mazzy-ax/compare-axClass

__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 08.10.2017 в 03:57.
За это сообщение автора поблагодарили: ax_mct (3).
Старый 08.10.2017, 19:16   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,011 / 2151 (80) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
о, как!
почти 20 лет с ней живем, и нормально было.
Ну это в мире X++ норма была. Остальной мир за это время вперед ушел.

Цитата:
зачем? да чтоб не геморроится с файлами тем, кто в ажуре работает.
Мне трудно представить сценарий работы, когда надо сравнивать код и при этом не иметь возможность обойтись без файлов в AX7. Вся среда разработки же файловая.

Последний раз редактировалось belugin; 08.10.2017 в 19:18.
Старый 17.10.2017, 23:16   #13  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
214 / 189 (7) ++++++
Регистрация: 14.10.2003
Разобрались с кодом или еще нет?
Я думаю, что нельзя получить искходный код в Ax7, потому что его там нет
На Prod-е лежат только скомпилированные dll-ки. Там, в облаке, нет исходного кода. Соответственно получить его средствами x++, как было раньше, нельзя.

Последний раз редактировалось AlexSD; 17.10.2017 в 23:18.
Старый 17.10.2017, 23:44   #14  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,785 / 3660 (180) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от AlexSD Посмотреть сообщение
Разобрались с кодом или еще нет?
Если хочешь спросить "решили ли задачу?"
Конечно же решили. Внешними средствами доступ к xml.

Если хочешь спросить "есть ли ответ на тему ветки?"
нет ответа нет.

Цитата:
Сообщение от AlexSD Посмотреть сообщение
Я думаю, что нельзя получить искходный код в Ax7, потому что его там нет
На Prod-е лежат только скомпилированные dll-ки. Там, в облаке, нет исходного кода.
Я понимаю что ты хочешь сказать.
Однако в той конфигурации с которой работают внутри МС, исходный код есть. (см. скриншот)

а раз программисты МС не перекладывают туда код руками, значит есть какая-то опция в установщике деплоере. отдельный вопрос - а синхронизируется ли этот код при обновлении. и вообще, вопросов - много.


Цитата:
Сообщение от AlexSD Посмотреть сообщение
Соответственно получить его средствами x++, как было раньше, нельзя.
Опять же, не совсем так.
Любой может открыть и посмотреть в класс SysModelMetaData
на его метод init() и на его метод buildinitmethod() (см. скриншоты)
Обсуждалось тут SMART TALKS 110: Metadata, abstract syntax tree and X++ best practice rules. Part 1

да, мы видим, что в buildinitmethod исходный код ЗАПИСЫВАЕТСЯ.
но доступ к коду есть!

в связи с этим вопрос - а только на запись доступ? или все-таки как-то прочитать можно? при каких условиях можно прочитать код из самой Аксапты?
чуть выше Макс Белугин предложил использовать не Runtime объекты, а Designtime.

но у меня сейчас руки не доходят проверить.
если кому нужен пример кода для проверки, то код здесь
https://gist.github.com/mazzy-ax/4d4...7527623467aee8
https://gist.github.com/mazzy-ax/292...fc753bfca9c529
попробуйте Designtime, пожалуйста
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 14
Размер:	90.9 Кб
ID:	11689   Нажмите на изображение для увеличения
Название: 2.PNG
Просмотров: 13
Размер:	93.9 Кб
ID:	11690  

Нажмите на изображение для увеличения
Название: 3.PNG
Просмотров: 13
Размер:	64.7 Кб
ID:	11691   Нажмите на изображение для увеличения
Название: 4.PNG
Просмотров: 12
Размер:	30.5 Кб
ID:	11692  

__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Tayfun Sertan Yaman: Using 3rd party Web components in AX7; an introduction to extensible controls Blog bot DAX Blogs 0 28.08.2017 13:11
mfp: X++ in AX7: Garbage Collection Blog bot DAX Blogs 0 21.12.2015 11:11
Как получить из элемента enum-а код типа (enum-а)? Romb DAX: База знаний и проекты 12 27.06.2013 16:17
Не найден исполнимый код метода insert Александр Костоусов DAX: Программирование 10 03.09.2004 16:47
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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