Показать сообщение отдельно
Старый 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.