Comunidad Oracle Hispana

Ejecutar procedimientos almacenados o querys personalizados mediante un boton en APEX Oracle

Estimados (as),

Estoy haciendo una aplicación en APEX, quisiera poder ejecutar mis procedimientos almacenados desde un botón, lastimosamente no estoy pudiendo hallar la forma de ejecutarlo desde el mencionado botón y menos el poder pasarle un parámetro, por ejemplo una fecha.

Alguien tiene alguna guía de como adjuntar en un botón el procedimiento almacenado?.

Cuando creo el botón tengo las siguientes opciones:

Name, Label, Display, Text, Display Attributes, Conditions, Authorization

He intentado selecionando las opciones de Text y Conditions, pero ninguna me ha funcionado.

Alguien podría darme una guía de cómo programar el botón para ejecutar un procedimiento o un query?.

 

 

Gracias por la ayuda,

Saludos

Jaime

Etiquetas: Apex, Fomularios

Visitas: 2257

Responde a esto

Respuestas a esta discusión

Hola Jaime

 

Voy a darte un ejemplo de como se hace de un tema general, porque desconozco la naturaleza de tu aplicación y el propósito de tus procedimientos.

 

Suponte que quieras alterar un indicador en tu tabla de pagos para que el sistema "sepa" que ese pago está aprobado: los que necesitas es hacer un update en la tabla para el renglón que corresponde al pago que vas a aprobar. Para hacer eso con un botón, primero debes crear un procedimiento llamado "APROBAR_PAGO", por lo que vas a la página, al sector de "procesamiento de página y pides crear un nuevo proceso (Bloque Anónimo PL/SQL).

 

Allí escribe el código, por ejemplo:

 

DECLARE
l_aprobar_ot NUMBER;
BEGIN
UPDATE   ORDENTRABAJO OT
SET      OT.APROBACION = :P1_USER_ID, OT.ESTADO = 2, OT.RECHAZO = NULL
WHERE    OT.ORDEN_ID = :p45_orden_id;
END;

 

Luego vas a procesamiento condicional, y ahí seleccioná que se dispare el proceso cuando se oprima el botón que creaste para tal propósito

 

Hasta ahí te va a funcionar, pero si tu programa difiere mucho y esto no te sirve, envianos info adicional

 

Saludos, Marcelo

Estimado Marcelo,

Gracias por tu respuesta, lastimosamente no me funciona para lo que deseo hacer.

Te explico en detalle:

1.- Estoy insertando datos en una tabla(A) desde otra(B), y no envio ningun parametro.

2.- Luego utilizando un merge actualiza una tercera tabla (C) o inserta los valores que no existan en la tabla C.

Como ejemplo adjunto el query que quisiera dispare el boton para el primer caso.

"insert into TablaA
select b.numero_orden,
'03000',
'00',
b.r_nombre||' '||R_paterno||' '||R_materno,
instituciones.et,
instituciones.agencia,
b.numero_orden,
'REMI',
'R',
'U',
b.R_cantidad,
(b.r_cantidad * comisiones.PORCENTAJE_uno)/100 + COMISIONES.COMISION_uno as uno,
(b.r_cantidad * comisiones.PORCENTAJE_dos)/100 + COMISIONES.COMISION_dos as dos,
(b.r_cantidad * comisiones.PORCENTAJE_tres)/100 + COMISIONES.COMISION_tres as tres, 
'1',
b.fecha_pago
from tablab, instituciones, comisiones
where
b.ubicacion_codigo = instituciones.codigo_ria and
b.estatus = 'Paid' and
comisiones.producto = 'DEM' and
b.r_cantidad between comisiones.monto_minimo and comisiones.monto_maximo

group by

b.numero_orden, '03000', '00', b.r_nombre||' '||R_paterno||' '||R_materno, instituciones.et, instituciones.agencia, b.numero_orden, 'REMI', 'R', 'U', b.R_cantidad, '1', ria.fecha_pago
order by b.numero_orden; "

