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:

Le colocamos un nombre a nuestro nuevo Navigation Menu

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.

9 respuestas a «Cómo crear un Navigation Menu dinámico en Oracle APEX 20.1»

  1. 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

  2. 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.

    1. 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

      1. 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???

Deja una respuesta

Tu dirección de correo electrónico no será publicada.