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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.12.2006, 11:19   #1  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Два 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  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Отрицательные RecId: http://axforum.info/forums/showthread.php?t=6211
Старый 14.12.2006, 11:51   #3  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от EVGL Посмотреть сообщение
Отрицательные RecId: http://axforum.info/forums/showthread.php?t=6211
там так много всего хотелось бы особенно понять почему один и тот же вопрос отрабатывает в различных ситуациях по разному ???

в моем примере это job и табличный метод! почему в джобе находится запись а в методе таблицы НЕТ ???
Старый 14.12.2006, 12:03   #4  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
3178071331+1116895965=2^32
Старый 14.12.2006, 12:11   #5  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Зачем задавать философские вопросы? Читайте и решайте проблему.
Старый 14.12.2006, 12:45   #6  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от oip Посмотреть сообщение
3178071331+1116895965=2^32
это уже понял, непонятна двоякая ситуация с различной отработкой одного и того же запроса
Старый 14.12.2006, 13:00   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
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);
Запись находится. Или у вас только в Delete() не отрабатывает?
__________________
Axapta v.3.0 sp5 kr2
Старый 14.12.2006, 13:03   #8  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от 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);
Запись находится. Или у вас только в Delete() не отрабатывает?
в этом то весь и геморой!!! если этот код написать например в отдельном JOb'e , то все находится. А вот в табличном методе delete() на markupTrans'e не хочет искать!!!
пытаюсь как то преобразовать отрицательный рекИд ничего пока не выходит
Старый 14.12.2006, 13:05   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А не могли бы вы привести код в этом методе?
__________________
Axapta v.3.0 sp5 kr2
Старый 14.12.2006, 13:18   #10  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от AndyD Посмотреть сообщение
А не могли бы вы привести код в этом методе?
пожалуйста мне не жалко :

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;
            ....
        }
        ....
}
this.TransRecId - это и есть этот минусовый recid
Старый 14.12.2006, 13:19   #11  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
вот блин опять код не вставился нормально теги же вроде юзал... ладно это не важно...
Старый 14.12.2006, 13:43   #12  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
сделал преобразование минусового recid (2^32-abs(recId)) получили положительный recId. который если подставить в фильтр в обозревателе таблицы позиционируется на записи с минусовым recid!

Однако в запросах не отрабатывает такое преобразование нигде!!! ни в Job'e, ни в табл. методе. Минусовый хоть в Job'e работает...

Вообщем дилемма, как разрешать - загадка.
Старый 14.12.2006, 13:51   #13  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Нет никакой дилеммы. Запускайте дефрагментрование RecId.
Старый 14.12.2006, 13:57   #14  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от EVGL Посмотреть сообщение
Нет никакой дилеммы. Запускайте дефрагментрование RecId.
для этого дефрагментирования я так понял нужен какой-то мега-скрипт, который предлагали за отдельную плату... Хотелось бы как то все без доп финансовых вливаний разрешить...
Старый 14.12.2006, 14:01   #15  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Вот уже жертвы рекламы пошли. Используйте штатную процедуру проверки RecId. Сидит совершенно бесплатно в форме SQL Administration и исправно работает.
Старый 14.12.2006, 14:26   #16  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от EVGL Посмотреть сообщение
Вот уже жертвы рекламы пошли. Используйте штатную процедуру проверки RecId. Сидит совершенно бесплатно в форме SQL Administration и исправно работает.
у меня таблица MarkupTrans, где TransRecId имеет EDT RecId, а не RefRecId.

Запуск данной процедуры не убьет ли мне ВСЕ ссылки в принципе?
Старый 14.12.2006, 14:36   #17  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
об этом же кстати писал и Mazzy создавая тему, ссылку на которую Вы приводили в своем первом посте в данной теме!

Поможет ли стандартная дефрагментация? вот в чем вопрос... и не поубиваются ли у нас ссылки если EDT-recId (как минимум markuptrans, сопоставления...)
Старый 14.12.2006, 14:51   #18  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от sparur Посмотреть сообщение
сделал преобразование минусового recid (2^32-abs(recId)) получили положительный recId. который если подставить в фильтр в обозревателе таблицы позиционируется на записи с минусовым recid!

Однако в запросах не отрабатывает такое преобразование нигде!!! ни в Job'e, ни в табл. методе. Минусовый хоть в Job'e работает...

Вообщем дилемма, как разрешать - загадка.
Не совсем понимаю смысл этих преобразований. В любом случае в вашей переменной что знаковое, что беззнаковое значение хранятся как один и то-же набор битов (т.е. 0xBD6D8523). Различие лишь в его интрепретации (кстати, можете попробовать подставить шестнадцитиричное значение в вызове). Axapta оперирует лишь знаковыми целыми, по-этому вы всегда получите отрицательное значение для него.
Еще, 2^32 это уже 64-битное число (3.0 с ними не работает) - выше преобразование некорректно.

По существу - попробовал добавить этот метод - запись нормально находится
__________________
Axapta v.3.0 sp5 kr2
Старый 14.12.2006, 15:06   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от EVGL Посмотреть сообщение
Вот уже жертвы рекламы пошли. Используйте штатную процедуру проверки RecId. Сидит совершенно бесплатно в форме SQL Administration и исправно работает.
Вот они - спокойные пользователи международного функционала.
Где тип полей со ссылками на recId унаследованы от типа refRecId...
__________________
полезное на axForum, github, vk, coub.
Старый 14.12.2006, 15:08   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от sparur Посмотреть сообщение
Запуск данной процедуры не убьет ли мне ВСЕ ссылки в принципе?
ВСЕ - не убьет.
Убьет только те ссылки, которые находятся в полях с типом, не унаследованнsм от recRefId.
__________________
полезное на axForum, github, vk, coub.
Теги
recid

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как проверить наличие хотя бы одной записи в подчиненной таблице. demon46 DAX: Программирование 5 07.03.2008 09:41
Как узнать по объекту RecordSortedList, из какой таблицы в нем записи? gl00mie DAX: Программирование 4 20.02.2008 15:39
Как получить записи двух таблиц в виде одной таблицы? chi DAX: Программирование 32 16.12.2004 11:44
Как решить проблему с правами на вновь создаваемые записи таблицы. AY DAX: Прочие вопросы 4 02.10.2003 12:44
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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