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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.11.2008, 11:17   #1  
jiller is offline
jiller
Участник
 
13 / 11 (1) +
Регистрация: 18.09.2008
Финансовые аналитики
Добрый день!
У меня вопрос, подскажите пожалуйста кто знает: как программно получить список финансовых аналитик, а точнее их названия?

P.S. DAX 4.0 SP2
Старый 12.11.2008, 11:27   #2  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
X++:
while select Dimensions {...}
Старый 12.11.2008, 12:01   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
если речь идёт просто о том какие фин аналитики есть в системе, то можно вот так:
X++:
    SysDictEnum dictEnum = new SysDictEnum(enumnum(SysDimension));
    int         i, cnt, iSearch;
    ;

    cnt = dictEnum.lastValue();

    for(i=dictEnum.firstValue(); iSearch <= cnt; i = dictEnum.nextValue(i))
    {
        iSearch++;
        info(dictEnum.value2Label(i));
    }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 12.11.2008, 12:08   #4  
jiller is offline
jiller
Участник
 
13 / 11 (1) +
Регистрация: 18.09.2008
Цитата:
Сообщение от lev Посмотреть сообщение
если речь идёт просто о том какие фин аналитики есть в системе, то можно вот так:
X++:
    SysDictEnum dictEnum = new SysDictEnum(enumnum(SysDimension));
    int         i, cnt, iSearch;
    ;

    cnt = dictEnum.lastValue();

    for(i=dictEnum.firstValue(); iSearch <= cnt; i = dictEnum.nextValue(i))
    {
        iSearch++;
        info(dictEnum.value2Label(i));
    }
Спасибо! Это как раз и надо было.
Старый 12.11.2008, 12:47   #5  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Возможная избыточность цикла
Цитата:
Сообщение от lev Посмотреть сообщение
если речь идёт просто о том какие фин аналитики есть в системе, то можно вот так:
X++:
    SysDictEnum dictEnum = new SysDictEnum(enumnum(SysDimension));
    int         i, cnt, iSearch;
    ;

    cnt = dictEnum.lastValue();

    for(i=dictEnum.firstValue(); iSearch <= cnt; i = dictEnum.nextValue(i))
    {
        iSearch++;
        info(dictEnum.value2Label(i));
    }
Приведенный алгоритм содержит потенциальный bug

Мастером финансовых аналитик (или просто в AOT) добавляем новый элемент со значением 101 (т.е. не последовательно 0,1,2,3,4,...) в enum SysDimension - в итоге цикл начинает отрабатывать 102 итерации т.к. сравнение идет iSearch <= 101 начиная с 0.

Если необходим список активных значений, то дополнительно можно проверить на предмет активности конфигурационного ключа на значении enum'а, что-то в таком духе:
X++:
static void jbDimensionListByEnum(Args _args)
{
    DictEnum    dictEnum = new DictEnum( enumNum( SysDimension ) ) ;
    Counter     enumIdx ;
    
    #define.OnlyActive
    ;

    for( enumIdx = 0; enumIdx < dictEnum.values(); enumIdx++ )
    {
#if.OnlyActive
        if( !isConfigurationKeyEnabled( dictEnum.index2ConfigurationKey( enumIdx ) ) )
            continue ;
#endif
        info( dictEnum.index2Label(enumIdx));
    }
}
За это сообщение автора поблагодарили: jiller (1).
Старый 12.11.2008, 12:57   #6  
jiller is offline
jiller
Участник
 
13 / 11 (1) +
Регистрация: 18.09.2008
И еще такой вопрос: как получить информацию о EDT, используемых в массиве типа Dimension?
Старый 12.11.2008, 13:02   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Еще более короткий вариант, тут вообще ничего проверять не надо
X++:
    int c;
    ;
    for (c = 1; c <= new DictType(extendedtypenum(Dimension)).arraySize(); c++)
        info(new DictType(extendedtypenum(Dimension)).label(c));
