通过一些数字进行会计处理。
但是当我尝试将st.hrs添加到total时 - 我收到错误。 价值''无法转换为数字。
认为这是因为st.hrs不存在 - 这就是记录计数检查的原因......
任何想法的人?
<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>
答案 0 :(得分:1)
简答:
如果您只需要计算总数,请使用Dan建议使用单个查询,并使用基本SUM()汇总。我会让Dan详细说明,但这比在循环中查询更有效。
更长的回答:
为了解决原始错误,这是一个很好的例子,说明为什么范围变量是一个好习惯。没有确定范围是造成致命错误的原因。然而,它可能很容易导致逻辑错误,这不容易发现。
在没有范围的情况下初始化total
变量意味着它最终在默认的variables
范围内。所以你基本上是这样做的:
<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
为空(或空字符串),因此会导致&#34;值&#39;&#39;无法转换为数字错误。指定变量范围,即variables.total
,可以防止该错误。
同样,有更好的方法可以简单地计算总和。但是,当您确实需要查询循环时,请务必确定所有变量的范围,以避免潜在的冲突。