2012-04-25 6 views
0

, пожалуйста, не обращайте внимания на это сообщение. Я сделал более ясный пример своей проблемы здесь: Error with CFLoop When Entries Are MissingОшибка CFLoop для отсутствующих записей

Я запускаю код CFLoop ниже.

<cfset data = queryNew("sid,firstname,lastname,age","integer,varchar,varchar,integer")> 
<cfloop index="x" from="1" to="50"> 
    <cfset queryAddRow(data)> 
    <cfset querySetCell(data,"sid",x)> 
    <cfset querySetCell(data,"firstname","#first[x]#")> 
    <cfset querySetCell(data,"lastname","#last[x]#")> 
    <cfset querySetCell(data,"age","#studentage[x]#")> 
</cfloop> 

<cfoutput query="data"> 
    #sid# - #firstnamet# #lastname# - #age#<br /> 
</cfoutput> 

Переменные first[x], last[x] и studentage[x] тянут из внешнего источника данных, с X является индекс цикла. Обратите внимание, что CFLoop имеет 50 записей.

Когда есть данные, код работает красиво. Однако, когда отсутствуют данные, код прерывается. Под этим я подразумеваю, что если в Entry 11 нет имени, указанного для переменной first[x], я получаю сообщение об ошибке по строкам "Element first is undefined. The error occurred on line 5

(строка 5 - это запись для имени).

Если это произойдет, я хочу пропустить запись 11 (и все другие записи, которые вызывают ошибку) из моих результатов и предотвратить отображение ошибки. Как я могу это сделать?

Уточнение: Укажите, что данные определены. Он становится немного волосатым, так как я использую внешний источник данных. Но я говорю, что появляются записи с 1 по 10. Когда наступает его ход 11, вот тогда и возникает ошибка.

+0

Где указаны первые, последние и учащиеся переменных? Похоже, вы создаете запрос с 50 строками одинаковых данных. Кроме того, вы зацикливаете запрос «данные», но затем отображаете переменные first, last и studentage вместо фактических столбцов запроса, которые являются именем, именем и возрастом. –

+0

ОК, я вижу, что происходит. Вы пытаетесь заполнить запрос w/переменную, которая не определена. Ошибка возникает при вызове querySetCell для первого имени, а не в строке внутри cfoutput. Нечего делать w/row в запросе, не имеющем данных, это должно быть сделано с учетом того, что вы не определили «первый», «последний» или «студент», но вы пытаетесь использовать их значения для заполнить запрос. –

+0

спасибо за ваш ответ Шон. эти переменные определены, я просто не включил в него этот фрагмент кода. Итак, я говорю, что, например, будут показаны записи с 1 по 10, но если в записи 11 будет отсутствовать первое имя, а затем появится ошибка CF. – Mike

ответ

1

Использование номера записи внешней базы данных в цикле должно предотвращать ошибки.

<cfloop index="x" from="1" to="#ExternalDatabaseQuery.RecordCount#"> 

Лучшее решение, если вы имеете запрос в памяти, будет использовать запрос запросов.

<cfquery dbtype='query' name='data'> 
SELECT SID, First AS FirstName, Last AS LastName, Age AS StudentAge 
FROM ExternalDatabaseQuery 
</cfquery> 
+0

Спасибо за это, но я не использую базу данных. Мой внешний источник данных - это XML-канал. Я уже пробовал аналогичный подход к # ExternalDatabaseQuery.RecordCount # раньше, но проблема состоит в том, что первые 10 записей имеют имя, фамилию и возраст ученика, но когда я добираюсь до входа 11, появляется имя, возраст, но нет имени. Затем запись 12 снова содержит всю информацию, но CFLoop застревает в записи 11 из-за отсутствующего имени – Mike

+0

Проверьте наличие переменной. . Может проверять каждую переменную или даже просто путать, когда она не определена, и т. Д. Множество вариантов зависит от того, как вы хотите продолжить. – Busches

+0

Также, если вы не используете фактическую базу данных, вы хотите уточнить исходный вопрос, так как вы говорите, что используете внешнюю базу данных, когда на самом деле вы перебираете что-то совсем другое. – Busches

1

Майк, извини, если я не понимаю, что тебе нужно, но казалось бы, что некоторые базовые условные обозначения могут выполнить эту работу. Следующее изменение вашего кода - это просто предложение о том, как это сделать (ваша полная база кода может диктовать что-то немного другое, конечно).

<cfset data = queryNew("sid,firstname,lastname,age","integer,varchar,varchar,integer")> 
<cfloop index="x" from="1" to="50"> 
    <cfif isDefined("first[x]") AND isDefined("last[x]") AND isDefined("studentage[x]")> 
    <cfset queryAddRow(data)> 
    <cfset querySetCell(data,"sid",x)> 
    <cfset querySetCell(data,"firstname","#first[x]#")> 
    <cfset querySetCell(data,"lastname","#last[x]#")> 
    <cfset querySetCell(data,"age","#studentage[x]#")> 
    </cfif> 
</cfloop> 

<cfoutput query="data"> 
    #sid# - #firstnamet# #lastname# - #age#<br /> 
</cfoutput> 

Основная проблема здесь (и, возможно, это не проблема для вас) заключается в том, что это приведет к выходу 50 ошибок. Итак, если есть 3 ошибки (т. Е. Данные не найдены), вы будете иметь 47 записей, а не 50. Если это проблема, добавьте комментарий ... есть несколько альтернативных подходов к обеспечению того, чтобы у вас всегда было 50 элементов вывод.

+0

извините, это моя ошибка , Я дал вам взнос за благодарность и сделал лучший пример, пожалуйста, смотрите здесь: http://stackoverflow.com/questions/10321272/error-with-cfloop-when-entries-are-missing – Mike

+0

Не беспокойтесь, Майк! Выберет новый вопрос. –