12.08.2008, 12:05 | #1 |
Участник
|
Kashperuk Ivan: Another useful Editor Script for AX developers
Источник: http://kashperuk.blogspot.com/2008/0...pt-for-ax.html
============== In AX the principle of upcasting is used quite a lot. Some examples coule be the RunBase hierarchy or the InventMovement class hierarchy. Basically, the base (or super) classes contain the main part of the hierarchy logic, while subclasses only override a couple of methods performing actions specific to this class. When browsing the AOT, trying to find a specific line of code (debugging without the debugger, basically), you often find yourself in a situation when you lookup a definition of a method from a derived class, and end up in this method of the base class instead (because upcasting was used in the code in question). And every time you need to see the same implementation in the child class, you need to go back to the AOT and open it from there manually. Well, not any more. Here is a small editor script, that you can use to navigate to an overridden method of a derived class. I created 2 versions of the same script, one using xReferences, the second using Dictionary class. You will have to pick the one you like more. I, personally, prefer the xRef one, as it, generally, should work faster once the xRefs for the class hierarchy is updated (happens the first time you use the script). You can read more about Editor Scripts and how to use them on Axaptapedia Version 1: public void addIns_OpenOverriddenMethodDef(Editor e) { #AOT #define.AOTDelimiter('\\') // This does not exist in AX versions prior to AX 2009, so I just declare it here TreeNode treeNode = TreeNode::findNode(e.path()); TreeNode treeNodeParent; Dictionary dictionary = new Dictionary(); Counter classCnt = dictionary.classCnt(); Counter iClassCount; ClassId classIdParent; ClassId classIdChild; Counter descendentsCount; SysDictClass dictClassChild; TreeNodeName methodName = treeNode.treeNodeName(); Map map; MapEnumerator mapEnumerator; ; if (subStr(treeNode.treeNodePath(), 1, strLen(#ClassesPath)) == #ClassesPath) { treeNodeParent = TreeNode::findNode(xUtilElements::getNodePathRough(xUtilElements::parentElement(xUtilElements::findTreeNode(treeNode)))); classIdParent = dictionary.className2Id(treeNodeParent.treeNodeName()); map = new Map(Types::String, Types::String); for (iClassCount = 1; iClassCount
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
12.08.2008, 18:18 | #2 |
Участник
|
В трешке вот этот кусок
if (xRefTypeHierarchy::findOrCreate(Types::Class, classIdParent).Children) не компилится. Поделитесь, плиз кто нить. |
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
12.08.2008, 18:29 | #3 |
Участник
|
Ваня, вылезай, мы тебе репутации отгрузим
Зачотный скрипт. Очень радует. Последний раз редактировалось Logger; 12.08.2008 в 18:36. |
|
12.08.2008, 18:31 | #4 |
Участник
|
Ой, что ж это я, собственно, на других версиях забыл проверить
Спасибо за замечание. Код методов с таблицы xRefTypeHierarchy: X++: public static xRefTypeHierarchy findOrCreate(Types _baseType, int _id) { xRefTypeHierarchy xRefTypeHierarchy = xRefTypeHierarchy::find(_baseType, _id); if (!xRefTypeHierarchy) { new xRefUpdateTypeHierarchy().run(); xRefTypeHierarchy = xRefTypeHierarchy::find(_baseType, _id); } return xRefTypeHierarchy; } X++: public static xRefTypeHierarchy find(Types _baseType, int _id) { xRefTypeHierarchy xRefTypeHierarchy; select firstonly xRefTypeHierarchy index BaseTypeIdIdx where xRefTypeHierarchy.BaseType == _baseType && xRefTypeHierarchy.Id == _id; return xRefTypeHierarchy; } |
|
|
За это сообщение автора поблагодарили: mazzy (2), AlGol (1), belugin (5), Logger (4), gl00mie (8). |
13.08.2008, 02:14 | #5 |
Участник
|
Корректировал сообщение (точнее удалил и создал заново), вставив туда недостающие методы (оказалось, что на АХ 4.0 этих методов еще тоже нет).
Вот что значит - заработался со своей АХ 2009 Новая ссылка - http://kashperuk.blogspot.com/2008/0...cript-for.html |
|
|
За это сообщение автора поблагодарили: Raven Melancholic (3), MikeR (5). |
13.08.2008, 09:17 | #6 |
Moderator
|
Цитата:
You can copy-paste the code for the script from axaptapedia.com (There is a problem with copying over the code from blogger site directly)
Эстеты могут еще в Excel выключить "Выравнивание по центру", но это не обязательно |
|
13.08.2008, 09:32 | #7 |
MCT
|
Иван молодец! Спасибо
|
|
13.08.2008, 18:23 | #8 |
Moderator
|
Немножко присоседюсь к Ивану
Показалось напряжным запускать пиклист заново, когда хочется посмотреть реализацию метода сразу в нескольких классах. Внёс небольшую модификацию, использовав SysInfoAction_Editor. По ходу получилось своеобразное инфолог-меню, которое можно подержать на экране, щелкая по строчкам. Ну, и добавил заодно доступ и к самим классам в целом (а не только к конкретному методу). X++: switch (descendents.elements()) { case 0: info(strFmt(@"The method '%1' is not overridden in any of the %2 descendent classes", methodName, descendentsCount)); break; case 1: descendentsEnumerator = descendents.getEnumerator(); if (descendentsEnumerator.moveNext()) treeNode = TreeNode::findNode(descendentsEnumerator.currentKey()); break; default: // Gustav --> //treeNode = TreeNode::findNode(pickList(descendents, "@SYS24724", @"Pick required class to go to method definition")); info(strRep('-', 100)); info(' Double click required string to go to method or class definition: ' ); info(strRep('-', 100)); descendentsEnumerator = descendents.getEnumerator(); while (descendentsEnumerator.moveNext()) { treeNode = TreeNode::findNode(descendentsEnumerator.currentKey()); info( strFmt('CLASS: %1', subStr( treeNode.AOTparent().treeNodePath(),10,100 )), '', SysInfoAction_Editor::newOpen( treeNode.AOTparent().treeNodePath() )); info( strFmt('%1 METHOD: %2', strRep('-', 50), treeNode.treeNodeName() ), '', SysInfoAction_Editor::newOpen( treeNode.treeNodePath() )); } } if(descendents.elements()<=1) { if (treeNode && SysTreeNode::hasSource(treeNode)) treeNode.AOTedit(); } // Gustav <-- |
|
|
За это сообщение автора поблагодарили: kashperuk (5), aidsua (1), alex55 (1). |
13.08.2008, 22:20 | #9 |
Участник
|
Добавил метод через Dictionary и метод, предложенный Gustav (правда я его перекромсал, приведя к более презентабельному, с моей точки зрения, виду).
Выложил, как discussion к теме на axaptapedia: http://www.axaptapedia.com/Talk:Edit...iddenMethodDef |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
10.11.2008, 15:36 | #10 |
Участник
|
Плагин для табакса
|
|
|
За это сообщение автора поблагодарили: kashperuk (2), aidsua (1). |
Теги |
editor script, полезное, ax2009, ax4.0, axapta |
|
|