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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.03.2006, 05:38   #1  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Как получить ТОЛЬКО из элемента enum-а код типа (enum-а)?
Подскажите. Приведу пример.
Надо получить из NoYesCombo::No, ID типа NoYesCombo (732).

Сложность в том, что мне неизвестно название типа. Т.е. я не могу воспользоваться enumnum(NoYesCombo). Обыскал AOT, не нашел ничего подходящего. Все методы сводятся к тому, что нужно знать название типа. typeof конечно честно возвращает Types::Enum, что не помогает. Сложилось стойкое ощущение, что задача решается просто, но ни на форуме, ни в доках не нашел решения...

P.S. Для классов, например есть classidget(Object), который возвращает ID типа экзамепляра класса (т.е. ID класса). Неужели тут enum-ы отдыхают?

Последний раз редактировалось Romb; 02.03.2006 в 10:47.
Старый 01.03.2006, 09:45   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Не совсем понял задачу, но советую Вам обратить внимание на класс DictEnum.

С Уважением,
Георгий
Старый 01.03.2006, 11:26   #3  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Снимаю вопрос. Задача абсолютно некорректна. Тут мне ничего вообще не поможет. В самом деле невозможно получить из элемента любого enum-а, его Name без знания названия enum-а.

Бывают же заморочки с мозгом.
Старый 01.03.2006, 12:09   #4  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от Romb
Задача абсолютно некорректна.
А что если изменить формулировку?
Код:
 anytype	a; 
;
a = NoYesCombo::No;
Если мы посмотрим в дебагере значение переменной a, то получим на экране:
Name Value Type
a No NoYesCombo
Теперь наверное можно ставить вопрос как получить эту информацию в X++
За это сообщение автора поблагодарили: Romb (1).
Старый 01.03.2006, 14:38   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Заднепроходно, но могу предложить такой вариант
X++:
static void Job90(Args _args)
{
    EnumId  GetEnumId(AnyType enum)
    {
        ContainerClass  contClass;
        str             sEnum;
        EnumId          enumId = 0;
        ;
        if (typeOf(enum) != Types::Enum)
            return 0;

        contClass = New ContainerClass([enum]);
        sEnum = BinData::dataToString(contClass.toBlob());
        if (sEnum && strlen(sEnum) == 12)
        {
            if (hex2int(substr(sEnum, 1, 2)) == 0x07 && hex2int(substr(sEnum, 3, 2)) == 0x04)
            {
                enumId = (hex2int(substr(sEnum, 9, 2)) << 8) | hex2int(substr(sEnum, 7, 2));
            }
        }
        return enumId;
    }
    ;
    info(int2str(enumnum(NoYesCombo)));
    info(int2str(GetEnumId(NoYesCombo::No)));
}
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (5), Borsugg (0).
Старый 02.03.2006, 10:44   #6  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
!!!
Excellent! Работает!
Я был 100% уверен, что внутренний формат представления элемента enum-a - простое целое число, из которого конечно никак не получишь свойства элемента enum-a без указания самого enuma. Видимо ошибался.

Andy большое спасибо!
Один вопрос, где можно узнать/почитать о вариантах использования продемонстрированной мистической кухни (см. ниже):

PHP код:

