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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2014, 01:16   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
Kashperuk Ivan: Q&A session: Working with MorphX project nodes from code
Источник: http://kashperuk.blogspot.com/2014/0...x-project.html
==============

I had some spare time today, so started answering some of the comments I had through the blog and through e-mail. I decided I'll just open up a new section on my blog, called Questions and Answers, in which I will slowly answer the questions from my backlog:

Question (related to post about the DEV_CreateNewProject tool for AX):
So could create ConfigKeys Macro and I wanted, and could throw them into the project that was created, but I can not throw them within their respective nodes, so they are loose in the project, you can help me put them within your nodes?
To summarize, Gustavo wanted to create some AOT elements from code (specifically, configuration keys and macros), and add them to a new project into respective groups, similar to how it is done in DEV_CreateNewProject tool.

I wrote a small job that does that, and can be downloaded from my OneDrive. The code is also pasted and explained below:

X++:
static void Tutorial_CreateProjWithGroupAndElement(Args _args)
{
    ProjectListNode     treeNodeProject;
    ProjectNode         upgradeNode;
    ProjectGroupNode    child;
    MacroBuild          macro;
    #AOT

    str projName = @"Project01";
    str groupName = @"macroGrp";
    str macroName = @"macro01";

    treeNodeProject = SysTreeNode::getPrivateProject();
    treeNodeProject.AOTadd(projName);
    upgradeNode = treeNodeProject.AOTfindChild(projName);
    upgradeNode = upgradeNode.getRunNode();

    upgradeNode.AOTadd(groupName);
    child = upgradeNode.AOTfindChild(groupName);
    child.projectGroupType(GroupNodeType::Macros);

    macro = new MacroBuild(macroName, true);
    macro.addSource(@"isConfigurationkeyEnabled(configurationkeynum(WMSAdvanced))");
    macro.save();

    child.addUtilNode(UtilElementType::Macro, macroName);

    upgradeNode.AOTsave();
}
  • SysTreeNode class is used to retrieve the object for the root of the Private projects node. This class contains a number of interesting methods for anyone who wants to navigate and manage AOT nodes
  • Standard AOTadd and AOTfindChild methods are used for first creating and then loading the contents of the node into a TreeNode object for processing.
  • getRunNode is used on the project node so that it is not just loaded for processing, but also opened in a new window to show the result to us after executing the job
  • MacroBuild class is used to creating new Macros, and is similar to a ClassBuild that I described previously
  • addUtilNode is the key method Gustavo was missing, and allows to add the macro created to the project group node.
  • AOTsave() is used to persist all the changes done to the project as well as the new macro.

You can see the results immediately after executing the job.

Источник: http://kashperuk.blogspot.com/2014/0...x-project.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.

Последний раз редактировалось mazzy; 07.05.2014 в 10:40.
За это сообщение автора поблагодарили: wojzeh (1).
Старый 24.10.2014, 21:40   #2  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Иван, помоги понять, в чём моя проблема. Почему AOTFindChild не находит существующий в проекте тип?

Нажмите на изображение для увеличения
Название: AOTFindChild.png
Просмотров: 289
Размер:	98.9 Кб
ID:	9012

Разобрался благодаря твоей статье и ответу Кускова. Спасибо!

http://alexvoy.blogspot.com/2014/10/...p-members.html
__________________
Felix nihil admirari

Последний раз редактировалось wojzeh; 24.10.2014 в 22:44. Причина: нашёл ответ сам
Старый 25.10.2014, 02:11   #3  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
How to iterate project group members: Tables, EDT, etc
Источник: http://alexvoy.blogspot.com/2014/10/...p-members.html
==============

Based on S. Kuskov's suggestion and Vania Kashperuk's article, I put down this simple job that iterates Tables and Extended Data Types groups members in a given shared project.
X++:
static void tmxIterateProjectGroupMembers(Args _args)
{
    #aot
    #properties
    Str                         projectName = "tmxEDI999";
    ProjectNode                 projectNode;
    ProjectGroupNode            ddProjectGroupNode;
    ProjectGroupNode            edtProjectGroupNode;
    ProjectGroupNode            tblProjectGroupNode;
    ProjectListNode             projectListNode;
    TreeNode                    memberTreeNode;              
    TreeNode                    projectTreeNode;
    TreeNodeIterator            projectIterator;
    
    if(projectName)
    {
        // find all shared projects
        projectListNode = SysTreeNode::getSharedProject();
        // find project with a given name
        projectNode = projectListNode.AOTfindChild(projectName);
        // open it in a separate window in AOT
        projectTreeNode = projectNode.getRunNode();
        // this is the key point after which we can iterate group members
        projectNode = projectNode.loadForInspection();
        // get nested nodes for appropriate names
        ddProjectGroupNode = projectNode.AOTfindChild('DataDictionary');
        edtProjectGroupNode = ddProjectGroupNode.AOTfindChild('Extended Data Types');
        tblProjectGroupNode = ddProjectGroupNode.AOTfindChild('Tables');
        
        // tables
        projectIterator = tblProjectGroupNode.AOTiterator();
        memberTreeNode = projectIterator.next();

        while(memberTreeNode)
        {
            info(strFmt("%1 %2", memberTreeNode.AOTname(), memberTreeNode.treeNodeName()));
            memberTreeNode = projectIterator.next();
        }

        // extended data types
        projectIterator = edtProjectGroupNode.AOTiterator();
        memberTreeNode = projectIterator.next();

        while(memberTreeNode)
        {
            info(strFmt("%1 %2", memberTreeNode.AOTname(), memberTreeNode.treeNodeName()));
            memberTreeNode = projectIterator.next();
        }
    }
}
The key method is loadForInspection. Happy iterating!

