Principales respuestas
Filtrar ventas

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!
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
-
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
Todas las respuestas
-
-
-
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
-
Trata:
Pero con los demas parametros como prosigo??
...
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 -
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
-
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
-