Muchas gracias de antemano.

Jaime

Hola Jaime.

 

Recuerda que Apex es para los que no somos programadores!

 

No quiero entrometerme en tu código, pero te pregunto sólo para curiosear:

 

Veo que en tu from estás usando tablab (intuyo que sería alias "b", pues sino no funciona la consulta), instituciones, comisiones y no utilizas joins sino relaciones entre tablas dentro del "where", pero no veo una relacion directa entre instituciones y comisiones lo que podría dar un producto parcialmente cartesiano.

 

El tema con esto simplemente es que me marea un poco, cada quien debe escribir su sql como le sea cómodo

 

Es un poco obvio preguntarte si la consulta funciona, ¿verdad?

 

Lo que te estaba aconsejando yo, era crear un PROCESO PL/SQL (dentro de esa pagina de apex), y lo que vos tenés es una SENTENCIA DML (insert)

 

Por lo que yo se, puedes convertir una sentencia DML en un proceso, agregándole antes del "insert into" los renglones

 

DECLARE;
BEGIN

...

a continuacion tu código dml

...

y finalmente otro renglón conteniendo

...

END;

La existencia del proceso pl/sql que debes crear disparado por hacer clic en el botón es todo lo que necesitas

 

Saludos

Jaime Alvaro Peredo Botello dice:

Estimado Marcelo,

Gracias por tu respuesta, lastimosamente no me funciona para lo que deseo hacer.

Te explico en detalle:

1.- Estoy insertando datos en una tabla(A) desde otra(B), y no envio ningun parametro.

2.- Luego utilizando un merge actualiza una tercera tabla (C) o inserta los valores que no existan en la tabla C.

Como ejemplo adjunto el query que quisiera dispare el boton para el primer caso.

"insert into TablaA
select b.numero_orden,
'03000',
'00',
b.r_nombre||' '||R_paterno||' '||R_materno,
instituciones.et,
instituciones.agencia,
b.numero_orden,
'REMI',
'R',
'U',
b.R_cantidad,
(b.r_cantidad * comisiones.PORCENTAJE_uno)/100 + COMISIONES.COMISION_uno as uno,
(b.r_cantidad * comisiones.PORCENTAJE_dos)/100 + COMISIONES.COMISION_dos as dos,
(b.r_cantidad * comisiones.PORCENTAJE_tres)/100 + COMISIONES.COMISION_tres as tres, 
'1',
b.fecha_pago
from tablab, instituciones, comisiones
where
b.ubicacion_codigo = instituciones.codigo_ria and
b.estatus = 'Paid' and
comisiones.producto = 'DEM' and
b.r_cantidad between comisiones.monto_minimo and comisiones.monto_maximo

group by

b.numero_orden, '03000', '00', b.r_nombre||' '||R_paterno||' '||R_materno, instituciones.et, instituciones.agencia, b.numero_orden, 'REMI', 'R', 'U', b.R_cantidad, '1', ria.fecha_pago
order by b.numero_orden; "

Muchas gracias de antemano.

Jaime

Estimado Marcelo,

Muchas gracias por tus observaciones.

Si el Query esta funcionando, desde el SQL Commands y desde la consola de Oracle.

Disculpa, al tratar de dar mas informacion suprime algunas lineas del query porque es bastante largo, es una sentencia DML.

Tengo ahora mi segunda duda, he definido ya un boton (P1_boton), disculpa que sea tan "molestoso" pero la verdad ando liado ya con APEX al tratar de finalizar mi aplicacion, tengo las siguientes opciones en mi boton, cual de ellas es donde debo definir mi proceso PL/SQL.

Porque intente haciendo una prueba sencilla en la opcion que muestro en el "screenshot1", en la pestana "Texto" en el recuadro "

Exception

 When Others then

   mensaje;

End;

 

Muchas gracias por tu tiempo y paciencia.

Saludos

Jaime

Archivos adjuntos:

