09.06.2019, 16:38 | #1 |
Участник
|
Импорт из 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; } } } } |
|
|
За это сообщение автора поблагодарили: sukhanchik (2), S.Kuskov (2). |
09.06.2019, 23:29 | #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; } } } } |
|
Теги |
aotdrop, ax2012, xpo |
|
Похожие темы | ||||
Тема | Ответов | |||
AX 2012 R3 - Импорт XPO-файла | 3 | |||
Сравнение при импорте XPO | 26 | |||
Ещё книга про Ax на английском - Inside Microsoft Dynamics AX 4.0 | 36 | |||
Программный импорт xpo | 13 | |||
Сравнение объектов (xpo) | 4 |
|