2010-09-27 108 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 = ''>