none
ayuda para generar varios registros apartir de uno RRS feed

  • Pregunta

  • hola amigos les expongo mi problema espero me puedan ayudar me super urge

    les explico a modo de ejemplo:

    tengo un contrato y su fecha de primer pago es el 15/06/2012 y el precio es de $1000 y ese saldo el cliente lo va a pagar en 10 pagos semanales

    lo que necesito es que apartir de la fecha de primer pago, se generen los registros de los 10 pagos y que se especifique que van a ser 10 pagos por 100 pesos cada uno mas o menos quedaria asi:

    15/06/2012         $100.00

    22/06/2012         $100.00

    29/06/2012         $100.00

    y asi hasta acompletar los 10 pagos de 100 pesos cada uno.

    espero haberme explicado  ojala me puedan ayudar

    domingo, 24 de junio de 2012 20:30

Respuestas

  • Aquí posteo una opción con un mayor rendimiento ya que no usa lógica procedimental (While), sino que se basa en lógica de conjuntos, me auxilie de la creación de una tabla de Numeros que en mi experiencia tienen un uso muy importante, el código de creación de la tabla es de Itzik Ben-Gan , aquí lo presento:

    IF OBJECT_ID('dbo.Nums', 'U') IS NOT NULL DROP TABLE dbo.Nums;
    CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
    DECLARE @max AS INT, @rc AS INT;
    SET @max = 1000000;
    SET @rc = 1;
    INSERT INTO Nums VALUES(1);
    WHILE @rc * 2 <= @max
    BEGIN
    INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
    SET @rc = @rc * 2;
    END
    INSERT INTO dbo.Nums
    SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;

    El siguiente paso es realizar un cambio en la función(en este caso cree una nueva):

    CREATE FUNCTION FDU_CalculoPagos(@i_fecha_inicial date,@i_monto money,@i_cuotas int)
    RETURNS @Tabla TABLE 
    (
     numpago int,
     fechapago date,
     cuota  money
    )
    AS
    BEGIN
    DECLARE @cuota money
    
      SELECT @cuota=@i_monto/@i_cuotas
       
     INSERT INTO @Tabla
     SELECT N.n,DATEADD(month,n,F.fecha_inicio),@cuota
     FROM Nums AS N
     CROSS JOIN (VALUES(@i_fecha_inicial)) AS F(fecha_inicio)
     WHERE N.n <= @i_cuotas
    
    
     RETURN
    END
    
    GO

    Y para finalizar la invocamos:

    SELECT * FROM FDU_CalculoPagos('20120101',100,10)

    El código de la función contiene un elemento que es manejado a nivel de SQL Server 2008 y es el uso de <<VALUEs (..) As Identificador(columna)>>, sino estas usando este versión solo debes cambiar el CROSS JOIN para una variable de tipo tabla cuya única columna sea la fecha inicial.  Por lo pronto espero que la función te sea de mucha ayuda.


    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez


    lunes, 25 de junio de 2012 3:33

Todas las respuestas

  • Pero que es lo que buscas resolver precisamente? el diseño?

    Con una tabla detalle puedes resolverla, tendrias una relacion 1:M con tu tabla de contrato..

    domingo, 24 de junio de 2012 21:43
  • Te propongo el uso de una función definida por el usuario que te retorne dicha información, aquí el código propuesto:

    CREATE FUNCTION fdu_TablaPagos(@i_fecha_inicial date,@i_monto money,@i_cuotas int)
    RETURNS @Tabla TABLE 
    (
     numpago int,
     fechapago date,
     cuota  money
    )
    AS
    BEGIN
    DECLARE @w_numpagos int,@w_fechapago date,@cuota money,@w_contador int
    
      SELECT @cuota=@i_monto/@i_cuotas,@w_fechapago=@i_fecha_inicial,@w_contador=1
       
     
    WHILE @w_contador <= @i_cuotas
     BEGIN
        SELECT @w_fechapago=DATEADD(month,1,@w_fechapago)
     
       INSERT INTO @Tabla
       VALUES (@w_contador,@w_fechapago,@cuota)
       
       SET @w_contador=@w_contador+1
     END
       
     RETURN
    END
    
    GO
    
    SELECT * FROM fdu_TablaPagos('20120101',100,10)

    Realiza la prueba y nos comentas como te fue.


    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez

    lunes, 25 de junio de 2012 3:05
  • Aquí posteo una opción con un mayor rendimiento ya que no usa lógica procedimental (While), sino que se basa en lógica de conjuntos, me auxilie de la creación de una tabla de Numeros que en mi experiencia tienen un uso muy importante, el código de creación de la tabla es de Itzik Ben-Gan , aquí lo presento:

    IF OBJECT_ID('dbo.Nums', 'U') IS NOT NULL DROP TABLE dbo.Nums;
    CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
    DECLARE @max AS INT, @rc AS INT;
    SET @max = 1000000;
    SET @rc = 1;
    INSERT INTO Nums VALUES(1);
    WHILE @rc * 2 <= @max
    BEGIN
    INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
    SET @rc = @rc * 2;
    END
    INSERT INTO dbo.Nums
    SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;

    El siguiente paso es realizar un cambio en la función(en este caso cree una nueva):

    CREATE FUNCTION FDU_CalculoPagos(@i_fecha_inicial date,@i_monto money,@i_cuotas int)
    RETURNS @Tabla TABLE 
    (
     numpago int,
     fechapago date,
     cuota  money
    )
    AS
    BEGIN
    DECLARE @cuota money
    
      SELECT @cuota=@i_monto/@i_cuotas
       
     INSERT INTO @Tabla
     SELECT N.n,DATEADD(month,n,F.fecha_inicio),@cuota
     FROM Nums AS N
     CROSS JOIN (VALUES(@i_fecha_inicial)) AS F(fecha_inicio)
     WHERE N.n <= @i_cuotas
    
    
     RETURN
    END
    
    GO

    Y para finalizar la invocamos:

    SELECT * FROM FDU_CalculoPagos('20120101',100,10)

    El código de la función contiene un elemento que es manejado a nivel de SQL Server 2008 y es el uso de <<VALUEs (..) As Identificador(columna)>>, sino estas usando este versión solo debes cambiar el CROSS JOIN para una variable de tipo tabla cuya única columna sea la fecha inicial.  Por lo pronto espero que la función te sea de mucha ayuda.


    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez


    lunes, 25 de junio de 2012 3:33