2013-12-24 8 views
4

У меня есть скрипт, который запрашивает базу данных для информации о заказе, а затем запрос этого запроса, чтобы получить итоговые суммы заказов. Код выглядит так.Ошибка выполнения запросов Query.Cannot применить двоичный числовой оператор [* | /] для нецифрового типа

<!--- Retrieve order information from database ---> 
<CFQUERY NAME="GetOrder"> 
    SELECT 
    oi.OrderQty, oi.ItemPrice 
    FROM 
    Orders o, 
    OrderItems oi, 
    WHERE 
    o.ID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#ATTRIBUTES.OrderID#"> 
    AND o.ID = oi.OrderID 
</CFQUERY> 

<!--- Query the GetOrders query to find total $$ ---> 
<CFQUERY DBTYPE="Query" NAME="GetTotal"> 
    SELECT SUM(ItemPrice * OrderQty) AS OrderTotal 
    FROM GetOrder 
</CFQUERY> 

Поля itemPrice и OrderQty в базе данных устанавливаются как числовые типы данных. По какой-то причине, когда я запускаю скрипт, я получаю сообщение об ошибке «Query Of Queries runtime». Невозможно применить двоичный числовой оператор [* | /] для не числового типа «

Я даже проверил быструю проверку, чтобы узнать, числа были числовыми в запросе и прервали скрипт перед запросом запросов. Проверка, которую я запускал, выглядит так.

<cfoutput> 
<cfif isnumeric(GetOrder.OrderQty)>1<cfelse>0</cfif> 
<cfif isnumeric(GetOrder.ItemPrice)>1<cfelse>0</cfif> 
<cfabort> 
</cfoutput> 

Оба результаты cfifs вернулся в «1»

Любая помощь с этим было бы весьма признателен.

+1

Ваш тест проверяет только первую строку в запросе, последующие строки могут вызвать проблему. –

ответ

2

Забудьте запрос запросов и сделайте запрос, чтобы сделать то же самое, предпочтительно используя precisionEvaluate(), чтобы избежать ошибки округления с плавающей точкой.

<cfset orderTotal = 0> 
<cfloop query="GetOrder"> 
    <cfset orderTotal = precisionEvaluate(orderTotal + (ItemPrice * OrderQty))> 
</cfloop> 

Почему это не сработало, может быть из-за ряда вещей. Возможно, ваш драйвер DB не вернул правильный тип sql.

Код isnumeric проверяет только, является ли строка числовой, а не внутренним представлением этой строки в объекте запроса.