Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. ENTORNO
• SQL Server 2008
• Visual Studio 2008
2. INTRODUCCIÓN
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
/*
----------------------------------------------------
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
/*
----------------------------------------------------
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
/*
----------------------------------------------------
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
/*
----------------------------------------------------
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
)
1. ENTORNO
2. INTRODUCCIÓN
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"
Debemos de agregar a nuestro proyecto la capa de datos, para eso nos vamos al menu de
"Archivo-->Agregar Nuevo Proyecto"
Para agregar una clase en C# debemos hacer clic derecho en la Capa de Datos y seleccionar
la opción "Agregar-->Clase" y la clase que creamos se llamara "Conexion", que se encargara
de guardar la cadena de conexión para poder conectarnos con nuestra base de datos que esta
en SQL Server 2008 y la cual se llama BDTutorial.
La clase Conexion tendrá el siguiente código en C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 SQL2008
//Utiliza seguridad integrada para conectarse a la base de datos
public static string cn = "Data Source=.\\SQL2008;Initial
Catalog=BDTutorial;Integrated Security=True";
}
}
using System;
using System.Collections.Generic;
using System.Text;
//Impotaciones necesarias
using System.Data;
using System.Data.SqlClient;
namespace CapaDatos
{
//Constructor vacio
public Producto()
{
}
catch (Exception ex)
{
rpta = ex.Message;
}
finally
{
//6. Cerramos la conexion con la BD
if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
}
return rpta;
}
}
catch (Exception ex)
{
rpta = ex.Message;
}
finally
{
//6. Cerramos la conexion con la BD
if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
}
return rpta;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
//Impotaciones necesarias
using System.Data;
using System.Data.SqlClient;
//Constructor vacio
public DetalleVenta()
{
}
catch (Exception ex)
{
rpta = ex.Message;
}
return rpta;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
//Impotaciones necesarias
using System.Data;
using System.Data.SqlClient;
//Constructor vacio
public Venta()
{
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;
//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["@codigoV
enta"].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
{
//6. Cerramos la conexion con la BD
if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
}
return rpta;
}
}
}
4. RESUMEN
Al final deberíamos tener las siguientes clases
C# - APLICACIÓN DE ESCRITORIO, SISTEMAS DE
VENTAS PART III - CREACIÓN DE LA CAPA DE
NEGOCIOS
10:15 PM HENRY WONG 2 COMENTARIOS
"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
2. INTRODUCCIÓN
Ya vimos que en la Parte II del tutorial creamos la Capa de Dato de nuestro sistema, la cual es
la encargada de comunicarse con la base de datos. Ahora nos tocaría desarrollar la Capa de
Negocios que es la capa en la cual se implementa la lógica del negocio de la empresa como
obtener descuentos, aumentos, etc.
3. DESARROLLO
Ahora debemos de agregar a nuestro proyecto un proyecto del tipo biblioteca de clases que se
llamara "CapaNegocios"
3.2. Agregando al referencia con 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;
//Desarollado por Henry Joe Wong Urquiza
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();
}
}
}
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;
//Desarollado por Henry Joe Wong Urquiza
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);
}
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);
}
}
}
4. RESUMEN
"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
2. INTRODUCCIÓN
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"
• AllowUserToAddRows = False
• AllowUserToDeleteRows = False
• MultiSelect = False
• ReadOnly = True
• SelectionMode = FullRowSelect
• codigoProducto
o DataPropertyName = codigoProducto
o HeaderText = codigoProducto
o Visible = False
• Nombre
o DataPropertyName = nombre
o HeaderText = Nombre
o Visible = True
• Precio
o DataPropertyName = precio
o HeaderText = Precio
o Visible = True
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Comunicarse con la Capa de Negocios
using CapaNegocios;
//Desarollado por Henry Joe Wong Urquiza
namespace CapaPresentacion
{
public partial class frmMantenimientoProducto : Form
{
//Variable que nos indica si vamos a insertar un nuevo producto
private bool nuevo = false;
//Variable que nos indica si vamos a modificar un producto
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
{
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.Tex
t),
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;
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;
}
}
}
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 diseño
En el cual el componente dgvProducto tiene los siguientes valores de propiedades:
• AllowUserToAddRows = False
• AllowUserToDeleteRows = False
• MultiSelect = False
• ReadOnly = True
• SelectionMode = FullRowSelect
Y como columnas tiene
• codigoProducto
o DataPropertyName = codigoProducto
o HeaderText = codigoProducto
o Visible = False
• Nombre
o DataPropertyName = nombre
o HeaderText = Nombre
o Visible = True
• Precio
o DataPropertyName = precio
o HeaderText = Precio
o Visible = True
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Comunicarse con la Capa de Negocios
using CapaNegocios;
//Desarollado por Henry Joe Wong Urquiza
namespace CapaPresentacion
{
public partial class frmSeleccionarProducto : Form
{
//El formulario padre
private frmRegistrarVenta frame;
//El constructor del formulario
public frmSeleccionarProducto()
{
InitializeComponent();
}
//Establece los valores del formulario padre
public void estableceFormulario(frmRegistrarVenta frame)
{
this.frame = frame;
}
//Evento que se ejecuta cuando se muestra el formulario
private void frmSeleccionarProducto_Load(object sender, EventArgs
e)
{
//Que no se genere las columnas de forma automatica
this.dgvProducto.AutoGenerateColumns = false;
//Obtiene todos los productos y lo asigana al DataGridView
this.dgvProducto.DataSource = NegProducto.ObtenerProducto();
}
//Evento double clic del DataGridView
private void dgvProducto_DoubleClick(object sender, EventArgs e)
{
//Estableciendo los datos a las cajas de texto del formulario
padre
this.frame.codigoProductoSeleccionado =
Convert.ToInt32(this.dgvProducto.CurrentRow.Cells["codigoProducto"].Va
lue);
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();
}
}
}
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 diseño del formulario
En cual la accesibilidad de los controles txtProducto y txtPrecio es del tipoInternal y tiene la
propiedad ReadOnly en True.
• AllowUserToAddRows = False
• AllowUserToDeleteRows = False
• MultiSelect = False
• ReadOnly = True
• SelectionMode = FullRowSelect
• codigoProducto
o DataPropertyName = codigoProducto
o HeaderText = codigoProducto
o Visible = False
• Producto
o DataPropertyName = Producto
o HeaderText = Producto
o Visible = True
• Cantidad
o DataPropertyName = cantidad
o HeaderText = Cantidad
o Visible = True
• PU
o DataPropertyName = PU
o HeaderText = PU
o Visible = True
• Descuento
o DataPropertyName = Descuento
o HeaderText = Descuento
o Visible = True
• SubTotal
o DataPropertyName = subTotal
o HeaderText = SubTotal
o Visible = True
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Comunicarse con la Capa de Negocios
using CapaNegocios;
//Desarollado por Henry Joe Wong Urquiza
namespace CapaPresentacion
{
public partial class frmRegistrarVenta : Form
{
//DataTable que se encargara de guardar el detalle de la venta
//de forma temporal
private DataTable dtDetalle;
//Codigo del producto seleccionado
internal int codigoProductoSeleccionado = -1;
//Variable que almacena el total de la venta
private decimal totalPagar = 0;
//El constructor de la clase
public frmRegistrarVenta()
{
InitializeComponent();
}
//Metodo que se ejecuta al cargar el formulario
private void frmRegistrarVenta_Load(object sender, EventArgs e)
{
this.Top = 0;
this.Left = 0;
this.crearTabla();
this.WindowState = FormWindowState.Maximized;
}
//Limpia todos los controles del formulario
private void limpiarControles()
{
this.txtCliente.Text = string.Empty;
this.codigoProductoSeleccionado = -1;
this.txtProducto.Text = string.Empty;
this.txtPrecio.Text = string.Empty;
this.nudCantidad.Value = 1;
this.crearTabla();
this.lblTotalPagar.Text = "Total Pagar: S/. 0.00";
}
//Crea la tabla de Detalle
private void crearTabla()
{
//Crea la tabla con el nombre de Detalle
this.dtDetalle = new DataTable("Detalle");
//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 confirmación
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 información 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");
}
}
//Si podemos registrar el producto en el detalle
if (registrar)
{
//Calculamos el sub total del detalle sin descuento
decimal subTotal = Convert.ToDecimal(this.txtPrecio.Text) *
nudCantidad.Value;
//Obtenemos el descuento
decimal descuento = NegDetalleVenta.ObtenerDescuento(
nudCantidad.Value,
Convert.ToDecimal(this.txtPrecio.Text));
//Actualizamos el sub total con el descuento correspondiente
subTotal = subTotal - descuento;
//Aumentamos el total a pagar
this.totalPagar += subTotal;
this.lblTotalPagar.Text = "Total Pagar: S/." +
totalPagar.ToString("#0.00#");
//Agregamos al fila a nuestro datatable
DataRow row = this.dtDetalle.NewRow();
row["codigoProducto"] = this.codigoProductoSeleccionado;
row["Producto"] = this.txtProducto.Text;
row["cantidad"] = this.nudCantidad.Value;
row["PU"] = this.txtPrecio.Text ;
row["Descuento"] = descuento;
row["subTotal"] = subTotal;
this.dtDetalle.Rows.Add(row);
}
}
}
//Evento click del boton quitar
private void btnQuitar_Click(object sender, EventArgs e)
{
try
{
//Indice dila actualmente seleccionado y que vamos a eliminar
int indiceFila = this.dgvDetalle.CurrentCell.RowIndex;
//Fila que vamos a eliminar
DataRow row = this.dtDetalle.Rows[indiceFila];
//Disminuimos el total a pagar
this.totalPagar = this.totalPagar -
Convert.ToDecimal(row["subTotal"].ToString());
this.lblTotalPagar.Text = "Total Pagar: S/." +
totalPagar.ToString("#0.00#");
//Removemos la fila
this.dtDetalle.Rows.Remove(row);
}
catch (Exception ex)
{
mError("No hay fila para remover");
}
}
}
}
"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
Continuando con el tutorial del sistemas de ventas con C#, ahora crearemos el reporte con
Crystal Report que nos mostrara el documento creado producto de la venta que hemos
realizado. Como este es un tutorial con un fin didáctico, para crear el reporte nosotros
escribiremos el código auto generado por la inserción de la venta, aunque lo ideal seria que
desde la capa de negocios obtengamos el código que se genero y se muestre el reporte de
forma automática.
3. DESARROLLO
Ahora debemos de modificar nuestro formulario que hemos creado anteriormente que se
llamaba frmRegistrarVenta. Si recordamos este formulario tenia un Tab Control con dos
pestañas, una que se llamaba Registrar y otro que se llama Reporte. Y justo en esta ultima
pestaña es donde vamos a poner nuestro reporte. Para poder mostrar los reportes en C#,
debemos de agregar un componente que se llama CrystalReportViewer que se encuentra en
nuestro cuadro de herramientas en el grupo de Informe
Y luego en nuestro formulario hacemos el siguiente diseño
3.2. Creando nuestro DataSet
Para poder crear un reporte para Crystal Reporte, lo primero que se tiene que hacer es crear
un DataSet en donde se almacenara todo nuestro datos de la consulta y nos servira para llenar
nuestro reporte y para eso les prepare el siguiente video para que puedan crear un DataSet de
la manera mas rápida y sencilla.
Ahora debemos de diseñar nuestro reporte con la información que obtenemos de nuestro
DataSet que hemos creado anteriormente, para eso también les prepare otro vídeo.
Ahora nos vamos a ir al evento clic del botón "btnReporte" de nuestro formulario
"frmRegistrarVenta" y pondremos el siguiente código fuente