28.11.2008, 16:17 | #1 |
Участник
|
ошибка update_recordset
Axapta 3.0 CIS SP3 Build #9.2 (MS SQL 2000)
Очень "странное" поведение update_recordset Когда в предложении присваивания используем выражение с переменными/константами - то результат получается абсолютно не предсказуемый - выражение вычисляется не верно В прикрепрепленном файле имеется проект. В форме создайте запись со значениями A=100 B=90 и запустите job: test_table в результате получаем 0.35 и 180.00 теперь раскоментируем строку // k = 1.0; и в результате: Error Сообщение (19:17:37) Невозможно отредактировать запись в 'test_table' ('test_table'). База данных SQL обнаружила ошибку. Info Сообщение (19:17:37) Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Divide by zero error encountered. Info Сообщение (19:17:37) Оператор SQL: UPDATE TEST_TABLE SET C=(A/((A/B)*?)) WHERE (DATAAREAID=?) Или это у меня только такое случается? |
|
|
За это сообщение автора поблагодарили: AndyD (5). |
28.11.2008, 16:58 | #2 |
Участник
|
Хм. Интересная ошибка.
Число внутри скобок почему-то преобразуется к целому. Причем, преобразуется либо к нулю, либо к 255. Если отбросить внутренние скобки test_table.A/(test_table.A/test_table.B * k), то ошибка остается. Если же еще и переставить число внутри скобок test_table.A/(k * test_table.A/test_table.B), то ошибка пропадает и считается правильно. А так test_table.A/(k * (test_table.A/test_table.B)) - опять появляется. В общем, поле чудес какое-то
__________________
Axapta v.3.0 sp5 kr2 |
|
28.11.2008, 17:05 | #3 |
Участник
|
а если forceLiterals?
|
|
28.11.2008, 17:09 | #4 |
Участник
|
Неа.
То же самое Возможно, на update_recordset он не действует - запрос уходит с плейсхолдером
__________________
Axapta v.3.0 sp5 kr2 |
|
28.11.2008, 17:15 | #5 |
MCITP
|
а если -INTERNAL=NOCURSORREUSE -INTERNAL=COMMENTS в Advanced в ACU?
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Logger (1). |
28.11.2008, 17:18 | #6 |
MCITP
|
Вообще, я пару раз натыкался уже тоже на такое непредсказуемое преобразование аксаптой выражений в SQL.
На вскидку было что-то типа X++: and 1?1
__________________
Zhirenkov Vitaly |
|
28.11.2008, 17:29 | #7 |
Участник
|
Тоже нет.
Да и вызов на сервер шел не из кэша - exec sp_prepexec
__________________
Axapta v.3.0 sp5 kr2 |
|
28.11.2008, 17:41 | #8 |
Участник
|
MS SQL 2005
Посмотрел трассировку на SQL сервере :
Цитата:
Цитата:
В первом случае действительно параметр передается как целочисленный. |
|
28.11.2008, 18:48 | #9 |
MCITP
|
ох уж этот сиквел
X++: (17:29:55) "test_table" ("test_table"). SQL . SQL: ORA-01476: divisor is equal to zero SQL: UPDATE TEST_TABLE SET C=(A/((A/B)*:in1/*1*/)) WHERE (SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER(:in2)/*'mil'*/) X++: Update Test_table Set C = ( A / ( ( A / B ) * :In1 /*0.5*/ ) ) Where ( substr ( nls_lower ( Dataareaid ), 1, 3 ) = nls_lower ( :In2 ) /*'mil'*/ ); в оракле естественно этот апдэйт (оба) с константами работает без вопросов. и с bind-переменными если сделать - то тоже. Т.е. запрос сформирован правильно, и параметр 0.5 пошёл как надо, а 1 как-то по пути к привязке в бинд-переменную превратился в 0. Ошибка повторяется до k=10, если больше, то работает. Если тип k изменить на int - то вообще нет проблем.
__________________
Zhirenkov Vitaly |
|
Теги |
bind variables, forceliterals, forceplaceholders, internal, literal, placeholder |
|
|