viernes, 6 de septiembre de 2013

Respuesta al reto 1

Se tiene una base de datos con las tablas: Ventas, Clientes, DetalleVentas y SeriesDetalleVentas que contienen los datos de las ventas de equipos de computo y accesorios. La tabla SeriesDetalleVentas contiene los numero de serie de los productos vendidos.

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