2013-04-16 2 views
1

У меня есть ошибка при циклическом выполнении запроса с использованием cfloop.Ошибка с неопределенными переменными при циклировании по запросу

Когда я использую cfdump по запросу (внутри цикла, заметьте), я вижу все данные в порядке. Но когда я пытаюсь получить значение каждой переменной, как обычно, в cfloop, я получаю сообщение, в котором говорится, что они не определены. Затем я изменил каждую переменную, чтобы конкретно ссылаться на запрос, и теперь проблема в том, что переменная не определена в запросе. Вот код:

<cffunction name="writeCourses"> 
<cfargument name="recordset" required="yes" type="query"> 
    <cfif recordset.RecordCount NEQ 0> 
     <cfset temp = ""> 
     <cfoutput> 
     <cfloop query="recordset">  
     <!--- <cfdump var="#recordset#"> <cfabort/> ---> 

      <cfset temp = temp & "<strong>#recordset.courseType# #recordset.courseNum# "> 
      <cfif isDefined("recordset.courseTHM") AND recordset.courseTHM EQ 1> 
       <cfset temp = temp & "(#left(recordset.courseNum,3)#4) "> 
      </cfif> 
      <cfif isDefined("recordset.courseName")> 
       <cfset temp = temp & "#recordset.courseName# </strong><br>"> 
      </cfif> 
      <cfset temp = temp & "#recordset.courseDESC#<br>"> 
      <cfset temp = temp & "#recordset.courseHours#<br><br>"> 
     </cfloop> 
     </cfoutput> 
    <cfelse> 
     <cfset temp = ""> 
    </cfif> 
<cfreturn temp> 
</cffunction> 

Так как вы можете видеть, каждая переменная заключена в ## тегов. Первоначально ни один из них не был отправлен recordset., но они все еще не определены. И когда я раскомментирую теги cfdump и cfabort, они работают нормально, и я могу увидеть запрос recordset со всеми данными, как и должно быть.

С другой стороны, я использовал cfloop с запросом, который работает так, как ожидалось. Кроме того, я не писал этот код, мне нужно его изменить (автор уже не работает здесь).

Вот пример recordset отвала:

enter image description here

Сообщение об ошибке:
деталь: [пустая строка]
ErrNumber: 0
Сообщение: Элемент COURSETYPE не определено в Recordset.
Resolvedname: RecordSet

Линия ошибка:

<cfset temp = temp & "<strong>#recordset.courseType# #recordset.courseNum# "> 
    <cfif isDefined("recordset.courseTHM") AND recordset.courseTHM EQ 1> 
    <cfset temp = temp & "(#left(recordset.courseNum,3)#4) "> 
    </cfif> 
    <cfif isDefined("recordset.courseName")> 
    <cfset temp = temp & "#recordset.courseName# </strong><br>"> 
    </cfif> 

Это все одна строка:/

Хранимая процедура/функция вызова выше:

<cffunction name="getCoursesByDept"> 
<cfargument name="deptCode" required="yes" type="string"> 
<CFSTOREDPROC procedure="dbo.GetCourses"  datasource="WebCatalog"> 
    <CFPROCPARAM type="IN" dbvarname="@deptCode" value="#deptCode#" cfsqltype="CF_SQL_CHAR"> 
    <CFPROCRESULT name="result"> 
</CFSTOREDPROC> 
<cfinvoke method="writeCourses" recordset="#result#" returnvariable="output"> 
<cfreturn output> 
</cffunction> 
+1

Не могли бы вы показать нам вывод ' '(или, по крайней мере, часть его, показывающую набор записей)? –

+0

Добавьте несколько примеров сейчас. – mAlenius

+1

Какая переменная и строка также указывают на ошибку? Можете ли вы поделиться фактическим сообщением об ошибке? –

ответ

1

появляется Ваша проблема быть неспособным охватить. Вот ваши первые 4 строки:

<cffunction name="writeCourses"> 
<cfargument name="recordset" required="yes" type="query"> 
<cfif recordset.RecordCount NEQ 0> 
    <cfset temp = ""> 

Попробуйте так:

<cffunction name="writeCourses"> 
<cfargument name="recordset" required="yes" type="query"> 
<cfset var temp = ""> 
<cfif arguments.recordset.RecordCount NEQ 0> 

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

+0

Это сделало трюк; спасибо :) Я также добавил isDefined проверки для каждой переменной, которая могла бы помочь, а также. – mAlenius

+0

@mAlenius не использует 'isDefined()' use 'structKeyExists (struct, value)' вместо –

0

(В дополнение к комментариям Дэна ...)

Если [процедура] не может найти что-то он возвращает запрос, содержащий сообщение об ошибке (т.е. нет конечно не найден)

Тогда это означает, что столбец COURSETYPE не всегда существует в resultset, что и сообщение об ошибке. Если процедура возвращает любой результат, независимо от содержимого, код внутри блока cfif будет выполнен.Поскольку первая строка кода использует этот столбец, без проверки его существования, это приведет к точной ошибке, которую вы видите.

Кроме того, как я уже упоминал в комментариях, вам необходимо локализовать функциональные переменные result, output, temp, etectera. Недостаток var позволяет определять проблемы даже на той же странице, если вы повторно используете имена переменных. Поскольку @Dan предположил, что вы должны полностью охватить все переменные - в частности, функцию arguments.

(В стороне, я понимаю, что вы изменяете существующий код, но сообщение об ошибке должно действительно обрабатываться в CF, , а не внутри процедуры. Задача процедуры - просто вернуть данные. CF-код должен проверять recordCount и предпринять соответствующие действия, если записи не найдены.)

+0

Хранимая процедура просто возвращает пустой запрос, если ничего не найдено; Сначала я неправильно понял. – mAlenius

+0

Хм .. это не джив с ошибкой, которую вы описали ;-) Но рад, что она работает сейчас. – Leigh

 Смежные вопросы

  • Нет связанных вопросов^_^