2010-09-27 6 views
2

J'essaye de créer une fonction récursive dans coldfusion et rencontre quelques problèmes.Fonction récursive dans Coldfusion

Voici la logique que j'ai:

<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> 

Le problème est qu'une fois que la fonction elle-même appelle une fois qu'il desserre la requête initiale dans la boucle. Maintenant, les événements sont profonds à trois niveaux, mais je ne veux pas avoir le même code à plusieurs reprises pour gérer tous les événements.

Je voudrais finir avec un tableau de structs qui contient tous les événements et sous-événements pour un jour donné.

Répondre

9

Essayez var la portée objet de votre requête. En fait, vous devriez utiliser une portée appropriée en général. Par exemple:

<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. 

Sinon, tout va dans le champ VARIABLES et écrasez autres que je soupçonne.

Espérons que ça aide! PS: Vous devez également utiliser <cfqueryparam /> dans vos requêtes.

+0

Et expliquer pourquoi c'est important aiderait les gens dans le futur. Pourquoi ce problème est-il dû au fait que les variables ne sont pas var-scoping? –

+0

Merci. Cela a fait l'affaire. J'ai CFQueryParam dans mon code mais je ne voulais pas écrire plus que ce dont j'avais besoin ici. –

+0

Edward, je viens de trouver ça http://www.garyrgilbert.com/tutorials/coldfusion/beginner/scope.cfm –

3

Assurez-vous de var-scope vos variables pour les garder locales à chaque invocation de la fonction.

Dans votre fonction (en haut si CF8 ou plus tôt):

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