none
Filtrar ventas RRS feed

  • Pregunta

  • Hola, estoy tratando de realizar un Procedimiento almacenado el cual me retorne un listado de las ventas de acuerdo a los parámetros enviados.

    Create PROCEDURE [dbo].[spFiltroVenta]
    @FechaInicio date,
    @FechaFin date,
    @FkFormaPago int,
    @FkCliente int
    AS
    BEGIN
    	Select Venta.PkVenta, Venta.Total, FechaEmision, Cliente.Nombre, Cliente.Telefono, FormaPago.FormaPago from Venta
    	inner join DetalleVenta on DetalleVenta.FkVenta=Venta.PkVenta
    	inner join FormaPago on FormaPago.PkFormaPago=@FkFormaPago	
    	inner join Cliente on Cliente.PkCliente=@FkCliente
    	where @FechaInicio<=FechaEmision and @FechaFin>=FechaEmision
    END

    El problema por el cual hago la pregunta es como puedo hacer para que me retome valores un caso de que un parámetro o todos sean null

    Desde ya gracias, saludos!

    martes, 9 de abril de 2019 14:39

Respuestas

  • Hola Federico32113:

    De tu estructura no se deduce exactamente como es tu modelado de datos.

    Te voy a dar una aproximación, pero yo al menos tengo muchas dudas.

    create table venta (pkVenta int, Total int, FechaEmision date, CLIENTE INT )
    create table DetalleVenta (FkVenta int, linea int)
    create table FormaPago (pkFormaPago int, Formapago varchar(10), PKVENTA INT, LINEAFORMAPAGO INT)
    Create table Cliente (pkCliente int, Telefono varchar(10), Nombre Varchar(10))
    go
    insert into venta (pkVenta, Total, FechaEmision, CLIENTE)
    values
    (1,100,'20190101',1),
    (2,100,'20190102',2),
    (3,100,'20190103',1);
    go
    insert into DetalleVenta (FkVenta, linea)
    values
    (1,1),
    (1,2),
    (2,1),
    (3,1),
    (3,2);
    go
    insert into FormaPago (pkFormaPago, Formapago, PKVENTA, LINEAFORMAPAGO)
    values
    (1,'fpago1',1,1),
    (2,'fpago2',1,2),
    (3,'fpago3',2,1),
    (4,'fpago3',3,1);
    go
    insert into Cliente (pkCliente, Nombre, Telefono)
    values
    (1,'ana','123'),
    (2,'bea','444'),
    (3,'isa','567');
    go
    

    La lógica dice que una factura es un maestro detalle, donde estará por ejemplo el id del cliente.

    Tu detalle tendrá varias lineas.....

    Pero la forma de pago, entiendo que tambíen podrás tener varias lineas, porque la factura se podrá pagar en varias veces ???

    Bueno esto te lo indico porque la solución es algo similar a lo que te han propuesto.

    CREATE PROCEDURE dbo.spFiltroVenta
    (@FechaInicio DATE
    , @fechafin    DATE
    , @fkformapago INT
    , @fkCliente   INT
    )
    AS
        BEGIN
    	   SELECT Venta.PkVenta
    		   , Venta.Total
    		   , FechaEmision
    		   , Cliente.Nombre
    		   , Cliente.Telefono
    		   , FormaPago.FormaPago
    	   FROM   
    		   Venta
    			   INNER JOIN DetalleVenta ON DetalleVenta.FkVenta = Venta.PkVenta
    			   INNER JOIN Cliente ON(Cliente.PkCliente = VENTA.CLIENTE)
    			   INNER JOIN FormaPago ON(FormaPago.PKVENTA = VENTA.pkVenta)
    	   WHERE  ((@FechaInicio <= FechaEmision
    			  OR @FECHAINICIO IS NULL)
    			 AND (@FechaFin >= FechaEmision
    				 OR @FECHAfIN IS NULL))
    			AND (cliente.pkCliente = @fkCliente
    				OR @fkCliente IS NULL)
    			AND (Formapago.pkFormaPago = @fkformapago
    				OR @fkformapago IS NULL);
    	   RETURN;
        END;

    Fíjate que las tablas se relacionan por si solas, no se relacionan con lo que le llegue como parámetro.

    Cuando tengo las tablas normalizadas y relacionadas, entonces, es cuando le decimos, que el where limite en funcion del parametro o el parametro sea nulo...y así con todos.

    Espero te ayude

    • Marcado como respuesta Federico32113 jueves, 11 de abril de 2019 14:26
    martes, 9 de abril de 2019 19:15
  • Ya Javi te respondio.

    Las tablas se relacionan entre si usando las columnas apropiadas, mientras que los parametros se usarian para filtrar ya sea en la clausula WHERE o en la union de acuerdo al tipo de esta ( inner o outer).

    No dejes de usar la opcion OPTION (RECOMPILE) para que el motor reduzca los filtros s usar cuando los parametros continen la marca NULL dada la construccion recomendada.

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Federico32113 jueves, 11 de abril de 2019 14:26
    miércoles, 10 de abril de 2019 0:14

