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
Vínculo permanente Respuesta de Marcelo Burgos el marzo 10, 2011 a las 2:17pm 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
Vínculo permanente Respuesta de Jaime Alvaro Peredo Botello el marzo 10, 2011 a las 3:26pm 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
Vínculo permanente Respuesta de Marcelo Burgos el marzo 10, 2011 a las 3:50pm 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_maximogroup 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
Vínculo permanente Respuesta de Jaime Alvaro Peredo Botello el marzo 10, 2011 a las 4:24pm 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
Vínculo permanente Respuesta de Marcelo Burgos el marzo 10, 2011 a las 8:39pm 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).
Vínculo permanente Respuesta de Marcelo Burgos el marzo 16, 2011 a las 7:05pm 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).
Vínculo permanente Respuesta de Jaime Alvaro Peredo Botello el marzo 17, 2011 a las 3:13pm 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
Vínculo permanente Respuesta de Jaime Alvaro Peredo Botello el marzo 17, 2011 a las 4:05pm Bienvenido a
Comunidad Oracle Hispana
© 2013 Creado por Fernando Garcia.