Está en la página 1de 14

Mantenimiento de Clientes en 3 Capas Pag: 1 / 14

_______________________________________________________________________________
Taller de N-Capas
Mantenimiento de Clientes en 3 Capas

1.- Crearemos una solucin en blanco, para lo cual sobre el men Archivo (File), Nuevo
Proyecto (New Project), seleccionamos Otros tipos de Proyecto, Soluciones de Visual
Studio y en plantilla Elegimos Solucin en Blanco (Blank Solution) y le damos el nombre de
Mantenimiento_3Capas, tal como se muestra en la siguiente figura:



2.- Agregaremos ahora 3 Nuevos proyectos a nuestra aplicacin para lo cual en el
Explorador de Soluciones (Solution Explorer) seleccionamos la solucin
Mantenimiento_3Capas, clic derecho Agregar (Add), Nuevo Proyecto (New Project), tal como
se muestra a continuacin:




Mantenimiento de Clientes en 3 Capas Pag: 2 / 14

_______________________________________________________________________________
Taller de N-Capas
3.- Luego de esto seleccionaremos el tipo de Proyecto, eligiendo Visual C#, Windows y
como plantilla Aplicacin para Windows (Windows Application), dndole el nombre de
LibNet_Presentacion, tal como se muestra a continuacin:




4.- Siguiendo este mismo proceso agregaremos los 2 proyectos faltantes pero de tipo
Librera de Clases (Class Library) para la Capa de Negocio y la capa de Datos a los cuales
los denominaremos LibNet_Business y LibNet_Data respectivamente.




Mantenimiento de Clientes en 3 Capas Pag: 3 / 14

_______________________________________________________________________________
Taller de N-Capas
5.- Ahora crearemos los procedimientos almacenados que utilizaremos en nuestra
aplicacin:


CREATE DATABASE BDVIDEOS

USE BDVIDEOS

CREATE TABLE CLIENTES
(
CLI_CODIGO CHAR(5) PRIMARY KEY,
CLI_NOMBRE VARCHAR(50),
CLI_RUC CHAR(11),
CLI_TELEFONO VARCHAR(12),
CLI_ESTADO BIT DEFAULT 1
)
GO

CREATE PROC USP_LISTA_CLIENTE
AS
SELECT * FROM CLIENTES WHERE CLI_ESTADO=1
GO

CREATE PROC USP_NUEVO_CLIENTE
@CODIGO CHAR(5) OUTPUT
AS
DECLARE @N INT
SELECT @N=(SELECT ISNULL(MAX(RIGHT(CLI_CODIGO,4)),0)+1 FROM CLIENTES)
SET @CODIGO='C'+RIGHT('000'+LTRIM(STR(@N)),4)
GO

DECLARE @COD CHAR(5)
EXEC USP_NUEVO_CLIENTE @COD OUTPUT
SELECT @COD
GO



CREATE PROC USP_ADD_CLIENTE
@CLI_CODIGO CHAR(5), @CLI_NOMBRE VARCHAR(50),
@CLI_RUC VARCHAR(11), @CLI_TELEFONO VARCHAR(12),@CLI_ESTADO BIT
AS
IF EXISTS(SELECT * FROM CLIENTES WHERE CLI_CODIGO=@CLI_CODIGO)
BEGIN
UPDATE CLIENTES
SET CLI_NOMBRE=@CLI_NOMBRE,CLI_RUC=@CLI_RUC,
CLI_TELEFONO=@CLI_TELEFONO, CLI_ESTADO=@CLI_ESTADO
WHERE CLI_CODIGO=@CLI_CODIGO
END
ELSE
BEGIN
INSERT INTO CLIENTES
VALUES(@CLI_CODIGO,@CLI_NOMBRE,@CLI_RUC,@CLI_TELEFONO,1)
END
GO




Mantenimiento de Clientes en 3 Capas Pag: 4 / 14

_______________________________________________________________________________
Taller de N-Capas

CREATE PROC USP_DEL_CLIENTE
@CLI_CODIGO CHAR(5)
AS
UPDATE CLIENTES SET CLI_ESTADO=0 WHERE CLI_CODIGO=@CLI_CODIGO
GO


6.- Luego de esto vamos a renombrar los archivos de clases creados de manera
predeterminada:

En el proyecto: LibNet_Data

Nombre Archivo Original Nuevo Nombre de Archivo
Class1.cs Cls_DBCliente.cs

En el proyecto: LibNet_Business

Nombre Archivo Original Nuevo Nombre de Archivo
Class1.cs Cls_BCliente.cs

En el proyecto: LibNet_Presentacion

Nombre Archivo Original Nuevo Nombre de Archivo
Form1.cs Frm_Mant_Clientes.cs

Al final el explorador de soluciones quedaria de la siguiente manera:




