![]() |
Un trigger que dispara un procedimiento que dispara un trigger...
Más que una pregunta es una duda. (es mi primera vez :D ) a ver:
Quiero manejar 2 tablas donde la inserción en la primera (co_detalleconsultas) causa la inserción en la segunda (ad_serviciosasignados) por medio de un procedimiento almacenado que genera el idservasig que al final del procedimiento se guarda en la 1ra tabla con un update. ¿ Este enfoque es viable y recomendable o mejor busco otra solución ? --- el código --- En un trigger after insert en co_detalleconsultas lanzo:
que llama al procedimiento
Que según (YO) cada vez que hay una consulta (de estetica) asigna la consulta (para efectos la pone en cuentas por cobrar - ad_serviciosasignados) y si se trata de un paquete (varias consultas = 1 asignación) aumenta el contador: secionesrealizadas = :ssecionesrealizadas +1 Al final ejecuta el código:
Que "Regresa" el sidservasig a al detalle de la consulta (para saber a que control se asignó) |
Resp
No voy a leer todo el codigo.
Pero si quieres usar recursion no se puede. |
Que en un trigger after insert ejecute un SP para agregar un registro a otra tabla, lo veo correcto.
Que ese SP modifique la primera tabla, eso ya no me parece lógico. Quizás deberías usar un trigger before Insert, así modificas campos en la primera tabla, y además lanzas la inserción en la segunda. El SP se supone está compilado... pero no me queda claro eso de hacer 2 inner joins cuando se va a ejecutar en un trigger, quizás fuera mejor usar una vista. Para este detalle me gustaría que otros foristas opinaran. Si ya tienes un trigger before insert de la primera tabla y no quieres modificarlo, siempre puedes usar el "position 1" Saludos |
Gracias por las respuestas :)
Primero debo aclarar que aunque parezca raro: ¡ funciona ! (yo mismo no lo creia) rastafarey: no es recursión La idea -simplificada- es: La primera tabla recibe los datos del cliente, luego de insertarlos (after insert) el servidor llama al procedimiento que pasa los datos correspondientes a otra tabla (en este proceso se genera el Nº de ID) y luego se envia (update) el Nº de ID a la primera tabla. Lepe: La idea de usar el before insert me parece interesante, pero considerando el caso: (la primera tabla guarda el servicio prestado y luego de "prestado el servicio" se llama al SP para que cree la cuenta por pagar) supongo que el resultado final sería el mismo, pero prefiero almacenar primero el servicio y luego crear la deuda. debo aclarar que no domino mucho la programación del lado del servidor en firebird (es mi 1ra applicación) así que el tema de las vistas ó usar el "position 1" escapan de mis conocimientos ...por ahora :cool: |
Todod el proceso se realiza en una transacción, por tanto, si una de las dos cosas falla, se deshace el proceso completo. Por eso no importa crear primero la deuda que el servicio, aunque como dices, parece lógico hacerlo al revés.
El "position 1" es un parámetro al tiempo de crear varios triggers after insert para una misma tabla, con ese parámetro indicas en qué orden deben ejecutarse esos triggers (no sé si tienes ya un trigger before insert o no). La vista, échale una ojeada ya mismo. Seguro que tendrás que hacer varios inner joins cuando quieres acceder a las tablas, con la vista, te evitas hacerlos. Ya puedes acceder a esta vista como si fuera una tabla más, con la peculiaridad de reunir información de varias tablas al mismo tiempo. Saludos |
Gracias lepe, no conocía las vistas, por lo que te entendí trabajan como una suerte de tabla "virtual", almacenando un select (complejo) para devolver los datos solicitados :cool:
Bueno a leer un rato... |
La franja horaria es GMT +2. Ahora son las 13:17:52. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi