25.08.2010, 14:26 | #1 |
Участник
|
Выборка не пустых строковых значений в AX 3.0
Вероятно баян, но в поиске не нашел.
Столкнулся со странным поведением, когда при выборке из таблицы по условию table.field (но не по условию table.field != "") не выбираются значения, начинающиеся со знака "минус" (-). Тут проще показать, чем рассказать )): X++: TestTable testTable; RecordInsertList ril; ; ttsbegin; delete_from testTable; ril = new RecordInsertList(tableNum(TestTable)); testTable.stringField = "1"; ril.add(testTable); testTable.stringField = "-1"; ril.add(testTable); testTable.stringField = "(3%*3%)"; ril.add(testTable); testTable.stringField = "-(3%*3%)"; ril.add(testTable); testTable.stringField = "bla-bla"; ril.add(testTable); testTable.stringField = "-bla-bla"; ril.add(testTable); ril.insertDatabase(); ttscommit; setPrefix("Result"); while select testTable where testTable.stringField { info("First\t" + testTable.stringField); } while select testTable where testTable.stringField != "" { info("Second\t" + testTable.stringField); } Код: Result First 1 (3%*3%) bla-bla Second 1 -1 (3%*3%) -(3%*3%) bla-bla -bla-bla В AX2009 такое не повторяется. |
|
25.08.2010, 14:33 | #2 |
Модератор
|
А QueryRun как себя ведет? Через него не пробовали?
А вообще, было что-то такое, но с RecId. Поэтому в ВР как раз и рекомендоалось ставить условие. Хотя странно, конечно. С Уважением, Георгий |
|
25.08.2010, 14:48 | #3 |
Участник
|
Цитата:
X++: Query query = new Query(); QueryRun queryRun; QueryBuildDataSource qbds; TestTable testTable; ; qbds = query.addDataSource(tableNum(TestTable)); qbds.addRange(fieldNum(TestTable,StringField)).value(SysQuery::valueNotEmptyString()); queryRun = new QueryRun(query); while (queryRun.next()) { testTable = queryRun.get(tableNum(TestTable)); info(testTable.stringField); } |
|
25.08.2010, 14:50 | #4 |
Участник
|
А с литералами как себя ведет ?
|
|
25.08.2010, 14:53 | #5 |
Участник
|
Есть ощущение что там проблема со сравнением символов в БД.
Условие X++: where testTable.stringField != "" а условие X++: where testTable.stringField Где параметр - некая константа, которую аксапта подставит. Для Оракла это chr(2), для SQL не проверял. Есть ощущение что сравнение как-то влияет. |
|
|
За это сообщение автора поблагодарили: lev (2). |
25.08.2010, 15:03 | #6 |
Участник
|
|
|
25.08.2010, 15:15 | #7 |
Ищущий знания...
|
Logger правильно говорит про разницу формируемого запроса к базе.
создайте два запроса с литералами, с != и просто с полем. отловите эти запросы в Журнале трассировки операторов SQL, и посмотрите в каком виде они едут в базу. Думаю сравнив два запроса, вы поймете причину такого поведения системы.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
25.08.2010, 15:22 | #8 |
Участник
|
Подозреваю, что, возможно, с какого-то KR этот баг исправлен - так что же, по другому запрос к базе данных отправляется?
|
|
25.08.2010, 15:42 | #9 |
Ищущий знания...
|
попробовал у себя (Ах 3.0 SP3, Oracle)
X++ код: X++: select forceliterals ItemId from inventTable where inventTable.ItemId; Цитата:
SELECT A.ITEMID,A.RECID FROM INVENTTABLE A WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER('Х')) AND (SUBSTR(NLS_LOWER(ITEMID),1,20)>''))
X++: select forceliterals ItemId from inventTable where inventTable.ItemId != ""; Цитата:
SELECT A.ITEMID,A.RECID FROM INVENTTABLE A WHERE ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER('Х')) AND (SUBSTR(NLS_LOWER(ITEMID),1,20)<>''))
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 25.08.2010 в 15:45. |
|
25.08.2010, 18:15 | #10 |
Участник
|
|
|
Теги |
sql server, сортировка, сравнение |
|
|