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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.10.2007, 14:22   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Dict and Dimension
Как сделать так , чтобы можно было поставить условие на значение одной из аналитик

X++:
static void Arahnid(Args _args)
{

    Dictionary dict = new Dictionary();
    DictTable dictTable;
    DictField dictField;
    int i, k;
    str 300 names;
    extendedTypeId _type;
    common      common;
    Dimension   dim;

    ;
    dim[2] = '0200';
    for (i=1; i<=dict.tableCnt(); i++)
    {
        dictTable = new DictTable(dict.tableCnt2Id(i));
        names = dictTable.name();
        for (k=1; k<=dictTable.fieldCnt(); k++)
        {
            dictField = new DictField(dictTable.id(),dictTable.fieldCnt2Id(k));
            _type = dictField.typeid();
            if (_type == 132)
            {
                common      = dictTable.makeRecord();
                info (names+' Это таблица!');
             //   info(extendedTypeId2name(_type));
                ttsbegin;
                while select forupdate  common
//вот так не работает
                where (common.(dictField.id()) == dim)
                {
                    info(common.(dictField.id()) );
                }
                ttscommit;
            }
        }
    }


}
как выход можно написать так
X++:
              common      = dictTable.makeRecord();
             //   info (names+' Это таблица!');
             //   info(extendedTypeId2name(_type));
                ttsbegin;
                while select forupdate  common
               // where (_dim[2] == dim[2])
                {
                    _dim = common.(dictField.id());
                    if (_dim[2] == dim [2])
                    info(_dim[2]  );
                }
                ttscommit;
            }
но я думаю это неправильно

Последний раз редактировалось Arahnid; 11.10.2007 в 14:51.
Старый 11.10.2007, 14:59   #2  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
where ( common.(dictField.id()+idx) == dim)
где idx - индекс аналитики
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 11.10.2007, 15:02   #3  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Кстати, что вы там ваяете
Не проще ли
X++:
    SalesTable  salesTable;
    ;
    while select salesTable
        where salesTable.Dimension[2] == '00001'
    {
        info(strFmt("%1", salesTable.Dimension[2]));
    }
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 11.10.2007, 15:05   #4  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
не вышло

X++:
ttsbegin;
                while select forupdate  common
                where (common.(dictField.id()+2) == dim[2])
                {
                  /*  _dim = common.(dictField.id());
                    if (_dim[2] == dim [2])*/
                    info(_dim[2]  );
                }
                ttscommit;
Старый 11.10.2007, 15:07   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от Arahnid Посмотреть сообщение
не вышло

X++:
        where (common.(dictField.id()+2) == dim[2])
Фигня какаято то...Используйте FieldId2Ext для работы с полями типа массив
/*
Returns an extended FieldId, based on the fieldId and the Array index
(an extended FieldId is a fieldId including the array index)
*/
static fieldId fieldId2Ext(fieldId fieldId,
ArrayIdx arrayIndex
)

Последний раз редактировалось Sada; 11.10.2007 в 15:10.
Старый 11.10.2007, 15:10   #6  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Используйте функцию fieldId2Ext:

X++:
                while select forupdate  common
                where (common.(fieldId2Ext(dictField.id()), 2) == dim[2])
                {
                    info(_dim[2]  );
                }
                ttscommit;
И, кстати, никогда не пишите так:
X++:
if (_type == 132)
Это противоречит BestPractices и резко сокращает понимаемость кода. Используйте т.н. intrinsic functions, в данном случае extendedTypeNum:
X++:
if (_type == extendedTypeNum(Dimension))

Последний раз редактировалось Peter Savintsev; 11.10.2007 в 15:18.
Старый 11.10.2007, 15:15   #7  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow


спасибо
Старый 11.10.2007, 15:49   #8  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Дело даже и не в том, что индекс явно числом указан. А если его индекс изменится когда нить потом, то что делать? + соглашусь с Петром.
Старый 11.10.2007, 16:01   #9  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Цитата:
Сообщение от Sada Посмотреть сообщение
Дело даже и не в том, что индекс явно числом указан. А если его индекс изменится когда нить потом, то что делать?.
Действительно. Более красивый вариант:

X++:
int idx = SysDimension::Center + 1;

while select forupdate  common
where (common.(fieldId2Ext(dictField.id(), idx)) == dim[idx])
{
   info(_dim[idx]  );
}
Старый 16.10.2007, 10:09   #10  
johny77 is offline
johny77
Участник
 
31 / 27 (1) +++
Регистрация: 04.07.2006
Можно посмотреть вот это
http://blogs.msdn.com/palle_agermark...imensions.aspx
Старый 16.10.2007, 12:30   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
X++:
#localmacro.dimNo
   (SysDimension::%1 + 1)
#endmacro

while select forupdate  common
where (common.(fieldId2Ext(dictField.id(), #dimNo(Center))) == dim[#dimNo(Center)])
Старый 17.10.2007, 11:17   #12  
Zan is offline
Zan
Участник
 
104 / 25 (1) +++
Регистрация: 22.07.2004
Адрес: I live in Moscow
В Ax40 на таблице Dimensions реализован статический метод code2arrayIdx().
В Ax30 такого стандартного метода нет.

Вместо макроса лучше наверное все-таки использовать то, что уже есть.
Ну, а если таки токого метода нет, то его можно написать.

PHP код:
public static int code2ArrayIdx(SysDimension _sysDimension)
{
    
SysDictEnum sysDictEnum;
    ;

    
sysDictEnum = new SysDictEnum(enumnum(SysDimension));

    return 
sysDictEnum.value2Index(_sysDimension) + 1;

За это сообщение автора поблагодарили: lev (2).
Старый 17.10.2007, 11:22   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
X++:
Dimensions::code2ArrayIdx(SysDimension::Division)
vs
X++:
#dimNo(Division)
Старый 17.10.2007, 11:31   #14  
Zan is offline
Zan
Участник
 
104 / 25 (1) +++
Регистрация: 22.07.2004
Адрес: I live in Moscow
Нет, ну я совсем не против.
Это кому как удобнее
Старый 17.10.2007, 12:24   #15  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
#dimNo(Division)
А по такой конструкции построятся перекрыстные ссылки (для SysDimension::Division)?
Старый 17.10.2007, 12:28   #16  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
не знаю, наверное, да - вроде перекрестные ссылки юзают ScannerClass - а он автоматически разворачивает макросы
Старый 17.10.2007, 12:40   #17  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Потом попробую - напишу.

Но мне все равно конструкция
Код:
#dimNo(Division)
не нравиться.

В конструкции
Код:
Dimensions::code2ArrayIdx(SysDimension::Division)
понятнее как-то, что конкретно она делает.

Но у каждого, конечно, свои предпочтения
 

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

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

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

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

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