|
![]() |
#1 |
Moderator
|
![]() Цитата:
Сообщение от someOne
![]() В третьей версии аксапты у нас неоднократно, самопроизвольно RecId перескакивали на несколько млн или уходили в "минус". Закономерности определить не удалось. При этом никаких "внешних" обращений к БД, минуя ядро Аксапты, не производилось.
"Возвращать" recId на "место" можно и нужно. Так как с отрицательными recId будет масса глюков в российском функционале (ЗП кадры и так далее - неоднократно обсуждалось на форуме) Либо исправлять все эти модули, (и не только Российские кстати, но там ошибок больше всего) Дефрагментацию делать не стоит, пока есть большие свободные диапазоны RecId Нужно лишь найти диапазоны не используемых recId. Собрать свободные диапазоны RecId можно джобом, который может собрать статистику используемых recId по наиболее активным и крупным таблицам. Могу привести пример если нужно будет... Решили пока понаблюдать. В случае критичных глюков переключим RecId на продолжение положительного диапазона. Поиск свободных диапазонов пока не нужен - есть примерное последнее RecId 1367133505 на котором остановилось, думаю к нему можно прибавить немного и продолжить. Но буду иметь в виду, Спасибо! ![]() |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от DreamCreator
![]() Большое Спасибо!
Решили пока понаблюдать. В случае критичных глюков переключим RecId на продолжение положительного диапазона. Поиск свободных диапазонов пока не нужен - есть примерное последнее RecId 1367133505 на котором остановилось, думаю к нему можно прибавить немного и продолжить. Но буду иметь в виду, Спасибо! ![]() |
|
|
За это сообщение автора поблагодарили: DreamCreator (2). |
![]() |
#3 |
Moderator
|
![]() Цитата:
![]() X++: //index hint RecIdTypeIdx |
|
![]() |
#4 |
Участник
|
Цитата:
X++: ... while (mEnum.moveNext()) { receipt = mEnum.currentValue(); inventTransKey = inventCostItemDim::keyAdjust2String(receipt.inventTransId,receipt.inventTransIdReturn,receipt.voucher); financialOpenQty = mapInventTransIdQty.lookup(inventTransKey); // dyol 17.08.2009 OK000754 --> //sortReceiptKey = InventCostItemDim::qtyRecId2String(mapInventTransIdQty.lookup(inventTransKey) / mapInventTransIdTotal.lookup(inventTransKey)*exp10(9), receipt.recId); sortReceiptKey = InventCostItemDim::qtyRecId2String_OK(mapInventTransIdQty.lookup(inventTransKey) / mapInventTransIdTotal.lookup(inventTransKey)*exp10(9), receipt.recId, receipt.DateFinancial); // dyol 17.08.2009 OK000754 <-- mapSortedReceipt.insert(sortReceiptKey,receipt); mapInventTransIdQty.insert(inventTransKey, financialOpenQty+receipt.financialOpenQty()); } ... X++: // dyol 17.08.2009 OK000754 --> static str qtyRecId2String_OK(Real _qty, Recid _recId, TransDate _transDate) { str qtyStr; str recIdStr; str key; qtyStr = int2str(trunc(_qty)); recIdStr = int2str(abs(_recId)); if (_recId < 0) key = strrep('0',20-strlen(qtyStr))+qtyStr + date2str(_transDate, 321, 2, 0, 2, 0, 4) + '#-' + strrep('0',15-strlen(recIdStr))+recIdStr; else key = strrep('0',20-strlen(qtyStr))+qtyStr + date2str(_transDate, 321, 2, 0, 2, 0, 4) + '#0' + strrep('0',15-strlen(recIdStr))+recIdStr; return key; } // dyol 17.08.2009 OK000754 <-- Последний раз редактировалось Bega; 28.11.2011 в 11:33. |
|
|
За это сообщение автора поблагодарили: DreamCreator (2). |
![]() |
#5 |
Moderator
|
|
|
![]() |
#6 |
Участник
|
Цитата:
Как вам примеры такого кода, например в таблице RPayCounterTable X++: static boolean checkScan(RPaySequence paySequence) { RPayCounterTable payCounterTable; ; if (paySequence) select firstonly firstfast payCounterTable index hint ScanningIdx where payCounterTable.scanning == paySequence; return payCounterTable.recId; } Для корректной работы придется все такие методы переписать на X++: return payCounterTable.recId != 0; |
|
![]() |
#7 |
Moderator
|
Цитата:
Сообщение от someOne
![]() Это не единственная проблема с отрицательными RecId...
Как вам примеры такого кода, например в таблице RPayCounterTable В этом месте (return payCounterTable.recId) при отрицательных RecId для некоторых вариантов значений (кратных 16 кажется) результат будет не верный! Для корректной работы придется все такие методы переписать на X++: return payCounterTable.recId != 0; |
|
![]() |
#8 |
Ищущий знания...
|
Цитата:
Сообщение от someOne
![]() ...
В этом месте (return payCounterTable.recId) при отрицательных RecId для некоторых вариантов значений (кратных 16 кажется) результат будет не верный! Для корректной работы придется все такие методы переписать на X++: return payCounterTable.recId != 0; X++: if (myTable.recId) X++: return myTable.recId; P.S. конечно после перевода RecId на 64 бита отрицательный RecId маловероятен, но все таки лучше делать явное преобразование соответствующего типа!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#9 |
Moderator
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: lev (2). |
![]() |
#10 |
Ищущий знания...
|
Цитата:
Сообщение от fed
![]() После перевода RecId на 64 бита, отрицательный RecId чуть менее вероятен чем в 32-битном варианте. Обсуждалось вот здесь
Тогда надо запрещать конструкции кода приведенные мной и someOne в прошлых сообщениях на уровне компниляции! ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|