Рекурсивная функция в Coldfusion - PullRequest
2 голосов
/ 28 сентября 2010

Я пытаюсь создать рекурсивную функцию в Coldfusion и сталкиваюсь с некоторыми проблемами.

Вот логика, которая у меня есть:

<cffunction name="getEvents" access="private">
  <cfargument name="strtdate">
  <cfargument name="parentID" default=0>
  <cfqeury name="qry" datasource="db">
    select *
    from table
    where parentid = #parentid# and 
          starttime between #strtdate# and #DateAdd('d', 1, strtdate)#
  </cfquery>

  <cfset events = arraynew(1)>
  <cfloop query="qry">
    <cfset events[qry.currentrow] = structnew()>
    <cfset events[qry.currentrow].id = qry.id>
    <cfset subevents = getEvents(strtdate, qry.id)>
    <cfif arraylen(subevents)>
      <cfset events[qry.currentrow].subevents = subevents>
    </cfif>
  </cfloop>

  <cfreturn events>
</cffunction>

Проблема заключается в том, что, как только функция вызывает себя, она теряет исходный запрос в цикле.Сейчас у меня три уровня глубины, но я не хочу исправлять одно и то же закодированное снова и снова, чтобы обрабатывать все события.

Я хотел бы закончить с массивом структур, который содержит все события и вложенные события для данного дня.

Ответы [ 2 ]

10 голосов
/ 28 сентября 2010

Попробуйте var область видимости вашего объекта запроса. На самом деле вы должны использовать правильную область видимости в целом. Например:

<cffunction name="getEvents" access="private">
  <cfargument name="strtdate">
  <cfargument name="parentID" default=0>

  <cfset var qry = "" />
  <cfset var events = "" />
  <!--- etc. --->


  <cfquery name="qry" datasource="db">
    select *
    from table
    where parentid = #parentid# and 
          starttime between #ARGUMENTS.strtdate# 
    and #DateAdd('d', 1, ARGUMENTS.strtdate)#
  </cfquery>

  ... etc.

В противном случае все входит в область действия VARIABLES и перезаписывает другие, которые я подозреваю.

Надеюсь, это поможет!

PS: Вам также следует рассмотреть возможность использования <cfqueryparam /> в своих запросах.

3 голосов
/ 28 сентября 2010

Убедитесь, что вы изменяете область видимости ваших переменных, чтобы они оставались локальными для каждого вызова функции.

В вашей функции (вверху, если в CF8 или ранее):

<cfset var qry = ''>
<cfset var events = ''>
<cfset var subevents = ''>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...