![]() |
#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 других приложениях срабатывает нормально.
__________________
Лучше сделать и жалеть, чем жалеть что не сделал |
|
![]() |
#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 а также могло влиять то с какого месте от знака неравенства стоит операнд. |
|
![]() |
#3 |
Участник
|
У меня работает
BD ORACLE, AX 4
__________________
В подводной охоте главное вдох ... |
|
![]() |
#4 |
Участник
|
А какая база у Вас?
__________________
В подводной охоте главное вдох ... |
|
![]() |
#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. |
|
![]() |
#6 |
Участник
|
У нас все 3 приложения AX 4.0 на MS SQL 2005, на 2 работает нормально а на одном никак ((
__________________
Лучше сделать и жалеть, чем жалеть что не сделал |
|
![]() |
#7 |
Участник
|
Ну для начала в коде литералы поставьте и посмотрите что уходит в запросе. Плюс я бы убедился что приложение одно и то же, что кеши не сказываются и все такое.
|
|
![]() |
#8 |
Участник
|
Как вариант, возможно в этой базе, какие-то кривые значения, в таблице....
У меня недавно был косяк, тоже sql валил ошибку из за того что в таблице слишком большие значения поля PostedValue. Откройте таблицу в ручную и посмотрите что она должна вам вернуть по такому запросу....
__________________
![]() Последний раз редактировалось hated8; 20.04.2010 в 10:53. |
|
![]() |
#9 |
Участник
|
N повторов дали один и тот же положительный результат.
Возможно настройки разделителя целой и дробной частей. Или действительно кеш.
__________________
В подводной охоте главное вдох ... |
|
![]() |
#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; } |
|
![]() |
#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. |
|
![]() |
#12 |
Участник
|
Цитата:
Да но по времени и по кол-ву запросов это разве не больше будет?
|
|
![]() |
#13 |
Участник
|
А замена join на exists join не поможет? Зачем вам именно join, если ищете firstonly.
|
|
![]() |
#14 |
Участник
|
Вообще-то, в стандартном функционале
(postedQty + received - deducted + registered - picked) == physicalInvent Так что, в данном конкретном случае можно писать без вычислений. Просто InventSum.physicalInvent > 20 |
|
![]() |
#15 |
Модератор
|
А не лучше ли в подобных случаях какой-нибудь класс использовать, типа InventOnHand или подобный?
С Уважением, Георгий |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|