Можете соптимизировать, дабы один и тот же объект два раза не создавать.
Отвечая на последний вопрос, new DictType(extendedtypenum(Dimension)) вам в помощь, там большинство методов этого объекта требуют указания индекса элемента.

Последний раз редактировалось Eldar9x; 12.11.2008 в 13:15.
За это сообщение автора поблагодарили: lev (1).
Старый 12.11.2008, 13:03   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от petergunn Посмотреть сообщение
Приведенный алгоритм содержит потенциальный bug
Согласен.
Просто в разрезе описанной задачи посчитал, что такого кода достаточно, т.к. сомневаюсь что в финансовых аналитиках, кто то добавит элемент со значением 101.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 12.11.2008, 13:33   #9  
jiller is offline
jiller
Участник
 
13 / 11 (1) +
Регистрация: 18.09.2008
Всем огромное спасибо за помощь!
Старый 12.11.2008, 14:05   #10  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Просто раз уж тему открыл, то предложу и свое решение задачи:

X++:
static void Job2(Args _args)
{
    SetEnumerator   dimensionsEnumerator = Dimensions::dimensionCodesSet().getEnumerator();
    SysDimension    sysDimension;
    ;

    while (dimensionsEnumerator.moveNext())
    {
        sysDimension = dimensionsEnumerator.current();
        print enum2str(sysDimension);
    }
    
    pause;
}
За это сообщение автора поблагодарили: lev (1), player (1).
Старый 14.07.2011, 07:47   #11  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
А если нужно добавить поля на форму?
У меня есть расширение этой задачи - добавление на форму "отвязанных" контролов по фин. аналитикам. Вариант с добавлением всех и последующим скрытием не интересен, т.к. заранее не известно, сколько аналитик будет.
Делаю так:
X++:
        DictEnum DictEnum = new DictEnum(enumnum(SysDimension));
        FormBuildDesign             formBuilddesign = form.design();
        FormBuildGroupControl       formBuildGroupControl;
        FormStringControl c;
        int      i;

        ;

        if (dictEnum){
            for (i=0; i<dictEnum.values(); i++){
            c = DimensionList.addControl(FormControlType::String,strfmt("_%1",dictEnum.index2Symbol(i)));
            c.extendedDataType(global::extendedTypeName2Id(strfmt("Dimension[%1]",i)));
            c.showLabel(true);
            c.label(dictEnum.index2Name(i));
            c.lookupButton(2);
            }
        }
Элементы появляются, но выпадающие списки не работают, т.е. тип не подцепляется. Не делать showlabel, label и lookupbutton пробовал, получается простое текстовое поле, что еще раз подтверждает, что тип не подхватывается.
Не подскажете, в чем дело?

Последний раз редактировалось gefr; 14.07.2011 в 08:07.
Старый 14.07.2011, 08:25   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,436 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от gefr Посмотреть сообщение
У меня есть расширение этой задачи - добавление на форму "отвязанных" контролов по фин. аналитикам.
...
выпадающие списки не работают, т.е. тип не подцепляется
А вы попробуйте для начала решить задачу не программно а в ручную. Получится?
Когда будете создавать unbound контрол вручную какой расширенный тип выберете?
Что, по-вашему, должен вернуть метод global::extendedTypeName2Id(strfmt("Dimension[%1]",i))?
Старый 14.07.2011, 08:35   #13  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,305 / 3538 (124) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от gefr Посмотреть сообщение
У меня есть расширение этой задачи - добавление на форму "отвязанных" контролов по фин. аналитикам.
...
Не подскажете, в чем дело?
В свое время для 4.0 пытался также решать похожую задачу и не тоже смог победить. Причем - такой вариант, как задание строкового типа Dimension[i] не катит - это точно - нет такого типа в системе.

