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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.03.2016, 12:58   #1  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Влияние selectLocked(false) на возвращаемый курсор
Добрый день, коллеги!

Столкнулись с непонятным.
Имеем запись в SalesTable и поле в ней (поле добавленное, не из стандарта).
Визуально:
- Смотрим через обозреватель таблицы - видим значение в поле.
- Смотрим через форму - видим значение в поле.
- Смотрим через "Паспорт записи" - видим значение в поле.
В коде:
- Ищем запись через SalesTable::findRecId() - видим значение поля.
- Ищем запись через SalesTable::find() - не видим значение поля.

Раскопки привели к тому, что SalesTable::findRecId() не использует salesTable.selectLocked(). То есть, используется значение по-умолчанию (true). А вот SalesTable::find() использует, причём выставляет этот флаг равным false.
Имитация на уровне запроса SQL напрямую с NOLOCK и без этой инструкции всегда возвращают корректное значение поля (как и ожидается).

Кто-нибудь сталкивался в подобными странностями? И как их обойти?
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 02.03.2016, 13:09   #2  
axm2013
Гость
 
n/a
А традиционные чистки кэшей и перезапуски аосов не помогают?
За это сообщение автора поблагодарили: Sergey Petrov (1).
Старый 02.03.2016, 13:17   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Похоже кеширование влияет. Рассинхронизация кеша и реальных данных.
Когда вы ищете SalesTable::find() то идет запрос по первичному ключу и в ax3.0 должно сработать кеширование.
Во всех остальных случаях оно не работает.

Попробуйте еще у полученного буфера вызвать
info(strFMT(' SalesTable.wasCached() = %1 ', SalesTable.wasCached()));

он вам покажет был ли использован кеш и какой вид кеша использовался.
можно также вырубить кеш SalesTable.disableCache(true)
прямо перед запросом и посмотреть результат.
За это сообщение автора поблагодарили: AlGol (2), Sergey Petrov (1), S.Kuskov (2).
Старый 02.03.2016, 13:41   #4  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Коллеги, спасибо за оперативный совет! find() действительно берёт курсор из кэша, а findRecId() - напрямую.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Теги
cache, cache lookup, nolock, selectlocked

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ax2009 RU4 RHRMOrderTrans_ds.AllowEdit(false) и validationWrite Dimitori DAX: Программирование 2 08.04.2011 11:35
Поставить курсор на контрол на форме Sada DAX: Программирование 9 16.07.2009 15:41
closeDocument(boolean _save = false, int _workBook = 1) Daido DAX: Программирование 1 03.11.2007 09:58
visible(true) и курсор mvf DAX: Программирование 6 20.07.2005 10:09
joined курсор Oz DAX: Программирование 5 25.03.2004 11:01

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

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

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