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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.11.2008, 16:32   #1  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
SysTreeNodeCompareContext
Доброго времени суток.
Коллеги, у кого имеется под рукой AX2009, выложите please проект с классом SysTreeNodeCompareContext (если таковой присутствует в AX2009).

Последний раз редактировалось petergunn; 21.11.2008 в 17:45.
Старый 24.11.2008, 14:33   #2  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Сравнение объектов на слоях. SysCompare. DAX 4.0
Dynamics Ax 4.0 SP2 (application version: 4.0.2501.122 )

Доброго времени суток.
Занимался на днях адаптацией решения axaptapedia: SysCompare class по сравнению 2 верхних слоев для Dynamics Ax 4.0.
Функционал по заполнению comboBox'ов списком сравниваемых слоев вынесен теперь на метод SysCompare\initContext():
X++:
protected void initContext(SysCompareContextProvider _context)
{
	...
    this.setCombo(comboBox1,
                  _context.comparableList(SysCompareType::Text1), comparableMap1, _context.comparableItemDefault(SysCompareType::Text1));

    this.setCombo(comboBox2, _context.comparableList(SysCompareType::Text2), comparableMap2, _context.comparableItemDefault(SysCompareType::Text2));

    comboBox1.selection(0);
	...
}
в методе SysCompare\setCombo()
X++:
protected void setCombo(
    FormComboBoxControl     combo,
    List                    list,
    Map                     map,
    str                     defaultItem
    )
4-ым параметром передается строка на которую Axapta пытается установить позиционирование в заполненном списке значений, если таковая будет в этом списке.
X++:
    ...    
    if (comparable.comparableName() == defaultItem)
        sel = i;
    ... 
    combo.setDropSize(list.elements()+1);
    combo.selection(sel);
    ...
При просмотре кода под отладчиком обнаружилось что этот параметр defaultItem всегда приходит в функцию пустым ('') - позиционирование combo.selection(sel) отрабатывает как combo.selection(0).

Смотрим код используемого метода SysTreeNodeCompareContext\comparableItemDefault():
X++:
public str comparableItemDefault(SysCompareType _type)
{
    switch (_type)
    {
        case SysCompareType::Text1:
            return default1;

        case SysCompareType::Text2:
            return default2;
    }
    return '';
}
В классе SysTreeNodeCompareContext объявлены 2 строковые переменные default1 и default2, но при этом, судя по коду, они нигде не инициализируются (кроме метода comparableItemDefault() функциональности использующей эти переменные в классе нет, наследников класса тоже не обнаружил) - в результате функция стабильно возвращает ''.

Бага в коде? Или эта 'фича' так и задумывалась для инициализации на наследниках класса? - хотелось бы взглянуть на реализацию этого класса (и его наследников) в DAX2009.
Старый 24.11.2008, 15:57   #3  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Итого
По результатам первичного переноса решения из Ax 3.0 публикую изменения внесенные в функционал Dynamics Ax 4.0 для отображения сравнения по 2-м верхним слоям:

SysCompare\initContext()
X++:
    ...
    this.setCombo(comboBox1,
                  _context.comparableList(SysCompareType::Text1), comparableMap1, _context.comparableItemDefault(SysCompareType::Text1));

    this.setCombo(comboBox2, _context.comparableList(SysCompareType::Text2), comparableMap2, _context.comparableItemDefault(SysCompareType::Text2));

    //comboBox1.selection(0);
    //  --> petergunn, Tools_000003_SysCompareDefaultLayer
    if( comboBox1.valueStr() == comboBox2.valueStr() )  //  если значения box'ов равны - в первом box'е пытаемся взять слой ниже
        comboBox1.selection( max( 0, comboBox1.selection() - 1 ) ) ;
    //  <-- petergunn, Tools_000003_SysCompareDefaultLayer
    ...

