martes, febrero 22, 2011

C# - Aplicación de Escritorio, Sistemas de Ventas Parte I - Creación de la Base Datos


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno

  • SQL Server 2008
  • Visual Studio 2008

2. Introducción


En el siguiente tutorial vamos a desarrollar un sistema de ventas usando el lenguaje de programación C# y como base de datos vamos a usar el SQL Server 2008 y tambien crearemos un reporte con Crystal Report. La base de datos que vamos a crear es una base de datos con fines didácticos, dado que nos faltaría crear mas tablas, como la tabla cliente, categoría, unidad de medida, etc pero si nos explayamos mucho nos quedaría muy largo el tutorial. Ademas en el ejemplo no se explica como disminuir un stock, debido a que eso siempre se les pide a los alumnos universitario que investiguen como hacerlo, pero si quieren una ayudita lo pueden hacer creando Triggers en la base de datos.

3. Desarrollo


En esta primera parte del tutorial vamos a crear la base de datos en SQL Server 2008, la base de datos se llamara BDTutorial

3.1. Diseño de la base de datos

La base de datos tendría las siguientes tablas: Venta, Producto y DetalleVenta











Ademas la columna "codigoVenta" de la tabla "Venta" tiene un valor de identidad, eso quiere decir que su valor es auto incremental que comienza en uno e incrementa de uno en uno.






















Lo mismo sucedería con la columna "codigoProducto" de la tabla Producto
























3.2. Creando los procedimientos almacenados

Según Wikipedia un procedimiento almacenado (stored procedure en inglés) es un programa (o procedimiento) el cual es almacenado físicamente en una base de datos. Su implementación varía de un manejador de bases de datos a otro. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una petición de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y sólo necesita enviar sus resultados de regreso al usuario, deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes.

3.2.1. Procedimientos Almacenados para la tabla Producto

/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA INSERTAR UN 
PRODUCTO A LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROC dbo.spI_Producto
   @codigoProducto  int = Null OUTPUT,
   @nombre  varchar(100) = Null,
   @precio  decimal(18, 2) = Null
AS
insert into Producto
(
   nombre,
   precio
)
VALUES(
@nombre,
@precio
)
--Obteniendo el codigo autogenerado de producto 
SET @codigoProducto = @@IDENTITY;
GO
/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA ACTUALIZAR UN
PROCEDUCTO A LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROC dbo.spU_Producto
   @codigoProducto int = Null,
   @nombre varchar(100) = Null,
   @precio decimal(18, 2) = Null
AS

UPDATE Producto
SET 
   nombre = @nombre,
   precio = @precio
WHERE
    codigoProducto = @codigoProducto
GO
/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA OBTENER TODOS
LOS PRODUCTOS DE LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROC dbo.spF_Producto_All
AS
SELECT 
    p.codigoProducto, 
    p.nombre, 
    p.precio
FROM 
    Producto p 
ORDER BY
    P.nombre

3.2.2. Procedimientos Almacenados para la tabla Venta

/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA INSERTAR UNA 
VENTA A LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROC dbo.spI_Venta
   @codigoVenta  int = Null OUTPUT,
   @cliente  varchar(100) = Null
AS

insert into Venta
(
   cliente,
   fecha
)
VALUES(
@cliente,
GETDATE()
)
--Obteniendo el codigo autogenerado de la venta 
SET @codigoVenta = @@IDENTITY
GO

/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA OBTENER EL 
REPORTE DE LA VENTA DE LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROCEDURE dbo.spF_Venta_One
    @codigoVenta int
AS
SELECT     
    v.codigoVenta AS CodigoVenta,  
    v.cliente AS Cliente, 
    v.fecha AS Fecha, 
    d.codigoProducto AS CodigoProducto, 
    p.nombre AS Nombre, 
    p.precio AS Precio, 
    d.cantidad AS Cantidad, 
    d.descuento AS Descuento,
    p.precio*d.cantidad AS Parcial,
    ((p.precio*d.cantidad)-d.descuento) AS SubTotal,
    (
    SELECT     
        SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar
    FROM         
        DetalleVenta AS dT INNER JOIN
        Producto AS pT ON dT.codigoProducto = pT.codigoProducto
    WHERE
        dT.codigoVenta=v.codigoVenta
    ) AS TotalPagar
FROM 
    Venta AS v INNER JOIN
    DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN
    Producto AS p ON d.codigoProducto = p.codigoProducto
