01.03.2006, 05:38 | #1 |
Участник
|
Как получить ТОЛЬКО из элемента 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 |
Модератор
|
Не совсем понял задачу, но советую Вам обратить внимание на класс DictEnum.
С Уважением, Георгий |
|
01.03.2006, 11:26 | #3 |
Участник
|
Снимаю вопрос. Задача абсолютно некорректна. Тут мне ничего вообще не поможет. В самом деле невозможно получить из элемента любого enum-а, его Name без знания названия enum-а.
Бывают же заморочки с мозгом. |
|
01.03.2006, 12:09 | #4 |
Участник
|
Цитата:
Сообщение от Romb
Задача абсолютно некорректна.
Код: anytype a; ; a = NoYesCombo::No; Name Value Type a No NoYesCombo Теперь наверное можно ставить вопрос как получить эту информацию в X++ |
|
|
За это сообщение автора поблагодарили: Romb (1). |
01.03.2006, 14:38 | #5 |
Участник
|
Заднепроходно, но могу предложить такой вариант
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 |
Участник
|
!!!
Excellent! Работает!
Я был 100% уверен, что внутренний формат представления элемента enum-a - простое целое число, из которого конечно никак не получишь свойства элемента enum-a без указания самого enuma. Видимо ошибался. Andy большое спасибо! Один вопрос, где можно узнать/почитать о вариантах использования продемонстрированной мистической кухни (см. ниже): PHP код:
|
|
|
За это сообщение автора поблагодарили: Borsugg (0). |
03.03.2006, 09:00 | #7 |
Участник
|
Первый байт (первые два символа в строке) значение 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 |
Участник
|
AndyD спасибо! Очень полезная инфа!
|
|
05.08.2011, 18:05 | #9 |
Участник
|
AndyD, а возможно таким способом определить dataareaID табличного буфера в контейнере ?
А то в Аксапте есть прикольный глюк. Если из контейнера достаешь буфер, то он всегда а dataareaid содержит код текущей компании. Причем влияет даже на отладчик. Т.е. 1. берем буфер. 2. Кладем в контейнер. 3. Переключаемся в другую компанию. 4. делаем conpeek - опаньки код компании текущий, а не исходный. 5. Если смотрим содержимое контейнера из под отладчика - то тоже самое - показывает не реальный а текущий код компании. В 3-ке еще такой фигней страдал метод xRecord.data() - констрактил дубликат со значением dataareaid из текущей компании. В 2009-й его поправили - сохраняет исходное значение. |
|
05.08.2011, 18:06 | #10 |
Участник
|
Т.е. если буфер в контейнер положили, то он как чёрную дыру провалился - нет возможности вытащить информацию о dataareaid никаким способом.
|
|
05.08.2011, 20:07 | #11 |
Участник
|
Кстати, для 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 |
Участник
|
Цитата:
Только из-за формата упакованной записи невозможно извлечь значение только одного поля (если оно не первое в записи). Так что, как побочный продукт, получился класс, извлекающий значения всех полей из контейнера и возвращающий табличную переменную с этими значениям. Во вложении - варианты класса Container2Record для тройки и DAX2009 Класс поддерживает любые типы полей, в том числе контейнерные, содержащие другие контейнеры и BLOB-данные, а так же, для DAX2009, типы int64, guid и UtcDateTime. При создании табличной переменной (метод Container2Record.record()) в нужной компании в DAX2009 используется changeCompany(). В трешке - метод company() Так же, возможно получение идентификатора компании через метод Container2Record.DataAreaId() или через статический метод Container2Record:: DataAreaIdFromCon() PS Подобный вопрос разбирался для получения данных в упакованном поле на MS SQL - Вопрос ConPeek
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (15). |
27.06.2013, 16:17 | #13 |
Участник
|
DictEnum::value2id()
|
|
|
За это сообщение автора поблагодарили: Logger (3), gl00mie (3). |