22.03.2016, 02:37 | #1 |
Участник
|
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)) ); X++: container conPoke2(container _con, int _pos, anytype _value) { return conPoke(_con, _pos, _value); } |
|
22.03.2016, 07:27 | #2 |
Участник
|
Можете сделать законченный минимальный пример для воспроизведения этой ошибки. Т.е составить некоторый локальный пример данных, на котором данный пример кода можно запустить.
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 |
Участник
|
Цитата:
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 |
Участник
|
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 |
Участник
|
|
|
Теги |
cil, conpoke |
|
|