20.04.2010, 09:29 | #1 |
Участник
|
Проблема.База данных SQL обнаружила ошибку.
Здравствуйте, пересмотрел много тем но так ничего подходящего не нашел.Подскажите в чем может быть проблема.Запрос не выполняется:
X++: select firstonly inventDim where inventDim.InventLocationId == 'Склад 1' join InventSum where InventSum.InventDimId == inventDim.inventDimId && InventSum.itemId == 'Item 1' && (InventSum.PostedQty + InventSum.Received - InventSum.Deducted + InventSum.Registered - InventSum.Picked) >= 20; Хотя на 2 других приложениях срабатывает нормально.
__________________
Лучше сделать и жалеть, чем жалеть что не сделал |
|
20.04.2010, 09:51 | #2 |
Участник
|
Было нечто подобное.
Как выяснилось кусок кода X++: && InventTrans.costamountPosted > 0 - InventTrans.costamountadjustment На оракл он уходил так : X++: AND (COSTAMOUNTPOSTED>(:IN5-COSTAMOUNTADJUSTMENT)))) X++: AND (COSTAMOUNTPOSTED>(7.<00373231303336E50-COSTAMOUNTADJUSTMENT))) X++: AND (COSTAMOUNTPOSTED>(7.;00323438363336E50-COSTAMOUNTADJUSTMENT))) Самое неприятное, что такое происходило не всегда, а например на 3-м или 5-м вызове запроса. (и это было уже совсем подстава) т.е. нередко уходил вполне нормальный запрос с нулем, а не странной константой "7.<00373231303336E50" Точного рецепта как это побороть не дам - начисто в голове забылось По-моему я шаманил с типом константы в коде, т.е. вместо 0 писал 0.0 а также могло влиять то с какого месте от знака неравенства стоит операнд. |
|
20.04.2010, 09:52 | #3 |
Участник
|
У меня работает
BD ORACLE, AX 4
__________________
В подводной охоте главное вдох ... |
|
20.04.2010, 09:54 | #4 |
Участник
|
А какая база у Вас?
__________________
В подводной охоте главное вдох ... |
|
20.04.2010, 10:09 | #5 |
Участник
|
Ax 3.0 KR3 appl SP5
Oracle 10g Повторюсь - глюк возникает не гарантировано, а на каком-то, как правило, не первом вызове. При вызове без литералов это приводило к ошибке ORA-01722: invalid number а с литералами к ORA-00911: invalid character или ORA-00907: missing right parenthesis (видимо зависело от константы которую парсер подставлял) Последний раз редактировалось Logger; 20.04.2010 в 10:15. |
|
20.04.2010, 10:24 | #6 |
Участник
|
У нас все 3 приложения AX 4.0 на MS SQL 2005, на 2 работает нормально а на одном никак ((
__________________
Лучше сделать и жалеть, чем жалеть что не сделал |
|
20.04.2010, 10:25 | #7 |
Участник
|
Ну для начала в коде литералы поставьте и посмотрите что уходит в запросе. Плюс я бы убедился что приложение одно и то же, что кеши не сказываются и все такое.
|
|
20.04.2010, 10:37 | #8 |
Участник
|
Как вариант, возможно в этой базе, какие-то кривые значения, в таблице....
У меня недавно был косяк, тоже sql валил ошибку из за того что в таблице слишком большие значения поля PostedValue. Откройте таблицу в ручную и посмотрите что она должна вам вернуть по такому запросу....
__________________
Что сломалось не знаем, но уже немного подчинили... Последний раз редактировалось hated8; 20.04.2010 в 10:53. |
|
20.04.2010, 10:40 | #9 |
Участник
|
N повторов дали один и тот же положительный результат.
Возможно настройки разделителя целой и дробной частей. Или действительно кеш.
__________________
В подводной охоте главное вдох ... |
|
20.04.2010, 10:45 | #10 |
Участник
|
Я стараюсь избегать вычисляемых выражений в запросах на X++.
Лучше переписать так: X++: while select inventDim where inventDim.InventLocationId == 'Склад 1' join InventSum where InventSum.InventDimId == inventDim.inventDimId && InventSum.itemId == 'Item 1' { if ((InventSum.PostedQty + InventSum.Received - InventSum.Deducted + InventSum.Registered - InventSum.Picked) >= 20) break; } |
|
20.04.2010, 10:48 | #11 |
Участник
|
Цитата:
Сообщение от Ace of Database
Я стараюсь избегать вычисляемых выражений в запросах на X++.
Лучше переписать так: X++: while select inventDim where inventDim.InventLocationId == 'Склад 1' join InventSum where InventSum.InventDimId == inventDim.inventDimId && InventSum.itemId == 'Item 1' { if ((InventSum.PostedQty + InventSum.Received - InventSum.Deducted + InventSum.Registered - InventSum.Picked) >= 20) break; }
__________________
Лучше сделать и жалеть, чем жалеть что не сделал Последний раз редактировалось kalex_a; 20.04.2010 в 10:52. |
|
20.04.2010, 10:55 | #12 |
Участник
|
Цитата:
Да но по времени и по кол-ву запросов это разве не больше будет?
|
|
20.04.2010, 11:17 | #13 |
Участник
|
А замена join на exists join не поможет? Зачем вам именно join, если ищете firstonly.
|
|
20.04.2010, 18:22 | #14 |
Участник
|
Вообще-то, в стандартном функционале
(postedQty + received - deducted + registered - picked) == physicalInvent Так что, в данном конкретном случае можно писать без вычислений. Просто InventSum.physicalInvent > 20 |
|
20.04.2010, 19:11 | #15 |
Модератор
|
А не лучше ли в подобных случаях какой-нибудь класс использовать, типа InventOnHand или подобный?
С Уважением, Георгий |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|