none
Procedimiento almacenado RRS feed

  • Pregunta

  • Me prodrían postear un procedimiento almacenado que seleccione un grupo de registro y que recorra ese grupo seleccionado con un cursor?. Muchas gracias-
    viernes, 27 de marzo de 2009 15:43

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 Cpbte

    Por esta forma:

    update F set SaldoComprobante = @dSaldo 
    from FacturasClientes F inner join deleted d on F.FacturasClientesID = d.FacturasClientesID //Recupero el saldo Cpbte de todos los registros borrados

    Y 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 recibo

    Es 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.
    domingo, 29 de marzo de 2009 17:42
    Moderador

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 as

    declare @nombre varchar(255)

    declare Cur cursor for
    select name from sysobjects where type = 'U'

    open Cur

    fetch next from Cur into @nombre

    while @@fetch_status = 0
    begin
    print @nombre
    fetch next from Cur into @nombre
    end

    deallocate Cur

    return 0


    Alberto.
    viernes, 27 de marzo de 2009 16:18
    Moderador
  • 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
    sábado, 28 de marzo de 2009 19:33
  • 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 Cpbte

    Por esta forma:

    update F set SaldoComprobante = @dSaldo 
    from FacturasClientes F inner join deleted d on F.FacturasClientesID = d.FacturasClientesID //Recupero el saldo Cpbte de todos los registros borrados

    Y 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 recibo

    Es 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.
    domingo, 29 de marzo de 2009 17:42
    Moderador
  • Gracias Alberto, Funcionó muy bien. sólo hice un pequeño cambio.

    update F set SaldoComprobante = d.SaldoCpbte <---
    from FacturasClientes F inner join deleted d on F.FacturasClientesID = d.FacturasClientesID

    Muchas gracias
    lunes, 30 de marzo de 2009 11:42