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ó)