You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX 如何根据当前日期修改日历条目颜色

Oracle APEX预约日历过期条目灰色样式实现问题

需求说明

  • 在Oracle APEX中搭建了周度预约记录日历,已为不同预约类型配置专属显示颜色
  • 需要实现规则:当预约结束日期KRAJ_REZ早于当前日期(即预约已过期)时,对应日历条目自动显示为灰色

原有代码与问题原因

原有SQL查询逻辑如下:

select ID_REZ,
   POCETAK_REZ,
   KRAJ_REZ,/* This is the end date!*/
   NASLOV_REZ,
   case when NASLOV_REZ is not null then
      title || '(' || BR_OSOBA_REZ || ' x ' || NAZIV_USLUGE || ' na ' || BR_SATI_REZ ||  ' sata. Detalji:  ' || NASLOV_REZ || ' )' || '[Šifra rezervacije: '|| ID_REZ ||']'
   end as title,
   BR_OSOBA_REZ,
   BR_SATI_REZ,
   case
    when USLUGA_FK = 13    then  'apex-cal-red'
    when USLUGA_FK = 14 then  'apex-cal-orange'
    when USLUGA_FK = 15  then  'apex-cal-blue'
    when USLUGA_FK = 16 then 'apex-cal-green'
    when USLUGA_FK = 17 then 'apex-cal-lime'
    when KRAJ_REZ < CURRENT_DATE then 'apex-cal-grey'
end as CSS_REZ /* This is where i store my colors for each entry*/
  from REZERVACIJE
  JOIN USLUGA ON USLUGA_FK = ID_USLUGA
  where 
(nvl(:VRSTA_USLUGE,'0') = '0' or USLUGA_FK = :VRSTA_USLUGE)
order by POCETAK_REZ

原有代码无法实现预期效果的原因和推测完全一致:

Oracle SQL中CASE表达式采用顺序匹配逻辑,从上到下校验每个分支的条件,第一个命中的条件会直接返回对应结果,后续分支不再执行。
原有逻辑把过期判断的分支放在了服务类型颜色分支的最后,只要预约的USLUGA_FK匹配到13-17中的任意值,就会直接返回对应服务类型的颜色类,根本不会执行到最后的过期判断分支,导致过期预约无法应用灰色样式。

修复方案

调整CSS_REZ字段的CASE分支顺序,把优先级最高的过期状态判断放到最前面,只要预约过期,无论属于什么服务类型,都优先返回灰色样式;未过期的预约再按照服务类型匹配对应的颜色类。
修复后的完整SQL如下:

select ID_REZ,
   POCETAK_REZ,
   KRAJ_REZ,/* This is the end date!*/
   NASLOV_REZ,
   case when NASLOV_REZ is not null then
      title || '(' || BR_OSOBA_REZ || ' x ' || NAZIV_USLUGE || ' na ' || BR_SATI_REZ ||  ' sata. Detalji:  ' || NASLOV_REZ || ' )' || '[Šifra rezervacije: '|| ID_REZ ||']'
   end as title,
   BR_OSOBA_REZ,
   BR_SATI_REZ,
   case
    -- 最高优先级:过期预约统一返回灰色
    when KRAJ_REZ < CURRENT_DATE then 'apex-cal-grey'
    -- 未过期预约按服务类型匹配对应颜色
    when USLUGA_FK = 13    then  'apex-cal-red'
    when USLUGA_FK = 14 then  'apex-cal-orange'
    when USLUGA_FK = 15  then  'apex-cal-blue'
    when USLUGA_FK = 16 then 'apex-cal-green'
    when USLUGA_FK = 17 then 'apex-cal-lime'
    -- 可选兜底:没有匹配到任何规则时返回默认样式,避免CSS类为空
    else 'apex-cal-default'
end as CSS_REZ /* This is where i store my colors for each entry*/
  from REZERVACIJE
  JOIN USLUGA ON USLUGA_FK = ID_USLUGA
  where 
(nvl(:VRSTA_USLUGE,'0') = '0' or USLUGA_FK = :VRSTA_USLUGE)
order by POCETAK_REZ

注意事项

  • 编写CASE表达式时,业务优先级越高的判断条件,越要放在靠前的位置,避免被低优先级条件提前命中覆盖。
  • 兜底的ELSE分支可以根据实际项目的样式配置调整,不需要可以删除,但建议加上避免出现样式异常。
  • 如果后续需要新增其他高优先级样式规则(比如已取消预约的特殊样式、VIP预约高亮等),同样按照优先级顺序插入到CASE表达式的对应位置即可。

内容的提问来源于stack exchange,提问作者Fiki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:57:07