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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.06.2019, 16:38   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,181 / 1934 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 2
Импорт из xpo сравнение узлов, бага
Привет всем.
Обнаружил интересную особенность при импорте xpo в 2012-ю Аксапту.
Если xpo выгружен из предыдущей версии, то в случае когда делаем merge контролов в формах, то порядок нарушается. Добавленный контрол всегда становится первым в группе, что очень неудобно, тратится много времени на исправление. Бага спрятана где-то в ядре. Такое же поведение получается если руками перетащить узел.
Но благодаря открытому коду в Аксапте, получилось пофиксить это поведение.
Правим метод
\Classes\SysTreeNode\mergeInsertSubnode

X++:
public void mergeInsertSubnode(
    SysComparable             _topComparable,
    SysCompareContextProvider _context,
    SysComparable               _nodeToInsert)
{
    TreeNode previousSourceNode, previousNode;
    TreeNode sourceNode;
    boolean result;
    TreeNode parentNodeInAot;
    SysTreeNode nodeToInsert;
    // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 -->
    TreeNode    previousNode_MRC;
    TreeNode    droppedNode_MRC;
    // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 <--
    ;
    nodeToInsert = _nodeToInsert as SysTreeNode;

    if (_nodeToInsert &&
        treeNode &&
        TreeNode::isNodeReferenceValid(treeNode))
    {
        parentNodeInAot = TreeNode::findNode(SysTreeNode::getPath(treeNode));
        if (parentNodeInAot)
        {
            sourceNode = nodeToInsert.parmTreeNode();
            previousSourceNode = sourceNode.AOTprevious();

            while (!previousNode && previousSourceNode)
            {
                previousNode       = parentNodeInAot.AOTfindChild(previousSourceNode.treeNodeName());
                previousSourceNode = previousSourceNode.AOTprevious();
            }

            // We get here e.g. if treeNode is the form design node. If previousNode=Null node is inserted last, it should be first.
            if (! previousNode)
                previousNode = parentNodeInAot;

            result = parentNodeInAot.AOTDrop(sourceNode, previousNode);
            
            // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 -->
            // при импорте xpo экспортированных из 4-ки в 2012-ю 
            // вызов parentNodeInAot.AOTDrop() работает не так как при импорте xpo выгруженных из 2012-й
            // почему-то игнорируется параметр previousNode и добавленный узел становится самым первым, что очень 
            // неудобно - порядок нарушается и его приходится исправлять в ручную
            // фиксим такое поведение
            if (result)
            {
                droppedNode_MRC = parentNodeInAot.AOTfindChild(sourceNode.treeNodeName());
            
                if (droppedNode_MRC)
                {
                    previousNode_MRC = droppedNode_MRC.AOTprevious();
                
                    if (!previousNode_MRC || 
                         previousNode_MRC.treeNodePath() != previousNode.treeNodePath())
                    {
                        droppedNode_MRC.AOTMove(parentNodeInAot, previousNode); 
                    }
                }
            }
            // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 <--

            if (result)
            {
                // node was successfully dropped
                previousSourceNode = null;
                previousNode       = null;
                sourceNode         = null;

                //Clear cached information
                comparableTextList = null;

                treeNode = parentNodeInAot;
            }
        }
    }
}
За это сообщение автора поблагодарили: S.Kuskov (2), sukhanchik (2).
Старый 09.06.2019, 23:29   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,181 / 1934 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 2
Небольшая поправка:

X++:
public void mergeInsertSubnode(
    SysComparable             _topComparable,
    SysCompareContextProvider _context,
    SysComparable               _nodeToInsert)
{
    TreeNode previousSourceNode, previousNode;
    TreeNode sourceNode;
    boolean result;
    TreeNode parentNodeInAot;
    SysTreeNode nodeToInsert;
    // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 -->
    TreeNode    previousNode_MRC;
    TreeNode    droppedNode_MRC;
    // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 <--
    ;
    nodeToInsert = _nodeToInsert as SysTreeNode;

    if (_nodeToInsert &&
        treeNode &&
        TreeNode::isNodeReferenceValid(treeNode))
    {
        parentNodeInAot = TreeNode::findNode(SysTreeNode::getPath(treeNode));
        if (parentNodeInAot)
        {
            sourceNode = nodeToInsert.parmTreeNode();
            previousSourceNode = sourceNode.AOTprevious();

            while (!previousNode && previousSourceNode)
            {
                previousNode       = parentNodeInAot.AOTfindChild(previousSourceNode.treeNodeName());
                previousSourceNode = previousSourceNode.AOTprevious();
            }

            // We get here e.g. if treeNode is the form design node. If previousNode=Null node is inserted last, it should be first.
            if (! previousNode)
                previousNode = parentNodeInAot;

            result = parentNodeInAot.AOTDrop(sourceNode, previousNode);
            
            // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 -->
            // при импорте xpo экспортированных из 4-ки в 2012-ю 
            // вызов parentNodeInAot.AOTDrop() работает не так как при импорте xpo выгруженных из 2012-й
            // почему-то игнорируется параметр previousNode и добавленный узел становится самым первым, что очень 
            // неудобно - порядок нарушается и его приходится исправлять в ручную
            // фиксим такое поведение
            if (result)
            {
                droppedNode_MRC = parentNodeInAot.AOTfindChild(sourceNode.treeNodeName());
            
                if (droppedNode_MRC)
                {
                    previousNode_MRC = droppedNode_MRC.AOTprevious();
                
                    if (previousNode_MRC &&
                         previousNode_MRC.treeNodePath() != previousNode.treeNodePath())
                    {
                        droppedNode_MRC.AOTMove(parentNodeInAot, previousNode); 
                    }
                }
            }
            // JEV003545 "Перенос последних изменений из Ax40 в Ax2012", pkoz 09.06.2019 <--

            if (result)
            {
                // node was successfully dropped
                previousSourceNode = null;
                previousNode       = null;
                sourceNode         = null;

                //Clear cached information
                comparableTextList = null;

                treeNode = parentNodeInAot;
            }
        }
    }
}
Теги
ax2012, xpo

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX 2012 R3 - Импорт XPO-файла MarinaAX DAX: Программирование 3 10.10.2016 09:51
Сравнение при импорте XPO akvi DAX: Программирование 26 23.01.2013 18:03
Ещё книга про Ax на английском - Inside Microsoft Dynamics AX 4.0 StasD DAX: База знаний и проекты 36 22.03.2007 12:51
Программный импорт xpo SolNik DAX: Программирование 13 02.10.2006 14:53
Сравнение объектов (xpo) malex DAX: Программирование 4 12.07.2006 12:11
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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