Ошибка с неопределенными переменными при зацикливании запроса
У меня ошибка при зацикливании запроса с помощью 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 и предпринимать соответствующие действия. если записи не найдены.)