Re: [cfaussie] Recursive function giving me 500 null error

2010-08-12 Thread Robin Hilliard
On 12/08/2010, at 2:34 PM, Seona Bellamy wrote:
 cffunction name=downTree hint=Returns the details of everything needed to 
 make an item access=public returntype=array output=no
 cfargument name=aItems type=array required=no default=
 
 cfscript
 var result = arrayNew(1);
 var i = 1;
 var qItem = ;
 
 qItem = getItemMadeBy(aItems[1].id);
 
 if (qItem.recordcount) {
 result[1] = structNew();
 result[1].id = qItem.id;
 result[1].item = qItem.item;
 result[1].skill = qItem.skillname;
 result[1].makes = arguments.aItems;
 
 downTree(result);
 }
 /cfscript
 
 cfreturn result
 /cffunction

I'm sure Geoff would have something like this for Eve by now. You can see with 
the function above that no matter how deep you recurse there is only ever going 
to be an item in the first position in the array, so there's definitely a 
problem. You could make a build tree like this (pseudocode):

function makeBuildTree() : struct {

stDependencies = structNew();

for all nextItem in allItems {
if not structKeyExists(stDependencies, nextItem.id)
stDependencies[nextItem.id] = structNew();

for all nextMadeThing in getItemsMadeBy(nextItem.id) {
if not structKeyExists(stDependencies, nextMadeThing.id)
stDependencies[nextMadeThing.id] = structNew();

stDependencies[nextMadeThing.id][nextItem.id] = 
stDependencies[nextItem.id];
}
}

return stDependencies;
}

If you then cfdump a key in stDependencies you'd see a tree of ids showing what 
built what. You might then use the little known but usefuly recursive CF 
function structFindValue(returnValue[id], , all) to get an array of all the 
keys under a branch of the result.

HTH,
Robin (who should get back to some project work)

 
ROBIN HILLIARD
Chief Technology Officer
ro...@rocketboots.com.au

RocketBoots Pty Ltd
Level 11
189 Kent Street
Sydney NSW 2001
Australia
Phone +61 2 9323 2507
Facsimile +61 2 9323 2501
Mobile +61 418 414 341
www.rocketboots.com.au   
 


-- 
You received this message because you are subscribed to the Google Groups 
cfaussie group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to 
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/cfaussie?hl=en.



Re: [cfaussie] Recursive function giving me 500 null error

2010-08-12 Thread Robin Hilliard
On 12/08/2010, at 4:18 PM, Robin Hilliard wrote:

 structFindValue(returnValue[id], , all) to get an array of all the keys 
 under a branch of the result.

Ah it's not quite right, when you first create a key in stDependencies you 
should set it to , and only replace it with a struct if something makes it.
Note that would only give you the raw materials, not the interim composite 
ones, because it would only match keys that were still = .

Robin

-- 
You received this message because you are subscribed to the Google Groups 
cfaussie group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to 
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/cfaussie?hl=en.



Re: [cfaussie] Recursive function giving me 500 null error

2010-08-12 Thread Sean Corfield
On Wed, Aug 11, 2010 at 9:34 PM, Seona Bellamy seon...@gmail.com wrote:
     cffunction name=downTree hint=Returns the details of everything
 needed to make an item access=public returntype=array output=no
         cfargument name=aItems type=array required=no default=
        ...
                 downTree(result);

Bear in mind that this copies result so changes made inside downTree()
are on a copy, not the original, so after calling downTree(), result
won't have changed.
-- 
Sean A Corfield -- (904) 302-SEAN
Railo Technologies, Inc. -- http://getrailo.com/
An Architect's View -- http://corfield.org/

If you're not annoying somebody, you're not really alive.
-- Margaret Atwood

-- 
You received this message because you are subscribed to the Google Groups 
cfaussie group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to 
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/cfaussie?hl=en.



Re: [cfaussie] Recursive function giving me 500 null error

