26.11.2007, 18:29 | #1 |
Участник
|
Преобразование 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; PS. Что-то похожее касательно enum'ов уже обсуждалось, но явной корреляции с той темой я не увидел. Возможно, конечно, что тема более общая и связана с преобразованием значений различных enum'ов вообще, я не проверял. |
|
|
За это сообщение автора поблагодарили: Russland (1). |
26.11.2007, 19:04 | #2 |
MCTS
|
Цитата:
один неприятный побочный эффект
Цитата:
вместо ожидаемой единички уйдет 255
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
26.11.2007, 19:23 | #3 |
Участник
|
|
|
26.11.2007, 19:42 | #4 |
MCTS
|
Раз так - не стоит полагаться на автоматическое преобразование, а указывать явно NoYes::Yes
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
27.11.2007, 11:10 | #5 |
Участник
|
Цитата:
X++: qbds.addRange(fieldId).value(queryValue(inventTrans.transType == InventTransType::Sales)); |
|
27.11.2007, 11:32 | #6 |
Участник
|
На всякий случай напомню, что MS SQL не имеет логического типа данных. Есть битовый тип, который, по сути, является числовым. Поэтому попытка передать на MS SQL значение true или false вызовет ошибку.
Если Вам надо правдободобное объяснение описанного эффекта, то это и может быть объяснением. Если же Вам надо решение проблемы, то возможно 2 варианта: 1) Никогда не полагаться на автоматическое преобразование типов. Всегда явно указывать нужный тип или также явно конвертировать в нужнуй тип. 2) Строить логические выражение на сравнении со значением false (0 или НЕ 0), поскольку любая опреация с логическими данными именно так и строится: есть или нет значения. А какое именно значение есть, не так уж и важно. |
|