if (hex2int(substr(sEnum12)) == 0x07 && hex2int(substr(sEnum32)) == 0x04)
{
    
enumId = (hex2int(substr(sEnum92)) << 8) | hex2int(substr(sEnum72));

2Dn. Да, спасибо. Именно это я и пытался сказать.
За это сообщение автора поблагодарили: Borsugg (0).
Старый 03.03.2006, 09:00   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Первый байт (первые два символа в строке) значение 0x07 - идентификатор контейнера. Второй байт - тип первого элемента контейнера (0x01 - целое число; 0x00 - строка; 0x02 - число с плаващей точкой; 0x04 - enum; 0x03 - дата; 0x07 - контейнер; есть еще несколько типов). Дальше идут данные, специфические для этого типа (размер может изменяться). Если элементов в контейнере несколько, то после данных предыдущего будет стоять байт с типом элемента и дальше опять данные. Последний байт контейнера равен 0xFF

Сам enum занимает 3 байта: 1-й - значение enum'а; 2-й и 3-й - ID enum'а (хранится в перевернутом виде - младший байт первым)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (5).
Старый 03.03.2006, 09:06   #8  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
AndyD спасибо! Очень полезная инфа!
Старый 05.08.2011, 18:05   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Заднепроходно, но могу предложить такой вариант
AndyD, а возможно таким способом определить dataareaID табличного буфера в контейнере ?

А то в Аксапте есть прикольный глюк. Если из контейнера достаешь буфер, то он всегда а dataareaid содержит код текущей компании.

Причем влияет даже на отладчик.
Т.е.
1. берем буфер.
2. Кладем в контейнер.
3. Переключаемся в другую компанию.
4. делаем conpeek - опаньки код компании текущий, а не исходный.
5. Если смотрим содержимое контейнера из под отладчика - то тоже самое - показывает не реальный а текущий код компании.

В 3-ке еще такой фигней страдал метод xRecord.data() - констрактил дубликат со значением dataareaid из текущей компании. В 2009-й его поправили - сохраняет исходное значение.
Старый 05.08.2011, 18:06   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Т.е. если буфер в контейнер положили, то он как чёрную дыру провалился - нет возможности вытащить информацию о dataareaid никаким способом.
Старый 05.08.2011, 20:07   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Кстати, для 2009-й джобик будет чуть чуть другим.
Оформил в виде метода для Global
X++:
// [url=http://axforum.info/forums/showthread.php?p=97771#post97771]Как получить из элемента enum-а код типа (enum-а)?[/url]
  // pkoz 27.02.2008
static EnumId GRD_GetEnumId(AnyType enum)
{
    ContainerClass  contClass;
    str             sEnum;
    EnumId          enumId = 0;
    ;
    if (typeOf(enum) != Types::Enum)
        return 0;

    contClass = New ContainerClass([enum]);
    sEnum = BinData::dataToString(contClass.toBlob());
//    if (sEnum && strlen(sEnum) == 12)
    if (sEnum && strlen(sEnum) == 14) //+переход на 2009-ю // pkoz 05.08.2011
    {
//        if (hex2int(substr(sEnum, 1, 2)) == 0x07 && hex2int(substr(sEnum, 3, 2)) == 0x04)
        if (hex2int(substr(sEnum, 1, 2)) == 0x07 && hex2int(substr(sEnum, 5, 2)) == 0x04) //+переход на 2009-ю // pkoz 05.08.2011
        {
//            enumId = (hex2int(substr(sEnum, 9, 2)) << 8) | hex2int(substr(sEnum, 7, 2));
            enumId = (hex2int(substr(sEnum, 11, 2)) << 8) | hex2int(substr(sEnum, 9, 2)); //+переход на 2009-ю // pkoz 05.08.2011
        }
    }
    return enumId;
}
За это сообщение автора поблагодарили: gl00mie (3).
Старый 07.08.2011, 15:51   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Logger Посмотреть сообщение
AndyD, а возможно таким способом определить dataareaID табличного буфера в контейнере ?
Угум.

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

Во вложении - варианты класса Container2Record для тройки и DAX2009

Класс поддерживает любые типы полей, в том числе контейнерные, содержащие другие контейнеры и BLOB-данные, а так же, для DAX2009, типы int64, guid и UtcDateTime.

При создании табличной переменной (метод Container2Record.record()) в нужной компании в DAX2009 используется changeCompany(). В трешке - метод company()

Так же, возможно получение идентификатора компании через метод Container2Record.DataAreaId() или через статический метод Container2Record:: DataAreaIdFromCon()

PS Подобный вопрос разбирался для получения данных в упакованном поле на MS SQL - Вопрос ConPeek
Вложения
Тип файла: zip Container2Record.zip (9.3 Кб, 199 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (15).
Старый 27.06.2013, 16:17   #13  
mista is offline
mista
Участник
 
8 / 20 (1) +++
Регистрация: 03.09.2007
Адрес: Switzerland
DictEnum::value2id()
За это сообщение автора поблагодарили: Logger (3), gl00mie (3).
Теги
ax2009, ax3.0, enum

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно сделать lookup по полю типа Base Enum? Hidden DAX: Программирование 25 04.10.2017 13:06
multiselect при lookup-е значения типа enum nebula DAX: Программирование 4 14.12.2006 18:56
Получить код метки узла Enum-а MironovI DAX: Программирование 2 23.11.2006 15:24
Как получить имя типа расширенного типа velk DAX: Программирование 9 03.08.2006 14:17
Каким образом можно получить код для работы в конкретном слое ? Андре DAX: Функционал 9 18.02.2003 15:58

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

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

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