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

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)
  )

关键优化点

  1. 去掉任务查询中冗余的EXISTS子查询,直接在JOIN后添加过滤条件,简化逻辑避免出错;
  2. 修正日期过滤条件中的错误,确保筛选逻辑正确;
  3. 给父节点补充start_date和end_date(取对应项目下子任务的最小开始日期和最大结束日期),解决NULL日期导致的渲染兼容问题;
  4. 保证父节点和子节点的过滤逻辑一致,避免出现父节点存在但子节点被全部过滤的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:10:00