![]() |
#1 |
Участник
|
axaptapedia: Trap typecast
Источник: http://www.axaptapedia.com/Trap_typecast
============== Summary: caution trap in implicit typecast int64 to boolean == Typecast from int64(RecId) to boolean == (tested in DynamicsAX 2009) the implicit typecast from int/int64 to boolean is often used in ax sources... select * from table where table.field == blabla if (table.recid) public boolean exist( EDT _value) { return (select * from table where table.field == _value).recId; } BUT..... when the RecId (as 64bit integer) last 8 bits are 0 the typecast results in a false even though the RecId is not 0 so, take a look at the bestpractice (design patterns for table exist method) '''when you'll need a boolean, than use a boolean expression !!!''' if (table.RecId != 0) [[category:caution trap]] Источник: http://www.axaptapedia.com/Trap_typecast
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
![]() |
#2 |
----------------
|
|
|
![]() |
#3 |
Ищущий знания...
|
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#4 |
Участник
|
Самое интересное, что if() работает корректно - проблема возникает лишь при присваивании значения int64 булевской переменной:
X++: Int64 i = 0x7fffffffffffffff; str hexI; boolean b; boolean c; Counter n; ; for (n = 0; n < 8; n++) { b = i ? true : false; c = i; hexI = strfmt("0x%1%2", int2hex(i >> 32, 8), int2hex(i & 0xffffffffu, 8)); info(strfmt("if (%1) -> (boolean) %2; %1 -> (boolean) %3", hexI, b, c)); i = (i << 8) ^ 0x8000000000000000u; } Код: if (0x7FFFFFFFFFFFFFFF) -> (boolean) true; 0x7FFFFFFFFFFFFFFF -> (boolean) true if (0x7FFFFFFFFFFFFF00) -> (boolean) true; 0x7FFFFFFFFFFFFF00 -> (boolean) true if (0x7FFFFFFFFFFF0000) -> (boolean) true; 0x7FFFFFFFFFFF0000 -> (boolean) true if (0x7FFFFFFFFF000000) -> (boolean) true; 0x7FFFFFFFFF000000 -> (boolean) true if (0x7FFFFFFF00000000) -> (boolean) true; 0x7FFFFFFF00000000 -> (boolean) false if (0x7FFFFF0000000000) -> (boolean) true; 0x7FFFFF0000000000 -> (boolean) false if (0x7FFF000000000000) -> (boolean) true; 0x7FFF000000000000 -> (boolean) false if (0x7F00000000000000) -> (boolean) true; 0x7F00000000000000 -> (boolean) false Последний раз редактировалось gl00mie; 23.06.2009 в 11:13. |
|
![]() |
#5 |
Участник
|
Эхх...
Старые баги на новый лад ![]() Кстати получается что все Exists методы на таблицах надо править теперь ? Или будет нормально работать ? |
|
![]() |
#6 |
Участник
|
Цитата:
![]()
X++: boolean ret = _salesId && salesTable.RecId; X++: boolean ret = record.RecId ? true : false; X++: boolean func() { // ... return record.RecId } X++: Int64 i; boolean test() { return 0x7fffffff00000000; } ; i = test(); info( strfmt('%1', i) ); X++: if (test()) // ... X++: boolean b = test(); if (b) // ... X++: #define.RecIdPattern ('[.]RecId') #define.RecIdNEZeroPattern ('[.]RecId[ ]*!=[ ]*0') UtilElements utilElements; UtilEntryLevel currentLayer; TreeNodePath treeNodePath; TreeNode treeNode; Source sourceCode; Set setOfMethods; Counter n; ; setOfMethods = new Set( Types::String ); currentLayer = currentAOLayer(); while select utilElements order by parentId, utilLevel where utilElements.recordType == UtilElementType::TableStaticMethod && utilElements.utilLevel <= currentLayer && utilElements.name like '*exist*' && !( utilElements.name like '*txtNotExist*' ) { treeNodePath = xUtilElements::getNodePath( utilElements ); if (!setOfMethods.in( treeNodePath )) { treeNode = TreeNode::findNode( treeNodePath ); sourceCode = SysUtil::unpackSource( treeNode.AOTgetSource() ); if ( match( #RecIdPattern, sourceCode ) && !match( #RecIdNEZeroPattern, sourceCode ) ) { n++; setOfMethods.add( treeNodePath ); info( strfmt( @"%1::%2() (%3)", tableid2name(utilElements.parentId), utilElements.name, utilElements.utilLevel ), '', SysInfoAction_Editor::newOpen( treeNodePath ) ); } } } if (n) { info( strfmt( "@SYS26824", n ) ); } else { warning( "@SYS4205" ); } |
|
|
За это сообщение автора поблагодарили: mazzy (2), Zabr (3), Logger (8), alex55 (2). |
![]() |
#7 |
Участник
|
Спасибо. У нас на Ax 4.0 SP2 + KorusAxaptaRetail = нашлось аж 105 таких табличных методов: половина на SYS и SYP, половина на GLS.
|
|
Теги |
ax2009, ax4.0, int64, recid, баг, приведение типов, ядро |
|
![]() |
||||
Тема | Ответов | |||
axaptapedia: Tutorial Password | 1 | |||
axcoder: PowerShell + Ax | 1 | |||
axaptapedia: Load Web Documents | 1 | |||
axcoder: AxPath is supported by axaptapedia | 0 |
|