#coldfusion #cfoutput
#coldfusion #cfoutput
Вопрос:
Я просматриваю результаты запроса, и мне нужно ограничить количество отображаемых строк. Мне нужно использовать cfoutput
, потому что я использую group
атрибут, и я не могу использовать maxrows
, потому что будут отображаться не все строки.
Я пытался использовать <cfbreak>
внутри <cfoutput>
, но это выдает ошибку.
Как я могу выйти из <cfoutput>
цикла?
Комментарии:
1. cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/…
2.
cfoutput
немного похоже на отель Calfornia. AFAIK, нет элегантного способа выйти из него раньше. Если вы используете базу данных, такую как MS SQL 2005, я бы предложил ограничить строки в SQL, а не cfoutput.3. Не можете ли вы «сгруппировать по» в своем запросе, чтобы исключить ошибки, а затем просто использовать cfloop, из которого вы можете выполнить cfbreak?
4. Я не использую группу для удаления дубликатов, я использую ее для их группировки. но я показываю группу только в том случае, если в ней более одной строки.
5. @Yisroel — Re: «если в нем более одной строки». Почему бы просто не отфильтровать это в вашем sql? Кроме того, какую базу данных вы используете?
Ответ №1:
Если ваша group by предназначена только для удаления дубликатов из ваших результатов, я бы предложил использовать ваш запрос, чтобы сократить их, тогда вы можете cfloop (выберите distinct и уменьшите возвращаемый список столбцов).
Если вы используете свою group by для «группировки» своих результатов, вы можете запустить счетчик в своем цикле и оператор cfif внутри вашего первого цикла, чтобы пропустить последующие результаты.
Вы можете подделать параметр group by в вашем cfloop, сопоставив значение из предыдущей строки, если вам нужен cfbreak
<cfloop query="queryname">
<cfif queryname.column[currentrow-1] neq queryname.column[currentrow]>
#queryname.column#
</cfif>
</cfloop>
Случайное примечание: вы можете использовать maxrows на любом / всех уровнях вашего сгруппированного cfoutput
<cfset tmp = querynew('id,dd')>
<cfloop from="1" to="20" index="i">
<cfset queryaddrow(tmp,1)>
<cfset querysetcell(tmp,'id',rand(),i)>
<cfset querysetcell(tmp,'dd',(i mod 4),i)>
</cfloop>
<cfquery dbtype="query" name="tmp">select * from tmp order by dd</cfquery>
<cfoutput query="tmp" group="dd" maxrows="2">#dd#<br
<ul>
<cfoutput maxrows="2" group="id"><li>#id#</li></cfoutput>
</ul>
</cfoutput>
Комментарии:
1. Ах! Maxrows! Я знал, что это было там, но не думал об этом использовании. Отлично!
2. Супер плюс один для maxrows на любом уровне cfoutput! Это отличная часть знаний.
Ответ №2:
Вы можете использовать тег cfthrow для запуска исключения, которое позволит вам выйти из цикла с помощью cfcatch. затем вы можете игнорировать исключение и продолжить обработку. Это даст вам то, что вы хотите.
<cftry>
<cfset i = 0>
<cfoutput query="qMyQuery" group="someGroup">
<cfset i = i 1>
Parent
<cfoutput>
Child
</cfoutput>
<cfif i GTE 10>
<cfthrow type="break">
</cfif>
</cfoutput>
<cfcatch type="break">
<!--- DO NOTHING - THIS IS A HACK FOR NOT BEING ABLE TO USE CFBREAK inside cfoutput. --->
</cfcatch>
</cftry>