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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.11.2007, 18:29   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
! Преобразование boolean <-> NoYes в запросах
Наткнулся сегодня на один неприятный побочный эффект преобразования типов в запросах. В таблицах для полей-"флажков" обычно используют enum NoYes, при том что в коде как-то привычнее оперировать с типом boolean (хотя, вообще говоря, никто не мешает использовать enum boolean и для полей таблиц ). Так вот, если в запросе для поля с типом enum NoYes в качестве QueryBuildRange.value() указать значение true (с использованием queryValue(), конечно), то на СУБД вместо ожидаемой единички уйдет 255! Причем в зависимости от версии ядра выяснить это удастся на различных этапах. Так, в SP3 QueryBuildRange.toString() будет показывать значение range "true", и выловить этот косяк удастя лишь трассировкой SQL-операторов; а вот на KR3 увидеть это можно будет уже в самой Аксапте, которая в QueryBuildRange.toString() будет честно писать значение range "255". Такая же картина наблюдается и при указании значения NoYes::Yes при выборке по полю с типом enum boolean.
При этом если запрос по таблице table c полем flagField типа enum NoYes делать непосредственно из кода
X++:
select table where table.flagField == true;
то на СУБД в запросе уходит единичка, как и ожидается Проверялось на AX 3.0 SP3, AX 3.0 KR3.
PS. Что-то похожее касательно enum'ов уже обсуждалось, но явной корреляции с той темой я не увидел. Возможно, конечно, что тема более общая и связана с преобразованием значений различных enum'ов вообще, я не проверял.
За это сообщение автора поблагодарили: Russland (1).
Старый 26.11.2007, 19:04   #2  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
один неприятный побочный эффект
Цитата:
вместо ожидаемой единички уйдет 255
А в чём неприятность-то? Уходит ведь не 0. Всё что не ноль ведь это true.
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 26.11.2007, 19:23   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Russland Посмотреть сообщение
А в чём неприятность-то? Уходит ведь не 0. Всё что не ноль ведь это true.
В базе данных это не так.

В запросе который уходит на БД, необходимо точное соответствие. В базе данных это числовой тип, так что значения 255 и 1 отличаются
Старый 26.11.2007, 19:42   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Раз так - не стоит полагаться на автоматическое преобразование, а указывать явно NoYes::Yes
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 27.11.2007, 11:10   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Russland Посмотреть сообщение
не стоит полагаться на автоматическое преобразование, а указывать явно NoYes::Yes
Это все идеологически верно, но обратите внимание, что в обычных select'ах в коде X++ все работает так, как надо, там и boolean::true, и NoYes::Yes равны единице. И единица же (а не, скажем, "true") подставляется в QueryBuildRange.value(), если в нем указать логическое выражение, к примеру, так:
X++:
qbds.addRange(fieldId).value(queryValue(inventTrans.transType == InventTransType::Sales));
Старый 27.11.2007, 11:32   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
На всякий случай напомню, что MS SQL не имеет логического типа данных. Есть битовый тип, который, по сути, является числовым. Поэтому попытка передать на MS SQL значение true или false вызовет ошибку.

Если Вам надо правдободобное объяснение описанного эффекта, то это и может быть объяснением.

Если же Вам надо решение проблемы, то возможно 2 варианта:

1) Никогда не полагаться на автоматическое преобразование типов. Всегда явно указывать нужный тип или также явно конвертировать в нужнуй тип.

2) Строить логические выражение на сравнении со значением false (0 или НЕ 0), поскольку любая опреация с логическими данными именно так и строится: есть или нет значения. А какое именно значение есть, не так уж и важно.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Объясните что это <datasource name>_DS Андрей К. DAX: Программирование 8 09.04.2007 18:14
Ошибка "Значение <3> не найдено в MAP". Lysov DAX: Программирование 3 20.02.2007 18:24
Что такое "<имя-формы>_ds"? Valia DAX: База знаний и проекты 6 11.11.2003 14:26
Параметр коммандной строки -job=<s> vovayak DAX: Администрирование 11 17.10.2003 15:59
что-такое "<имя-формы>_ds"? Valia DAX: Программирование 3 21.08.2003 10:48

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

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

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