7.- Ahora procederemos a escribir el codigo necesario que permita conectar y utilizar los
procedimientos almacenados en el servidor de base de datos, para lo cual ingresaremos al
codigo de la clase Cls_DBCliente.cs y lo primero que tenemos que ingresar es el codigo que
permita acceder a los componentes de acceso a datos:

using System.Data;
using System.Data.SqlClient;

Mantenimiento de Clientes en 3 Capas Pag: 5 / 14

_______________________________________________________________________________
Taller de N-Capas
Y luego especificamos una cadena de conexion y un objeto SqlConnection que lo utilice:

const string CadCn = "Server=(local)\\sqlexpress;Database=BDVIDEOS;" +
"Integrated Security=yes";

SqlConnection Cn = new SqlConnection(CadCn);

8.- El codigo completo de nuestra capa de datos se muestra a continuacion:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace LibNet_Data
{
public class Cls_DBCliente
{
const string CadCn = "Server=(local)\\sqlexpress;Database=BDVIDEOS;" +
"Integrated Security=yes";
SqlConnection Cn = new SqlConnection(CadCn);

private void AbrirConexion()
{
try
{
if (Cn.State == ConnectionState.Closed)
Cn.Open();
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
}

private void CerrarConexion()
{
try
{
if (Cn.State == ConnectionState.Open)
Cn.Close();
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
}

public DataTable ListaClientes(string NomSP)
{
AbrirConexion();
SqlCommand oCmd = Cn.CreateCommand();
oCmd.CommandText = NomSP;
oCmd.CommandType = CommandType.StoredProcedure;
Mantenimiento de Clientes en 3 Capas Pag: 6 / 14

_______________________________________________________________________________
Taller de N-Capas
SqlDataAdapter oDap = new SqlDataAdapter(oCmd);

DataTable oTabla = new DataTable();
oDap.Fill(oTabla);
CerrarConexion();
return oTabla;
}

public int AgregarCliente(string NomSP, string Codigo, string Nombre,
string RUC, string Telefono, int Estado)
{
try
{
AbrirConexion();
SqlCommand oCmd = new SqlCommand(NomSP, Cn);
oCmd.CommandType = CommandType.StoredProcedure;

oCmd.Parameters.AddWithValue("@CLI_CODIGO", Codigo);
oCmd.Parameters.AddWithValue("@CLI_NOMBRE", Nombre);
oCmd.Parameters.AddWithValue("@CLI_RUC", RUC);
oCmd.Parameters.Add("@CLI_TELEFONO", SqlDbType.VarChar, 11).Value =
Telefono;
oCmd.Parameters.Add("@CLI_ESTADO", SqlDbType.Bit).Value = Estado;

int n;
n = Convert.ToInt32(oCmd.ExecuteNonQuery());
CerrarConexion();
return n;
}
catch
{
throw new Exception("Error de ClsDatos.AgregarCliente");
}
}

public int EliminarCliente(string NomSP, string Codigo)
{
try
{
AbrirConexion();
SqlCommand oCmd = new SqlCommand(NomSP, Cn);
oCmd.CommandType = CommandType.StoredProcedure;
oCmd.Parameters.Add("@CLI_CODIGO", SqlDbType.Char, 5).Value = Codigo;

int n;
n = Convert.ToInt32(oCmd.ExecuteNonQuery());
CerrarConexion();
return n;
}
catch
{
throw new Exception("Error de ClsDatos.EliminarCliente");
}
}


Mantenimiento de Clientes en 3 Capas Pag: 7 / 14

_______________________________________________________________________________
Taller de N-Capas
public string NuevoCodigoCliente()
{
try
{
AbrirConexion();
SqlCommand oCmd = new SqlCommand("USP_NUEVO_CLIENTE", Cn);
oCmd.CommandType = CommandType.StoredProcedure;
oCmd.Parameters.Add("@CODIGO", SqlDbType.Char, 5).Direction =
ParameterDirection.Output;
oCmd.ExecuteNonQuery();
string NewCodigo = oCmd.Parameters[0].Value.ToString();
CerrarConexion();
return NewCodigo;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return ex.Message;
}
}
}
}


9.- Ahora antes de ingresar el codigo necesario en nuestra capa de negocio, lo primero que
tenemos que hacer es establecer la referencia desde el proyecto LibNet_Business con el
Proyecto LibNet_Data, para lo cual realizaremos lo siguiente:

Seleccionamos y expandimos el Proyecto LibNet_Business
Clic derecho sobre la carpeta References y seleccionamos Agregar Referencia



Y en la ficha Proyectos (Projects) seleccionaremos el proyecto LibNet_Data

Mantenimiento de Clientes en 3 Capas Pag: 8 / 14

_______________________________________________________________________________
Taller de N-Capas



10.- Ahora si ingresaremos el codigo que nos permita comunicarnos con nuestra capa de
datos desde nuestra capa de negocio, asi es que lo primero que haremos es crear una
variable de tipo LibNet_Data.Cls_DBCliente para que atraves de ella obtener los metodos
(Funciones, procedimientos, etc) de la capa de datos.

LibNet_Data.Cls_DBCliente objData = new LibNet_Data.Cls_DBCliente();

No olvidar que tambien aqui deberemos utilizar los objetos de acceso a datos.

using System.Data;
using System.Data.SqlClient;

11.- El codigo completo de nuestra capa de negocio Cls_BCliente perteneciente al proyecto
LibNet_Business se muestra a continuacion:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace LibNet_Business
{
public class Cls_BCliente
{
LibNet_Data.Cls_DBCliente objData = new LibNet_Data.Cls_DBCliente();

public DataTable BListarClientes()
{
return objData.ListaClientes("USP_LISTA_CLIENTE");
}

Mantenimiento de Clientes en 3 Capas Pag: 9 / 14

_______________________________________________________________________________
Taller de N-Capas
public string BNuevoCodigo()
{
return objData.NuevoCodigoCliente().ToString();
}

public int BAgregarCliente(string Codigo, string Nombre, string RUC,
string Telefono, int Estado)
{
return objData.AgregarCliente("USP_ADD_CLIENTE", Codigo, Nombre, RUC,
Telefono, Estado);
}

public int BEliminarCliente(string Codigo)
{
return objData.EliminarCliente("USP_DEL_CLIENTE", Codigo);
}
}
}


12.- Por ultimo nos queda la parte del diseo de nuestra capa de presentacin, no olvidar
que esta capa se debe comunicar con nuestra capa de negocio, por lo cual esta capa
necesitara de una referencia con LibNet_Business, as es que deber realizar antes esta
referencia.

Luego de haber realizado la referencia desde LibNet_Presentacion hacia LibNet_Business,
comenzaremos con el diseo, para lo cual necesitaremos:

6 Labels (Etiquetas)
1 TextBox (Caja de Texto)
2 MaskedTextBox
1 CheckBox
1 DataGridView
1 ToolStrip

Propiedades de los controles

Control Propiedad Valor

Label1 Text Codigo
Label2 Text Nombre
Label3 Text Nro de RUC
Label4 Text Telefono
Label5 Text Estado
Label6 Text
Label6 Name LblCodigo

TextBox1 Text
Name TxtNombre

MaskedTextBox1 Name MskRUC
Mask 99999999999

MaskedTextBox2 Name MskTelefono
Mask 999-9999

Mantenimiento de Clientes en 3 Capas Pag: 10 / 14

_______________________________________________________________________________
Taller de N-Capas
CheckBox1 Name chkEstado

DataGridView1 Name dgvClientes

ToolStrip Items

Agregaremos 3 Botones, 1 separador, 1 boton, 1 separador, 1 etiqueta, 1 ComboBox y un
ltimo boton, todos en este orden.

Ahora sus propiedades individuales:

toolstripButton1 Name tsBtnNuevo
Text Nuevo

toolstripButton2 Name tsBtnGrabar
Text Grabar

toolstripButton3 Name tsBtnEliminar
Text Eliminar

toolstripButton1 Name tsBtnListado
Text Listado

toolstripLabel1 Text Busqueda

toolstripComboBox1 Name tsCboBusqueda

toolstripButton1 Name tsBtnSalir
Text Salir




Mantenimiento de Clientes en 3 Capas Pag: 11 / 14

_______________________________________________________________________________
Taller de N-Capas
13.- El codigo completo de esta capa de presentacin se muestra a continuacin:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace LibNet_Presentacion
{
public partial class Frm_Mant_Cliente : Form
{
public Frm_Mant_Cliente()
{ InitializeComponent();
}

LibNet_Business.Cls_BCliente objNeg = new LibNet_Business.Cls_BCliente();

private void btnListar_Click(object sender, EventArgs e)
{
this.dgvClientes.DataSource = objNeg.BListarClientes();
FormatoGrilla(dgvClientes);
}
private void btnNuevo_Click(object sender, EventArgs e)
{
this.LblCodigo.Text = objNeg.BNuevoCodigo().ToString();
}

private void tSBtnSalir_Click(object sender, EventArgs e)
{
this.Close();
}

private void tSBtnNuevo_Click(object sender, EventArgs e)
{
this.LblCodigo.Text = objNeg.BNuevoCodigo().ToString();
ClsUtiles obj = new ClsUtiles();
obj.LimpiarTextos2(this);
}

private void Form1_Load(object sender, EventArgs e)
{
LlenarCboClientes();
}

private void LlenarCboClientes()
{
this.tSCboBusqueda.Items.Clear();
DataTable oTabla = objNeg.BListarClientes();
foreach (DataRow Fila in oTabla.Rows)
{
tSCboBusqueda.Items.Add(Fila[0].ToString());
}
}
Mantenimiento de Clientes en 3 Capas Pag: 12 / 14

_______________________________________________________________________________
Taller de N-Capas
private void FormatoGrilla(DataGridView dgv)
{
dgv.Columns[0].HeaderText = "Codigo";
dgv.Columns[0].Width = 60;
dgv.Columns[0].Frozen = true;
dgv.Columns[1].HeaderText = "Nombre del Cliente";
dgv.Columns[1].Width = 180;
dgv.Columns[1].Frozen = true;
dgv.Columns[2].HeaderText = "Nro de RUC";
dgv.Columns[2].Width = 90;
dgv.Columns[3].HeaderText = "Telefono";
dgv.Columns[3].Width = 80;
dgv.Columns[4].HeaderText = "Estado";
dgv.Columns[4].Width = 70;
}

private void tSBtnListado_Click(object sender, EventArgs e)
{
this.dgvClientes.DataSource = objNeg.BListarClientes();
FormatoGrilla(dgvClientes);
}

private void tSBtnGrabar_Click(object sender, EventArgs e)
{
int resp=objNeg.BAgregarCliente(LblCodigo.Text, TxtNombre.Text, mskRUC.Text,
mskTelefono.Text, Convert.ToInt32(chkEstado.Checked));
if (resp != 0)
{
MessageBox.Show("Cliente [Agregado/Actualizacion] Satisfactoriamente");
tSBtnListado_Click(null, null);
LlenarCboClientes();
}
else
MessageBox.Show("Error al Agregar Cliente");
}

private void dgvClientes_CellContentClick(object sender, DataGridViewCellEventArgs
e)
{
int n = e.RowIndex;
LblCodigo.Text = dgvClientes.Rows[n].Cells[0].Value.ToString();
TxtNombre.Text = dgvClientes.Rows[n].Cells[1].Value.ToString();
mskRUC.Text = dgvClientes.Rows[n].Cells[2].Value.ToString();
mskTelefono.Text = dgvClientes.Rows[n].Cells[3].Value.ToString();
chkEstado.Checked =
Convert.ToBoolean(dgvClientes.Rows[n].Cells[4].Value.ToString());
}

private void tSCboBusqueda_SelectedIndexChanged(object sender, EventArgs e)
{
DataTable oTabla = objNeg.BListarClientes();
foreach (DataRow Fila in oTabla.Rows)
{
if (Fila[0].ToString() == tSCboBusqueda.Text)
{
LblCodigo.Text = Fila[0].ToString();
Mantenimiento de Clientes en 3 Capas Pag: 13 / 14

_______________________________________________________________________________
Taller de N-Capas
TxtNombre.Text = Fila[1].ToString();
mskRUC.Text = Fila[2].ToString();
mskTelefono.Text = Fila[3].ToString();
chkEstado.Checked = Convert.ToBoolean(Fila[4].ToString());
break;
}
}
}

private void tSBtnEliminar_Click(object sender, EventArgs e)
{
int n = objNeg.BEliminarCliente(LblCodigo.Text);
if (n != 0)
{
MessageBox.Show("Se Elimino al Cliente ==>" + TxtNombre.Text);
tSBtnListado_Click(null, null);
tSBtnNuevo_Click(null, null);
LlenarCboClientes();
}
}

private void TxtNombre_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == Convert.ToChar(13))
{
mskRUC.Focus();
}
}

private void mskRUC_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == Convert.ToChar(13))
{
mskTelefono.Focus();
}
}

private void mskTelefono_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == Convert.ToChar(13))
{
chkEstado.Focus();
}
}
}
}


Agregaremos una nueva clase en la capa de presentacin (LibNet_Presentacion) con el
nombre de Cls_Utiles.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

Mantenimiento de Clientes en 3 Capas Pag: 14 / 14

_______________________________________________________________________________
Taller de N-Capas
namespace LibNet_Presentacion
{
public class Cls_Utiles
{
public void LimpiarTextos2(Form frm)
{
// Limpiando los Controles dentro del Formulario
foreach (Control x in frm.Controls)
{
if (x is TextBox) x.Text = "";
if (x.GetType().ToString() == "System.Windows.Forms.CheckBox")
{
CheckBox chk = (CheckBox)x;
chk.Checked = false;
}
if (x.GetType().ToString() == "System.Windows.Forms.MaskedTextBox")
{
MaskedTextBox msk = (MaskedTextBox)x;
msk.Text = "";
}

if (x.GetType().ToString() == "System.Windows.Forms.ComboBox")
{
ComboBox cbo = (ComboBox)x;
cbo.SelectedIndex = -1;
}
}
}
}
}

Una muestra de nuestro proyecto en ejecucin se muestra a continuacin:

También podría gustarte