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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.03.2016, 02:37   #1  
kgksoft is offline
kgksoft
Участник
 
37 / 107 (4) +++++
Регистрация: 24.12.2003
conpoke в CIL
AX 2012 R3 + CU10

Вот такая конструкция привела к тому, что в CIL элементы не обновлялись в контейнере, а добавлялись в конец контейнера. Без CIL все ОК.

X++:
cElementUpdate = conpoke(
  cElementUpdate,
  conpeek(conpeek(cOperation, j), 1),
  conpeek(cElementUpdate, conpeek(conpeek(cOperation, j), 1))
    + conpeek(cElement, conpeek(conpeek(cOperation, j), 1))
  );
Проблему решил созданием вспомогательного кода вместо conpoke. Боюсь теперь контейнеров.

X++:
container conPoke2(container _con, int _pos, anytype _value)
{
    return conPoke(_con, _pos, _value);
}
Старый 22.03.2016, 07:27   #2  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Можете сделать законченный минимальный пример для воспроизведения этой ошибки. Т.е составить некоторый локальный пример данных, на котором данный пример кода можно запустить.
X++:
container cElementUpdate = [...];
container cOperation = [...];
container cElement = [...];
int j = ...;
;

cElementUpdate = conpoke(
  cElementUpdate,
  conpeek(conpeek(cOperation, j), 1),
  conpeek(cElementUpdate, conpeek(conpeek(cOperation, j), 1))
    + conpeek(cElement, conpeek(conpeek(cOperation, j), 1))
  );

// ожидалось [...]
// получилось [...]
Старый 22.03.2016, 16:22   #3  
kgksoft is offline
kgksoft
Участник
 
37 / 107 (4) +++++
Регистрация: 24.12.2003
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Можете сделать законченный минимальный пример для воспроизведения этой ошибки. Т.е составить некоторый локальный пример данных, на котором данный пример кода можно запустить.
вчера обновился до
Recent kernel build 6.3.3000.2043
Ошибка осталась.

X++:
class test_conpoke
{
}

public static server void main(Args args)
{
    XppILExecutePermission xppILExecutePermission = new XppILExecutePermission();
    xppILExecutePermission.assert();
    runClassMethodIL(classStr(test_conpoke), staticMethodStr(test_conpoke, runIL), conNull());
    CodeAccessPermission::revertAssert();
}

private static server container runIL(container _pack)
{
container cElementUpdate = [0, '', '', 0.0, 0.0, 0.0]; //6 элементов
container cOperation = [[4,NoYes::Yes],[6,NoYes::Yes]];

container cElement = [563797946, 'A322880392', '0989666', 555.0, 0.0, 0.0];
int j = 1;

cElementUpdate = conpoke(
  cElementUpdate,
  conpeek(conpeek(cOperation, j), 1),
  conpeek(cElementUpdate, conpeek(conpeek(cOperation, j), 1))
    + conpeek(cElement, conpeek(conpeek(cOperation, j), 1))
  );

    return connull();
}
Поведение странное:
6, 10 раз запускаешь и получаешь ошибку, а потом вдруг ошибки нет, но
cElementUpdate == [0, '', '', 0.0, 0.0, 0.0, 555.0] //7 элементов

Ожидаю увидеть:
cElementUpdate == [0, '', '', 0.0, 555.0, 0.0] //6 элементов

Ошибка:
System.ArgumentOutOfRangeException: Требуется неотрицательное число.
Имя параметра: length
в System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
в System.Array.Copy(Array sourceArray, Array destinationArray, Int32 length)
в Microsoft.Dynamics.Ax.Xpp.PredefinedFunctions.qins(Object c, Int32 position, Object[] parameters)
в Microsoft.Dynamics.Ax.Xpp.PredefinedFunctions.qpoke(Object c, Int32 position, Object[] parameters)
в Dynamics.Ax.Application.test_conpoke.runIL(Object[] _pack) в test_conpoke.runIL.xpp:строка 10
в test_conpoke::runIL(Object[] )
в Microsoft.Dynamics.Ax.Xpp.ReflectionCallHelper.MakeStaticCall(Type type, String MethodName, Object[] parameters)
в Dynamics.Ax.Application.SysDictClass.invokeStaticMethod(Object[] _params) в SysDictClass.invokeStaticMethod.xpp:строка 26
в SysDictClass::invokeStaticMethod(Object[] )
в Microsoft.Dynamics.Ax.Xpp.ReflectionCallHelper.MakeStaticCall(Type type, String MethodName, Object[] parameters)
в Microsoft.Dynamics.Ax.Xpp.PredefinedFunctions.runAsInvoke(String className, String staticMethodName, Object[] parms, Object[]& exportInfolog)
Старый 22.03.2016, 18:01   #4  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Cудя по ошибке, наблюдаются проблемы с преобразованием AnyType в Int и Real. Во втором случае выходит сложение контейнеров вместо сложения чисел.

Что будет если написать так?
X++:
int jj = conpeek(conpeek(cOperation, j), 1);
real value = conpeek(cElementUpdate, jj)
real valueAdd = conpeek(cElement, jj)

cElementUpdate = conpoke(cElementUpdate, jj, value + valueAdd);
Старый 22.03.2016, 23:43   #5  
kgksoft is offline
kgksoft
Участник
 
37 / 107 (4) +++++
Регистрация: 24.12.2003
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Что будет если написать так?
X++:
int jj = conpeek(conpeek(cOperation, j), 1);
real value = conpeek(cElementUpdate, jj)
real valueAdd = conpeek(cElement, jj)

cElementUpdate = conpoke(cElementUpdate, jj, value + valueAdd);
так ошибок нет. все работает верно
Теги
cil, conpoke

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AXBR: AX2012 – Common Intermediate Language (CIL) – (Parte I) Blog bot DAX Blogs 0 04.04.2013 09:11
X++ to CIL Blog bot DAX Blogs 0 01.04.2013 14:11
X++: X++ Arrays Behave Differently in .NET CIL, in Dynamics AX 2012 Blog bot DAX Blogs 0 17.09.2012 23:11
emeadaxsupport: In Microsoft Dynamics AX 2012, compiler output setting of Message Window may cause errors when generating (incremental) CIL Blog bot DAX Blogs 0 16.03.2012 23:12
X++: X++ Function num2Str: Difference in .NET CIL Mode Blog bot DAX Blogs 0 09.03.2012 07:45

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

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

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