WHERE
    v.codigoVenta=@codigoVenta
ORDER BY
    Nombre

GO

/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA OBTENER TODAS 
LAS VENTAS DE LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROCEDURE dbo.spF_Venta_All
AS
SELECT     
    v.codigoVenta AS CodigoVenta,  
    v.cliente AS Cliente, 
    v.fecha AS Fecha, 
    d.codigoProducto AS CodigoProducto, 
    p.nombre AS Nombre, 
    p.precio AS Precio, 
    d.cantidad AS Cantidad, 
    d.descuento AS Descuento,
    p.precio*d.cantidad AS Parcial,
    ((p.precio*d.cantidad)-d.descuento) AS SubTotal,
    (
    SELECT     
        SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar
    FROM         
        DetalleVenta AS dT INNER JOIN
        Producto AS pT ON dT.codigoProducto = pT.codigoProducto
    WHERE
        dT.codigoVenta=v.codigoVenta
    ) AS TotalPagar
FROM 
    Venta AS v INNER JOIN
    DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN
    Producto AS p ON d.codigoProducto = p.codigoProducto
ORDER BY
    CodigoVenta, Nombre

3.2.3. Procedimientos Almacenados para la tabla DetalleVenta

/*
----------------------------------------------------
CREADO:
   POR  :HENRY JOE WONG URQUIZA
   FECHA:22FEB2011
PROCEDIMIENTO ALMACENADO UTILIZADO PARA INSERTAR UN 
DETALLE DE VENTA A LA BASE DE DATOS
----------------------------------------------------
*/
CREATE PROC dbo.spI_DetalleVenta
   @codigoVenta  int = Null,
   @codigoProducto  int = Null,
   @cantidad  decimal(18, 2) = Null,
   @descuento  decimal(18, 2) = Null
AS
insert into DetalleVenta
(
    codigoVenta,
    codigoProducto,
    cantidad,
    descuento
)
VALUES(
    @codigoVenta,
    @codigoProducto,
    @cantidad,
    @descuento
)

17 comentarios:

orale viejo, sos grande en esto, epero y muestres mas de estos ejemplos, yo apenas estoy aprendiendo estos terminos, porke estoy en la escuela..
ammm..te felicito por tu blog eh

hey ese tu mini sistema esta excelente ya que das la pauta a que vayan realizandolo paso a paso y lo mejor que esta completo para implementarlo y solo me gustaria saber como implementarlo para la web

Muchas gracias por los saludos ... y para hacer el sistema para web solo tienes que cambiar la capa de presentación nada mas :D

Hola somos un grupo de estudiantes y necesitamos ayuda , para resolver un problema urgente:

el problema consiste en elaborar un sistema que lleve el control de las ventas de un almacen de ropa , en una base de datos de c# , lo que queremos saber es como o con que codigo podemos Ingresar una Venta y que solo al poner el nombre de un producto te aparesca en un text box el precio de la prenda automaticamente.

saaLudos ojala nos puedan ayudar

Justo en la ultima parte del capitulo del sistema podras ver un ejemplo

Y por casualidad el archivo BDTUTORIAL.bak es la base de datos, y si es como puedo abrirlo.

Saludos

Exacto esa es la base de datos y para restaura la base de datos tienes que hacer clic derecho en BASE DE DATOS y RESTAURAR BASE DE DATOS y luego ahi buscas el archivo .bak
Saludos

una sola palabra describe este post: EXCELENTE

muy bueno amigoo.. acabo de comenzar el tuto, gracias

esta increible este post, oye podrias darnos otra ayuda de como disminuir el stock, gracias..

12hola amigo muy intersante tu turorial pero dime en el caso de realizar la venta de un producto se supono q al ingresar la cantidad esta debe ser validada para ver si hay stock suficiente para realizar la venta entonces como haria para poder validarlo sria con un procedimeinto almacnado

Tienes que tener una columna stock en la tabla producto para poder hacer los descuentos respectivos. Si seguimos con el modelo de base de datos que hemos planteado :)

Estoy iniciando en Asp .net Sql Server y me parece excelente tu aporte, Gracias por dedicar tiempo a este tema....

Este comentario ha sido eliminado por el autor.

agradezco el aporte que has hecho, espero puedas aplicarlo para un ejemplo de ventas en línea

Muy buen post te felicito