SysTreeNodeCompareContext\parmSysTreenode1():
X++:
public SysTreeNode parmSysTreenode1(SysTreeNode _sysTreenode1 = sysTreenode1)
{
    ;
    sysTreenode1 = _sysTreenode1;
    //  --> petergunn, Tools_000003_SysCompareDefaultLayer
    if( !prmisdefault( _sysTreenode1 ) )
        default1 = sysTreenode1 ? sysTreeNode1.comparableName() : '' ;
    //  <-- petergunn, Tools_000003_SysCompareDefaultLayer
    return sysTreenode1;
}
SysTreeNodeCompareContext\parmSysTreenode2():
X++:
public SysTreeNode parmSysTreenode2(SysTreeNode _sysTreenode2 = sysTreenode2)
{
    ;
    sysTreenode2 = _sysTreenode2;
    //  --> petergunn, Tools_000003_SysCompareDefaultLayer
    if( !prmisdefault( _sysTreenode2 ) )
        default2 = sysTreenode2 ? sysTreeNode2.comparableName() : '' ;
    //  <-- petergunn, Tools_000003_SysCompareDefaultLayer
    return sysTreenode2;
}
SysTreeNodeCompareContext\parmTreeNode1():
X++:
public TreeNode parmTreeNode1(TreeNode _treeNode1 = treeNode1)
{
    ;
    treeNode1 = _treeNode1;
    //  --> petergunn, Tools_000003_SysCompareDefaultLayer
    if( !prmisdefault( _treeNode1 ) && !sysTreeNode1 )
        default1 = treeNode1 ? SysTreeNode::newTreenode( treeNode1 ).comparableName() : '' ;
    //  <-- petergunn, Tools_000003_SysCompareDefaultLayer
    return treeNode1;
}
SysTreeNodeCompareContext\parmTreeNode2():
X++:
public TreeNode parmTreeNode2(TreeNode _treenode2 = treenode2)
{
    ;
    treenode2 = _treenode2;
    //  --> petergunn, Tools_000003_SysCompareDefaultLayer
    if( !prmisdefault( _treenode2 ) && !sysTreeNode2 )
        default2 = treeNode2 && treeNode2.applObjectLayerMask() ? SysTreeNode::newTreenode( treeNode2 ).comparableName() : '' ;
    //  <-- petergunn, Tools_000003_SysCompareDefaultLayer
    return treenode2;
}
В реализации метода SysTreeNodeCompareContext\parmTreeNode2() сделано небольшое 'допущение': если treeNode2.applObjectLayerMask() == 0 то в этом случае узел был инициализирован в результате импорта из XPO файла, для него должно бы возвращаться значение SysTreeNodeVirtualXPO::newTreenode( treeNode2 ).comparableName().
С другой стороны при импорте из XPO второй список сравнения содержит 1 значение ( вида '\ObjName (xpo)' ), позиционирование будет установлено на него даже в случае если функция вернет ''.

'Полный' вариант модифицированного метода изначально выглядел так - SysTreeNodeCompareContext\parmTreeNode2():
X++:
public TreeNode parmTreeNode2(TreeNode _treenode2 = treenode2)
{
    ;
    treenode2 = _treenode2;
    //  --> petergunn, Tools_000003_SysCompareDefaultLayer
    if( !prmisdefault( _treenode2 ) && !sysTreeNode2 )
    {
        if( treeNode2 )
            default2 = treeNode2.applObjectLayerMask() ? SysTreeNode::newTreenode( treeNode2 ).comparableName() : SysTreeNodeVirtualXPO::newTreenode( treeNode2 ).comparableName() ;
        else default2 = '' ;
    }	    	
    //  <-- petergunn, Tools_000003_SysCompareDefaultLayer
    return treenode2;
}
Проект с модифицированными классами прилагаю.
P.S. ногами сильно не пинать , проект пока носит характер отладочной версии и содержит 2 варианта модификации класса SysTreeNodeCompareContext - разделены значением макроопределения #debugVersion
Вложения
Тип файла: zip SharedProject_DAX40_SysCompareDefaultLayer.zip (16.7 Кб, 65 просмотров)
Старый 25.11.2008, 09:41   #4  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Если еще актуально
Class_SysTreenodeCompareContext.xpo
За это сообщение автора поблагодарили: petergunn (1).
Старый 25.11.2008, 11:06   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от player Посмотреть сообщение
Если еще актуально
Вложение 3986
Это для трешки или 4-ки?
Старый 26.11.2008, 07:01   #6  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Это из AX2009

(petergunn: "Коллеги, у кого имеется под рукой AX2009, выложите please проект с классом SysTreeNodeCompareContext")
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:34.