--- Adrian Lynch <[EMAIL PROTECTED]> wrote:
> Ignore that. I meant to say, in the recursive functions, locally
> scope your
> queries.

that is essentially what i do with using the arguments.foo and it
solved the problem.  but is this what is supppose to happen/intended?
it seems to me that the the query should be scoped to the local
function automatically.  why is it global? why can the other
recursive function calls see it?   Are all variables global?    I
would prefer to have an understanding of why and how instead of (imo)
a workaround.  

jason

>
> -----Original Message-----
> From: Adrian Lynch [mailto:[EMAIL PROTECTED]
> Sent: 08 October 2003 15:08
> To: CF-Talk
> Subject: RE: problems with recursion in cfmx
>
>
> In your query put <cfset var getStandardRet = "" />
>
>
> That may help.
>
>
> Ade
>
> -----Original Message-----
> From: Jason Wagstaff [mailto:[EMAIL PROTECTED]
> Sent: 08 October 2003 15:04
> To: CF-Talk
> Subject: problems with recursion in cfmx
>
> I don't know if this is a possible bug (or maybe i am doing
> something
> wrong), but when using recursion with a query in the function scope
> it is overwritten on the next call of the function.  i did find a
> workaround, but want to know is what is intended.
>
> I have this function which orders sibilings from a result set that
> is
> a hierarchacl tree of nodes with ids and parentids.(btw i know in
> oracle 9i this functino exists, but we are running 8i) the query
> looks like this:
>
> <cfquery name="getStandardRet" datasource="test">
>   SELECT upper(name) as uppername, name,level as
> depth,frameid,description,parentid
>   FROM sn_standard
>   START WITH frameid = '#arguments.key#'
>   CONNECT BY PRIOR frameid = parentid
> </cfquery>
>
> I call the orderbysibling function by passing the the parent of the
> tree.
>
> <cfset startid = getStandardRet["frameid"][1] />
> <cfset orderedQuery =
> QueryNew("frameid,parentid,depth,name,description") />
> <cfset QueryAddRow(orderedQuery) />
> <cfset
> QuerySetCell(orderedQuery,"frameid",getStandardRet["frameid"][1])>
> <cfset
> QuerySetCell(orderedQuery,"depth",getStandardRet["depth"][1])>
> <cfset QuerySetCell(orderedQuery,"name",getStandardRet["name"][1])>
> <cfset
>
QuerySetCell(orderedQuery,"description",getStandardRet["description"][1])>
> <cfset
>
QuerySetCell(orderedQuery,"parentid",getStandardRet["parentid"][1])>
> <cfset orderbySibling(startid) />
>
> ---orderbySibling function
> <cffunction name="orderbySibling">
>   <cfargument name="nodeid" required="true" />
>
>   <cfquery name="qsiblings" dbtype="query">
>     select frameid,depth,name,description,parentid
>     from getStandardRet
>     where parentid = '#nodeid#'
>     order by uppername
>   </cfquery>
>
>   <cfloop query="qsiblings">
>     <cfset QueryAddRow(orderedQuery) />
>     <cfset QuerySetCell(orderedQuery,"frameid",qsiblings.frameid)>
>     <cfset QuerySetCell(orderedQuery,"depth",qsiblings.depth)>     
>  
>      
>     <cfset QuerySetCell(orderedQuery,"name",qsiblings.name)>
>     <cfset
> QuerySetCell(orderedQuery,"description",qsiblings.description)>
>     <cfset
> QuerySetCell(orderedQuery,"parentid",qsiblings.parentid)>
>     <cfset orderbySibling(qsiblings.frameid) />
>   </cfloop>
> </cffunction>
>
> --- this is the workaround
> <cffunction name="orderbySibling">
>   <cfargument name="nodeid" required="true" />
>   <cfargument name="foo" required="false" />
>
>   <cfquery name="qsiblings" dbtype="query">
>     select frameid,depth,name,description,parentid
>     from getStandardRet
>     where parentid = '#nodeid#'
>     order by uppername
>   </cfquery>
>
>   <cfset arguments.foo = qsiblings />
>   <cfloop query="arguments.foo">
>     <cfset QueryAddRow(orderedQuery) />
>     <cfset
> QuerySetCell(orderedQuery,"frameid",arguments.foo.frameid)>
>     <cfset QuerySetCell(orderedQuery,"depth",arguments.foo.depth)>
>  
>         
>     <cfset QuerySetCell(orderedQuery,"name",arguments.foo.name)>
>     <cfset
> QuerySetCell(orderedQuery,"description",arguments.foo.description)>
>     <cfset
> QuerySetCell(orderedQuery,"parentid",arguments.foo.parentid)>
>     <cfset orderbySibling(arguments.foo.frameid) />
>   </cfloop>
> </cffunction>
>
> To me it seems that the query(all variables of the function) should
> be pushed onto the stack at each time the function is called.  the
> workaround is a hack that forces the query qsiblings to take a
> different scope so that the data will be preserved as it comes up
> out
> of the recursive calls.  i have also noticed that if you use a
> varialbe in the original calling scope that it is seen as a global
> variable in the recursive function and not local to the scope of
> the
> original calling function.  
>
> Does anyone know of a good document that it explains all of the
> scopes in cfmx and their relationships?
>
> tia,
> jason
>
> __________________________________
> Do you Yahoo!?
> The New Yahoo! Shopping - with improved product search
> http://shopping.yahoo.com <http://shopping.yahoo.com>
> <http://shopping.yahoo.com>  
>   _____  
>
>
>   _____  
>
>
>

[Todays Threads] [This Message] [Subscription] [Fast Unsubscribe] [User Settings]

Reply via email to