Normalmente. durante el desarrollo de nuestras aplicaciones con Oracle APEX, es muy común que las nuevas pantallas se desarrollen de una forma estática, sin embargo, existe una forma en la que las opciones del menú las podemos autogenerar tomandolas de una tabla en la base de datos, veamos cómo hacerlo!
Primero debemos crear una tabla, le llamaremos CATEGORIA y le pondremos los siguientes campos:
- ID_CATEGORIA – NUMBER(10,0)
- NOMBRE – VARCHAR2(50) – Nombre de la categoría
- ICONO – VARCHAR2(100) – Aquí se pondrá el nombre del icono que tendrá la categoría
- IMAGEN – BLOB – Aquí podrémos cargar una imagen
- ATTRR_VALUE – VARCHAR2(70) – Son atributos para envíar a la página que llama la categoría
- NIVEL – VARCHAR2(10) – Sirve para colocar un subnivel de categoría, es lo que se hace cuando creamos una categoría parent que tendrá subcategorías
- TARGET – NUMBER(10,0) – Indicará el número de la página que llamará

Ahora vamos a ir a la sección de componentes compartidos y Navigation Menu:

Luego presionamos create:


En la siguiente página vamos a colocar el siguiente script, este nos permitirá llamar todos los campos creados previamente en el paso anterior:
select nivel as level_value , "NOMBRE" as label_value , 'f?p=&APP_ID.:'|| TARGET ||':'||:APP_SESSION||'::::' as target_value , 'NO' as is_current , "ICONO" as image_value , null as image_attr_value , null as image_alt_value from "CATEGORIA" order by ID_CATEGORIA asc;
Debemos tener en cuenta que en el campo target_value colocamos nuestro url de acceso a la página, siempre es necesario enviar :APP_SESSION para mantener la sesión del usuario, de lo contrario cada vez que quiera ingresar a una página del menú le pedirá nuevamente la contraseña, &APP_ID es el id de nuestra aplicación

De esta manera si llenamos los campos en nuestra tabla por ejemplo así:

Tendríamos un Navigation Menu de la siguiente forma:

Nota: En el campo ICONO, debe colocarse el nombre del icono de los que uno selecciona normalmente en los iconos de Oracle APEX, en el caso de que no se coloque uno, se pondrá una hoja en blanco, por ende si no queremos que aparezca un icono debemos colocarle el valor null al campo
En mi caso, yo solo tengo 2 páginas en mi aplicación, la 1 y la 3, por ende la mayoría de categorías me lleva a la 3 y otras a la 1.

De esta forma es como podemos hacer un Navigation Menu dinámico en Oracle APEX, ahora podemos crear un mantenimiento para la tabla CATEGORIA y así agregar, actualizar o borrar categorías sin tener que acceder a la consola de APEX.
Había hecho algo similar recuerdo para la versión 5.0… Excelente material. Un saludo desde Paraguay
Excelente mi estimado, faltaría un ejemplo de mostrar ciertas opciones de forma dinámica a través de permisos de acceso a usuarios de una tabla.
Saludos
Hola profesor!
Muchas gracias y claro, acá tengo la publicación sobre los schemas de autorización y autenticación dinámica desde tablas:
https://oracle-max.com/creando-un-schema-de-autenticacion-y-autorizacion-personalizada-en-oracle-apex/
Saludos!
Hola tengo una duda,
Hice un menú dinámico sin embargo cuando un módulo tiene submódulos al darle click al submódulo el menu hace como un submit a la pagina que se asigno y colapsa las opciones haciendo que se pierda en que modulo estoy, alguna idea del porque hace ese comportamiento?
Cuando es un menú estático no hace ese comportamiento.
Gracias saludos espero alguien pueda tener respuesta.
Hola Hiram,
Este menú no esta pensado para usar submenús de segundo o tercer nivel, sino solo menús estáticos de primer nivel, voy a realizar una documentación sobre como hacer un menú dinámico con submenús de segundo y tercer nivel esta semana, esté atento.
Saludos
Muchas gracias de todas formas lo solucione de esta manera null as is_current.
select
LEVEL as «level»,
NAV_NAME as «label»,
decode( connect_by_isleaf, 0, »,’f?p=&APP_ID.:’
|| TO_CHAR(PAGE_NO)
|| ‘:&SESSION.:::::’
) target,
—-> null as is_current,
decode(nvl(ICON_IMG, ‘A’), ‘A’, », ICON_IMG) image,
PAGE_NO,
PARENT_ID as id_padre,
NAV_ID as id_menu,
PAGE_NO as num_pagina,
NAV_ID AS MENU
from
NAVIGATION_MASTER nav
WHERE NAV_ID in (
SELECT
ID_MENU
FROM
MENU_ROL_T
start with
PARENT_ID is null
connect by
prior NAV_ID = PARENT_ID
order siblings by NAV_ID asc
una duda sobre esta pagina ¿Cómo hago para que me notifiquen de alguna respuesta en esta plataforma???
Suscríbete! abajito al final de la página esta la sección para suscribirse 😀
Yo también quedo atento. Estoy buscando como hacer eso y no doy con la solución. Gracias por tus materiales
gracias por esa ayuda.. estoy pendiente..
Saludos