Ver Mensaje Individual
  #10  
Antiguo 21-05-2012
Avatar de LuNaTk
LuNaTk LuNaTk is offline
Miembro
 
Registrado: jun 2007
Posts: 19
Reputación: 0
LuNaTk Va por buen camino
Un ultimo ajuste ya que en el caso de que no haya registros que coincidan con la busqueda no se borraba la tabla de resultados, arrojando registros que no cumplian.

Código SQL [-]
alter procedure sp_c_pago_reemplazo @Total numeric(19,2),@Fecha datetime
as
set nocount ON
declare @Pago table (n int identity(1,1),pag_id int,pag_total numeric(19,2))
declare @Resultado table (n int,pag_id int,pag_total numeric(19,2))
insert @pago
select 
pag_id,pag_total
from pago
where pag_total<=@Total
and year(pag_fecha)=year(@Fecha)
and month(pag_fecha)=month(@Fecha)
order by pag_total desc,pag_id desc
declare
@pag_id int,
@pag_total_idx numeric(19,2),
@pag_total numeric(19,2),
@pag_total_rep numeric(19,2),
@n int,
@l int,
@n_ int,
@l_ int,
@c int,
@r int,
@Suma numeric(19,2)
select @n=MIN(n),@l=MAX(n),@Suma=0 from @Pago
while (@n<=@l)
 begin
   -- Limpio tabla de resultados
   delete from @Resultado
   set @Suma=0
   -- Tomo el primer pago
   select @pag_total_idx=pag_total,@pag_id=pag_id from @pago where n=@n
   if @pag_total_idx<=@Total
     insert @Resultado select @n,@pag_id,@pag_total_idx
   -- Verifico si se encontro el total
   if @Total=@pag_total_idx
     Goto Final
   else
     begin
        select 
        @c=MAX(n),
        @r=0
        from @Pago 
        where pag_total<=@Total-@pag_total_idx
        --print 'Repeticiones '+cast(@c as varchar)
        while @r<=@c
          begin  -- Repito la busqueda para todas las combinaciones
            delete from @Resultado where n<>@n
            set @Suma=0
      select 
      @n_=MIN(n)+@r,
      @l_=@l
      from @Pago 
      where pag_total<=@Total-@pag_total_idx and n>@n         
      while @n_<=@l_
        begin
        select @pag_total=pag_total,@pag_id=pag_id from @pago where n=@n_
              --print 'Nivel '+cast(@pag_total as varchar)      
        if (@pag_total_idx+@Suma+@pag_total)<=(@Total)
          begin
          insert @Resultado select @n_,@pag_id,@pag_total 
          set @Suma=@Suma+@pag_total
          end
        if (@Suma+@pag_total_idx)=@Total  -- Verifico si se encontro el total
          Goto Final 
        set @n_=(select MIN(n) from @Pago where n>@n and n>@n_) 
        end
      set @r=@r+1
      end
     end
   set @n=(select MIN(n) from @pago where n>@n and pag_total<@pag_total_idx)
 end
 delete from @Resultado
 Final:
 select pag_id,pag_total from @Resultado order by n

Última edición por LuNaTk fecha: 21-05-2012 a las 03:09:19.
Responder Con Cita