16.04.2015, 07:12 | #1 |
Участник
|
Особенности работы X++ и CIL
Добрый день!
При реализации сервиса в Dynamics AX 2012, внутри которого идет работа со стандартными классами, я нашел некоторую особенность. Код на Х++ и CIL работает по-разному: X++: container emptyFields; ; if (! _rec.DocumentNumber) { emptyFields += "@SYS8434"; } if (! _rec.DocumentDate) { emptyFields += "@SYS2587"; } if (! _rec.PayerAccount) { emptyFields += "@GLS100568"; } if (! _rec.PayeeAccount) { emptyFields += "@GLS100577"; } if (!_rec.AmountCur) { emptyFields += "@SYS860"; } if(emptyFields) { // даже если emptyFields пустое, в CIL вызывает исключение throw error(strFmt("@GLS115341", con2Str(emptyFields, #comma))); } |
|
16.04.2015, 09:00 | #2 |
Участник
|
X++: if (conlen(emptyFields) > 0)
{
...
} |
|
16.04.2015, 09:20 | #3 |
Участник
|
А можно подробнее, как это "писать код на CIL"?
__________________
Ivanhoe as is.. |
|
16.04.2015, 09:42 | #4 |
Участник
|
ldc.i4.0 bne.un.s 004a ldc.i4 0x5182 stloc.0 br.s 004b nop ldloc.0 ret |
|
|
За это сообщение автора поблагодарили: EVGL (1). |
16.04.2015, 10:01 | #5 |
Участник
|
|
|
16.04.2015, 10:03 | #6 |
Участник
|
|
|
16.04.2015, 10:05 | #7 |
Участник
|
Прям весь? Если есть примеры не корректной работы стандартной функциональности MS - пишите запросы в поддержку, они исправят.
__________________
Ivanhoe as is.. |
|
16.04.2015, 10:15 | #8 |
Участник
|
Обычно пишем на X++, есть известные ограничения (https://msdn.microsoft.com/EN-US/library/hh397320.aspx), а также неявные преобразования типов. В целом все предсказуемо и понятно, поддерживать легче. Переходить на C#, мне кажется, стоит только в случае ожидаемого большого ускорения кода или когда бОльшая часть Аксы сама перейдет на C#.
На практике, нововведения с внешними библиотеками в AX вызывают огромные лишние телодвижения (планирование мощности в сводном, расчеты в TMS), как в плане понять "как оно работает", так и в плане "а как это поменять?".
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: ski (1). |
16.04.2015, 10:18 | #9 |
Участник
|
Утрирую, конечно, но как минимум проверять надо теперь весь.
Не писал никогда, бизнесу функционал нужен "уже вчера", а МС когда выпустят свои обновления? |
|
16.04.2015, 10:19 | #10 |
Участник
|
Цитата:
Сообщение от Ivanhoe
Обычно пишем на X++, есть известные ограничения (https://msdn.microsoft.com/EN-US/library/hh397320.aspx), а также неявные преобразования типов. В целом все предсказуемо и понятно, поддерживать легче. Переходить на C#, мне кажется, стоит только в случае ожидаемого большого ускорения кода или когда бОльшая часть Аксы сама перейдет на C#.
На практике, нововведения с внешними библиотеками в AX вызывают огромные лишние телодвижения (планирование мощности в сводном, расчеты в TMS), как в плане понять "как оно работает", так и в плане "а как это поменять?". |
|
16.04.2015, 10:20 | #11 |
Участник
|
|
|
16.04.2015, 10:32 | #12 |
Участник
|
|
|
16.04.2015, 10:35 | #13 |
NavAx
|
Забавный вопрос. Конечно же используем X++ И конечно же он компилируется в CIL.
__________________
Isn't it nice when things just work? |
|
17.04.2015, 15:45 | #14 |
Участник
|
А зря. Обычно система работает довольно быстро, и хотфикс получают в короткие сроки - и тогда "все тестировать" не придется.
|
|
28.10.2020, 11:37 | #15 |
Участник
|
Через 4 года я понял, что значит "Писать код на CIL".
1. Пример для числа с плавающей точкой На X++ можно написать так: myTable.(myFieldNum) = 0 А на CIL надо обязательно писать так: myTable.(myFieldNum) = 0.0. Иначе будут очень интересные эффекты. 2.Пример для даты На X++ можно написать так: str key = con2Str([transDate]) А на CIL надо обязательно писать так: str key = con2Str([strfmt("%1", transDate)]), иначе вместо даты в переменной key окажется строка "Microsoft.Dynamics.Ax.Xpp.AxShared.Date".
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ Последний раз редактировалось Ace of Database; 28.10.2020 в 11:44. |
|
|
За это сообщение автора поблагодарили: AlGol (3), sukhanchik (4). |
03.11.2020, 16:40 | #16 |
Axapta Retail User
|
rPayRateTrans.RateValue = strFmt('%1', rhrmWorkConditionClass.PayRateValue);
Подобная запись ставки вызывает увеличение зарплаты в 100 раз при исполнении в CIL |
|
|
|