Professional Documents
Culture Documents
net
2. 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
Adems 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 sucedera con la columna "codigoProducto" de la tabla Producto.
Programacin C# .net
necesita enviar sus resultados de regreso al usuario, deshacindose de la
sobrecarga resultante de comunicar grandes cantidades de datos salientes y
entrantes.
Programacin C# .net
FROM
Producto p
ORDER BY
P.nombre
Programacin C# .net
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
/*
---------------------------------------------------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
Programacin C# .net
insert into DetalleVenta
(
codigoVenta,
codigoProducto,
cantidad,
descuento
)
VALUES(
@codigoVenta,
@codigoProducto,
@cantidad,
@descuento
)
Programacin C# .net
Capa de negocio: es donde residen los programas que se ejecutan, se reciben las
peticiones del usuario y se envan las respuestas tras el proceso. Se denomina capa
de negocio (e incluso de lgica del negocio) porque es aqu donde se establecen
todas las reglas que deben cumplirse. Esta capa se comunica con la capa de
presentacin, para recibir las solicitudes y presentar los resultados, y con la capa de
datos, para solicitar al gestor de base de datos para almacenar o recuperar datos de
l. Tambin se consideran aqu los programas de aplicacin.
Creando el proyecto
Parte 3: Aplicacin Sistema de Ventas en C#.net trabajando con Capas - David
Molina Hostia
Programacin C# .net
Primero debemos de crear un proyecto con Visual Studio 2008, para eso abrimos el Visual
Studio 2008 y nos vamos al men de "Archivo-->Nuevo Proyecto". A nuestro proyecto le
pondremos de nombre "SistemaVentas"
Programacin C# .net
Programacin C# .net
La clase Conexin
Para agregar una clase en C# debemos hacer clic derecho en la Capa de Datos y seleccionar
la opcin "Agregar-->Clase" y la clase que creamos se llamara "Conexin", que se
encargara de guardar la cadena de conexin para poder conectarnos con nuestra base de
datos que est en SQL Server 2008 y la cual se llama BDTutorial.
System;
System.Collections.Generic;
System.Linq;
System.Text;
using CapaDatos.Properties;
namespace CapaDatos
{
public class Conexion
{
//La base de datos se llama BDTutorial
//La ubicacion de base de datos esta de modo local y en una instancia que
se llama SQLEXPRESS2008
//Se llama a la configuracin hecha en la capaDatos.
}
Programacin C# .net
}
La clase Producto
Esta clase se encarga de conectar la tabla Producto con C#
using System;
using System.Collections.Generic;
using System.Text;
//Impotaciones necesarias
using System.Data;
using System.Data.SqlClient;
namespace CapaDatos
{
public class Producto
{
private int var_codigoProducto;
private string var_nombre;
private decimal var_precio;
//Constructor vacio
public Producto()
{
}
//Constructor con parametros
public Producto(
int codigoProducto,
string nombre,
decimal precio
)
{
this.var_codigoProducto = codigoProducto;
this.var_nombre = nombre;
this.var_precio = precio;
}
//Metodo utilizado para insertar un Producto
public string Insertar(Producto varProducto)
{
string rpta = "";
SqlConnection sqlCon = new SqlConnection();
try
{
//1. Establecer la cadena de conexion
sqlCon.ConnectionString = Conexion.cn;
//2. Abrir la conexion de la BD
sqlCon.Open();
//3. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.CommandText = "spI_Producto";
sqlCmd.CommandType = CommandType.StoredProcedure;
//4. Agregar los parametros al comando
Programacin C# .net
//Establecemos los valores para el parametro @codigoProducto del
Procedimiento Almacenado
SqlParameter sqlParcodigoProducto = new SqlParameter();
sqlParcodigoProducto.ParameterName = "@codigoProducto";
sqlParcodigoProducto.SqlDbType = SqlDbType.Int;
//Le declaramos que el parametro es de salida, porque obtendremos el
codigo generado por la base de datos
sqlParcodigoProducto.Direction = ParameterDirection.Output;
sqlCmd.Parameters.Add(sqlParcodigoProducto); //Agregamos el parmetro
al comando
//Establecemos los valores para el parametro @nombre del Procedimiento
Almacenado
SqlParameter sqlParnombre = new SqlParameter();
sqlParnombre.ParameterName = "@nombre";
sqlParnombre.SqlDbType = SqlDbType.VarChar;
sqlParnombre.Size = 100;
sqlParnombre.Value = varProducto.nombre;
sqlCmd.Parameters.Add(sqlParnombre); //Agregamos el parametro al
comando
//Establecemos los valores para el parametro @precio del Procedimiento
Almacenado
SqlParameter sqlParprecio = new SqlParameter();
sqlParprecio.ParameterName = "@precio";
sqlParprecio.SqlDbType = SqlDbType.Decimal;
sqlParprecio.Precision=18;
sqlParprecio.Scale=2;
sqlParprecio.Value = varProducto.precio;
sqlCmd.Parameters.Add(sqlParprecio); //Agregamos el parametro al
comando
//5. Ejecutamos el commando
rpta = sqlCmd.ExecuteNonQuery() == 1 ? "OK" : "No se inserto el
producto de forma correcta";
}
catch (Exception ex)
{
rpta = ex.Message;
}
finally
{
//6. Cerramos la conexion con la BD
if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
}
return rpta;
Programacin C# .net
//3. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.CommandText = "spU_Producto";
sqlCmd.CommandType = CommandType.StoredProcedure;
//4. Agregar los parametros al comando
//Establecemos los valores para el parametro @codigoProducto del
Procedimiento Almacenado
SqlParameter sqlParcodigoProducto = new SqlParameter();
sqlParcodigoProducto.ParameterName = "@codigoProducto";
sqlParcodigoProducto.SqlDbType = SqlDbType.Int;
sqlParcodigoProducto.Value = varProducto.codigoProducto;
sqlCmd.Parameters.Add(sqlParcodigoProducto); //Agregamos el parametro
al comando
//Establecemos los valores para el parametro @nombre del
Procedimiento Almacenado
SqlParameter sqlParnombre = new SqlParameter();
sqlParnombre.ParameterName = "@nombre";
sqlParnombre.SqlDbType = SqlDbType.VarChar;
sqlParnombre.Size = 100;
sqlParnombre.Value = varProducto.nombre;
sqlCmd.Parameters.Add(sqlParnombre); //Agregamos el parametro al
comando
//Establecemos los valores para el parametro @precio del
Procedimiento Almacenado
SqlParameter sqlParprecio = new SqlParameter();
sqlParprecio.ParameterName = "@precio";
sqlParprecio.SqlDbType = SqlDbType.Decimal;
sqlParprecio.Precision = 18;
sqlParprecio.Scale = 2;
sqlParprecio.Value = varProducto.precio;
sqlCmd.Parameters.Add(sqlParprecio); //Agregamos el parametro al
comando
//5. Ejecutamos el commando
rpta = sqlCmd.ExecuteNonQuery() == 1 ? "OK" : "No se actualizo el
producto de forma correcta";
}
catch (Exception ex)
{
rpta = ex.Message;
}
finally
{
//6. Cerramos la conexion con la BD
if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
}
return rpta;
Programacin C# .net
//1. Establecer la cadena de conexion
sqlCon.ConnectionString = Conexion.cn;
//2. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;//La conexion que va a usar el comando
sqlCmd.CommandText = "spF_Producto_All";//El comando a ejecutar
sqlCmd.CommandType = CommandType.StoredProcedure;//Decirle al comando
que va a ejecutar una sentencia SQL
//3. No hay parametros
//4. El DataAdapter que va a ejecutar el comando y es el encargado de
llena el DataTable
SqlDataAdapter sqlDat = new SqlDataAdapter(sqlCmd);
sqlDat.Fill(dtProducto);//Llenamos el DataTable
}
catch (Exception ex)
{
dtProducto = null;
}
return dtProducto;
}
#region Metodos Get y Set
public int codigoProducto
{
get { return var_codigoProducto; }
set { var_codigoProducto = value; }
}
public string nombre
{
get { return var_nombre; }
set { var_nombre = value; }
}
public decimal precio
{
get { return var_precio; }
set { var_precio = value; }
}
#endregion
}
}
Clase DetalleVenta
Esta clase se encarga de conectar la tabla DetalleVenta con C#
using System;
using System.Collections.Generic;
using System.Text;
//Impotaciones necesarias
using System.Data;
using System.Data.SqlClient;
namespace CapaDatos
Programacin C# .net
{
public class DetalleVenta
{
private int var_codigoVenta;
private int var_codigoProducto;
private decimal var_cantidad;
private decimal var_descuento;
//Constructor vacio
public DetalleVenta()
{
}
//Constructor con parametros
public DetalleVenta(
int codigoVenta ,
int codigoProducto ,
decimal cantidad ,
decimal descuento
)
{
this.var_codigoVenta=codigoVenta;
this.var_codigoProducto=codigoProducto;
this.var_cantidad=cantidad;
this.var_descuento=descuento;
}
//Mtodo utilizado para insertar un DetalleVenta
//Le pasamos la conexion y la transaccion por referencia, debido a que esos
datos lo obtenemos
//de la clase Venta y no deberiamos crear una nueva Conexion o una nueva
Transaccion//sino la creada por la clase Venta
public string Insertar(DetalleVenta varDetalleVenta, ref SqlConnection
sqlCon, ref SqlTransaction sqlTra)
{
string rpta = "";
try
{
//1. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTra;
sqlCmd.CommandText = "spI_DetalleVenta";
sqlCmd.CommandType = CommandType.StoredProcedure;
//4. Agregar los parametros al comando
//Establecemos los valores para el parametro @codigoVenta del
Procedimiento Almacenado
comando
Programacin C# .net
sqlParcodigoProducto.ParameterName = "@codigoProducto";
sqlParcodigoProducto.SqlDbType = SqlDbType.Int;
sqlParcodigoProducto.Size = 4;
sqlParcodigoProducto.Value = varDetalleVenta.codigoProducto;
sqlCmd.Parameters.Add(sqlParcodigoProducto); //Agregamos el parametro
al comando
//Establecemos los valores para el parametro @cantidad del Procedimiento
Almacenado
SqlParameter sqlParcantidad = new SqlParameter();
sqlParcantidad.ParameterName = "@cantidad";
sqlParcantidad.SqlDbType = SqlDbType.Decimal;
sqlParcantidad.Precision = 18;
sqlParcantidad.Scale = 2;
sqlParcantidad.Value = varDetalleVenta.cantidad;
sqlCmd.Parameters.Add(sqlParcantidad); //Agregamos el parametro al
comando
//Establecemos los valores para el parametro @descuento del Procedimiento
Almacenado
SqlParameter sqlPardescuento = new SqlParameter();
sqlPardescuento.ParameterName = "@descuento";
sqlPardescuento.SqlDbType = SqlDbType.Decimal;
sqlParcantidad.Precision = 18;
sqlParcantidad.Scale = 2;
sqlPardescuento.Value = varDetalleVenta.descuento;
sqlCmd.Parameters.Add(sqlPardescuento); //Agregamos el parametro al
comando
//5. Ejecutamos el commando
rpta = sqlCmd.ExecuteNonQuery() == 1 ? "OK" : "No se inserto el
detalle de venta de forma correcta";
}
catch (Exception ex)
{
rpta = ex.Message;
}
return rpta;
}
#region Metodos Get y Set
public int codigoVenta
{
get { return var_codigoVenta; }
set { var_codigoVenta = value; }
}
public int codigoProducto
{
get { return var_codigoProducto; }
set { var_codigoProducto = value; }
}
public decimal cantidad
{
get { return var_cantidad; }
set { var_cantidad = value; }
}
public decimal descuento
{
get { return var_descuento; }
set { var_descuento = value; }
Programacin C# .net
}
#endregion
}
Clase Venta
Esta clase se encarga de conectar la tabla Venta con C#
using System;
using System.Collections.Generic;
using System.Text;
//Impotaciones necesarias
using System.Data;
using System.Data.SqlClient;
namespace CapaDatos
{
public class Venta
{
private int var_codigoVenta;
private string var_cliente;
private DateTime var_fecha;
//Constructor vacio
public Venta()
{
}
//Constructor con parametros
public Venta(int codigoVenta,string cliente,DateTime fecha)
{
this.var_codigoVenta=codigoVenta;
this.var_cliente=cliente;
this.var_fecha=fecha;
}
//Metodo utilizado para insertar un Venta
public string Insertar(Venta varVenta, List<DetalleVenta> detalles)
{
string rpta = "";
SqlConnection sqlCon = new SqlConnection();
try
{
//1. Establecer la cadena de conexion
sqlCon.ConnectionString = Conexion.cn;
//2. Abrir la conexion de la BD
sqlCon.Open();
//3. Establecer la transaccion
SqlTransaction sqlTra = sqlCon.BeginTransaction();
//4. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTra;
sqlCmd.CommandText = "spI_Venta";
sqlCmd.CommandType = CommandType.StoredProcedure;
Programacin C# .net
//5. Agregar los parametros al comando
//Establecemos los valores para el parametro @codigoVenta del
Procedimiento Almacenado
SqlParameter sqlParcodigoVenta = new SqlParameter();
sqlParcodigoVenta.ParameterName = "@codigoVenta";
sqlParcodigoVenta.SqlDbType = SqlDbType.Int;
sqlParcodigoVenta.Direction = ParameterDirection.Output;
sqlCmd.Parameters.Add(sqlParcodigoVenta); //Agregamos el parametro al
comando
//Establecemos los valores para el parametro @cliente del Procedimiento
Almacenado
SqlParameter sqlParcliente = new SqlParameter();
sqlParcliente.ParameterName = "@cliente";
sqlParcliente.SqlDbType = SqlDbType.VarChar;
sqlParcliente.Size = 100;
sqlParcliente.Value = varVenta.cliente;
sqlCmd.Parameters.Add(sqlParcliente); //Agregamos el parametro al
comando
//6. Ejecutamos el commando
rpta = sqlCmd.ExecuteNonQuery() == 1 ? "OK" : "No se inserto el
detalle de venta de forma correcta";
if (rpta.Equals("OK"))
{
//Obtenemos el codigo de la venta que se genero por la base de
datos
this.codigoVenta=Convert.ToInt32(sqlCmd.Parameters["@codigoVenta"].Value);
foreach(DetalleVenta det in detalles){
//Establecemos el codigo de la venta que se autogenero
det.codigoVenta = this.codigoVenta;
//Llamamos al metodo insertar de la clase DetalleVenta
//y le pasamos la conexion y la transaccion que debe de usar
rpta = det.Insertar(det, ref sqlCon, ref sqlTra);
if (!rpta.Equals("OK"))
{
//Si ocurre un error al insertar un detalle de venta salimos
del for
break;
}
}
}
if (rpta.Equals("OK"))
{
//Se inserto todo los detalles y confirmamos la transaccion
sqlTra.Commit();
}
else
{
//Algun detalle no se inserto y negamos la transaccion
sqlTra.Rollback();
}
}
catch (Exception ex)
{
rpta = ex.Message;
}
finally
Programacin C# .net
{
//6. Cerramos la conexion con la BD
if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
}
return rpta;
}
//Obtenemos la venta por el codigo generado
public DataTable ObtenerVenta(int codigoVenta)
{
DataTable dtVenta = new DataTable("Venta");
SqlConnection sqlCon = new SqlConnection();
try
{
//1. Establecer la cadena de conexion
sqlCon.ConnectionString = Conexion.cn;
//2. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;//La conexion que va a usar el comando
sqlCmd.CommandText = "spF_Venta_One";//El comando a ejecutar
sqlCmd.CommandType = CommandType.StoredProcedure;//Decirle al comando
que va a ejecutar una sentencia SQL
//3. Agregar los parametros al comando
//Establecemos los valores para el parametro @codigoVenta del
Procedimiento Almacenado
SqlParameter sqlParcodigoVenta = new SqlParameter();
sqlParcodigoVenta.ParameterName = "@codigoVenta";
sqlParcodigoVenta.SqlDbType = SqlDbType.Int;
sqlParcodigoVenta.Value = codigoVenta;
sqlCmd.Parameters.Add(sqlParcodigoVenta); //Agregamos el parametro al
comando
//4. El DataAdapter que va a ejecutar el comando y es el encargado de
llena el DataTable
SqlDataAdapter sqlDat = new SqlDataAdapter(sqlCmd);
sqlDat.Fill(dtVenta);//Llenamos el DataTable
}
catch (Exception ex)
{
dtVenta = null;
}
return dtVenta;
}
//Obtener todas las ventas
public DataTable ObtenerVenta()
{
DataTable dtVenta = new DataTable("Venta");
SqlConnection sqlCon = new SqlConnection();
try
{
//1. Establecer la cadena de conexion
sqlCon.ConnectionString = Conexion.cn;
//2. Establecer el comando
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;//La conexion que va a usar el comando
Programacin C# .net
sqlCmd.CommandText = "spF_Venta_All";//El comando a ejecutar
sqlCmd.CommandType = CommandType.StoredProcedure;//Decirle al comando
que va a ejecutar una sentencia SQL
//3. No hay parametros
//4. El DataAdapter que va a ejecutar el comando y es el encargado de
llena el DataTable
SqlDataAdapter sqlDat = new SqlDataAdapter(sqlCmd);
sqlDat.Fill(dtVenta);//Llenamos el DataTable
}
catch (Exception ex)
{
dtVenta = null;
}
return dtVenta;
}
#region Metodos Get y Set
public int codigoVenta
{
get { return var_codigoVenta; }
set { var_codigoVenta = value; }
}
public string cliente
{
get { return var_cliente; }
set { var_cliente = value; }
}
public DateTime fecha
{
get { return var_fecha; }
set { var_fecha = value; }
}
#endregion
}
}
Resumen
Al final deberamos tener las siguientes clases
Programacin C# .net
Programacin C# .net
Creando el proyecto
Ahora debemos de agregar a nuestro proyecto un proyecto del tipo biblioteca de clases que
se llamara "CapaNegocios"
Programacin C# .net
Agregando al referencia con la Capa de Datos
Debemos de establecer la comunicacin entre la Capa de Negocios y la Capa de Datos. Para
eso hacemos clic derecho en nuestro proyecto que se llama "CapaNegocios" y nos vamos a
la opcion de "Agregar Referencia"
Programacin C# .net
Clase NegProducto
La clase "NegProducto" se encarga de comunicarse con la clase "Producto" de la capa de
datos
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
//Para que se comunique con la Capa de Datos
using CapaDatos;
namespace CapaNegocios
{
public class NegProducto
{
//Metodo que llama al metodo Insertar de la Capa de Datos
//de la clase Producto
public static string Insertar(string Nombre, decimal Precio)
{
Producto pro = new Producto();
pro.nombre = Nombre;
pro.precio = Precio;
return pro.Insertar(pro);
}
//Metodo que llama al metodo Actualizar de la Capa de Datos
//de la clase Producto
public static string Actualizar(int CodigoProducto, string Nombre, decimal Precio)
{
Producto pro = new Producto();
pro.codigoProducto = CodigoProducto;
pro.nombre = Nombre;
pro.precio = Precio;
return pro.Actualizar(pro);
}
//Metodo que se encarga de llamar al metodo ObtenerProducto
//de la clase Producto
public static DataTable ObtenerProducto()
{
return new Producto().ObtenerProducto();
}
}
}
Clase NegDetalleVenta
La clase "NegDetalleVenta" se encarga de establecer los descuentos de los detalles de
venta. Si el subtotal supera los 50 soles, dolares, euros, etc se le aplica un descuento del
5% del detalle de la venta. Y eso se aplica en la Capa de Negocios debido a que pertenece a
la lgica de la empresa.
using System;
Programacin C# .net
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CapaNegocios
{
public class NegDetalleVenta
{
//Metodo utilizado para obtener el descuento del detalle de la venta
//si la venta supera los 50 soles, dolares, euros, etc
//se le hace un descuento del 5% del detalle de la venta
public static decimal ObtenerDescuento(decimal cantidad, decimal pu)
{
if ((cantidad * pu) > 50)
{
decimal porcentaje = Convert.ToDecimal(0.05);
decimal descuento = ((cantidad * pu) * porcentaje);
return descuento;
}
else
{
return 0;
}
}
}
}
Clase NegVenta
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
//Para que se comunique con la Capa de Datos
using CapaDatos;
namespace CapaNegocios
{
public class NegVenta
{
//Metodo que llama al metodo Insertar de la Capa de Datos
//de la clase Venta
public static string Insertar(string cliente, DataTable dtDetalles)
{
Venta venta = new Venta();
venta.cliente = cliente;
List<DetalleVenta> detalles=new List<DetalleVenta>();
foreach (DataRow row in dtDetalles.Rows)
{
DetalleVenta detalle = new DetalleVenta();
detalle.codigoProducto = Convert.ToInt32(row["codigoProducto"].ToString());
detalle.cantidad = Convert.ToDecimal(row["cantidad"].ToString());
detalle.descuento = NegDetalleVenta.ObtenerDescuento(detalle.cantidad,
Convert.ToDecimal(row["PU"].ToString()));
detalles.Add(detalle);
Programacin C# .net
}
return venta.Insertar(venta, detalles);
}
//Metodo que se encarga de llamar al metodo ObtenerProducto
//de la clase Venta
public static DataTable ObtenerVenta()
{
return new Venta().ObtenerVenta();
}
//Metodo que se encarga de llamar al metodo ObtenerProducto
//por codigo de la clase Venta
public static DataTable ObtenerVenta(int codigoVenta)
{
return new Venta().ObtenerVenta(codigoVenta);
}
}
Resumen
Al final deberamos tener las siguientes clases
Programacin C# .net
Creando el Proyecto
Ahora debemos de agregar a nuestro proyecto un proyecto del tipo biblioteca de clases que
se llamara "CapaPresentacion". No olvidar que debemos de ir a "Archivo-->Agregar->Nuevo Proyecto"
Programacin C# .net
Programacin C# .net
Formulario frmMantenimientoProducto
En este formulario vamos a realizar un mantenimiento a la tabla Producto de nuestra Base
de Datos que se llama BDTutorial y que esta diseada en SQL Server 2008. A
mantenimiento me refiero a los procesos de insercin, actualizacin y consulta de datos de
la tabla Producto. Debemos de disear el siguiente formulario
AllowUserToAddRows = False
AllowUserToDeleteRows = False
MultiSelect = False
ReadOnly = True
SelectionMode = FullRowSelect
codigoProducto
o
DataPropertyName = codigoProducto
HeaderText = codigoProducto
Visible = False
Nombre
Programacin C# .net
DataPropertyName = nombre
HeaderText = Nombre
Visible = True
Precio
o
DataPropertyName = precio
HeaderText = Precio
Visible = True
Programacin C# .net
private bool modificar = false;
//Constructor del formulario
public frmMantenimientoProducto()
{
InitializeComponent();
}
//Evento que se lanza cuando se va a mostrar el formulario
private void frmMantenimientoProducto_Load(object sender, EventArgs e)
{
//Para ubicar al formulario en la parte superior del contenedor
this.Top = 0;
this.Left = 0;
//Le decimos al DataGridView que no auto genere las columnas
this.dgvProductos.AutoGenerateColumns = false;
//Llenamos el DataGridView con la informacion de todos nuestros
//productos
this.dgvProductos.DataSource = NegProducto.ObtenerProducto();
//Deshabilita los controles
this.habilitar(false);
//Establece los botones
this.botones();
}
//Para mostrar mensaje de confirmacion
private void mOK(string men)
{
MessageBox.Show(men, "MENSAJE", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
//Para mostrar mensaje de error
private void mError(string men)
{
MessageBox.Show(men, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//Limpia los controles del formulario
private void limpiar()
{
this.txtNombre.Text = string.Empty;
this.nudPrecio.Value = 0;
}
//Habilita los controles de los formularios
private void habilitar(bool valor)
{
this.txtNombre.ReadOnly = !valor;
this.nudPrecio.Enabled = valor;
}
//Habilita los botones
private void botones()
{
if (this.nuevo || this.modificar)
{
this.habilitar(true);
this.btnNuevo.Enabled = false;
this.btnGuardar.Enabled = true;
this.btnModificar.Enabled = false;
this.btnCancelar.Enabled = true;
}
else
Programacin C# .net
{
this.habilitar(false);
this.btnNuevo.Enabled = true;
this.btnGuardar.Enabled = false;
this.btnModificar.Enabled = true;
this.btnCancelar.Enabled = false;
}
}
//Evento clic del boton btnNuevo
private void btnNuevo_Click(object sender, EventArgs e)
{
this.nuevo=true;
this.modificar=false;
this.botones();
this.limpiar();
this.txtCodigo.Text = string.Empty;
this.txtNombre.Focus();
}
//Evento clic del boton btnGuardar
private void btnGuardar_Click(object sender, EventArgs e)
{
//La variable que almacena si se inserto o se modifico la tabla
string rpta = "";
if(this.nuevo)
{
//Vamos a insertar un producto
rpta=NegProducto.Insertar(this.txtNombre.Text.Trim().ToUpper(),
this.nudPrecio.Value);
}else
{
//Vamos a modificar un producto
rpta=NegProducto.Actualizar(Convert.ToInt32(this.txtCodigo.Text),
this.txtNombre.Text.Trim().ToUpper(),
this.nudPrecio.Value);
}
//Si la respuesta fue OK, fue porque se modifico o inserto el Producto
//de forma correcta
if (rpta.Equals("OK"))
{
if (this.nuevo)
{
this.mOK("Se inserto de forma correcta al Producto");
}
else
{
this.mOK("Se actualizo de forma correcta al Producto");
}
}
else
{
//Mostramos el mensaje de error
this.mError(rpta);
}
this.nuevo=false;
this.modificar=false;
Programacin C# .net
this.botones();
this.limpiar();
this.dgvProductos.DataSource = NegProducto.ObtenerProducto();
this.txtCodigo.Text="";
}
//Evento clic del boton btnModificar
private void btnModificar_Click(object sender, EventArgs e)
{
//Si no ha seleccionado un producto no puede modificar
if(!this.txtCodigo.Text.Equals(""))
{
this.modificar=true;
this.botones();
}
else
{
this.mError("Debe de buscar un producto para Modificar");
}
}
//Evento clic del boton btnCancelar
private void btnCancelar_Click(object sender, EventArgs e)
{
this.nuevo=false;
this.modificar=false;
this.botones();
this.limpiar();
this.txtCodigo.Text=string.Empty;
}
//Evento double clic del DataGridView de Productos
private void dgvProductos_DoubleClick(object sender, EventArgs e)
{
this.txtCodigo.Text =
Convert.ToString(this.dgvProductos.CurrentRow.Cells["codigoProducto"].Value);
this.txtNombre.Text =
Convert.ToString(this.dgvProductos.CurrentRow.Cells["nombre"].Value);
this.nudPrecio.Value =
Convert.ToDecimal(this.dgvProductos.CurrentRow.Cells["precio"].Value);
this.tabControl.SelectedIndex = 1;
}
}
}
Formulario frmSeleccionarProducto
Es un formulario del tipo modal que nos permitir seleccionar un producto de nuestra base
de datos para registrar la venta. Y tiene el siguiente diseo
Programacin C# .net
AllowUserToAddRows = False
AllowUserToDeleteRows = False
MultiSelect = False
ReadOnly = True
SelectionMode = FullRowSelect
codigoProducto
o
DataPropertyName = codigoProducto
HeaderText = codigoProducto
Visible = False
Nombre
Programacin C# .net
DataPropertyName = nombre
HeaderText = Nombre
Visible = True
Precio
o
DataPropertyName = precio
HeaderText = Precio
Visible = True
Programacin C# .net
{
//Estableciendo los datos a las cajas de texto del formulario padre
this.frame.codigoProductoSeleccionado =
Convert.ToInt32(this.dgvProducto.CurrentRow.Cells["codigoProducto"].Value);
this.frame.txtProducto.Text =
Convert.ToString(this.dgvProducto.CurrentRow.Cells["nombre"].Value);
this.frame.txtPrecio.Text =
Convert.ToString(this.dgvProducto.CurrentRow.Cells["precio"].Value);
//Cerrando el formulario
this.Hide();
}
}
}
Formulario frmRegistrarVenta
Este formulario es la parte principal del sistema en cual se registra la venta. Tener en
cuenta que si el detalle de la venta es mayor a 50 soles, dolares, euros, etc se le aplica un
descuento del 5% del sub total de la venta. Debemos realizar el siguiente diseo del
formulario.
AllowUserToAddRows = False
AllowUserToDeleteRows = False
MultiSelect = False
ReadOnly = True
Programacin C# .net
SelectionMode = FullRowSelect
codigoProducto
o
DataPropertyName = codigoProducto
HeaderText = codigoProducto
Visible = False
Producto
o
DataPropertyName = Producto
HeaderText = Producto
Visible = True
Cantidad
o
DataPropertyName = cantidad
HeaderText = Cantidad
Visible = True
DataPropertyName = PU
HeaderText = PU
Visible = True
PU
Descuento
o
DataPropertyName = Descuento
HeaderText = Descuento
Visible = True
SubTotal
o
DataPropertyName = subTotal
HeaderText = SubTotal
Visible = True
Programacin C# .net
Programacin C# .net
//Agrega las columnas que tendra la tabla
this.dtDetalle.Columns.Add("codigoProducto", System.Type.GetType("System.Int32"));
this.dtDetalle.Columns.Add("Producto", System.Type.GetType("System.String"));
this.dtDetalle.Columns.Add("cantidad", System.Type.GetType("System.Decimal"));
this.dtDetalle.Columns.Add("PU", System.Type.GetType("System.Decimal"));
this.dtDetalle.Columns.Add("Descuento", System.Type.GetType("System.Decimal"));
this.dtDetalle.Columns.Add("subTotal", System.Type.GetType("System.Decimal"));
//Relacionamos nuestro datagridview con nuestro datatable
this.dgvDetalle.DataSource = this.dtDetalle;
}
//Para mostrar mensaje de error
private void mError(string mensaje)
{
MessageBox.Show(this, mensaje, "ERROR", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
//Para mostrar mensaje de confirmacin
private void mOk(string mensaje)
{
MessageBox.Show(this, mensaje, "MENSAJE", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
//Evento del clic del boton btnBuscar
private void btnBuscar_Click(object sender, EventArgs e)
{
//Creamos una variable del tipo del formulario que deseamos abrir
frmSeleccionarProducto frame = new frmSeleccionarProducto();
//Le pasamos como datos la informacin de nuestro formulario
frame.estableceFormulario(this);
//Mostrar el formulario que tiene los productos que hemos seleccionado
frame.ShowDialog();
}
//Evento clic del boton agregar
private void btnAgregar_Click(object sender, EventArgs e)
{
//Valida que hemos seleccionado algun producto
if (this.codigoProductoSeleccionado == -1)
{
this.mError("No ha seleccionado aun ningun producto");
}
else
{
//Variable que va a indicar si podemos registrar el detalle
bool registrar = true;
foreach (DataRow row in dtDetalle.Rows)
{
if (Convert.ToInt32(row["codigoProducto"]) == this.codigoProductoSeleccionado)
{
registrar = false;
this.mError("Ya se encuentra el producto en el detalle");
}
}
Programacin C# .net
Programacin C# .net
private void btnGuardar_Click(object sender, EventArgs e)
{
//Debe de tener por almenos un detalle para poder registrar
if (this.dtDetalle.Rows.Count > 0)
{
string rpta = NegVenta.Insertar(this.txtCliente.Text, this.dtDetalle);
if (rpta.Equals("OK"))
{
mOk("Se inserto de manera correcta la venta");
this.limpiarControles();
}
else
{
mError(rpta);
}
}
else
{
mError("No agregado ningun detalle");
}
}
Programacin C# .net