2016-10-26 15 views
0

Зацикливание через некоторые цифры для выполнения некоторых операций.Ошибка учета - ColdFusion - не добавляет Total

Но когда я пытаюсь добавить st.hrs к итогу - я получаю сообщение об ошибке. Значение '' не может быть преобразовано в число.

Думал, что это произошло потому, что st.hrs нет - поэтому проверка RecordCount есть ...

Любые идеи люди?

 <cfloop index = "ul" list = "#templist#"> 
      <cfset total = 0> 
      <cfoutput query="bl"> 
       <cfquery name="st" datasource="#tds#"> 
       SELECT * from billstaff 
       where billid = '#bl.billid#' and uid = '#ul#' 
       </cfquery> 
       <cfif st.recordcount is not 0> 
       <cfset total = #st.hrs# + total> 
       </cfif> 
      </cfoutput> 
      <cfoutput>#total#</cfoutput><br> 
     </cfloop> 
+2

В базе данных, которая имеет нулевые значения в общем поле для некоторых записей, ColdFusion преобразует эти для пустых строк. Есть ли причина, по которой вы не используете функцию sum() sql, чтобы получить ответ? –

+0

Нулевые значения Я думал, что удалил с помощью записи.Можете ли вы рассказать о сумме()? –

+0

RecordCount просто сообщает вам, содержит ли запрос какие-либо записи. Он ничего не сообщает о значениях столбца в этих записях. Вы должны проверить отдельные значения. Dan предлагает вам использовать совокупный SUM для вычисления общей суммы в одном запросе вместо запроса в цикле. Вам нужно будет опубликовать SQL для запроса bl для специфики. – Leigh

ответ

1

Короткий ответ:

Если вам просто нужно вычислить сумму, идти с предложением Дэна использования одного запроса, с базовой SUM() агрегата. Я расскажу Дэн, но это будет более эффективно, чем запрос в цикле.

Более длинный ответ:

Просто для решения исходной ошибки, это хороший пример того, почему обзорных переменных является хорошей практикой. Отсутствие обзора - вот что привело к фатальной ошибке. Тем не менее, это может так же легко вызвать логические ошибки, которые не так легко заметить.

Инициализация переменной total без рамки, означает, что она заканчивается по умолчанию variables scope. Таким образом, вы, по сути это сделать:

<cfset variables.total = 0>

При перебрать внешнего запроса, данные в текущей строке получает присваиваются переменным, но в другой области: в (псевдо) запрос объем. Так как один из столбцов запроса происходит, чтобы быть названным total, петля неосторожно создает вторую total переменную, которая вызывает все идет в сторону, когда вы пытаетесь вычислить сумму здесь:

<cfset total = #st.hrs# + total>

Поскольку переменная total не ограничена, CF должен угадать, какая из двух она должна использовать, и в этом случае догадывается неправильно.

Переменные без области действия - evaluated according to these rules, которые придают области запроса более высокий приоритет, чем variables. В результате CF использует значение bl.total вместо variables.total. Поскольку bl.total равно нулю (или пустая строка), что приводит к тому, «значение„“не может быть преобразован в номер ошибки. Задание переменной сферы, т.е. variables.total, предотвратит эту ошибку.

Опять же, лучше способы просто вычислить сумму.Однако, когда вам действительно нужен цикл запроса, не забудьте охватить все переменные, чтобы избежать возможных конфликтов.