2014-12-19 3 views
1

Я могу получить запрос окончен в промежуток времени, скажем, 1 часа - с шагом 15 минут ...Отображение CFQuery Результата Over Time Span

Я просто пытаюсь остановить отображение повторяющегося результата, когда первичный ключ является одна и та же.

ie: Если что-то начинается в 6:45 утра - и заканчивается в 8:00 утра - я только хочу, чтобы он пробежал DIV один раз, если первичный ключ (мастер-диск) тот же. И потом, если что-то еще в 8 утра с другим первичным ключом - чтобы охватить что ДИВ временные рамки и т.д. ...

Я созерцая cfloop или тому подобное - проверка, что освоена либо одинаковыми или различными/

Мысли о том, как это сделать ...

Код запроса работает отлично - как мой код отображения ... Изображение включено, чтобы дать представление о том, что я пытаюсь сделать.

Output

<cfloop index="incr" from="0" to="#loopreps#"> 
    <cfoutput> 

    Loopreps is thru the time spans of 15 mins... 

    <cfquery name="scht" datasource="#ds#"> 
Proper Query 
</cfquery> 

    <cfif scht.recordcount is not 0> 
    <cfset mid = #scht.masterid#> 
    This is where I am lost to hold it to only 1 result when spanning time 


    Proper Display Across Div Height Span once if MasterID is same 

    </cfif> 

    </cfoutput> 
    </cfloop> 
+1

Какая-либо конкретная причина, по которой вы используете CF для выполнения задачи? Вы не сказали, какие dbms вы используете, но такие базы данных, как SQL Server, делают эту задачу намного проще. Без необходимости запроса в цикле. – Leigh

+0

Сайт построен в ColdFusion. Интеграция с базами данных использует Access –

+2

В качестве базы данных настольных компьютеров, не предназначенной для многопоточных веб-приложений, Access действительно ограничивает ваши возможности. Если это вообще возможно, перейдите на SQL Server. Он намного более гибкий, а экспресс-версия бесплатна.Сказав это, вы все равно можете упростить его, имея вспомогательную таблицу, содержащую времена, с шагом в 15 минут. Просто присоединяйтесь к своей другой таблице к началу/концу. Полученный запрос будет содержать все необходимые вам интервалы. Затем форматируйте вывод запроса, как вам нужно. (Edit) Я использовал аналогичный подход в SQL Server, прежде чем CTE придет один. – Leigh

ответ

1

Я обычно ставлю значение мусора перед началом цикла.

<cfset CompareValue = "value that will never occur in real life"> 
<cfloop> 
<cfif FieldToCheck is not CompareValue> 
<cfset CompareValue = FieldToCheck> 
more code 
<cfelse> 
appropriate code, maybe nothing 
</cfif> 
</cfloop> 
+0

Это правильный метод. У меня только что был цикл для популяции времени. Я помещаю значение мусора вне моего другого цикла. Спасибо. Thx для понимания также для других вещей - но Cold Fusion/Access не имеет проблем с созданием/вытягиванием времени. –

2

С помощью тега CFLOOP вы можете циклически увеличивать время. Например, этот код выводит каждые 15 минут. Вы можете комбинировать петлю, подобную этой, с проверкой (Q of Q, возможно), чтобы извлечь доступность.

<cfloop index="tm" from="8:00 AM" to="5:00 PM" step="#createTimespan(0,0,15,0)#">  
    <cfoutput> <li>#TimeFormat(tm, "h:mm TT")#</li></cfoutput> 
</cfloop> 

Просто имейте в виду, что это хорошее решение для коротких итераций. Если вы выполняете длинные итерации, я бы установил атрибут «step» для переменной, а не вызывал функцию напрямую. Если действительно долго, я бы выбрал что-то еще. Думаю, что в течение нескольких дней он будет работать отлично. См. Этот пост на Interesting loop for date and time. Удачи!

+0

Прочитав связанную статью, мое первоначальное впечатление заключалось в том, что использование переменной вместо запуска createTimespan() каждый раз через цикл должно было устранить указанные проблемы производительности. –

3

Как отмечено в комментариях, в качестве базы данных для настольных компьютеров MS Access довольно ограничен. Такие базы данных предприятия, как SQL Server, предлагают гораздо больше возможностей для таких задач, как using CTE's.

Однако, чтобы предложить другую перспективу, вы также можете использовать вспомогательную таблицу раз. (Это был общий подход в SQL Server, до появления CTE). Вы можете легко заполнить таблицу пятнадцатью минутами, от 00:00 до 23:45, используя Mark's loop в качестве основы. Затем просто присоединитесь к этой таблице в запланированное время начала и окончания. (Для доступа требуется дополнительная скобка и производная таблица).

SELECT ti.IntervalTime 
     , s.StartTime 
     , s.EndTime 
     , s.AppointmentName 
FROM TimeInterval ti LEFT JOIN 
     (
      SELECT AppointmentName, StartTime, EndTime 
      FROM ScheduleTable 
      WHERE ScheduleDate = <cfqueryparam value="#someDate#" cfsqltype="cf_sql_timestamp">  
     ) s 
     ON ( 
      ti.IntervalTime >= s.StartTime AND 
      ti.IntervalTime <= s.EndTime 
     ) 
WHERE ti.IntervalTime >= <cfqueryparam value="#fromTime#" cfsqltype="cf_sql_timestamp"> 
AND ti.IntervalTime <= <cfqueryparam value="#toTime#" cfsqltype="cf_sql_timestamp"> 
ORDER BY ti.IntervalTime 

Результат будет содержать все интервалы и встречи в одном запросе, без необходимости циклизации. Затем вы можете вывести результаты, как вам нужно.

IntervalTime | StartTime | EndTime | Appointment Name 
06:00:00  |   |   | 
06:15:00  |   |   | 
06:30:00  |   |   | 
06:45:00  | 06:45:00 | 08:00:00 | Edge 
07:00:00  | 06:45:00 | 08:00:00 | Edge 
07:15:00  | 06:45:00 | 08:00:00 | Edge 
07:30:00  | 06:45:00 | 08:00:00 | Edge 
.... 
+1

Замечательный подробный ответ –

+0

Мой код доводит меня до этого да. Я просто пытаюсь отформатировать до 1 результата и размер div соответственно. Так что мне не трудно добраться до примера выше ... –

+0

Да, но используя 50+ запросов - * за запрос * - делать это крайне неэффективно. Это будет узким местом, если приложение имеет более нескольких пользователей. Гораздо эффективнее запускать один запрос. Затем используйте данные, чтобы определить, сколько интервалов назначается назначением. Например, простенький dateDiff («n»)/15 должен сказать вам об этом. – Leigh