Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/06/2015, 16:21
lospichones
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Buscar Resultado entre muchos montos

Buenas noches estoy usando un SP para encontrar un resultado entre muchos montos, el problema que el sp solo me devuelve un total si los montos estan continuos , si los montos que me dan el resultado que estoy buscando no estan uno por debajo del otro no me funciona alguien me puede ayudar???? dejo el sp que estoy usando
Código SQL:
Ver original
  1. ALTER PROCEDURE sp_c_pago_reemplazo @Total NUMERIC(19,2),@Fecha datetime
  2. AS
  3. SET nocount ON
  4. DECLARE @Pago TABLE (n INT IDENTITY(1,1),pag_id INT,pag_total NUMERIC(19,2))
  5. DECLARE @Resultado TABLE (n INT,pag_id INT,pag_total NUMERIC(19,2))
  6. INSERT @pago
  7. SELECT
  8. pag_id,pag_total
  9. FROM pago
  10. WHERE pag_total<=@Total
  11. AND YEAR(pag_fecha)=YEAR(@Fecha)
  12. AND MONTH(pag_fecha)=MONTH(@Fecha)
  13. ORDER BY pag_total DESC,pag_id DESC
  14. DECLARE
  15. @pag_id INT,
  16. @pag_total_idx NUMERIC(19,2),
  17. @pag_total NUMERIC(19,2),
  18. @pag_total_rep NUMERIC(19,2),
  19. @n INT,
  20. @l INT,
  21. @n_ INT,
  22. @l_ INT,
  23. @c INT,
  24. @r INT,
  25. @Suma NUMERIC(19,2)
  26. SELECT @n=MIN(n),@l=MAX(n),@Suma=0 FROM @Pago
  27. while (@n<=@l)
  28.  BEGIN
  29.    -- Limpio tabla de resultados
  30.    DELETE FROM @Resultado
  31.    SET @Suma=0
  32.    -- Tomo el primer pago
  33.    SELECT @pag_total_idx=pag_total,@pag_id=pag_id FROM @pago WHERE n=@n
  34.    IF @pag_total_idx<=@Total
  35.      INSERT @Resultado SELECT @n,@pag_id,@pag_total_idx
  36.    -- Verifico si se encontro el total
  37.    IF @Total=@pag_total_idx
  38.      GOTO Final
  39.    ELSE
  40.      BEGIN
  41.         SELECT
  42.         @c=MAX(n),
  43.         @r=0
  44.         FROM @Pago
  45.         WHERE pag_total<=@Total-@pag_total_idx
  46.         --print 'Repeticiones '+cast(@c as varchar)
  47.         while @r<=@c
  48.           BEGIN  -- Repito la busqueda para todas las combinaciones
  49.             DELETE FROM @Resultado WHERE n<>@n
  50.             SET @Suma=0
  51.       SELECT
  52.       @n_=MIN(n)+@r,
  53.       @l_=@l
  54.       FROM @Pago
  55.       WHERE pag_total<=@Total-@pag_total_idx AND n>@n        
  56.       while @n_<=@l_
  57.         BEGIN
  58.         SELECT @pag_total=pag_total,@pag_id=pag_id FROM @pago WHERE n=@n_
  59.               --print 'Nivel '+cast(@pag_total as varchar)      
  60.         IF (@pag_total_idx+@Suma+@pag_total)<=(@Total)
  61.           BEGIN
  62.           INSERT @Resultado SELECT @n_,@pag_id,@pag_total
  63.           SET @Suma=@Suma+@pag_total
  64.           END
  65.         IF (@Suma+@pag_total_idx)=@Total  -- Verifico si se encontro el total
  66.           GOTO Final
  67.         SET @n_=(SELECT MIN(n) FROM @Pago WHERE n>@n AND n>@n_)
  68.         END
  69.       SET @r=@r+1
  70.       END
  71.      END
  72.    SET @n=(SELECT MIN(n) FROM @pago WHERE n>@n AND pag_total<@pag_total_idx)
  73.  END
  74.  DELETE FROM @Resultado
  75.  Final:
  76.  SELECT pag_id,pag_total FROM @Resultado ORDER BY n

Última edición por gnzsoloyo; 12/06/2015 a las 18:59 Razón: Código sin etiquetar