Gráficos Dinámicos y Visualización de Datos en Oracle APEX
Dashboards Inteligentes para Decisiones Reales

Search for a command to run...
Dashboards Inteligentes para Decisiones Reales

No comments yet. Be the first to comment.
El patrón para producción que ahora despliego en menos de 30 minutos — y por qué finalmente lo empaqueté.

A production pattern I now deploy in under 30 minutes — and why I finally packaged it.
Cómo resolvimos el caos de WhatsApp en las inmobiliarias mexicanas con componentes nativos de APEX y diseño intencional.

How we transformed a complex real estate workflow into a sleek, high-density productivity tool using native APEX components and intentional design.

Por qué el 'los empleados no tienen opción' es la mayor falacia del software empresarial, y cómo construir herramientas que los usuarios realmente amen.

La toma de decisiones en una organización depende de datos claros, precisos y visualmente entendibles. Oracle APEX ofrece capacidades integradas para transformar información operativa en gráficos dinámicos, dashboards interactivos y vistas analíticas que impulsan acciones empresariales.
En esta nueva entrega de APEX Insights, construiremos un dashboard profesional con énfasis en:
Este modelo aplica a múltiples escenarios:
APEX permite construir dashboards potentes sin necesidad de librerías externas, manteniendo seguridad, rendimiento y mantenibilidad.
Ya hemos cubierto Buenas Prácticas, Seguridad, UX, Rendimiento, Modularidad y Control de Versiones. Ahora nos enfocaremos en visualización de datos.
📝 Código Fuente: Puedes descargar el código completo de este artículo en nuestro repositorio de demos: 2025-12-02-dynamic-charts.
Los gráficos nativos de Oracle APEX se construyen sobre Oracle JET (JavaScript Extension Toolkit), un framework robusto soportado oficialmente por Oracle. Gracias a esta integración, puedes crear dashboards empresariales sin depender de librerías externas como ChartJS o ApexCharts.
No necesitas escribir JavaScript para configurar la mayoría de gráficos. Desde las propiedades de la región, puedes definir:
Oracle JET soporta:
Cada una de estas opciones es compatible con el Universal Theme, asegurando consistencia visual con tu aplicación.
Los gráficos se ajustan automáticamente a distintos tamaños de pantalla:
JET cumple con estándares AA/AAA:
Esto facilita implementar dashboards accesibles y alineados con políticas corporativas.
| Objetivo | Tipo de gráfico recomendado |
| Mostrar tendencia longitudinal | Líneas / Áreas |
| Comparar categorías | Barras / Columnas |
| Mostrar composición porcentual | Donut / Pie |
| Indicadores clave | Gauge |
| Jerarquías o proporciones internas | Treemap |
Regla profesional:
Elige el tipo de gráfico según el mensaje que quieras comunicar, no según el aspecto visual más llamativo.
Supongamos que deseas representar el total de ventas por mes durante el último año.
Consulta sugerida:
SELECT
TO_CHAR(order_date, 'YYYY-MM') AS periodo,
SUM(order_total) AS total_ventas
FROM orders
WHERE order_date >= ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), -12)
GROUP BY TO_CHAR(order_date, 'YYYY-MM')
ORDER BY periodo;
Características técnicas de esta consulta:
SELECT *,Esto reduce uso de recursos y acelera el render de tu dashboard.
Cuando un gráfico requiere personalización más detallada —por ejemplo, formato de tooltips, colores por condiciones o ajuste de tolerancias visuales— puedes extender las opciones de Oracle JET con JavaScript.
Ejemplo base:
function(options) {
options.valueFormats = {
decimal: 2,
prefix: "$"
};
options.chartArea = {
backgroundColor: "#ffffff"
};
return options;
}
Recomendación: Esta técnica potencia tus gráficos sin romper compatibilidad con futuras actualizaciones de Oracle APEX, ya que solo expandes configuraciones permitidas.
Oracle JET Charts son el núcleo visual de Oracle APEX. Cuando dominas:
tus dashboards dejan de ser complementos estéticos para convertirse en herramientas estratégicas.
Con esto claro, avanzaremos a la siguiente sección: construir el dashboard declarativo completo con filtros dinámicos, refresco AJAX y drilldown hacia el detalle.
Para ilustrar análisis del mundo real en Oracle APEX, diseñaremos un dashboard de ventas mensuales profesional impulsado por SQL optimizado, variables de enlace, componentes declarativos y visualizaciones nativas de Oracle JET.
Este dashboard incluirá:
Este modelo es totalmente adaptable a otros escenarios corporativos:
Con fundamentos sólidos, desbloqueas un entorno analítico escalable, mantenible y seguro.
El dashboard utiliza LOVs (Listas de Valores) para poblar los filtros. Estas deben ser eficientes, limpias y predecibles.
📌 Principios clave para el rendimiento de LOV:
SELECT *Propósito: Mostrar solo años disponibles en los datos.
Esto asegura que el dashboard refleje periodos de negocio reales y se mantenga alineado con el contenido de la base de datos.
Fuente SQL:
SELECT DISTINCT
EXTRACT(YEAR FROM order_date) AS d,
EXTRACT(YEAR FROM order_date) AS r
FROM orders
ORDER BY 1 DESC;
💡 Tip: Confirma que order_date esté indexado para mantener esta LOV rápida bajo alto volumen.
Propósito: Permitir segmentación de ingresos mensuales usando valores a nivel de región.
Fuente SQL:
SELECT
region_name AS d,
region_id AS r
FROM regions
ORDER BY 1;
💡 Los índices importan. Si las regiones se relacionan con las órdenes vía una tabla de mapeo, asegura que region_id esté indexado.
Esto ayuda a:
Esta consulta calcula totales mensuales agregados basados en los filtros seleccionados mientras asegura el uso adecuado de variables de enlace.
SELECT
TO_CHAR(order_date, 'YYYY-MM') AS period,
SUM(order_total) AS total_sales
FROM orders
WHERE EXTRACT(YEAR FROM order_date) = :P10_YEAR
AND (:P10_REGION IS NULL OR region_id = :P10_REGION)
GROUP BY TO_CHAR(order_date, 'YYYY-MM')
ORDER BY period;
🔷 Agregación por periodo de negocio
Usar YYYY-MM asegura agrupación lógica y ordenamiento.
🔷 Lógica de filtro flexible Si no se selecciona región, se incluyen todas.
🔷 Variables de enlace en todas partes
:P10_YEAR y :P10_REGION protegen contra inyección SQL y mejoran la reutilización de planes.
🔷 Dataset ligero Solo se retornan el periodo y la agregación total. Payload más pequeño = gráficos más rápidos.
Crea una nueva región de gráfico y aplica estos ajustes:
periodtotal_salesP10_YEAR y P10_REGIONAPEX y Oracle JET manejan automáticamente:
📌 Resultado: No se necesita JavaScript personalizado en esta etapa. Se produce un gráfico limpio y profesional usando capacidades declarativas seguras.
Previenen inyección SQL y ayudan a Oracle a reutilizar planes de ejecución.
Aplicaciones de alto tráfico demandan order_date y region_id indexados.
Solo retorna campos requeridos por el gráfico—esto acelera el renderizado y mejora la escalabilidad.
Las LOVs estáticas solo tienen sentido si los valores nunca cambian. De lo contrario, genéralas siempre desde datos de negocio.
Con consultas limpias, LOVs validadas y JET Charts configurados declarativamente, tu dashboard es ahora funcional, escalable y seguro.
En la siguiente sección, añadiremos:
Esto convierte tus gráficos en herramientas accionables en lugar de visualizaciones estáticas.
Con la consulta central y las LOVs en su lugar, es hora de dar vida al dashboard usando características nativas de Oracle APEX. En esta sección:
Este enfoque requiere cero SQL personalizado o lógica fuera de APEX, haciéndolo ideal para entrega rápida mientras se mantiene una estructura de nivel empresarial.
Crea dos items de página en la página del dashboard, ej., P10_YEAR y P10_REGION:
Estos valores alimentarán directamente la consulta del gráfico vía variables de enlace.
Cuando el usuario cambia un filtro, el dashboard debe refrescarse instantáneamente sin recargar la página.
Crear Acción Dinámica en P10_YEAR y P10_REGION:
ChangeAcción True: Refresh
📌 Resultado: Cada vez que cambia un valor de filtro, APEX re-ejecuta automáticamente el SQL del gráfico y redibuja el gráfico usando session state.
No se requiere JavaScript y el gráfico se mantiene seguro — las variables de enlace aseguran el manejo adecuado de valores.
Para transformar gráficos en analítica accionable, habilita la navegación drilldown.
Hacer clic en un mes en el gráfico redirige a los usuarios a un Reporte de Órdenes detallado.
Configura el destino:
20)En la sección Set Items:
period) a un item de filtro del reporte (ej. P20_PERIOD)APEX agrega y valida automáticamente el checksum de la URL para prevenir manipulación.
💡 Pro Tip: Si tu Reporte de Órdenes usa un filtro TO_CHAR(order_date, 'YYYY-MM'), coincidir el formato de la Etiqueta del Gráfico mantiene todo alineado.
Abajo está el SQL usado en el reporte destino:
SELECT
order_id,
customer_name,
order_total,
order_date
FROM orders
WHERE TO_CHAR(order_date, 'YYYY-MM') = :P20_PERIOD
ORDER BY order_date;
Todos los valores movidos entre páginas vía enlaces de gráficos heredan la seguridad de sesión de APEX. Los enlaces siempre llevan un checksum, previniendo manipulación de URL.
Las Acciones Dinámicas eliminan la necesidad de JavaScript personalizado y simplifican el mantenimiento.
Cuando la navegación drilldown y las consultas del dashboard comparten el mismo formato (YYYY-MM), la depuración y el análisis se vuelven más simples.
En este punto, el dashboard es:
Ahora que tenemos filtros declarativos, refresco AJAX y navegación drilldown, estamos listos para ir más profundo.
En la siguiente sección, verás cómo extender todo con:
apex.server.process()Ahora que el dashboard declarativo es totalmente funcional, lo llevaremos al siguiente nivel.
En entornos empresariales, es común:
Para estos casos, Oracle APEX provee todo lo necesario para implementar visualizaciones impulsadas por backend de forma segura.
En esta sección, aprenderás cómo:
apex.server.process() desde JavaScriptEste modelo híbrido mantiene a Oracle APEX declarativo, mientras PL/SQL maneja el trabajo pesado.
Crea un Proceso de Aplicación llamado: GET_SALES_DATA
Este proceso:
DECLARE
l_cursor APEX_EXEC.T_CURSOR;
l_period VARCHAR2(20);
l_total NUMBER;
BEGIN
-- Paso 1: Ejecutar SQL seguro con variables de enlace
l_cursor := APEX_EXEC.OPEN_CURSOR(
p_sql_statement =>
'SELECT
TO_CHAR(order_date, ''YYYY-MM'') AS period,
SUM(order_total) AS total_sales
FROM orders
WHERE EXTRACT(YEAR FROM order_date) = :P_YEAR
AND (:P_REGION IS NULL OR region_id = :P_REGION)
GROUP BY TO_CHAR(order_date, ''YYYY-MM'')
ORDER BY period',
p_bind_vars => APEX_EXEC.T_BIND_VAR(
APEX_EXEC.T_BIND_VAR_ROW('P_YEAR', :P10_YEAR),
APEX_EXEC.T_BIND_VAR_ROW('P_REGION', :P10_REGION)
)
);
-- Paso 2: Emitir respuesta JSON
APEX_JSON.OPEN_OBJECT;
APEX_JSON.OPEN_ARRAY('data');
LOOP
APEX_EXEC.FETCH_ROWS(l_cursor);
EXIT WHEN APEX_EXEC.LAST_FETCH_STATUS != 0;
l_period := APEX_EXEC.GET_VARCHAR2(l_cursor, 'PERIOD');
l_total := APEX_EXEC.GET_NUMBER (l_cursor, 'TOTAL_SALES');
APEX_JSON.OPEN_OBJECT;
APEX_JSON.WRITE('period', l_period);
APEX_JSON.WRITE('total_sales', l_total);
APEX_JSON.CLOSE_OBJECT;
END LOOP;
APEX_JSON.CLOSE_ARRAY;
APEX_JSON.CLOSE_OBJECT;
END;
✔ APEX_EXEC asegura seguridad: las variables de enlace se fuerzan en todas partes. ✔ La salida JSON es universal: gráficos, tablas, dashboards — todos pueden consumirla. ✔ La lógica se mantiene centralizada: nada está disperso a través de procesos de página. ✔ Alta escalabilidad: cualquier mejora futura va a la misma capa de API.
apex.server.process()Este ejemplo llama al proceso de forma segura y registra la respuesta.
// Llamada AJAX Segura a GET_SALES_DATA
apex.server.process(
"GET_SALES_DATA",
{
x01: $v('P10_YEAR'),
x02: $v('P10_REGION')
},
{
success: function(pData) {
console.log("Respuesta:", pData);
const mapped = pData.data.map(r => ({
period: r.period,
total: r.total_sales
}));
console.log("Datos Mapeados:", mapped);
},
error: function(jqXHR, textStatus, errorThrown) {
apex.message.clearErrors();
apex.message.showErrors([
{
type: "error",
message: "Falló la solicitud: " + errorThrown,
location: ["page"]
}
]);
}
}
);
En este punto, tienes:
Ahora posees la receta central para dashboards profesionales en Oracle APEX.
En la siguiente sección, cerraremos con recomendaciones estratégicas y referencias oficiales para continuar avanzando tus habilidades.
Con la arquitectura completa en su lugar — SQL optimizado, diseño declarativo, refrescos AJAX, APIs JSON y lógica PL/SQL segura — tu dashboard ya no es solo un elemento visual. Ha evolucionado a un activo analítico profesional.
Esta sección final consolida recomendaciones clave y provee material de referencia para fortalecer y refinar tu implementación de Oracle APEX.
apex.server.process() para llamadas AJAX seguras.APEX_EXEC para ejecución SQL con seguridad integrada.✔ Crea APIs PL/SQL estandarizadas por dominio: Finanzas, Ventas, Órdenes, Usuarios, etc.
✔ Almacénalas en Git con archivos .pks y .pkb separados.
✔ Mantén la salida JSON predecible — los dashboards rinden mejor con estructuras uniformes.
✔ Documenta la lógica del dashboard:
✔ Usa el mismo formato de periodo en todas partes (YYYY-MM) para simplificar drilldown y coincidencia.
✔ Encapsula todos los parámetros dependientes del entorno (esquemas, regiones, límites de datos) dentro de PL/SQL.
Los dashboards dinámicos en Oracle APEX van mucho más allá de gráficos y visuales.
Cuando combinas:
…logras una plataforma analítica madura diseñada para decisiones de negocio reales.
Este modelo híbrido no es experimental — es un patrón probado usado en entornos empresariales donde la precisión de datos, respuesta y mantenibilidad son no-negociables.
Tus dashboards se vuelven:
Y lo más importante, le dicen la verdad al negocio.
En la siguiente edición de APEX Insights, nos enfocaremos en:
Mejorando la Experiencia de Usuario en Oracle APEX Applications
Cubriremos:
Si tus dashboards son el cerebro analítico de tus aplicaciones, la UX es el rostro en el que tus usuarios aprenden a confiar.
Abajo hay fuentes confiables para continuar fortaleciendo tu conocimiento de visualización de datos dinámica en Oracle APEX:
Documentación Oficial de Oracle APEX — Visualización y Gráficos https://apex.oracle.com/en/learn/getting-started/charts/
Optimización de Rendimiento en Oracle APEX https://docs.oracle.com/en/database/oracle/application-express/latest/htmdb/optimizing-performance.html
API JavaScript de APEX — apex.server.process()
https://docs.oracle.com/en/database/oracle/application-express/latest/aexjs/apex-server-process.html
Referencia del Paquete APEX_EXEC https://docs.oracle.com/en/database/oracle/application-express/latest/aeapi/apex_exec.html
Oracle JET Cookbook https://www.oracle.com/webfolder/technetwork/jet/index.html
Código Fuente del Demo Descarga el código fuente completo de este demo en GitHub.
Construir dashboards de la manera correcta toma disciplina, pero la recompensa es enorme:
Sigue afilando tu oficio, sigue aprendiendo de la comunidad y sigue construyendo soluciones que reflejen excelencia.
Tus dashboards en Oracle APEX son más que gráficos — son insights en movimiento.
Ayudo a empresas a construir dashboards y aplicaciones escalables como esta. Si buscas acelerar tus proyectos, hablemos.
☕ Agendar una Llamada | 💼 Conectar en LinkedIn