Jimmy: nunca lancé un procedimiento desde un botón, lo que no quiere decir que no funciona.

 

Mi método es ver de qué manera si funciona, y si me gusta no sigo probando cosas.

 

Lo que querés hacer es meter el código de dml dentro del botón. Lo que te propuse fue crear un procedimiento del tipo pl/sql por separado, con el códilo de tu insert. Eso funciona perfectamente. Luego dentro de las propiedades del procedimiento (se crea con un asistente muy simple) le decís que la condición de ejecutar el procedimiento (no la condición de mostrar el botón) es que se ejecute al pulsar el botón P1_boton (lo vas a encontrar dentro de una lista de todos los botones de la página)

 

Insiste y lo conseguirás

@Jaime.

No es más sencillo poner un trigger para que consolide los datos automáticamente?.

 

@Marcelo

Los queries en Oracle se pueden escribir asi listando las tablas y uniendolas con where, el plan resultante es un join, igual que si utilizaras la sentencia (INNER JOIN).

Hola Fernando. Uno de mis próximos temas del blog será precisamente lo de tener que aprender el join al estilo ansi, y también al estilo Oracle, con la complicación que el join cuando es "left" significa el signo (+) del lado "right" en el where. Lo que le comentaba a Jaime era precisamente la ausencia de dicha union dentro de los "wheres"

 

Aprovecho tu intervención en la discusión, para ver si podremos conseguir ser más eficientes en la ayuda al prójimo, porque me parece que estamos fracasando muchas veces porq las preguntas no las interepretamos y nuestras respuestas parece que no son tan útiles (disculpa si te parece que no es así)

 

Tomando como experiencia el foro (Apex en este caso) de otn, y comparando, salvando las distancias, veo que allí existe bastante rigor en la forma en que debe consultarse una duda, por ejemplo no se aceptan consultas en otro idioma que el inglés, es una norma no escrita primero hacer una búsqueda en el foro para encontrar consultas similares (muchas veces encontré la respuesta contestada), y algo que me parece muy sensato es contar con un workspace en apex.oracle.com donde publicar la aplicación para que en caso de encontrarnos con tiempo y ganas, meternos a ver el problema "en vivo" y respondamos de primer intento, lo que significa menos dedicación para nosotros y menos espera para quien está preguntando.

 

De otra manera creo que terminaremos respondiendo una de cada 3 consultas, de las que una de cada tres estará más o menos bien, y para ese momento quien consulta lo habrá resuelto de otra manera.

 

No comento esto de aguafiestas sino porque me interesaría que nuestros foros se categorizaran, y que cuando los no hispanos nos comiencen a consultar debido a nuestra reconocida solidez técnica, les respondamos "Hi Michael, post in spanish, please"

 

Me intersaría sacar una idea común entre todos los "cráneos"

 

Saludos

 

Fernando J. Andrade dice:

@Jaime.

No es más sencillo poner un trigger para que consolide los datos automáticamente?.

 

@Marcelo

Los queries en Oracle se pueden escribir asi listando las tablas y uniendolas con where, el plan resultante es un join, igual que si utilizaras la sentencia (INNER JOIN).

Hola Marcelo,

 

Gracias por tu respuesta, la verdad que lo que pregunte creí que era algo sencillo en Apex pero se ha vuelto una de buscar y dar vueltas por todo lado sin sentido.

Aun sigo buscando una solución, para poder desplegar mi aplicación, puesto que ejecutando mis querys y procedimiento todo anda bien, pero claro no le puedo pedir a un usuario que vaya haciendo eso.

Saludos

Hola,

Tratando de hallar alguna solucion a mi dilema, me halle con esta opcion:

 

 

 

 

cuando trato de darle el nombre de mi procedimiento me aparece el error que se muestra en la imagen, que podra ser?.

Saludos

Responder a debate

RSS

© 2014   Creado por Fernando Garcia.

Insignias  |  Informar un problema  |  Términos de servicio