如何单独使用cfloop中动态生成的变量?

时间:2013-12-05 13:20:26

标签: coldfusion cfloop

我不确定我的标题是如何解释的。坦率地说,我不确定如何将其用于文字,但这里有:

我正在从另一个页面上动态创建的表单字段中捕获变量,这些变量已经提交到包含以下代码的页面。到目前为止,一切都按照我的意愿运作。我正在获取动态命名的表单字段。现在我需要将小计美元金额加在一起以创建总计。不幸的是,由于它们的动态特性,我无法弄清楚如何将个体总数排除在循环之外,因此我可以对最终数字进行数学计算。

下面这部分代码生成小计,我需要能够将所有这些添加到一起以获得总计,但我无法弄清楚如何:

#dollarformat(val(getticket[item].ticketprice * form[item]))#

也许我需要采取不同的方法...建议/帮助赞赏。

这是完整的代码:

<CFLOOP LIST="#form.fieldnames#" INDEX="item">
<cfoutput>

    <cfquery datasource="outertixdb" name="getticket[item]">
        select * from tickets
        where ticketid = '#item#'
    </cfquery>

    #getticket[item].ticketname#: #dollarformat(getticket[item].ticketprice)# x #form[item]# = #dollarformat(val(getticket[item].ticketprice * form[item]))#<br/>

</cfoutput>

3 个答案:

答案 0 :(得分:4)

您需要使用以下格式设置name的{​​{1}}属性:

cfquery

要处理总数,首先需要在<cfquery datasource="outertixdb" name="#getticket[item]#">

之前使用变量
cfloop

然后,在循环内部,您只需将故障单的价格添加到总计

<cfset total = 0 />

此外,您应该在查询中使用<cfset total = total + getticket[item].ticketprice /> 。您可以阅读更多相关信息here

最后,如果您不需要cfqueryparam表中的所有数据,请不要使用'select * ..',只需提取您需要的数据。

答案 1 :(得分:3)

不确定我完全理解,但听起来你只是想通过“id”查找一堆票据记录。然后显示单个成本,加上总计。如果这就是您所做的一切,只需为字段指定相同的名称:ticketID。例如:

  <input name="ticketID" value="1" ...>
  <input name="ticketID" value="22" ...>
  <input name="ticketID" value="45" ...>
  <input name="ticketID" value="16" ...>

然后,这些值将作为列表提交,即1,22,45,16,您可以使用IN子句将其提供给查询。这使您可以在单个查询中获取所有数据。 (通常,您希望避免在循环中运行查询,因为对每个 id执行单独的数据库查询会产生大量不必要的开销并降低性能)。

*根据需要更改cfsqltype

SELECT TicketID, TicketPrice
FROM   YourTable
WHERE  TicketID IN ( <cfquerparam value="#FORM.ticketID#" 
                             list="true" 
                             cfsqltype="cf_sql_integer"> 
                  )

<强>更新

  

form[item]是上一页中数量选择的值。

这是一个令人困惑的命名约定。我建议使用更直观的名称,如“数量”。更具描述性的内容。您仍然可以使用故障单ID生成唯一的名称,即quantity_#ticketID#。例如,使用与上述相同的票证ID:

  <input name="quantity_1" ...>
  <input name="quantity_22" ...>
  <input name="quantity_45" ...>
  <input name="quantity_16" ...>

获得结果后,有several ways to generate a grand total。最简单的方法是在循环之前初始化变量,然后在迭代时递增它。使用查询票证ID从FORM范围中获取数量值:

 <cfset grandTotal = 0>
 <cfoutput query="yourQuery">
     <!--- extract quantity value --->
     <cfset currQuantity = FORM["quantity_"& yourQuery.ticketID ]>
     ... display price ...
     <cfset grandTotal += val(yourQuery.ticketPrice * currQuantity )> 
 </cfoutput>

 GrandTotal <cfoutput>#grandTotal#</cfoutput>

答案 2 :(得分:0)

我建议丢弃整个动态命名的查询。

<cfset total = 0>

<CFLOOP LIST="#form.fieldnames#" INDEX="item">

    <cfquery datasource="outertixdb" name="getticket">
       select * from tickets
       where ticketid = <cfqueryparam cfsqltype="cf_sql_varchar" value="#item#">
    </cfquery>

 <cfset total += getticket.ticketprice />    


 <cfoutput query="getTicket">   
    #ticketname#: #dollarformat(ticketprice)# &times; #form[item]# 
    = #dollarformat(val(ticketprice * form[item]))#<br/>
</cfoutput>
</cfloop>

根据需要输出总数