Ошибка с неопределенными переменными при зацикливании запроса

У меня ошибка при зацикливании запроса с помощью 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 свалка:

Сообщение об ошибке:
Деталь: [пустая строка]
ErrNumber: 0
Сообщение: Элемент COURSETYPE не определен в ЗАПИСИ.
Разрешенное имя: 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>

2 ответа

Решение

Похоже, ваша проблема заключается в неспособности достичь цели Вот ваши первые 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>

Различия заключаются в использовании ключевого слова var для локальной переменной temp и добавлении области аргументов в переменную набора записей.

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

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

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

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

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

Другие вопросы по тегам