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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.06.2014, 17:00   #1  
Мартынов Дмитрий is offline
Мартынов Дмитрий
Участник
 
236 / 66 (3) ++++
Регистрация: 02.02.2004
Адрес: г. Москва
код в CIL и без
Хочу поделиться опытом связанным с 2012:

Был вот такой код
X++:
void test()
{
    Map     valList = new Map(Types::String, Types::Container);
    Real    value;
    ;
    valList.insert(value, conNull());
}
Ошибочка: объявили, что в мепе будет стринг, а пишем туда риал. Долго оставалась незамеченной, все работало как часы. Но как только собрали CIL она всплыла. Вот ведь... в циле работает так, а в аксапте иначе. Но если говорить серьезно, то разница есть и на вполне правильных конструкциях. В последнее время я попробовал работать с SysOperation вместо RunBaseBatch, а там все работает только через цил.

1. Прежде всего, это передача различных типов данных.
а) например, при работе с Net-сборками:

Без цила работает так

X++:
void test(CLRObject _obj)
{
    System.Collections.Hashtable        hash;
    ;
    hash = new System.Collections.Hashtable(_obj);
}
В циле требуется передавать объект правильного типа

X++:
void test(CLRObject _obj)
{
    System.Collections.Hashtable        hash;
    System.Collections.IDictionary      iDictionary;
    ;
    if ( #isDictionary )
    {
        iDictionary = _obj;
        hash = new System.Collections.Hashtable(iDictionary);
    }
}
б) выборка из таблицы select x; без цила возвращает объект того типа, который объявлен, а в циле возвращает объект дочерней таблицы (теперь у нас такие есть в Акс12).
в) Аналогично, надо внимательно относиться к классам дочерним и родительским, к передаче данных через контейнер, к использованию anytype и common и т.д.

2. insert_recordset без цила позволяет писать в таблицу константы (используя переменные правильного типа), в циле этот номер не проходит, приходится выполнять две операции, сначала используя insert_recordset прописать идентификаторы, а затем при помощи update_recordset прописать текстовые константы.

3. Метод внутри метода (вложенный): с ним нет проблем, кроме одной: если вложенный метод является рекурсивным, то цил даже отказывается компилиться

У меня пока все, может быть кто то еще с чем то подобным встречался ?

Последний раз редактировалось Мартынов Дмитрий; 10.06.2014 в 17:02. Причина: ня
За это сообщение автора поблагодарили: mazzy (2), Logger (3), Link (4), S.Kuskov (5), pedrozzz (1).
Старый 10.06.2014, 17:28   #2  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Интересные наблюдения, пригодятся в работе, спасибо!
Старый 10.06.2014, 17:36   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Уточните версию. Это R2? для R3 актуально?
Старый 10.06.2014, 20:56   #5  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
CIL валится, если значение переменной класса-наследника инициализировать экземпляром родителя. Живой пример в стандартном функционале привел в другой ветке
__________________
Кононов Пётр
Старый 10.06.2014, 21:03   #6  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Цитата:
В последнее время я попробовал работать с SysOperation вместо RunBaseBatch, а там все работает только через цил.
Не совсем так. Если в меню айтеме, который ссылается на SysOperationServiceController указать:
EnumTypeParameter = SysOperationExecutionMode
EnumParameter = Synchronous
то код будет выполняться как и прежде, без всякого CIL.
Если для вызова сервиса используете свой контроллер (наследник SysOperationServiceController), то аналогично, указываем энум и значение на менюайтеме, а после создания экземпляра контроллера дергаем
X++:
controller.initializeFromArgs(_args);
__________________
Кононов Пётр
За это сообщение автора поблагодарили: Мартынов Дмитрий (1).
Старый 11.06.2014, 12:56   #7  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от Мартынов Дмитрий Посмотреть сообщение
Хочу поделиться опытом связанным с 2012:
У меня пока все, может быть кто то еще с чем то подобным встречался ?
http://blogs.msdn.com/b/x/archive/20...s-ax-2012.aspx
За это сообщение автора поблагодарили: gl00mie (1).
Старый 29.06.2014, 18:52   #8  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Еще не особо работают неявные преобразования типов, например такой код
X++:
str key = conPeek([systemDateGet()], 1);
даст два разных результата: без CIL - ожидаемый "2014.06.29", и не многими ожидаемый "Microsoft.Dynamics.Ax.Xpp.AxShared.Date", если выполнять в CIL.
__________________
Axapta non erubescit
Теги
cil

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Неправильный объектный код. Хотя правильный... Мартынов Дмитрий DAX: Администрирование 4 06.02.2014 00:44
Узнать уникальный код сеанса для web сессии trud DAX: Программирование 10 12.04.2012 09:39
axdaily: X++ can be compiled to CIL in AX 2012 Blog bot DAX Blogs 0 23.04.2011 07:11
Получить код экземпляра устройства samolalex DAX: Программирование 0 26.11.2010 12:05
Channel9: Peter Villadsen and Gustavo Plancarte: X++ to MSIL Blog bot DAX Blogs 30 24.08.2010 17:11

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

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

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