Дублирование CFLOOP

У меня есть выпадающий список, который создается двумя циклами. Внутренний цикл генерирует последовательность чисел, то есть от 0 до 23. Внешний цикл - это цикл запроса, который выбирает правильное значение из 23 чисел на основе значений, хранящихся в моей базе данных.

Моя проблема здесь в том, что эти два цикла конфликтуют, что приводит к отображению чисел от 0 до 23 дважды. Как можно сохранить обе петли, но избежать этой проблемы? Эта проблема также вызывает проблемы при отправке формы, пытаясь отправить форму дважды и удаляя введенные пользователем данные.

Это мой код:

<select id="openHours#CountVar#" name="openHours#CountVar#">
 <cfloop query="doctorHours" >                
   <cfloop from="0" to="23" index="OpenHours"> 
   <option value="#openHours#"
      <cfif TimeFormat(doctorHours.openTime,'HH') EQ OpenHours AND CountVar EQ doctorHours.day > selected="selected"</cfif>>#OpenHours#</option>
   </cfloop>
  </cfloop>
</select>

Это мой CFDUMP для этого запроса

query
RESULTSET   
query
    CLOSETIME           DAY DOCTORID            OPENTIME
1   1970-01-01 16:00:00.0   4   2011041516290025478779  1970-01-01 10:00:00.0
2   1970-01-01 16:00:00.0   1   2011041516290025478779  1970-01-01 13:00:00.0
3   1970-01-01 16:00:00.0   2   2011041516290025478779  1970-01-01 13:00:00.0
CACHED  false
EXECUTIONTIME   0
SQL select doctorID, opentime, closetime, day from doctorBusinessHours where doctorID='2011041516290025478779' 

2 ответа

Решение

Вы должны вернуть только те часы, которые вам нужны, а затем выполнить цикл для создания выпадающего списка:

DATEPART(hh,yourdate) вернет часы для вашего значения datetime:

<cfquery name="doctorHours" datasource="#ds#">
    SELECT doctorID,DATEPART(hh,openTime) As OpenHours, DATEPART(hh,closetime) As CloseHours 
    FROM   doctorHours 
    WHERE  day = #CountVar#
    AND    doctorID='#docID#'
</cfquery>

ValueList преобразует результаты вашего запроса в список:

<cfset openTimesList = ValueList(doctorHours.OpenHours) />
<cfset closeTimesList = ValueList(doctorHours.CloseHours ) />

ListContains вернет индекс значения в вашем списке:

<select id="openHours#CountVar#" name="openHours#CountVar#">
    <cfloop from="0" to="23" index="OpenHours"> 
       <option value="#openHours#"
           <cfif ListContains(openTimesList,OpenHours) NEQ 0 > 
              selected="selected"
           </cfif>
       >#OpenHours#</option>
   </cfloop>
</select>

Вы можете использовать ту же стратегию для closeTimesList.

Хммм.... количество значений, отображаемых в приведенном выше коде, будет равно числу записей, возвращаемых запросом X 23. Если ваш запрос возвращает 2 записи, вы увидите 46 вариантов и так далее. Похоже, вы верите, что в запросе только 1 запись. Я хотел бы предложить, возможно, у него есть больше.

Попробуйте LIMIT 1 или TOP 1 в своем запросе - или используйте Maxrows (как предложено в комментариях)... но убедитесь, что вы знаете, что вы включаете, а что исключаете. Вы должны знать, почему ваш запрос не соответствует ожиданиям:)

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