AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.11.2008, 16:17   #1  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
ошибка 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=?)

Или это у меня только такое случается?
Вложения
Тип файла: zip test_updaterecordset.zip (2.8 Кб, 144 просмотров)
За это сообщение автора поблагодарили: AndyD (5).
Старый 28.11.2008, 16:58   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Хм. Интересная ошибка.
Число внутри скобок почему-то преобразуется к целому. Причем, преобразуется либо к нулю, либо к 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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
а если forceLiterals?
Старый 28.11.2008, 17:09   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Неа.
То же самое
Возможно, на update_recordset он не действует - запрос уходит с плейсхолдером
__________________
Axapta v.3.0 sp5 kr2
Старый 28.11.2008, 17:15   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
а если -INTERNAL=NOCURSORREUSE -INTERNAL=COMMENTS в Advanced в ACU?
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Logger (1).
Старый 28.11.2008, 17:18   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Вообще, я пару раз натыкался уже тоже на такое непредсказуемое преобразование аксаптой выражений в SQL.
На вскидку было что-то типа
X++:
and 1?1
на выходе.
__________________
Zhirenkov Vitaly
Старый 28.11.2008, 17:29   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Тоже нет.
Да и вызов на сервер шел не из кэша - exec sp_prepexec
__________________
Axapta v.3.0 sp5 kr2
Старый 28.11.2008, 17:41   #8  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
MS SQL 2005
Посмотрел трассировку на SQL сервере :

Цитата:
Сообщение от AndyD Посмотреть сообщение
Если отбросить внутренние скобки test_table.A/(test_table.A/test_table.B * k), то ошибка остается.
(@P1 bigint,@P2 int,@P3 nvarchar(8))UPDATE TEST_TABLE SET C=(A/((A/B)*@P1)),RECVERSION=@P2 WHERE (DATAAREAID=@P3)

Цитата:
Сообщение от AndyD Посмотреть сообщение
Если же еще и переставить число внутри скобок test_table.A/(k * test_table.A/test_table.B)
(@P1 numeric(28,12),@P2 int,@P3 nvarchar(8))UPDATE TEST_TABLE SET C=(A/((@P1*A)/B)),RECVERSION=@P2 WHERE (DATAAREAID=@P3)


В первом случае действительно параметр передается как целочисленный.
Старый 28.11.2008, 18:48   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от AndyD Посмотреть сообщение
Тоже нет.
Да и вызов на сервер шел не из кэша - exec sp_prepexec
ох уж этот сиквел

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'*/)
Для 0.5
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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка (?) при печати приходного ордера в DAX 4.0 SP2 Ivanhoe DAX: Программирование 7 19.01.2021 14:13
Ошибка в формате числа. 36AC DAX: Программирование 7 19.10.2006 10:04
Ошибка: "Ошибка в суммы в валюте XXX. Необходимо округлить до '0.00'. Std DAX: Функционал 3 18.07.2006 11:22
Ошибка при обработке С-Ф Sergo DAX: Программирование 7 20.01.2006 11:56
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:15.