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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.06.2009, 07:56   #1  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
! Метод typeCnt() класса Dictionary
Доброго времени суток.

Наткнулся на очередную фичу Аксапты. Метод typeCnt() класса Dictionary в AX 4.0 и AX 2009 почему-то возвращает на единицу больше существующих EDT(в AX 3.0 работает нормально). Ниже приведенный job наглядно это демонстрирует.

X++:
static void SRF_TestDictionaryTypeCnt(Args _args)
{
    Dictionary          dictionary = new Dictionary();
 
    ExtendedTypeId      currentTypeId;
    Counter             typeCnt;
    ;
    for (currentTypeId = dictionary.typeNext(0); currentTypeId; currentTypeId = dictionary.typeNext(currentTypeId))
    {
        typeCnt++;
    }
    info(strfmt("%1", dictionary.typeCnt() - typeCnt));
}
У меня результат в AX 3.0 - 0 (результат вполне ожидаем), а вот в AX 4.0 и AX 2009 job упорно выдает - 1 !!!!
Все бы ничего, если бы при использовании других xxxCnt() и xxxNext() методов класса Dictionary результат тоже был 1 (объяснялось бы проще - изменился принцип работы методов xxxCnt()) однако это не так, результат такой же как и в AX 3.0 - 0.

OFFTOPIC : В голову почему-то приходит фраза: "О, женщина. Как ты не постоянна", которую я не много перефразировал
Цитата:
О, Аксапта. Как ты не постоянна
но из-за того непостоянства мне нравиться с ней работать, поскольку не знаешь, где и когда будет "подвох"

Последний раз редактировалось SRF; 25.06.2009 в 07:57. Причина: опечатки
За это сообщение автора поблагодарили: kashperuk (5).
Старый 25.06.2009, 12:27   #2  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
-> extendedTypeNum( featureKey ) = 61465
Цитата:
Сообщение от SRF Посмотреть сообщение
...
Метод typeCnt() класса Dictionary в AX 4.0 и AX 2009 почему-то возвращает на единицу больше существующих EDT(в AX 3.0 работает нормально).
Да, есть такая багофича.
Связано с тем что в Ax 3.0 был системный EDT featureKey (extendedTypeNum( featureKey ) = 61465), а в DAX 4.0 такого уже нет. При этом функции dictionary.typeCnt() и dictionary.typeCnt2Id() все же информацию о нем как-то учитывают 'по старой памяти' .
В свое время тоже натыкался на это в DAX 4.0, только с другой стороны - в цикле по dictionary.typeCnt() с dictionary.typeCnt2Id() (в общем то так и определил какой EDT 'фонит' ):
X++:
static void jbCheckDictionaryType(Args _args)
{
    Dictionary      dictionary      ;
    DictType        dictType        ;
    ExtendedTypeId  extendedTypeId  ;
    Counter         counterType     ;
    ;
    
    dictionary = new Dictionary() ;
    for( counterType =1; counterType <dictionary.typeCnt(); counterType++)
    {
        extendedTypeId = dictionary.typeCnt2Id( counterType ) ;
        dictType = dictionary.typeObject( extendedTypeId ) ;
        if( !dictType )
            warning( strfmt( "Oops: %1 - %2", extendedTypeId, dictionary.typeName( extendedTypeId ) ) ) ;
    }
    info( 'finished' ) ;
}
результат:
Цитата:
Сообщение (10:02:16)
- Oops: 61465 -
- finished
При этом функция dictionary.typeNext() 'перепрыгивает' через этот номер EDT в DAX 4.0:
X++:
    Dictionary      dictionary = new Dictionary() ;
    ExtendedTypeId  extendedTypeId = extendedTypeNum( userGroupId ) ;
    ;
    
    info( strfmt( "%1 - %2", extendedTypeId, dictionary.typeName( extendedTypeId ) ) ) ;
    extendedTypeId = dictionary.typeNext( extendedTypeId ) ;
    info( strfmt( "%1 - %2", extendedTypeId, dictionary.typeName( extendedTypeId ) ) ) ;
Цитата:
Сообщение (10:16:24)
- 61464 - userGroupId
- 61466 - money
Собственно поэтому цикл:
X++:
for (currentTypeId = dictionary.typeNext(0); currentTypeId; currentTypeId = dictionary.typeNext(currentTypeId))
    {
        typeCnt++;
    }
посчитал количество в AX 4.0 и AX2009 на единицу меньше чем выдает dictionary.typeCnt().
Изображения
  
За это сообщение автора поблагодарили: SRF (1).
Старый 25.06.2009, 14:27   #3  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Я выяснять в свое время не стал, и просто тупо проверял, создался ли DictType по очередному counter. Теперь стало ясно, почему оно не стреляло..
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Теги
ax2009, ax3.0, ax4.0, dictionary, typecnt

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Метод 'SendMail' в COM-объекте класса 'Dundas.mailer' возвратил код ошибки 0x80004005 (E_FAIL), который означает: The HELLO command failed. Andrew Akhmetov DAX: Программирование 4 09.04.2008 13:24
Как запустить метод класса :) Silence DAX: Программирование 6 19.10.2006 12:23
Запустить метод класса loka DAX: Программирование 2 13.03.2006 15:40
Как вызвать нужный метод класса? Pawlik DAX: Программирование 5 12.01.2006 15:47
Метод класса, возвращающий сумму налога. 2.5SP5 studentLPC DAX: Программирование 2 25.07.2003 12:21
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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