Durante nuestro desarrollo en Oracle APEX, en varias ocasiones vamos a necesitar realizar cálculos en el frontend, ya sea sumas, restas, divisiones, multiplicaciones, concatenaciones, entre otros, además es muy probable que queramos traer datos de la base de datos para jugar con ellos o bien poderlos insertar en tiempo real sin que la página pase por una refresh.

Es ahí donde Oracle APEX nos brinda la posibilidad de modificar los valores de la sesión del usuario sin la necesidad de tener que usar javascript, para ello vamos a realizar un ejemplo de cómo hacerlo.

Tengo los siguientes 4 campos:

  • Monto Honorario
  • Monto Gasto
  • Inclusión IVA
  • Monto IVA

Lo que queremos hacer esque al elegir la opción Incluido, se dispare un evento que me realice el siguiente cálculo (Monto Honorario + Monto Gasto) * 12 / 100 y que lo muestre en el campo Monto IVA.

Cree un evento de tipo Change para el campo Inclusión IVA, y agregue un condición del lado del cliente de tipo javascript, esta condición será únicamente para verificar que los campos tengan un valor, no sean nulos y que la elección del combo box sea «Incluido»:

Código del Client-side Condition:

$v('P13_MONTO_HONORARIO') != ''
&& $v('P13_MONTO_GASTO') != ''
&& $v('P13_INCLUSION_IVA') == 'Incluido'

Luego en la sección de TRUE, cree un action de tipo Execute PL/SQL Code, luego en la sección de Settings debe asignar en items to submit los campos de Monto Honorario y Monto Gasto y en item to return debe asignar el item Monto IVA que es donde quiero que se muestre el resultado:

Lo siguiente es agregar el código PL/SQL para ejecutar el cálculo:

Declare
montoIVA NUMBER(10,2);
Begin
montoIVA := (:P13_MONTO_HONORARIO + :P13_MONTO_GASTO) * 12/100;
:P13_MONTO_IVA := montoIVA;
apex_util.set_session_state('P13_MONTO_IVA', montoIVA);
End;

Lo que hacemos es declarar la variable montoIVA, realizar el cálculo, luego asignar el valor de montoIVA al campo :P13_MONTO_IVA y por último asignar el valor de montoIVA a la sesión del usuario.

Nota: apex_util.set_session_state(‘ITEM NAME’, value) sirve para establecer el valor a nivel la sesión del usuario, sin este comando, al llamar el campo o hacer un submit, aparecería como nulo a pesar de aparecer el valor en la pantalla del usuario.

Guardamos la pantalla y realizamos la prueba de que cuando se elija Incluido en el combo box se ejecute el procedimiento:

De esta manera podemos realizar cálculos en el frontend de Oracle APEX sin tener que usar comandos como document.getElementById(«item»).value; de javascript y hacer el cálculo por medio de PL/SQL.

La principal ventaja esque con PL/SQL podemos realizar cualquier CRUD en la base de datos y traer diferentes tipos de datos dependiendo la elección del usuario y lo mejor en tiempo real, sin tener tiempos de carga; sé que en javascript también existe AJAX, sin embargo, tenemos que utilizar mucho más código para hacer lo mismo.

Luego de hacer el cálculo, podemos añadir algunos detalles, como que se presente un error utilizando la sección de FALSE del evento en el momento en que el usuario elija un opción del combo box pero que los campos de Monto Honorario y Monto Gasto estén en vacíos, para ello puede ver la siguiente documentación de Cómo mostrar mensajes de error personalizados en Oracle APEX

3 respuestas a «Cómo realizar cálculos matemáticos en el frontend de Oracle APEX utilizando PL/SQL en lugar de javascript»

  1. Muchas gracias por el aporte. Una pregunta: el calculo se da cada vez que el usuario ingrese un nuevo dato o se recalcula para la información ya existente?
    Gracias

    1. No, como el evento se creó para cuando se cambia el combo box de INCLUSION IVA, solo cuando ese cambie se actualizará, si lo desea puede añadirle un evento on change a los otros campos para que también funcione con esos.

  2. Muchas gracias, me propuse a aprender apex y con tu ejemplo logre hacer algo interesante que hace mas uso de pl/sql que de eventos, claro utilizando el evento de cambio del item que quería.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *