|
![]() |
#1 |
Участник
|
Продолжил эксперименты с джобом JobTestCommonReread. Метод reread() в комбинации с методом clear() ведёт себя не столь очевидно.
X++: static void JobTestCommonReread(Args _args) { InventTable InventTable, InventTable2; RecId RecId; ; select firstonly InventTable; RecId = InventTable.RecId; InventTable2.RecId = RecId; InventTable2.reread(); info(InventTable2.ItemId); InventTable2.clear(); // ??? InventTable2.RecId = RecId; InventTable2.reread(); info(InventTable2.ItemId); // ??? } |
|
![]() |
#2 |
Ищущий знания...
|
Цитата:
reread() - это не аналог find(), а метод для перезагрузки курсора из базы.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#3 |
Участник
|
Но можно попытаться явно присвоить RecId. В моём первом примере курсор InventTable2 не был проинициалицирован, но reread() сработал, если же курсор стереть явно, при помощи clear, то reread перестаёт работать (второй пример). В чём принципиальная разница между непроинициализированным курсором и курсором после clear()?
|
|
![]() |
#4 |
Участник
|
Поэкспериментировав, пришел к выводу, что нужно обнулить ссылку на область памяти, на которую ссылается табличная переменная. В итоге гарантированно "перевыбрать" запись при помощи reread можно так:
X++: static void JobTestCommonReread(Args _args) { InventTable InventTable, InventTable2; RecId RecId; ; select firstonly InventTable; RecId = InventTable.RecId; InventTable2.RecId = RecId; InventTable2.reread(); info(InventTable2.ItemId); InventTable2.clear(); inventTable2 = null; InventTable2.RecId = RecId; InventTable2.reread(); info(InventTable2.ItemId); }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 15.12.2010 в 12:51. |
|
|
За это сообщение автора поблагодарили: lev (1), S.Kuskov (1). |
![]() |
#5 |
Ищущий знания...
|
Цитата:
![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#6 |
Ищущий знания...
|
Цитата:
Сообщение от S.Kuskov
![]() Но можно попытаться явно присвоить RecId. В моём первом примере курсор InventTable2 не был проинициалицирован, но reread() сработал, если же курсор стереть явно, при помощи clear, то reread перестаёт работать (второй пример). В чём принципиальная разница между непроинициализированным курсором и курсором после clear()?
про clear() я думаю все понятно, и он делает то что я написал выше. скорее встает вопрос, а как же работает метод reread() ??? получается ему для выбора кроме RecId нужно ещё что то, что вычищается после использования метода clear().
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
![]() |
#7 |
Участник
|
тоже так думаю
__________________
С уважением, Александр. |
|
![]() |
#8 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: lev (2), samolalex (1). |
![]() |
#9 |
Ищущий знания...
|
Цитата:
![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#10 |
Administrator
|
Цитата:
Попробуйте выполнить такой код. В нем reread честно отработает (вспоминаем, что в БД индекс состоит из двух полей - RecID и dataareaid, т.о. выбрать запись просто по RecId система не может - ей нужен еще dataareaid): X++: static void Job1(Args _args) { InventTable inventTable; ; inventTable.clear(); breakpoint; inventTable = null; inventTable.(fieldnum(InventTable, dataAreaId)) = 'dat'; inventTable.RecId = 5637147343; inventTable.reread(); breakpoint; }
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#11 |
Ищущий знания...
|
Цитата:
Сообщение от sukhanchik
![]() Достаточно посмотреть в отладчик, чтобы понять, что clear() устанавливает все поля в их "нулевое" или "начальное" состояние. В частности, попутно устанавливаются и системные поля (например, код компании).
Попробуйте выполнить такой код. В нем reread честно отработает (вспоминаем, что в БД индекс состоит из двух полей - RecID и dataareaid, т.о. выбрать запись просто по RecId система не может - ей нужен еще dataareaid): X++: static void Job1(Args _args) { InventTable inventTable; ; inventTable.clear(); breakpoint; inventTable = null; inventTable.(fieldnum(InventTable, dataAreaId)) = 'dat'; inventTable.RecId = 5637147343; inventTable.reread(); breakpoint; } если посмотреть в отладчике, после выполнения метода clear() поле DataAreaId остается со значением компании (то значение, которое было в выбранном курсоре). Затем ещё присваивается значение полю RecId. Получается перед выполнением метода reread() у нас и так заполнены два нужных поля. кстати, тут уже писалось, что если обнулить память для таблицы (выполнить присвоение переменной NULL), то reread() нормально работает. а в Вашем примере в начале вызывается clear(), а потом обнуляется переменная, поэтому все нормально отрабатывает ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|