2013-04-19 3 views
2

Я имею в виду предыдущий SO Coldfusion Calculate Sum Total (Loop?), который был помечен как правильный ответ, но код для меня не работает.Значения сумм в cfloop

Я пытаюсь создать общую сумму из нескольких полей. Но ошибка, которую я получаю, заключается в том, что «переменная xxx не определена». Это потому, что я пытаюсь добавить значения из цикла для всех записей

<cfoutput> 
<cfquery name="ActivityReceipts" dbtype="query"> 
    SELECT 
      activity, 
      qty_approved, 
      location, 
      payment_amount, 
      shipping_cost, 
      handling_cost 
    FROM rc.RC1 
    WHERE id_number = '#Receipts.id_number#' 
</cfquery> 

<cfloop query="ActivityReceipts"> 
<tr> 
<td style="text-align:left;">#ActivityReceipts.activity#</td> 
<td style="text-align:left;">#ActivityReceipts.qty_approved#</td> 
<td style="text-align:left;">#ActivityReceipts.location#</td> 
<td style="text-align: right; padding-right: 80px;">#ActivityReceipts.payment_amount#</td> 
</tr> 

<cfset grandTotal = grandTotal + (#ActivityReceipts.payment_amount# + #ActivityReceipts.handling_cost# + #ActivityReceipts.Shipping_cost#) /> 

</cfloop> 


<td>#grandTotal#</td> 
</cfoutput> 

Обратите внимание, что если изменить переменную строку настройки GrandTotal в

<cfset grandTotal = (#ActivityReceipts.payment_amount# + #ActivityReceipts.handling_cost# + #ActivityReceipts.Shipping_cost#) /> 

это не вызывает ошибку, но также суммирует только последнюю строку, а не все из них.

+0

Ничего общего с вашей ошибкой, но нет необходимости обертывать 'cfquery' в' cfoutput', только часть html. # Переменные # внутри тега запроса будут оцениваться автоматически. Кроме того, не забудьте использовать 'cfqueryparam' для защиты от SQL-инъекции. – Leigh

ответ

4

Вы должны инициализировать grandTotal так:

<cfset grandTotal = 0> 
<cfloop query="ActivityReceipts"> 
    <tr> 
     <td style="text-align:left;">#ActivityReceipts.activity#</td> 
     <td style="text-align:left;">#ActivityReceipts.qty_approved#</td> 
     <td style="text-align:left;">#ActivityReceipts.location#</td> 
     <td style="text-align: right; padding-right: 80px;"> 
      #ActivityReceipts.payment_amount# 
     </td> 
    </tr> 

    <cfset grandTotal = grandTotal + (ActivityReceipts.payment_amount 
             + ActivityReceipts.handling_cost 
             + ActivityReceipts.Shipping_cost 
            ) /> 
</cfloop> 
+1

используйте 'PrecisionEvaluate()', если вам нужна ошибка округления! В противном случае используйте '+ =', чтобы ваш код выглядел более холодным. :) – Henry

2

Вы должны определить и инициализировать переменную grandTotal, прежде чем вы сможете сделать заявление, подобное <cfset grandTotal = grandTotal + .... Просто сделать что-то вроде:

... 
</cfquery> 

<cfset grandTotal= 0> 

<cfloop query="ActivityReceipts"> 
    ... 
2

Start с <cfset grandtotal=0> до вашего цикла. Поскольку вы ссылаетесь на него в своем цикле и его не инициализировали, вы становитесь неопределенным.

5

вам необходимо установить значение по умолчанию для GrandTotal вара перед петлей ...

<cfset grandTotal = 0> 

Кроме того, вам не нужно ставить фунт знаки, если вы не собираетесь выводить или процитировать вар ,

<cfset grandTotal = grandTotal + (ActivityReceipts.payment_amount + ActivityReceipts.handling_cost + ActivityReceipts.Shipping_cost) /> 
+0

так же, как и знаки #, это просто усложняет чтение. – JamesRLamar

3

Вот способ сделать это без петли.

grandTotal = ArraySum(ActivityReceipts["payment_amount"]) 
+ ArraySum(ActivityReceipts["handling_cost"]) 
+ ArraySum(ActivityReceipts["Shipping_cost"]); 
Смежные вопросы