Una consulta para obtener las ventas con sus clientes, detalles y series de ls detalles seria el siguiente:
SELECT Ventas.idVenta, FolioVenta, FechaVenta, Ventas.idCliente, Clientes.NombreCompleto,
DetalleVentas.idDetalleVenta, Productos.idProducto,
Productos.DescripcionProd, DetalleVentas.Cantidad, DetalleVentas.Precio,
Serie
FROM Ventas
INNER JOIN Clientes
ON Ventas.idCliente = Clientes.idCliente
INNER JOIN DetalleVentas
ON Ventas.idVenta = DetalleVentas.idVenta
INNER JOIN Productos
ON DetalleVentas.idProducto = Productos.idProducto
INNER JOIN SeriesDetalleVenta
ON DetalleVentas.idDetalleVenta = SeriesDetalleVenta.idDetalleVenta
ORDER BY Ventas.idVenta, DetalleVentas.idDetalleVenta
Aqui lo interesante es que la ventas pueden tener solo un cliente, varios detalles y los detalles pueden tener varios numeros de serie.
Un ejemplo del resultado seria el siguiente:
El codigo para llenar todos los objetos de la consulta anterior en c# seria:
public static void RecuperaVentas()
{
clsVentas Venta = new clsVentas();
clsProductosMovs Producto;
SqlDataReader dr;
// Lo importante es definir un id anterior, para que en el momento que cambie, se cree
// un nuevo objeto y se agregue el anterior a la coleccion
int idVenta, idVentaAnterior = -1;
int idDetalleVenta, idDetalleVentaAnterior = -1;
while (dr.Read())
{
idVenta = Convert.ToInt32(dr["idVenta"]);
// Si la venta es diferente a la anterior, se crea el objeto venta
// y se agrega a la coleccion
if (idVenta != idVentaAnterior)
{
Venta = new clsVentas();
Venta.idVenta = Convert.ToInt32(dr["idVenta"]);
Venta.FechaVenta = Convert.ToDateTime(dr["FechaVenta"]);
Venta.FolioVenta = Convert.ToInt32(dr["FolioVenta"]);
Venta.Cliente.idCliente = Convert.ToInt32(dr["idCliente"]);
Venta.Cliente.NombreCompleto = dr["NombreCompleto"].ToString();
Ventas.Agregar(Venta);
}
// Si el detalle de la venta es diferente a la anterior, se crea el objeto
// detalle y se agrega a la coleccion
if (idDetalleVenta != idDetalleVentaAnterior)
{
Producto = new clsProductosMovs();
Producto.idDetalleVenta = Convert.ToInt32(dr["CantDetVenta"]);
Producto.Cantidad = Convert.ToInt32(dr["CantDetVenta"]);
Producto.idProducto = Convert.ToInt32(dr["idProducto"]);
Producto.Precio = Convert.ToSingle(dr["Precio"]);
Producto.DescripcionProd = dr["DescripcionProd"].ToString();
Venta.Detalle.Agregar(Producto);
}
// Finalmente se agrega la serie
Producto.Series.Agregar(dr["Serie"].ToString();
// Se actualizan los indices anteriores para el siguiente ciclo
idVentaAnterior = idVenta;
idDetalleVentaAnterior = idDetalleVenta;
}
}
Espero que tenga algun error para que comenten este codigo
No hay comentarios.:
Publicar un comentario