|
14.12.2006, 11:19 | #1 |
Участник
|
Два RecId у одной записи таблицы
Здравствуй Коллективный Разум.
И снова требуется твоя помощь. Столкнулся с совершенно аномальной для меня ситуацией при работе со строками закупок (purchLine). Ничего не остается как спросить объяснения у всезнающих гуру. Вообщем , ситуация следующая: есть строка в закупке, пытаюсь найти на нее ссылку в табличном методе delete таблицы MarkupTrans по ее recId хранящейся в поле transRecId. Никак не получается этот фокус у меня. В ходе танцев с бубном выяснилось следующее: имеем запрос вида: select firstonly purchLine where purchLine.RecId == -1116895965; где цифры это собственно сам recId строки закупки и есть либо можно использовать стандартный метод на таблицы purchLine под названием findRecId, куда передать эту же циффру. пытаемся использовать этот запрос в 2-х случаях: 1) в табличном методе markupTrans'a результат - ничего не найдено 2) в отдельном Job'e результат ЕСТЬ!!! однако несколько странный, а именно: смотрим в отладчике и имеем после выполнения select'a запись в purchLine находится, НО в окне просмотра переменных recId отображается СОВСЕМ другой в угловых скобках, точнее так: purchLine: <3178071331> далее если раскрыть переменную то увидим список всех полей, идем на recID b видим цифру, переданную в качестве параметра в запрос, т.е. -1116895965. Как такое возможно? плюс ко всему если в обозревателе таблицы поискать запись по recId, то по обоим этим цифрам (3178071331 и -1116895965) мы попадаем на одну запись. Кто может объяснить сие явление буду очень благодарен! Интерес вызывает как сама ситуация с 2-мя recId, так и вопрос почему запрос отрабатывает по-разному в разных ситуациях (см. выше) Получилось длинно, зато надеюся информативно |
|
14.12.2006, 11:31 | #2 |
Banned
|
Отрицательные RecId: http://axforum.info/forums/showthread.php?t=6211
|
|
14.12.2006, 11:51 | #3 |
Участник
|
Цитата:
Сообщение от EVGL
Отрицательные RecId: http://axforum.info/forums/showthread.php?t=6211
в моем примере это job и табличный метод! почему в джобе находится запись а в методе таблицы НЕТ ??? |
|
14.12.2006, 12:03 | #4 |
Axapta
|
3178071331+1116895965=2^32
|
|
14.12.2006, 12:45 | #5 |
Участник
|
|
|
14.12.2006, 12:11 | #6 |
Banned
|
Зачем задавать философские вопросы? Читайте и решайте проблему.
|
|
14.12.2006, 13:00 | #7 |
Участник
|
2 oip
Я бы сказал так 1116895965 == ~((unsigned int)3178071331) + 1; 3178071331 + ~((unsigned int)3178071331) = 2^32-1; а в общем (int)-1116895965 == (unsigned int)3178071331 2 sparur У меня такой код отрабатывает нормально X++: PurchLine purchLine; ; purchLine = purchLine::findRecId(-1116895965);
__________________
Axapta v.3.0 sp5 kr2 |
|
14.12.2006, 13:03 | #8 |
Участник
|
Цитата:
Сообщение от AndyD
2 oip
Я бы сказал так 1116895965 == ~((unsigned int)3178071331) + 1; 3178071331 + ~((unsigned int)3178071331) = 2^32-1; а в общем (int)-1116895965 == (unsigned int)3178071331 2 sparur У меня такой код отрабатывает нормально X++: PurchLine purchLine; ; purchLine = purchLine::findRecId(-1116895965); пытаюсь как то преобразовать отрицательный рекИд ничего пока не выходит |
|
14.12.2006, 13:05 | #9 |
Участник
|
А не могли бы вы привести код в этом методе?
__________________
Axapta v.3.0 sp5 kr2 |
|
14.12.2006, 13:18 | #10 |
Участник
|
пожалуйста мне не жалко :
X++: public void delete() { TGP_SyncUz2Buh sync; MarkupTrans markupTrans; Common refTable; PurchLine purchLine; super(); //ищем запись таблицы, для которой создается строка накл. расходов switch (this.TransTableId) { ...... case tablenum(PurchLine): refTable = PurchLine::findRecId(this.TransRecId); break; .... } .... } |
|
14.12.2006, 13:19 | #11 |
Участник
|
вот блин опять код не вставился нормально теги же вроде юзал... ладно это не важно...
|
|
14.12.2006, 13:43 | #12 |
Участник
|
сделал преобразование минусового recid (2^32-abs(recId)) получили положительный recId. который если подставить в фильтр в обозревателе таблицы позиционируется на записи с минусовым recid!
Однако в запросах не отрабатывает такое преобразование нигде!!! ни в Job'e, ни в табл. методе. Минусовый хоть в Job'e работает... Вообщем дилемма, как разрешать - загадка. |
|
14.12.2006, 13:51 | #13 |
Banned
|
Нет никакой дилеммы. Запускайте дефрагментрование RecId.
|
|
14.12.2006, 13:57 | #14 |
Участник
|
|
|
14.12.2006, 14:01 | #15 |
Banned
|
Вот уже жертвы рекламы пошли. Используйте штатную процедуру проверки RecId. Сидит совершенно бесплатно в форме SQL Administration и исправно работает.
|
|
14.12.2006, 14:26 | #16 |
Участник
|
Цитата:
Запуск данной процедуры не убьет ли мне ВСЕ ссылки в принципе? |
|
14.12.2006, 15:08 | #17 |
Участник
|
ВСЕ - не убьет.
Убьет только те ссылки, которые находятся в полях с типом, не унаследованнsм от recRefId. |
|
14.12.2006, 15:38 | #18 |
Участник
|
|
|
15.12.2006, 06:26 | #19 |
Участник
|
Возвращаясь к теме об отрицательных RecId, дефрагментации этого самого RecId, его разрядности и пр....
Меня вот интересует такой вопрос: допустим гипотетическую ситуацию, когда у нас имеется идеальное состояние, т.е. нет никакой дефрагментации, все ок, дырок нет в принципе (хоть это и невозможно) что будет когда значение recId превысит волшщебную цифру в 2^32 (~4млрд). Что в этом случае делать?? ведь данная цифра хоть и велика, но все же recId распределяется по ВСЕМ таблицам в пределах отдельной компании. А это значит если контора крупная с большим ежедневным оборотом, то год-два и как не крути, а проблема встанет!!! Какой выход из ситуации? |
|
14.12.2006, 15:06 | #20 |
Участник
|
Цитата:
Где тип полей со ссылками на recId унаследованы от типа refRecId... |
|
Теги |
recid |
|
|