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
相关产品推荐
相关产品推荐

