Как выйти из Cfoutput

#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>