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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.06.2011, 12:17   #1  
kia is offline
kia
Участник
 
96 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
От перестановки условий меняется результат
На АХ4 и АХ2009 замечен интересный глюк. Результат запроса в цикле зависит от положения полей в условии.
PHP код:
static void Job47(Args _args)
{
    
EmplTable   emplTable;
    
int         n 0;
    ;
    while 
select emplTable
        where emplTable
.EmplId == emplTable.PayMainEmplId_Ru
    
{
        
n++;
    }
    
info(int2str(n));
    
0;
    while 
select emplTable
        where emplTable
.PayMainEmplId_Ru == emplTable.EmplId
    
{
        
n++;
    }
    
info(int2str(n));

Результат:
1
11365
За это сообщение автора поблагодарили: mazzy (2), Maximin (2), lev (1).
Старый 21.06.2011, 12:23   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
прикольно. подтверждаю.
__________________
полезное на axForum, github, vk, coub.
Старый 21.06.2011, 12:27   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kia Посмотреть сообщение
На АХ4 и АХ2009 замечен интересный глюк. Результат запроса в цикле зависит от положения полей в условии.
Это побочный эффект от кэширования.

У таблицы EmplTable стандартная установка CahceLookup = Found
Первый select совпадает с PrimaryIndex, а второй нет.
Поэтому кэширование на первый влияет, а на второй - нет.

Поставьте CahceLookup = NotInTTS (примечание - это очень плохо подействует на расчет зарплаты в модуле RPay)
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 21.06.2011 в 12:30. Причина: добавил примечание про RPay
Старый 21.06.2011, 12:28   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
на Ах3.0 SP3 то же самое
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 21.06.2011, 12:31   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
Это побочный эффект от кэширования.

У таблицы EmplTable стандартная установка CahceLookup = Found
Первый select совпадает с PrimaryIndex, а второй нет.
Поэтому кэширование на первый влияет, а на второй - нет.

Поставьте CahceLookup = NotInTTS (примечание - это очень плохо подействует на расчет зарплаты в модуле RPay)
у нас CahceLookup = None - тот же эффект

попробовал установить CahceLookup = NotInTTS - тот же эффект
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 21.06.2011, 12:33   #6  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Поставьте между SELECT'ами:

X++:
...
emplTable = null;
...
или

X++:
...
emplTable.EmplId = '';
...
и повторите тест.
Старый 21.06.2011, 12:45   #7  
kia is offline
kia
Участник
 
96 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Поставьте между SELECT'ами:
и повторите тест.
И что?
Не правильно отрабатывает первый запрос.
Поменял запросы местами, вставил как вы написали.
Все равно запрос с "emplTable.EmplId == emplTable.PayMainEmplId_Ru" отрабытывает не правильно.
Старый 21.06.2011, 12:48   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от lev Посмотреть сообщение
у нас CahceLookup = None - тот же эффект

попробовал установить CahceLookup = NotInTTS - тот же эффект
а на ax2009 запросы стали выдавать одинаковые значения...
странно.
__________________
полезное на axForum, github, vk, coub.
Старый 21.06.2011, 12:48   #9  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Поставьте между SELECT'ами:

X++:
...
emplTable = null;
...
или

X++:
...
emplTable.EmplId = '';
...
и повторите тест.
то же самое

написал джоб через query нормально отрабатывает при любом положении условий:
X++:
static void Job47(Args _args) 
{ 
    Query                   query = new Query();
    QueryBuildDataSource    qbds  = query.addDataSource(tableNum(EmplTable));
    QueryRun                queryRun;
    ;

    qbds.addRange(fieldNum(EmplTable, RecId)).value(strFmt('(%1 == %2)', fieldStr(EmplTable, EmplId), fieldStr(EmplTable, PayMainEmplId_Ru)));
    info(qbds.toString());

    queryRun    = new QueryRun(query);

    info(strFmt('%1', SysQuery::countLoop(query.pack())));
    
    qbds.clearRange(fieldNum(EmplTable, RecId));
    qbds.addRange(fieldNum(EmplTable, RecId)).value(strFmt('(%1 == %2)', fieldStr(EmplTable, PayMainEmplId_Ru), fieldStr(EmplTable, EmplId)));
    info(qbds.toString());

    queryRun    = new QueryRun(query);

    info(strFmt('%1', SysQuery::countLoop(query.pack()))); 
}
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 21.06.2011, 12:50   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
а на ax2009 запросы стали выдавать одинаковые значения...
странно.
ага. Сейчас нет под рукой 2009 ахи чтоб попробовать.

но в Ax3.0 перепробовал все значения свойства CahceLookup результат всегда один
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 21.06.2011, 12:51   #11  
kia is offline
kia
Участник
 
96 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
Нормально отработает при добавлении любого дополнительного условия
например "&& emplTable.EmplId"
Но именно в таком виде - не правильно
Старый 21.06.2011, 13:22   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
mazzy прав - дело в кэше.
Попробуйте вызвать emplTable.disableCache(true); перед проблемным запросом
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: lev (2).
Старый 21.06.2011, 13:37   #13  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
mazzy прав - дело в кэше.
Попробуйте вызвать emplTable.disableCache(true); перед проблемным запросом
в Ах 3.0 это помогло!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Меняется шрифт при печати отчетов на принтере gec DAX: Программирование 4 19.04.2010 17:47
непонятный результат str2date ice DAX: Программирование 19 09.02.2008 12:36
Результат обработки закупки на возврат kvg6 DAX: Программирование 6 30.05.2006 16:17
Результат зароса в грид Manner DAX: Программирование 2 20.09.2005 16:20
Передача условий в отчет ArturK DAX: Программирование 4 18.08.2003 22:56

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

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

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