2010-08-12 Thread Seona Bellamy
On 12 August 2010 16:27, Sean Corfield seancorfi...@gmail.com wrote:

 On Wed, Aug 11, 2010 at 9:34 PM, Seona Bellamy seon...@gmail.com wrote:
  cffunction name=downTree hint=Returns the details of everything
  needed to make an item access=public returntype=array output=no
  cfargument name=aItems type=array required=no default=
 ...
  downTree(result);

 Bear in mind that this copies result so changes made inside downTree()
 are on a copy, not the original, so after calling downTree(), result
 won't have changed.


Aha! Turns out this was the missing piece. Changing that line to:

result = downTree(result);

has made everything play nicely. Thanks for all the responses and
clarifications. I understand what's going on better now, and why it
originally screwed itself up. It was indeed caught in a never-ending loop as
the first value in the array never changed and so it never got to the
beginning of the tree.

Cheers,

Seona.

-- 
You received this message because you are subscribed to the Google Groups 
cfaussie group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to 
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/cfaussie?hl=en.



RE: [cfaussie] Recursive function giving me 500 null error

2010-08-11 Thread Dale Fraser
I'd suggest you have a recursive loop

 

For example

 

Let's say that

 

Item A requires Item B

 

And that

 

Item B requires Item A

 

It will go around in circles and eventually give up.

 

Regards

Dale Fraser

 

http://dale.fraser.id.au

http://cfmldocs.com http://cfmldocs.com/ 

http://learncf.com

http://flexcf.com

 

From: cfaussie@googlegroups.com [mailto:cfaus...@googlegroups.com] On Behalf
Of Seona Bellamy
Sent: Thursday, 12 August 2010 2:34 PM
To: CFAussie
Subject: [cfaussie] Recursive function giving me 500 null error

 

Hi guys,

Trying to make a little helper tool for an online game that I play. The game
has a very complex crafting system, and I'm trying to put together something
to allow me to select an item I can craft and find out:
a) all the things I need to make that item, all the way back to the raw
materials, and
b) all the things I can then make from that item.

I've accomplished (b) no problem. Works beautifully. I can accomplish (a)
back one step. Then I try to make that recursive to step all the way back to
the beginning of the sequence and it throws a 500 null error. So I did
some reading and found out that this is an error that means something has
gone wrong so fundamentally early in the code that it doesn't even know how
to display the error. I found a suggestion of putting a cfflush just after
the application setting, but that hasn't helped.

Here are the two functions at play here. If someone can give me any
suggestions about what I may have done wrong, I'd be very grateful.

cffunction name=downTree hint=Returns the details of everything
needed to make an item access=public returntype=array output=no
cfargument name=aItems type=array required=no default=

cfscript
var result = arrayNew(1);
var i = 1;
var qItem = ;

qItem = getItemMadeBy(aItems[1].id);

if (qItem.recordcount) {
result[1] = structNew();
result[1].id = qItem.id;
result[1].item = qItem.item;
result[1].skill = qItem.skillname;
result[1].makes = arguments.aItems;

downTree(result);
}
/cfscript

cfreturn result
/cffunction

cffunction name=getItemMadeBy hint=Gets the items needed to make a
given item access=public returntype=query output=no
cfargument name=item type=string required=no default=

cfquery datasource=#application.dsn# name=qResults debug=yes
result=qItemResult
SELECTi.id, i.item, s.skillname
FROMdi_item i
INNER JOIN di_itemItem ii ON i.id = ii.madeWithID
INNER JOIN di_skill s ON i.skill = s.id
WHEREii.itemID = cfqueryparam cfsqltype=cf_sql_integer
value=#arguments.item#
/cfquery
cfreturn qResults
/cffunction



I've removed the recursive call at the end of the first function so that you
can see the thing in (sort of) action at
http://frontandback.com.au/DarkIsles/index.cfm?do=main.craftTree - select an
item such as a wooden spool of thick thread (the last item in the list).
It will dump out all of the things that you can make from this item, and the
things you can make from those items and so on.It will also show the item
that the thread is made from. What I need is for it to go multiple steps
back, however.

Hope this all makes sense...

Cheers,

Seona.

-- 
You received this message because you are subscribed to the Google Groups
cfaussie group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/cfaussie?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
cfaussie group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to 
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/cfaussie?hl=en.