Ver Mensaje Individual
  #1  
Antiguo 22-05-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Reputación: 22
sitrico Va por buen camino
Un trigger que dispara un procedimiento que dispara un trigger...

Más que una pregunta es una duda. (es mi primera vez ) 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:

Código SQL [-]
execute procedure ad_asignarserviciosprestados(new.idpaciente, New.idservicio);

que llama al procedimiento

Código SQL [-]
CREATE PROCEDURE AD_ASIGNARSERVICIOSPRESTADOS (
    aidpaciente integer,
    aidservicio integer)
as
declare variable sidservasig integer;
declare variable didservicio integer;
declare variable cidpaciente integer;
declare variable diddetcons integer;
declare variable scantidadsesiones integer;
declare variable ssecionesrealizadas integer;
declare variable lsesiones integer;
begin
  FOR
  Select  d.IDDETCONS, s.idservasig, d.IdServicio, d.IdPaciente, s.cantidadsesiones, s.secionesrealizadas, l.sesiones
  from co_detalleconsultas d
  left join ad_serviciosasignados S
  on d.idpaciente = s.idpaciente And d.idservicio = S.idservicio And
    (s.cantidadsesiones is null or s.cantidadsesiones > s.secionesrealizadas)
  join dg_listaservicios L On d.idservicio = l.idservicio
  Where d.IdPaciente = :aIdPaciente and d.IdServicio = :aidservicio
  -- variables para los resultados
  into :diddetcons, :sidservasig, :dIdServicio, :cIdPaciente, :scantidadsesiones, :ssecionesrealizadas, :lsesiones
     DO
     BEGIN
     if (sidservasig is null) then
        Begin
        -- aqui se determina el nuevo ID usando un generador
        sidservasig = GEN_ID(GEN_AD_SERVICIOSASIGNADOS_ID,1);
        Insert into ad_serviciosasignados
           (idservasig, idservicio, idpaciente, iddetcons, cantidadsesiones, secionesrealizadas, fchinicio, fchfinal) values
           (:sidservasig, :dIdServicio, :cIdPaciente, :diddetcons, :lsesiones, 1, current_date, current_date);
        End
     Else
        Begin
        Update ad_serviciosasignados Set
            secionesrealizadas = :ssecionesrealizadas +1,
            fchfinal = current_date
        Where idservasig = :sidservasig;
        End
     Update co_detalleconsultas SET
        IDSERVASIG = :sidservasig
     Where co_detalleconsultas.iddetcons = :diddetcons;
     suspend;
     End
end

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:

Código SQL [-]
     Update co_detalleconsultas SET
        IDSERVASIG = :sidservasig
     Where co_detalleconsultas.iddetcons = :diddetcons;

Que "Regresa" el sidservasig a al detalle de la consulta (para saber a que control se asignó)
__________________
Sitrico
Responder Con Cita