2010-09-27 75 views
2

我试图在Coldfusion中创建一个递归函数,并且遇到了一些问题。Coldfusion中的递归函数

这里是我的逻辑:

<cffunction name="getEvents" access="private"> 
    <cfargument name="strtdate"> 
    <cfargument name="parentID" default=0> 
    <cfqeury name="qry" datasource="db"> 
    select * 
    from table 
    where parentid = #parentid# and 
      starttime between #strtdate# and #DateAdd('d', 1, strtdate)# 
    </cfquery> 

    <cfset events = arraynew(1)> 
    <cfloop query="qry"> 
    <cfset events[qry.currentrow] = structnew()> 
    <cfset events[qry.currentrow].id = qry.id> 
    <cfset subevents = getEvents(strtdate, qry.id)> 
    <cfif arraylen(subevents)> 
     <cfset events[qry.currentrow].subevents = subevents> 
    </cfif> 
    </cfloop> 

    <cfreturn events> 
</cffunction> 

的问题是,一旦函数调用自身,一旦失去在循环原始查询。我现在的事件是三个层面的深度,但我不想纠正一遍又一遍地处理所有事件。

我想结束一个包含给定日期的所有事件和子事件的结构数组。

回答

9

尝试var作用域查询对象。实际上你应该使用适当的范围。例如:

<cffunction name="getEvents" access="private"> 
    <cfargument name="strtdate"> 
    <cfargument name="parentID" default=0> 

    <cfset var qry = "" /> 
    <cfset var events = "" /> 
    <!--- etc. ---> 


    <cfquery name="qry" datasource="db"> 
    select * 
    from table 
    where parentid = #parentid# and 
      starttime between #ARGUMENTS.strtdate# 
    and #DateAdd('d', 1, ARGUMENTS.strtdate)# 
    </cfquery> 

    ... etc. 

否则,一切都将进入VARIABLES范围并覆盖其他人,我怀疑。

希望有帮助!

PS:您还应该考虑在查询中使用<cfqueryparam />

+0

并解释为什么这是重要的将有助于未来的人。为什么这个问题是由var变量的变量范围造成的? – 2010-09-27 21:19:14

+0

谢谢。那就是诀窍。我在我的代码中有CFQueryParam,但我不想写更多,然后我需要在这里。 – 2010-09-27 21:40:39

+0

Edward,我刚刚发现这个http://www.garyrgilbert.com/tutorials/coldfusion/beginner/scope.cfm – 2010-09-27 21:48:42

3

请确保您的变量范围变量保持它们对函数的每个调用都是本地的。

在你的函数(在顶部如果CF8或更早):

<cfset var qry = ''> 
<cfset var events = ''> 
<cfset var subevents = ''>