Thank you very much. I've tried doing that. Because of my query, I tried
putting the logic into a CFFUNCTION:
<CFFUNCTION NAME="getSubCategories">
<CFARGUMENT NAME="CatID" TYPE="numeric">
<CFQUERY NAME="getSubCategories" DATASOURCE="#APPLICATION.Datasource#">
SELECT CatID, CatName
FROM Categories
WHERE ParentID=#CatID#
ORDER BY CatName
</CFQUERY>
<CFIF getSubCategories.RecordCount>
<CFSET temp="<ul>">
<CFLOOP QUERY="getSubCategories">
<CFSET temp=temp & "<li>#CatName#</li>">
<CFOUTPUT>#getSubCategories(CatID)#</CFOUTPUT>
</CFLOOP>
<CFSET temp=temp & "</ul>">
</CFIF>
<CFRETURN temp>
</CFFUNCTION>
But the code is erroring out where getSubCategories is getting called within
itself. I'm getting "The symbol you have provided getSubCategories is not the
name of a function" error.
So, how do I call the function within itself?
Sam
>This is essentially the reason recursion was created.
>
>Recursion (I may get this wrong... I don't have a Comp-Sci degree... or any
>degree actually) is the concept of "self referencing code". In simplest
>terms code which calls itself.
>
>In CF you can do this with any extension that maintains its own private
>scope: a function or a custom tag (or a function in a CFC or Custom tag).
>Since the code will be calling itself you need a private place for each call
>to maintain it own state.
>
>Let's take a simple example that's related to what you're doing. I have a
>simple black box (a function) that accepts a name and displays the children
>of that person. It looks like this:
>
>getChildren(CurrentName) {
>
> CurrentChildren = magicDataCall(CurrentName)
>
> Loop over CurrentChildren
> Display Current Child in Loop
> End Loop
>
>}
>
>I hope that makes some sense. It just calls for data (magicDataCall in this
>case) and loops over the results displaying them as it does.
>
>But now my problem has changed. I don't want just the children, I want all
>the descendents. Now I don't know how my levels of descendents there are
>(sound familiar?)
>
>So I remodel the function as a recursive function like so:
>
>getChildren(CurrentName) {
>
> CurrentChildren = magicDataCall(CurrentName)
>
> Loop over CurrentChildren
> Display Current Child in Loop
> getChildren(CurrentChildName)
> End Loop
>
>}
>
>Note that after displaying a child I call the SAME FUNCTION with that childs
>name.
>
>If I call that function with my name (I have two kids and they have no kids)
>I'd get:
>
>Jim // Start
>Paxton // Child of Jim
>Matilda // Child of Jim
>
>However if I call it with my MOM's name I'd get this (I have a brother and
>he has a kid):
>
>Sandy // Start
>Joe // Child of Sandy
>Sara // Child of Joe
>Jim // Child of Sandy
>Paxton // Child of Jim
>Matilda // Child of Jim
>
>If this is confusing don't worry - work it out on paper and you'll get it
>(or have a stroke... either way, probably solved!)
>
>So, for your problem you don't need to know how many loops you'll have: you
>just need to make a function that accepts a CatID, gets the children then
>calls the SAME function for each child.
>
>Remember however that in CF function variables must be prefixed with the VAR
>keyword to make them private: this is VERY IMPORTANT when building recursive
>functions!
>
>Also - a minor point, but the HTML you're producing in your example is
>broken (<ul> isn't allowed in a <ul> - but it is allowed in a <li>.) The
>basic concepts of recursion are pretty simple.... but getting the output
>right can be a major pain the ass. ;^)
>
>Jim Davis
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Discover CFTicket - The leading ColdFusion Help Desk and Trouble
Ticket application
http://www.houseoffusion.com/banners/view.cfm?bannerid=48
Message: http://www.houseoffusion.com/lists.cfm/link=i:4:227714
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54