Oracle APEX 22.2甘特图异常:添加过滤条件后图表变灰
Oracle APEX 22.2甘特图异常排查与解决
问题背景
在Oracle APEX 22.2中搭建活跃项目任务的甘特图,用于展示时间线及进度:
- 初始查询可正常渲染图表,但部分项目会显示不在指定日期范围内的任务;
- 给任务查询添加项目查询中的日期过滤条件后,图表整体变灰,但数据仍存在,hover时tooltip显示正常;
- 只要给任务查询添加任何AND条件都会触发该异常,尝试将查询转为视图后问题依旧。
初始查询
--Projects info SELECT PRO.PROYECTO_ID task_id, NULL parent_task_id, PRO.NOMBRE nombre_proyecto, PRO.NOMBRE task_name, NULL start_date, NULL end_date, NULL task_progress FROM PROYECTOS PRO WHERE PRO.ACTIVO = 'Y' AND EXISTS (SELECT 1 FROM TAREAS T WHERE T.PROYECTO_ID = PRO.PROYECTO_ID AND T.AVANCE != 100 AND ((T.FECHA_DESDE BETWEEN :P78_MIN_DATE AND T.FECHA_HASTA) OR (T.FECHA_HASTA BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (T.FECHA_DESDE < :P78_MIN_DATE AND T.FECHA_HASTA > :P78_MAX_DATE)) ) UNION ALL -- tasks info SELECT TAR.TAREA_ID task_id, PRO.PROYECTO_ID parent_task_id, PRO.NOMBRE nombre_proyecto, TAR.NOMBRE task_name, TAR.FECHA_DESDE start_date, TAR.FECHA_HASTA end_date, TAR.AVANCE task_progress FROM PROYECTOS PRO JOIN TAREAS TAR ON TAR.PROYECTO_ID = PRO.PROYECTO_ID WHERE PRO.ACTIVO = 'Y'
添加过滤条件后的查询
--Projects info SELECT PRO.PROYECTO_ID task_id, NULL parent_task_id, PRO.NOMBRE nombre_proyecto, PRO.NOMBRE task_name, NULL start_date, NULL end_date, NULL task_progress FROM PROYECTOS PRO WHERE PRO.ACTIVO = 'Y' AND EXISTS (SELECT 1 FROM TAREAS T WHERE T.PROYECTO_ID = PRO.PROYECTO_ID AND T.AVANCE != 100 AND ((T.FECHA_DESDE BETWEEN :P78_MIN_DATE AND T.FECHA_HASTA) OR (T.FECHA_HASTA BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (T.FECHA_DESDE < :P78_MIN_DATE AND T.FECHA_HASTA > :P78_MAX_DATE)) ) UNION ALL -- tasks info SELECT TAR.TAREA_ID task_id, PRO.PROYECTO_ID parent_task_id, PRO.NOMBRE nombre_proyecto, TAR.NOMBRE task_name, TAR.FECHA_DESDE start_date, TAR.FECHA_HASTA end_date, TAR.AVANCE task_progress FROM PROYECTOS PRO JOIN TAREAS TAR ON TAR.PROYECTO_ID = PRO.PROYECTO_ID WHERE PRO.ACTIVO = 'Y' AND EXISTS (SELECT 1 FROM TAREAS T WHERE T.TAREA_ID = TAR.TAREA_ID AND T.AVANCE != 100 AND ((T.FECHA_DESDE BETWEEN :P78_MIN_DATE AND T.FECHA_HASTA) OR (T.FECHA_HASTA BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (T.FECHA_DESDE < :P78_MIN_DATE AND T.FECHA_HASTA > :P78_MAX_DATE)) )
排查方向
- 父子节点完整性检查:如果过滤后某个父项目对应的子任务被全部过滤,APEX甘特图会因父节点孤立出现渲染变灰的情况。当前项目查询筛选了有符合条件子任务的项目,但任务查询再次过滤可能导致部分项目的子任务被清空。
- 日期过滤逻辑错误:原查询中
T.FECHA_DESDE BETWEEN :P78_MIN_DATE AND T.FECHA_HASTA是错误的,应该是T.FECHA_DESDE BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE,错误的条件会导致筛选结果异常,影响图表渲染。 - 父节点日期配置:初始查询中父节点的
start_date和end_date设为NULL,部分APEX版本对NULL日期的父节点渲染存在兼容问题,建议补充父节点的实际日期范围。 - 数据结构验证:导出过滤后的查询结果,确认父子节点的对应关系是否正常,避免出现父节点无匹配子节点的情况。
修复方案
修正后的完整查询
-- 项目(父任务)信息:取符合条件的项目,并计算项目的整体日期范围 SELECT PRO.PROYECTO_ID task_id, NULL parent_task_id, PRO.NOMBRE nombre_proyecto, PRO.NOMBRE task_name, MIN(TAR.FECHA_DESDE) start_date, MAX(TAR.FECHA_HASTA) end_date, NULL task_progress FROM PROYECTOS PRO JOIN TAREAS TAR ON TAR.PROYECTO_ID = PRO.PROYECTO_ID WHERE PRO.ACTIVO = 'Y' AND TAR.AVANCE != 100 AND ( (TAR.FECHA_DESDE BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (TAR.FECHA_HASTA BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (TAR.FECHA_DESDE < :P78_MIN_DATE AND TAR.FECHA_HASTA > :P78_MAX_DATE) ) GROUP BY PRO.PROYECTO_ID, PRO.NOMBRE UNION ALL -- 任务(子任务)信息:直接过滤符合条件的任务,去掉冗余的EXISTS子查询 SELECT TAR.TAREA_ID task_id, PRO.PROYECTO_ID parent_task_id, PRO.NOMBRE nombre_proyecto, TAR.NOMBRE task_name, TAR.FECHA_DESDE start_date, TAR.FECHA_HASTA end_date, TAR.AVANCE task_progress FROM PROYECTOS PRO JOIN TAREAS TAR ON TAR.PROYECTO_ID = PRO.PROYECTO_ID WHERE PRO.ACTIVO = 'Y' AND TAR.AVANCE != 100 AND ( (TAR.FECHA_DESDE BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (TAR.FECHA_HASTA BETWEEN :P78_MIN_DATE AND :P78_MAX_DATE) OR (TAR.FECHA_DESDE < :P78_MIN_DATE AND T.FECHA_HASTA > :P78_MAX_DATE) )
关键优化点
- 去掉任务查询中冗余的
EXISTS子查询,直接在JOIN后添加过滤条件,简化逻辑避免出错; - 修正日期过滤条件中的错误,确保筛选逻辑正确;
- 给父节点补充
start_date和end_date(取对应项目下子任务的最小开始日期和最大结束日期),解决NULL日期导致的渲染兼容问题; - 保证父节点和子节点的过滤逻辑一致,避免出现父节点存在但子节点被全部过滤的情况。
内容的提问来源于stack exchange,提问作者Matuteriv
相关产品推荐
相关产品推荐

