Показать сообщение отдельно
Старый 29.01.2009, 16:42   #8  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
DAX 4.0 SP2
Цитата:
Сообщение от Silphidae Посмотреть сообщение
...
Просто меня удивило, что при любом другом значении, кроме 0 - я получаю тоже самое "Подразделение" (Например, при 2 должно быть "Тип производства", если верить перечислению SysDimension ).

Данное утверждение показалось несколько странным, решил проверить его на практике.
За основу эксперимента был взят совет данный автору топика:

Цитата:
Сообщение от oip Посмотреть сообщение
Создать для нужной аналитики свой ЕДТ-наследние от SysDim и прописать соответствющий релейшн к таблице Dimensions. В диалог подставлять этот ЕДТ.

X++:
DepartmentId extends SysDim
DepartmentId == Dimensions.Num
0 = Dimensions.Code

Создал новый EDT, который должен был отображать штатную аналитику 'Центр затрат' (SysDimension::Center=1)
X++:
DimensionSysDemo extends SysDim
DimensionSysDemo == Dimensions.Num
1 = Dimensions.DimensionsCode

Однако на диалоге, в поле на основе созданного EDT DimensionSysDemo, в lookup действительно отображался список аналитик соответствующих типу 'Подразделение'. Причина этого в том что на EDT SysDim, взятого в качестве 'родителя', указана своя lookup форма (FormHelp=DimensionsLookup), в методе run() которой происходит определение значения переменной sysDimension на основании индекса массива поля с которого открывается lookup.

X++:
void run()
{
    ...
    callerControl = SysTableLookup::getCallerStringControl(element.args());
    ...
    callerFieldId = callerControl.dataField() ;

    sysDimension = Dimensions::arrayIdx2Code(fieldExt2Idx(callerFieldId));
    callerFieldId = fieldExt2Id(callerFieldId);

    if (!callerFieldId)
    {
        sysDimension = Dimensions::arrayIdx2Code(callerControl.arrayIndex());
    }
    ...
}

У созданного EDT DimensionSysDemo нет дополнительных array elements и преобразование Dimensions::arrayIdx2Code( <arrayIdx> ) давало 0 (SysDimension:: Department). Т.е. если наследование определенной аналитики идет от SysDim, то вне зависимости от указанных relations на новом EDT отображаться в lookup будет аналитика 'Подразделение', что и подтвердили слова Silphidae.

Наследование новых EDT от SysGroup (как родителя SysDim) избавляет от такого вида lookup. (работает штатная функциональность по отображению lookup на основе EDT relations )

В качестве следующей цели эксперимента стало обеспечение возможности форме DimensionsLookup (помимо работы с массивами) корректно отображать список аналитик для EDT унаследованных от SysDim и не являющихся массивом - для единобразия вида lookup отображающего аналитику (форма DimensionsLookup содержит дополнительные вкладки).

Суть внесенных модификаций в форму: для вызывающего control формы определить extended data type, в случае если EDT не является массивом (для них остается штатная логика) определить значение sysDimension на основе информации о relation с типом 'Поле ссылки фиксировано' на поле Dimensions.DimensionCode.

Вот что получилось в первом приближении (для включения дополнительной функциональности нужно в \Forms\DimensionsLookup\Methods\classDeclaration определить значение макроса dimensionsLookup(1) - в проекте значение =0 ).

P.S. В проект включил job и форму которую использовал для тестирования. Выгружено с приложения DAX 4.0 SP2 (application version: 4.0.2501.122):
Вложения
Тип файла: zip DimensionsLookup.zip (9.2 Кб, 127 просмотров)
За это сообщение автора поблагодарили: aao_p (1).