Principales respuestas
Procedimiento almacenado

Pregunta
-
Respuestas
-
Hola.El error está en los triggers, pero no sería muy difícil de solucionar, bastaría con esta adaptación:Sustituir esta línea en trg_ElimItem:update FacturasClientes set SaldoComprobante = @dSaldo where FacturasClientesID = ( select FacturasClientesID from deleted )//Recupero el saldo CpbtePor esta forma:update F set SaldoComprobante = @dSaldofrom FacturasClientes F inner join deleted d on F.FacturasClientesID = d.FacturasClientesID //Recupero el saldo Cpbte de todos los registros borradosY lo mismo con el otro (te paso otra variante):delete from PlanillasCobranzaRecibosItems where PlanillasCobranzaRecibosID in (Select PlanillasCobranzaRecibosID from deleted) //Elimino los items
delete from PlanillasCobranzaRecibos where PlanillasCobranzaRecibosID in (Select PlanillasCobranzaRecibosID from deleted) //Elimino el reciboEs muy importante pensar siempre en conjuntos de registros y no de registro en registro, ya que eso nos limita mucho las posibilidades.Alberto López Grande.- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator domingo, 29 de marzo de 2009 17:42
- Marcado como respuesta Arielr domingo, 29 de marzo de 2009 22:32
Todas las respuestas
-
Hola.No es recomendable usar cursores, ya que dan un rendimiento muy malo. Si nos dices qué necesidad necesitas cubrir, a lo mejor podemos ayudarte.El código es sencillo, te lo pongo pero no te aconsejo que lo uses:create proc NoSeUsanCursores asdeclare @nombre varchar(255)declare Cur cursor forselect name from sysobjects where type = 'U'open Curfetch next from Cur into @nombrewhile @@fetch_status = 0beginprint @nombrefetch next from Cur into @nombreenddeallocate Curreturn 0Alberto.
- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator viernes, 27 de marzo de 2009 16:18
-
Gracias por tu consejo. Lo voy a tener muy presente. El problema se me genera en unos desencadenadores... El contexto:
Actualización de facturas pagadas por un cliente. Tengo 2 tablas, Recibos y RecibosItems. RecibosItems tiene un desencadenador que recupera los saldos del comprobante cuando un item se elimina. A su vez Recibos tiene otro desencadenador que elimina los items cuando un recibo es eliminado. Esta conjunción funciona bien si en los Items tengo un sólo registro, pero no cuando son más de uno....Tengo un error de resultados múltiples...
¿Por qué quería utilizar un proc almacenado? Este proceso funciona si elimino item, por item, sin realizar un "delete from "
Estos son los Desencadenadores:...
//ELIMINO EL RECIBO LUEGO DE ELIMINAR LOS ITEMS //
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [dbo].[trg_EliminaRecibo]
ON [dbo].[PlanillasCobranzaRecibos]
INSTEAD OF DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
delete from PlanillasCobranzaRecibosItems where PlanillasCobranzaRecibosID = (Select PlanillasCobranzaRecibosID from deleted) //Elimino los items
delete from PlanillasCobranzaRecibos where PlanillasCobranzaRecibosID = (Select PlanillasCobranzaRecibosID from deleted) //Elimino el recibo
END
//RESTAURO EL SALDO DEL COMPROBANTES EL ELIMINAR EL ITEM //
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [dbo].[trg_ElimItem]
ON [dbo].[PlanillasCobranzaRecibosItems]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @dSaldo float
select @dSaldo = SaldoCpbte from deleted
update FacturasClientes set SaldoComprobante = @dSaldo where FacturasClientesID = ( select FacturasClientesID from deleted )//Recupero el saldo Cpbte
END
Muchas Gracias -
Hola.El error está en los triggers, pero no sería muy difícil de solucionar, bastaría con esta adaptación:Sustituir esta línea en trg_ElimItem:update FacturasClientes set SaldoComprobante = @dSaldo where FacturasClientesID = ( select FacturasClientesID from deleted )//Recupero el saldo CpbtePor esta forma:update F set SaldoComprobante = @dSaldofrom FacturasClientes F inner join deleted d on F.FacturasClientesID = d.FacturasClientesID //Recupero el saldo Cpbte de todos los registros borradosY lo mismo con el otro (te paso otra variante):delete from PlanillasCobranzaRecibosItems where PlanillasCobranzaRecibosID in (Select PlanillasCobranzaRecibosID from deleted) //Elimino los items
delete from PlanillasCobranzaRecibos where PlanillasCobranzaRecibosID in (Select PlanillasCobranzaRecibosID from deleted) //Elimino el reciboEs muy importante pensar siempre en conjuntos de registros y no de registro en registro, ya que eso nos limita mucho las posibilidades.Alberto López Grande.- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator domingo, 29 de marzo de 2009 17:42
- Marcado como respuesta Arielr domingo, 29 de marzo de 2009 22:32
-