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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.01.2005, 12:21   #1  
Deep Dreamer is offline
Deep Dreamer
Участник
 
76 / 24 (1) +++
Регистрация: 05.03.2004
Адрес: Москва
? Объясните странное поведение enum'ов
Есть стандартный пример функции enum2str:

PHP код:
static void Job7(Args _args)
{
      
LedgerJournalACType     p;
      
LedgerJournalACType::Ledger;
      
infoenum2str(p) );

Есть попытка применить эту функцию:

PHP код:
static void Job6(Args _args)
{
    
LedgerJournalTrans  ljt;
    
set                 s=new set(types::Enum);
    
setiterator         si;
    
LedgerJournalACType tmp;

    while 
select firstonly ljt
    
{
        
s.add(ljt.OffsetAccountType);
    }

    
si = new setiterator(s);
    while(
si.more())
    {
        
tmp si.value();
        
info(enum2str(tmp));
        
si.next();
    }

Вызов
PHP код:
 info(enum2str(tmp)); 
приводит к ошибке времени выполнения. Почему? Причём в debugger'е значение tmp вполне корректно
Старый 09.04.2007, 23:44   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Раскопал этот старый тред и показалось любопытным - в чем проблема?

В результате разбора полетов выяснил вот что:
Собственно, ошибка возникает на
tmp = si.value();
Причем, причина не в anytype, а в том, как SetIterator возвращает значение. Любой enum, помимо самого значения, содержит так же тип, к которому он принадлежит. Так вот, SetIterator возвращает значение с типом 65237 (0xFED5). При присвоении енуму с определенным типом (в данном случае LedgerJournalACType) и происходит ошибка конвертации.

Вариантов лечения этой проблемы несколько.
Первый предложил Maxim Gorbunov - преобразовывать полученное значение в целое, а затем уже его присваивать енуму.
Второй - использовать в Set'е целочисленное значение (Types::Integer). В этом случае перед вызовом Add() надо будет преобразовать сохраняемый енум в целое. При считывании преобразований делать не надо - конвертация произойдет автоматически
Третий - использовать вместо SetIterator - SetEnumerator. Енумератор возвращает значение как целое и дополнительных преобразований делать не надо.

Из всего этого следует вот что: внутри set'а не делается различия между разными типами енумов. Например, если в Set добавить ABC::B и ABCModel::Value (оба имеют одинаковое enumValue=2), то получить из него можно только это самое значение (2) - без привязки к типу. Причем, значение будет единственное

Все это также относится и к Map'у. Единственное отличие - MapIterator.key() (а так же MapIterator.value()) возвращает целочисленное значение.
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: KiselevSA (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Электронные платежи. Странное поведение LEM DAX: Функционал 3 05.04.2008 12:00
Странное поведение Lookup CDR DAX: Программирование 5 21.02.2007 11:17
Странное поведение SPID'ов, как промониторить sergeypp DAX: Администрирование 3 18.05.2006 16:13
Странное поведение при использовании карантина VIS DAX: Функционал 22 15.09.2005 18:40
Странное поведение резервирования после создания спланированной закупки. NEO DAX: Функционал 7 01.07.2004 14:03

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:54.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.