Нашел для себя 2 "обходных" пути.
1. Для диалогов - наследников RunBase есть класс DialogAddDimensionType_CheckButton_RU. Он добавляет в диалог флажки, по количеству элементов в массиве в типе Dimension. По сути здесь простой цикл и все. Но это решает задачу добавления именно "отвязанных" контролов. Важно! Здесь список контролов подготавливается ДО init формы. Т.к. после - уже не получается (ну у меня тогда не получилось). При этом лукапы для каждого элемента массива тут работать не будут (если пытаться заменить галки на строковые поля). Т.е. если хочется добавить контрол с лукапом в случае массива - он должен быть "связанным"

2. Если нужно сделать лукап со списком полей (а может и лукап со списком значений) аналогично форме расширенного запроса (SysQueryForm) - то нужно использовать класс SysQueryForm (его можно использовать, предварительно подготовив всякие таблички и Query). При этом, обращаю внимание - там используется табличка TmpSysQuery и у контрола типа Dimension проставлен не EDT, а FieldId, причем свойство ArraySize не используется (оно не работает), а в FieldId подставлено значение fieldId2Ext(fieldnum(Dimension), i), где i - индекс массива. Здесь видно, что лукап у поля "Значения" строится в зависимости от выбранного элемента массива.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 14.07.2011 в 08:46.
За это сообщение автора поблагодарили: Sergey Petrov (1).
Старый 14.07.2011, 08:45   #14  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
2 S.Kuskov: да, вы правы, тупанул переделал так - все равно не помогло.
X++:
                c.extendedDataType(typeid(Dimension));
                c.arrayIndex(i);
Старый 14.07.2011, 08:47   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,305 / 3538 (124) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от gefr Посмотреть сообщение
2 S.Kuskov: да, вы правы, тупанул переделал так - все равно не помогло.
X++:
                c.extendedDataType(typeid(Dimension));
                c.arrayIndex(i);
Я ж сказал - не работает это свойство. Ошибся в названии - не ArraySize, а arrayIndex
__________________
Возможно сделать все. Вопрос времени
Старый 14.07.2011, 08:53   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,436 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Я ж сказал - не работает это свойство. Ошибся в названии - не ArraySize, а arrayIndex
Сейчас попробовал. В AX2009 arrayIndex как минимум влияет на Label

Вот тут ещё было обсуждение этой проблемы Статьи аналитик

Последний раз редактировалось S.Kuskov; 14.07.2011 в 08:55.
Старый 14.07.2011, 09:40   #17  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
Там, к сожалению, про диалоги. В диалогах проблем нет, я это и так знал, сразу попробовал и здесь, на форме. На форме не срастается
Старый 14.07.2011, 12:44   #18  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
X++:
public void init()
{
    FormBuildDesign             formBuilddesign = form.design();
    FormBuildGroupControl       formBuildGroupControl = form.design().control('AddGroup');
    formBuildStringControl      bc;
    ;

    bc = formBuildGroupControl.addControl(FormControlType::STRING,'RunTimeControl');
    bc.extendedDataType(typeId2ExtendedTypeId(typeId(Dimension)));
    bc.arrayIndex(2);

    super();
}
За это сообщение автора поблагодарили: sukhanchik (4), S.Kuskov (3), Player1 (1).
Старый 14.07.2011, 14:33   #19  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
К сожалению, не могу добавить благодарность 2Wamr - сайт артачится. Но все равно - спасибо.
Теги
dimensions

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
финансовые аналитики в диалог longson DAX: Программирование 6 02.07.2008 03:23
Код новой фин. аналитики DAX 4.0 Ivanhoe DAX: Программирование 4 13.05.2008 15:23
Сравнение в разрезе складской аналитики. longson DAX: Программирование 3 14.01.2008 13:45
Учёт остатков в разрезе фин. аналитики miklenew DAX: Программирование 11 06.11.2007 20:01
Допустимо ли так использовать фин. аналитики kosenkov DAX: Функционал 5 26.02.2006 18:17

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

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

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