06.05.2014, 01:16 | #1 |
Участник
|
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(); }
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 |
Участник
|
Иван, помоги понять, в чём моя проблема. Почему AOTFindChild не находит существующий в проекте тип?
Разобрался благодаря твоей статье и ответу Кускова. Спасибо! http://alexvoy.blogspot.com/2014/10/...p-members.html
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 24.10.2014 в 22:44. Причина: нашёл ответ сам |
|
25.10.2014, 02:11 | #3 |
Участник
|
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(); } } } Источник: http://alexvoy.blogspot.com/2014/10/...p-members.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. Последний раз редактировалось mazzy; 28.10.2014 в 12:26. |
|
28.10.2014, 08:38 | #4 |
Участник
|
Так в чем дело было в итоге?
|
|
28.10.2014, 17:20 | #5 |
Участник
|
дело в том, что группы проекта требуют иного подхода в переборе и нахождении элементов -- тут 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 |
Участник
|
Цитата:
Сообщение от wojzeh
кстати, ознакомься, пожалуйста i-neti: Решение проблемы с поиском новой цены в Dynamics AX
|
|
|
За это сообщение автора поблагодарили: wojzeh (1). |
29.10.2014, 01:31 | #7 |
Участник
|
Цитата:
Если например никто не зарепортит, то как будет делать исправление ? Я порядке очереди пока не попадет в какой нить из роллапов. Или его вообще не будут править ? |
|
29.10.2014, 01:47 | #8 |
Участник
|
Цитата:
То есть баг, который я создам, будет в базе багов для текущего/следующего релиза, а не в базе хотфикс багов, которые создают пользователи. Я пару раз пробовал вручную создавать там баги на основании таких вот сообщений - но там столько геморроя (потому что это нестандартный путь), что я перестал. |
|
29.10.2014, 01:52 | #9 |
Участник
|
золотые слова, маэстро! на тебя и уповаем потому
__________________
Felix nihil admirari |
|
29.10.2014, 11:16 | #10 |
Участник
|
Ну, кастомерам должно быть довольно просто создать, и все.
А если я создаю, то кучу всего дополнительно делать надо |
|
29.10.2014, 17:17 | #11 |
Участник
|
я ж не кустомер - я партнёр!
__________________
Felix nihil admirari |
|
29.10.2014, 17:44 | #12 |
Участник
|
|
|
|
|