Как я могу вставить дату истечения срока действия в таблицу, и срок действия сообщений истекает без нарушения функциональности? - PullRequest
0 голосов
/ 24 марта 2011

Я использую Coldfusion 9,0,0,251028 в 64-разрядной версии Windows 7 с базой данных Microsoft Access 97.

Код предназначен для приложения, которое берет отправленное сообщение из формы и публикует его на другой странице (Breaknews.cfm). Значения формы вставляются в таблицу «news» в базе данных, включая дату отправки сообщения (mes_dat) и дату его истечения (exp_dat).

В базе данных столбцы is_current и display имеют значение по умолчанию, равное 0.

Действие формы new_process.cfm, которое выполняет две функции:

1) Имеет ли <cfset expdate = createdate(end_year, end_month, end_day)>. End_year, end_month и end_day - выпадающие селекторы, которые устанавливают дату истечения срока действия. Проблема, с которой я столкнулся, заключается в том, что expdate не может быть вставлен post_breaking.cfm, но только когда он помещен в сеть, на моем локальном тестовом сервере, похоже, нет проблем.

2) Включает шаблон с именем "post_breaking.cfm", который выполняет следующие запросы:

<cfquery name="get_init_info" datasource="#db#">
select id
     from news
     where is_current = 1
</cfquery>



<cfquery name="update_info_1" datasource="#db#">
update news
     set is_current = 0, scrollshow = 0
</cfquery>


<cfif get_init_info.recordcount NEQ 0>


    <cfquery name="update_info_2" datasource="#db#">
     update news
        set display = 1
        where id = #get_init_info.id#
    </cfquery>

</cfif>


<cfquery name="put_in_info" datasource="#db#">
  insert into news
  (is_current, display, mes_dat,mes_tim,mes_sub,mes_text,scrollshow, exp_dat)
  values
  (1,0, #createodbcdate(now())#, #createodbctime(now())#, '#subject#', '#message#',1, #expdate#)
</cfquery>

Это сообщение затем отображается на BreakingNews.cfm, если столбец is_current в таблице новостей равен 1. Это код, который я унаследовал, поэтому я не уверен, как он это делает, но код допускает только 5 сообщений в время для is_current = 1.

Часть, которую я пытаюсь осуществить, - это выполнение запроса при загрузке breaknews.cfm, который проверяет, находится ли exp_dat между now () и mes_dat, чтобы установить is_current в 1, при этом сохраняя только 5 элементов, имеющих is_current, равный 1 .

При обращении к Breaknews.cfm он выполняет следующие запросы:

<cfquery name="get_info" datasource="#db#">
select *
     from news
     where
         <cfif not isdefined("id")>
         is_current = 1
         <cfelse>
         id = #id#
         </cfif>
    order by mes_dat desc, mes_tim desc
</cfquery>

<cfquery name="add_exp" datasource="#db#">
   UPDATE news
   SET is_current = 1
   WHERE now() BETWEEN mes_dat AND exp_dat
</cfquery>

<cfquery name="remove_exp" datasource="#db#">
   UPDATE news
   SET is_current = 0
   WHERE now() NOT BETWEEN mes_dat AND exp_dat
</cfquery>

Это приведет к тому, что сообщения, имеющие exp_dat между now () и mes_dat, будут отображаться, а в противном случае не будут отображаться на breaknews.cfm.

Однако при отправке нового сообщения при первом доступе к Breaknews.cfm отображается только вновь отправленное сообщение.

Если страница обновлена, сообщения, которые были отфильтрованы правильно, будут отображаться под новым сообщением, но теперь на странице будет отображаться шесть элементов, а их должно быть только пять.

Как получить правильное количество сообщений, чтобы они отображались в первый раз без обновления?

Я получил совет заменить запрос get_init_info на

<cfquery name="get_init_info" datasource="#db#">
select id
     from news
     where exp_dat > now()
</cfquery>

но это привело к тому, что все остальные строки в is_current и scrollshow были изменены на 0 после создания нового сообщения (хотя scrollshow и is_current нового сообщения равны 1).

1 Ответ

0 голосов
/ 24 марта 2011

Моя первая мысль состоит в том, чтобы изменить способ отображения новостей в системе, но, поскольку вы отказываетесь от контроля над этим, вот мое предложение. Помните, что я никогда не использовал Access, поэтому я использую синтаксис MS-SQ.

Получить идентификаторы 5 предметов, которые вы хотите

select top 5 id 
from bews 
where exp_date > #createodbcdate(now)#
    and display = 1

Теперь установите display = 0 для всех элементов.

Наконец, снова отобразите идентификаторы, которые вы нашли ранее.

update news
set display = 1 
where id in #valuelist(query, "id")

Если у вас есть вопросы или исправления, не стесняйтесь комментировать.

...