会计错误 - ColdFusion - 不会添加总计

时间:2016-10-26 18:20:26

标签: coldfusion coldfusion-9 cfml

通过一些数字进行会计处理。

但是当我尝试将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>

1 个答案:

答案 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,可以防止该错误。

同样,有更好的方法可以简单地计算总和。但是,当您确实需要查询循环时,请务必确定所有变量的范围,以避免潜在的冲突。