2011-01-13 76 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

什麼是功能標記您的訪問屬性,你給它留下功能無法調用自身價值?