Todas las respuestas

  • Sin temor a equivocarme, espero ver los demás comentarios, es PREGUNTAR por el valor de las variables y en caso de venir NULL, le asignas un valor



    IIslas Master Consultant SQL Server

    martes, 9 de abril de 2019 14:50
  • Que valor le asignaría? porque por ejemplo que FkFormaPago vengan null la idea es traer todas las ventas, es decir sin restriccion alguna en la forma de pago
    martes, 9 de abril de 2019 15:11
  • Trata:

    ...
    where (@fechainicio <= fechaemision or @fechainicio is null) and (@fechafin >= fechaemision or @fechafin is null) option (recompile);

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Propuesto como respuesta Carlos_Ruiz_M martes, 9 de abril de 2019 18:25
    martes, 9 de abril de 2019 15:42
  • Trata:

    ...
    where (@fechainicio <= fechaemision or @fechainicio is null) and (@fechafin >= fechaemision or @fechafin is null) option (recompile);

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    Pero con los demas parametros como prosigo??
    martes, 9 de abril de 2019 16:34
  • Hola Federico32113:

    De tu estructura no se deduce exactamente como es tu modelado de datos.

    Te voy a dar una aproximación, pero yo al menos tengo muchas dudas.

    create table venta (pkVenta int, Total int, FechaEmision date, CLIENTE INT )
    create table DetalleVenta (FkVenta int, linea int)
    create table FormaPago (pkFormaPago int, Formapago varchar(10), PKVENTA INT, LINEAFORMAPAGO INT)
    Create table Cliente (pkCliente int, Telefono varchar(10), Nombre Varchar(10))
    go
    insert into venta (pkVenta, Total, FechaEmision, CLIENTE)
    values
    (1,100,'20190101',1),
    (2,100,'20190102',2),
    (3,100,'20190103',1);
    go
    insert into DetalleVenta (FkVenta, linea)
    values
    (1,1),
    (1,2),
    (2,1),
    (3,1),
    (3,2);
    go
    insert into FormaPago (pkFormaPago, Formapago, PKVENTA, LINEAFORMAPAGO)
    values
    (1,'fpago1',1,1),
    (2,'fpago2',1,2),
    (3,'fpago3',2,1),
    (4,'fpago3',3,1);
    go
    insert into Cliente (pkCliente, Nombre, Telefono)
    values
    (1,'ana','123'),
    (2,'bea','444'),
    (3,'isa','567');
    go
    

    La lógica dice que una factura es un maestro detalle, donde estará por ejemplo el id del cliente.

    Tu detalle tendrá varias lineas.....

    Pero la forma de pago, entiendo que tambíen podrás tener varias lineas, porque la factura se podrá pagar en varias veces ???

    Bueno esto te lo indico porque la solución es algo similar a lo que te han propuesto.

    CREATE PROCEDURE dbo.spFiltroVenta
    (@FechaInicio DATE
    , @fechafin    DATE
    , @fkformapago INT
    , @fkCliente   INT
    )
    AS
        BEGIN
    	   SELECT Venta.PkVenta
    		   , Venta.Total
    		   , FechaEmision
    		   , Cliente.Nombre
    		   , Cliente.Telefono
    		   , FormaPago.FormaPago
    	   FROM   
    		   Venta
    			   INNER JOIN DetalleVenta ON DetalleVenta.FkVenta = Venta.PkVenta
    			   INNER JOIN Cliente ON(Cliente.PkCliente = VENTA.CLIENTE)
    			   INNER JOIN FormaPago ON(FormaPago.PKVENTA = VENTA.pkVenta)
    	   WHERE  ((@FechaInicio <= FechaEmision
    			  OR @FECHAINICIO IS NULL)
    			 AND (@FechaFin >= FechaEmision
    				 OR @FECHAfIN IS NULL))
    			AND (cliente.pkCliente = @fkCliente
    				OR @fkCliente IS NULL)
    			AND (Formapago.pkFormaPago = @fkformapago
    				OR @fkformapago IS NULL);
    	   RETURN;
        END;

    Fíjate que las tablas se relacionan por si solas, no se relacionan con lo que le llegue como parámetro.

    Cuando tengo las tablas normalizadas y relacionadas, entonces, es cuando le decimos, que el where limite en funcion del parametro o el parametro sea nulo...y así con todos.

    Espero te ayude

    • Marcado como respuesta Federico32113 jueves, 11 de abril de 2019 14:26
    martes, 9 de abril de 2019 19:15
  • Ya Javi te respondio.

    Las tablas se relacionan entre si usando las columnas apropiadas, mientras que los parametros se usarian para filtrar ya sea en la clausula WHERE o en la union de acuerdo al tipo de esta ( inner o outer).

    No dejes de usar la opcion OPTION (RECOMPILE) para que el motor reduzca los filtros s usar cuando los parametros continen la marca NULL dada la construccion recomendada.

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Federico32113 jueves, 11 de abril de 2019 14:26
    miércoles, 10 de abril de 2019 0:14
  • Muchas gracias por las respuestas, lo pude solucionar al problema.
    jueves, 11 de abril de 2019 14:26