Источник: http://alexvoy.blogspot.com/2014/10/...p-members.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.

Последний раз редактировалось mazzy; 28.10.2014 в 12:26.
Старый 28.10.2014, 08:38   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Так в чем дело было в итоге?
Старый 28.10.2014, 17:20   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Так в чем дело было в итоге?
дело в том, что группы проекта требуют иного подхода в переборе и нахождении элементов -- тут AOTFindChild() не работает.

во-первых, loadForInspection()
затем AOTIterator() или findGroupMember()

X++:
...       
       ProjectNode         edtProjectGroupNode;
       ProjectNode         tblProjectGroupNode;
       ProjectNode         qryProjectGroupNode;

        // find all shared projects
        projectListNode = SysTreeNode::getSharedProject();
        // find project with a given name
        projectNode = projectListNode.AOTfindChild(_projectName);
        // open it in a separate window in AOT
        projectRunNode = projectNode.getRunNode();
        // this is the key point after which we can iterate group members
        projectNode = projectNode.loadForInspection();
        // get nested nodes for appropriate names
        ddProjectGroupNode = projectNode.AOTfindChild('DataDictionary');
        edtProjectGroupNode = ddProjectGroupNode.AOTfindChild('Extended Data Types');
        tblProjectGroupNode = ddProjectGroupNode.AOTfindChild('Tables');
        qryProjectGroupNode = projectNode.AOTfindChild('Queries');
...

// add to the project if not yet
private void addNewObjectToProject(UtilElementType _type, TreeNode _treeNode)
{
    str name = _treeNode.AOTname();

    switch (_type)
    {
    case UtilElementType::ExtendedType:
        if(!edtProjectGroupNode.findGroupMember(name, _type, true))
        {
            edtProjectGroupNode.addNode(_treeNode);
        }
        break;

   case UtilElementType::Table:

        if(!tblProjectGroupNode.findGroupMember(name, _type, true))
        {
            tblProjectGroupNode.addNode(_treeNode);
        }
        break;

   case UtilElementType::Query:
        if(!qryProjectGroupNode.findGroupMember(name, _type, true))
        {
            qryProjectGroupNode.addNode(_treeNode);
        }
        break;

    default:
        throw error(Error::wrongUseOfFunction(funcName()));

    }
}

кстати, ознакомься, пожалуйста i-neti: Решение проблемы с поиском новой цены в Dynamics AX
__________________
Felix nihil admirari
Старый 29.10.2014, 00:58   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Ознакомился. Баг то я создам, но для того, чтобы оно было выпущено как хотфикс, надо чтоб кто-то из вас зарепортил это через стандартные каналы
За это сообщение автора поблагодарили: wojzeh (1).
Старый 29.10.2014, 01:31   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Ознакомился. Баг то я создам, но для того, чтобы оно было выпущено как хотфикс, надо чтоб кто-то из вас зарепортил это через стандартные каналы
Вань, а в чем отличие ?
Если например никто не зарепортит, то как будет делать исправление ? Я порядке очереди пока не попадет в какой нить из роллапов. Или его вообще не будут править ?
Старый 29.10.2014, 01:47   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Logger Посмотреть сообщение
Вань, а в чем отличие ?
Если например никто не зарепортит, то как будет делать исправление ? Я порядке очереди пока не попадет в какой нить из роллапов. Или его вообще не будут править ?
Отличие в том, что я в команде R&D core, то есть мы работает над новыми релизами.
То есть баг, который я создам, будет в базе багов для текущего/следующего релиза, а не в базе хотфикс багов, которые создают пользователи.
Я пару раз пробовал вручную создавать там баги на основании таких вот сообщений - но там столько геморроя (потому что это нестандартный путь), что я перестал.
Старый 29.10.2014, 01:52   #9  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Отличие в том, что ... там столько геморроя
золотые слова, маэстро! на тебя и уповаем потому
__________________
Felix nihil admirari
Старый 29.10.2014, 11:16   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от wojzeh Посмотреть сообщение
золотые слова, маэстро! на тебя и уповаем потому
Ну, кастомерам должно быть довольно просто создать, и все.
А если я создаю, то кучу всего дополнительно делать надо
Старый 29.10.2014, 17:17   #11  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Ну, кастомерам должно быть довольно просто создать, и все.
А если я создаю, то кучу всего дополнительно делать надо
я ж не кустомер - я партнёр!
__________________
Felix nihil admirari
Старый 29.10.2014, 17:44   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от wojzeh Посмотреть сообщение
я ж не кустомер - я партнёр!
Для МС ты тоже кастомер
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kashperuk Ivan: Q&A session: Working with UtcDateTime from X++ Blog bot DAX Blogs 0 06.05.2014 01:16
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
emeadaxsupport: Intercompany time postings incomplete at transaction voucher level when project date differs from the day posted Blog bot DAX Blogs 0 19.08.2013 19:11
fed: Net requirements update in MRP Module and Working Set of MRP Blog bot DAX Blogs 14 08.05.2012 13:09
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43

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

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

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