2011-01-13 46 views
0

我有一个执行存储过程并返回结果的搜索函数。如果没有结果,我想尝试再次使用更广义的搜索来运行该函数。于是,我把一个CFIF到我的代码 -我的递归方法调用有什么问题?

<cfif results.recordCount EQ 0 And Not arguments.searchForPotentialMatches> 
    <cfset arguments.searchForPotentialMatches = True /> 
    <cfinvoke method="thisMethod" argumentCollection="#arguments#" /> 
</cfif> 

基本上,如果没有结果,我还没有尝试过通用搜索,它应该再次调用此方法。然后,在该方法的开始,在调用存储过程之前,我检查searchForPotentialMatches是否为true,如果是,则推广搜索查询。

似乎有一个问题,虽然...当我尝试运行这个,它挂起 - 直到有一个存储过程超时。通过调试和输出变量,我已经能够看到它到达存储过程,然后试图执行它。但是,在这些重新运行更改之前使用原始函数,如果我执行常规搜索,然后在2个单独的调用中执行广义搜索,它将正确执行。所以我不确定为什么它失败时,我尝试以编程方式构建这个...我做错了什么?

+1

请发布整个函数调用。问题可能会或可能不在递归调用中。 – 2011-01-13 16:11:29

回答

0

这种感觉不公平......但问题与完全不同。递归调用可以正常工作,但在调用存储过程并导致存储过程挂起之前,还有另一个字段因功能检查而发生更改。对不起,感谢您的帮助!

2

真的可以是任何数量的东西。所有这些代码都是在cfc里面的吗?那个cfc是在一个持久的范围内,并且你已经正确地变化了所有的变量?

你可以在正常和一般条件下独立执行存储过程吗?

尝试粘贴更多的代码(包括首次调用存储过程),以便我们可以尝试追踪更多的数据流。

1

递归是:

  • 在理论上诱惑简单的屁股在实践中的痛苦 - 调试。
  • 通常需要散步树或遍历图,但是当没有时,没有。

因此,如你所写,我会失去递归,并顺序执行。如缺席要求@scrittler任何代码,我已经重写这样:

<cfcomponent output="false"> 
    <cffunction name="search" output="false" access="public" returntype="any" hint="I am called by the client"> 
     <!--- <cfargument/> tags ---> 
     <!--- what ever you need to do with the arg before actually searching ---> 
     <cfset var results = doSearch(argumentCollection=arguments)> 
     <cfif NOT results.recordcount> 
      <!--- whatever you need to change about the args to perform a generalized search ---> 
      <cfset var results = doSearch(argumentCollection=arguments)> 
     </cfif> 

     <cfreturn results> 
    </cffunction> 

    <cffunction name="doSearch" output="false" access="private" returntype="query" hint="I run the query"> 
     <!--- <cfargument/> tags ---> 
     <!--- results query (i.e. call to sproc)---> 
     <cfreturn results> 
    </cffunction> 
</cfcomponent> 
0

什么是功能标记您的访问属性,你给它留下功能无法调用自身价值?