Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

36
Diseño e Implement de Aplic de Escritorio Vb. Net Guía de Laboratorio Nro. 2 Diseño de Implement, de Aplicac. De escritorio APLICACIONES EN TRES CAPAS USANDO VISUAL BASIC .NET 1. INTRODUCCIÓN Cuando se construye software como producto empresarial o comercial, se llevan a cabo varias técnicas de manera que el desarrollo se haga en forma ordenada y así poder asegurar un avance continuo del proyecto, un producto final de calidad, y además realizar posteriores mejoras sea una tarea más fácil. La programación para lograr sacarle el mayor provecho a la programación por capas se necesita seguir una serie de pasos complejos los cuales primeramente deben ser definidos para cada proyecto en específico, luego deben ser revisados para asegurarse de que el modelo adoptado cumpla con las normas necesarias para que la aplicación sea del agrado del usuario, y por último debe ser implementado por el grupo de desarrollo encargado para tal fin, los cuales siguiendo el modelo propuesto obtienen una herramienta útil para facilitar la labor de programación dividiendo la aplicación en módulos y capas fácil es de pulir. Figura 1: Arquitectura Tres Capas 2. CARACTERÍSTICAS DE LA PROGRAMACIÓN POR CAPAS La programación por capas es una técnica de ingeniería de software propia de la programación por objetos, éstos se organizan principalmente en 3 capas: la capa de presentación o frontera, la capa de lógica de negocio o control, y la capa de datos. Siguiendo el modelo, el desarrollador se asegura avanzar en la programación del proyecto de una forma ordenada, lo cual beneficia en cuanto a reducción de costos por tiempo, debido a que se podrá avanzar de manera más segura en el desarrollo, al ser dividida la aplicación general en varios módulos y capas que pueden ser tratados de manera independiente y hasta en forma paralela.

description

vbasic

Transcript of Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Page 1: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Guía de Laboratorio Nro. 2

Diseño de Implement, de Aplicac. De escritorio

APLICACIONES EN TRES CAPAS USANDO VISUAL BASIC .NET

1. INTRODUCCIÓN

Cuando se construye software como producto empresarial o comercial, se llevan a cabo varias

técnicas de manera que el desarrollo se haga en forma ordenada y así poder asegurar un avance

continuo del proyecto, un producto final de calidad, y además realizar posteriores mejoras sea una

tarea más fácil.

La programación para lograr sacarle el mayor provecho a la programación por capas se necesita

seguir una serie de pasos complejos los cuales primeramente deben ser definidos para cada

proyecto en específico, luego deben ser revisados para asegurarse de que el modelo adoptado

cumpla con las normas necesarias para que la aplicación sea del agrado del usuario, y por último

debe ser implementado por el grupo de desarrollo encargado para tal fin, los cuales siguiendo el

modelo propuesto obtienen una herramienta útil para facilitar la labor de programación dividiendo

la aplicación en módulos y capas fácil es de pulir.

Figura 1: Arquitectura Tres Capas

2. CARACTERÍSTICAS DE LA PROGRAMACIÓN POR CAPAS

La programación por capas es una técnica de ingeniería de software propia de la programación por

objetos, éstos se organizan principalmente en 3 capas: la capa de presentación o frontera, la capa

de lógica de negocio o control, y la capa de datos.

Siguiendo el modelo, el desarrollador se asegura avanzar en la programación del proyecto de una

forma ordenada, lo cual beneficia en cuanto a reducción de costos por tiempo, debido a que se

podrá avanzar de manera más segura en el desarrollo, al ser dividida la aplicación general en varios

módulos y capas que pueden ser tratados de manera independiente y hasta en forma paralela.

Page 2: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Por otra parte, otra característica importante de recalcar es la facilidad para las actualizaciones de

la aplicación. En este aspecto, la programación en capas juega un papel de suma importancia ya

que sigue un estándar conocido en el ambiente de desarrollo de aplicaciones, lo cual da al

programador una guía para hacer mejoras a la aplicación sin que esto sea una tarea tediosa y

desgastante, siguiendo el estándar establecido para tal fin y dividiendo las tareas en partes

específicas para cada capa del proyecto.

Las principales capas que siempre deben estar en este modelo son:

2.1. CAPA DE PRESENTACIÓN O FRONTERA

La presentación del programa ante el usuario, debe manejar interfaces que cumplan con el

objetivo principal de este componente, el cual es facilitar al usuario la interacción con la

aplicación. Para esto se utilizan patrones predefinidos para cada tipo de aplicación y para cada

necesidad del usuario. La interfaz debe ser amigable y fácil de utilizar, ya que el usuario final es

el que se va a encargar de utilizar el sistema y de dar retroalimentación al equipo de desarrollo

en caso de que haya algo que mejorar.

Las interfaces deben ser consistentes con la información que se requiere, no se deben utilizar

más campos de los necesarios, así como la información requerida tiene que ser especificada de

manera clara y concisa, no debe haber más que lo necesario en cada formulario y por último,

las interfaces deben satisfacerlos requerimientos del usuario, por lo cual no se debe excluir

información solicitada por el usuario final y no se debe incluir información no solicitada por el

mismo.

Dentro de la parte técnica, la capa de presentación contiene los objetos encargados de

comunicar al usuario con el sistema mediante el intercambio de información, capturando y

desplegando los datos necesarios para realizar alguna tarea. En esta capa los datos se procesan

de manera superficial por ejemplo, para determinar la validez de su formato o para darles

algún orden específico. Esta capa se comunica únicamente con la capa de Reglas de Negocio o

Control.

2.2. CAPA DE LÓGICA DEL NEGOCIO O DE CONTROL

Es llamada capa de reglas de negocio porque en esta se definen todas las reglas que se deben

cumplir para una correcta ejecución del programa.

Es aquí donde se encuentra toda la lógica del programa, así como las estructuras de datos y

objetos encargados para la manipulación de los datos existentes, así como el procesamiento de

la información ingresada o solicitada por el usuario en la capa de presentación.

Representa el corazón de la aplicación ya que se comunica con todas las demás capas para

poder llevar a cabo las tareas. Por ejemplo, mediante la capa de presentación obtiene la

información ingresada por el usuario, y despliega los resultados. Si la aplicación se comunica

con otros sistemas que actúan en conjunto, lo hace mediante esta capa. También se comunica

con la capa de datos para obtener información existente o ingresar nuevos datos.

Recibe los datos que ingresó el usuario del sistema mediante la capa de presentación, luego los

procesa y crea objetos según lo que se necesite hacer con estos datos; esta acción se denomina

encapsulamiento.

Al encapsular los datos, el programa asegura mantener la consistencia de los mismos, así como

obtener información precisa de las bases de datos e ingresar en las mismas, solamente la

información necesaria, asegurando así no tener datos duplicados ni en las bases de datos, ni en

los reportes solicitados por el usuario.

Page 3: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

2.3. CAPA DE DATOS

Es la encargada de realizar transacciones con bases de datos y con otros sistemas para obtener

o ingresar información al sistema.

El manejo de los datos debe realizarse de forma tal que haya consistencia en los mismos, de tal

forma los datos que se ingresan así como los que se extraen de las bases de datos, deben ser

consistentes y precisos.

Es en esta capa donde se definen las consultas a realizar en la base de datos, tanto las

consultas simples como las consultas complejas para la generación de reportes más

específicos.

Esta capa envía la información directamente a la capa de reglas de negocio para que sea

procesada e ingresada en objetos según se necesite, esta acción se denomina

encapsulamiento.

3. VENTAJAS Y DESVENTAJAS

La programación en capas no es una técnica rígida que debe implementarse solamente de una

forma, sino que los desarrolladores de proyectos tienen múltiples maneras de implementarla según

las tecnologías y tendencias que se utilicen.

La satisfacción de los requerimientos del usuario es la base para escoger el modelo de

implementación a seguir. La tendencia a utilizar el modelo de programación en capas es grande

cuando se trata principalmente de aplicaciones empresariales donde se deben manejar gran

cantidad de subsistemas y módulos, así como generar reportes lo suficientemente complejos como

para necesitar un orden estricto a la hora de desarrollar el proyecto.

Dentro del concepto de programación en capas, existen dos términos esenciales para el mejor

entendimiento de los conceptos relativos a esta metodología, es aquí donde radica la importancia

de la cohesión y el acoplamiento dentro de una aplicación generada mediante este método.

Cohesión:

Este término es utilizado para describir el comportamiento que deben tener los módulos y objetos

de un sistema o subsistema, comportamiento que describe la forma en que deben trabajar los

objetos y módulos entre sí, con alta cohesión para que trabajando en conjunto los módulos y

objetos puedan alcanzar un solo propósito de manera más eficaz y rápida.

Determina que las operaciones de un objeto deben trabajar en conjunto para alcanzar un propósito

común. Es deseable que haya alta cohesión.

Acoplamiento:

Se refiere al grado de dependencia que existe entre los módulos. Este grado de dependencia debe

ser considerablemente bajo ya que el trabajo se divide en módulos para que cada uno tenga un

funcionamiento específico y puede ser más factible la implementación por separado de cada uno.

En caso de haber alto acoplamiento entre módulos no se estaría alcanzando el principal objetivo de

este modelo, el cual es dividir una tarea grande en varias pequeñas, ya que los módulos actuarían

como uno solo al estar altamente acoplados entre sí y se perdería el objetivo primordial de dividir

el proyecto.

3.1.VENTAJAS

Al implementar este modelo de programación, se asegura un trabajo de forma ordenada y

separada, debido a que sigue el principio de “divide y vencerás”.

Cada capa está dividida según su funcionalidad cuando se quiere modificar el sistema basta con

cambiar un objeto o conjunto de objetos de una capa. Esto se llama modularidad.

Page 4: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

3.2.DESVENTAJAS

Cuando se implementa un modelo de programación en capas, se debe llegar a un balance

entre el número de capas y subcapas que componen el programa. Este debe ser el necesario y

suficiente para realizar un trabajo específico con eficiencia y ser lo más modular posible.

De lo contrario se tiene una serie de desventajas como: pérdida de eficiencia, realización de

trabajo innecesario o redundante entre capas, gasto de espacio de la aplicación debido a la

expansión de las capas, o bien una alta dependencia entre los objetos y capas que contradice el

objetivo principal del modelo.

4. CONCLUSIONES

La programación en capas ha sido una de las últimas tendencias en cuanto a software comercial

se refiere, es una tendencia que bien aplicada puede resultar en un desarrollo de software

eficiente.

Sin embargo, no todos los equipos ni empresas desarrolladoras usan un sistema rígido, ni

existe una forma estricta en la que tenga que implementarse el modelo de capas, cada quién

debe hacerlo según sus necesidades, alcances y lo más importante; las tendencias y nuevas

tecnologías que vayan surgiendo.

Es importante tener en cuenta que no importa el lenguaje de programación usado, o el tipo de

implementación que se le dé al modelo; se debe buscar una alta cohesión y un bajo

acoplamiento dentro de los objetos y capas para lograr que la aplicación sea fácilmente

desarmable y sea más sencillo realizar mejoras y actualizaciones al sistema.

5. DESARROLLO DE APLICACIÓN DE ESCRITORIO GESTION DE PEDIDOS-PARTE I

Para esta ocasión se realizara los Mantenimientos de Datos de las tablas Categoría,

Producto, desde VB Net usando como herramienta desarrollo Visual Studio 2012

con conexión al gestor de Base de Datos MSSQLSERVER 2008 ,utilizando la Base

Datos Pedidos.

5.1.ENUNCIADO

Este aplicativo se trata de un sistema para el registro de pedidos que se utilizara

para llevar un control de los pedidos realizados. El sistema permite el registro de

pedidos, así como el mantenimiento de clientes, empleados, productos y

categorías.

El sistema es un aplicativo de escritorio que se conecta a una base de datos

MSSQLSERVER 2008 donde se guarda la data.

5.2. DIAGRAMA ENTIDAD - RELACIÓN

A continuación se muestra la figura del modelo de datos (entidad – relación) de

nuestro sistema.

Como se puede ver tenemos 6 tablas: Cliente, Pedido, DetallePedido, Producto,

Categoría y Empleado.

Page 5: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Figura 2: Diagrama Entidad - Relación BD Pedidos

5.3. REQUISITOS DE SOFTWARE

Para la programación del aplicativo SistemaPedidos se utilizará:

Lenguaje de Programación Visual Basic. Net

IDE Visual Studio 2012

Gestor de Base Datos MSSQLSERVER 2008

5.4. CONSTRUCCIÓN DE LA APLICACIÓN

En primer lugar creamos una solución en Visual Studio 2010 (Nombre:

SistemaPedidos), luego agregamos los proyectos (Capas) con sus respectivas

Clases. Es decir cuatro librerías de clases y una Aplicación de Windows Form.

Creando la solución en Visual Studio 2010

Figura 3: Creación de la Solución en Visual Studio 2010

Page 6: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Agregamos los proyectos, bibliotecas de clases (CLass Library), que le asignamos

los nombres de Datos, Conexionbd, Entidades, Negocio y e l P r o y e c t o

W i n d o w s F o r m d e n o m i n a d o Presentación, hacemos clic en Archivo y

seleccionamos la opción Nuevo Proyecto y elegimos Biblioteca de Clases.

Figura 4: Estructura de Archivos

Donde:

conexionbd: biblioteca donde se creara una clase en la cual definamos nuestra

conexión a la base de datos con MSQLSERVER 2008.

datos: En esta biblioteca es donde crearemos clases que permitiran usar los

metodos de la clase conexionbd para poder realizar las transacciones

(operaciones) con la base de datos, como son consultas, inserción, modificación y

eliminación de datos. Es recomendable crear una clase por cada tabla de la Base

de Datos. Se hará uso del sqlcommand, sqlDataAdapter, sqlDataReader y DataSet.

negocio: En esta biblioteca creamos métodos que utilizarán a los métodos

creados en la biblioteca de datos. Aquí se hace referencia a la biblioteca de datos

y entidad.

entidades: En esta biblioteca sólo creamos las clases que contendrán los atributos

correspondientes por cada columna de la tabla de la base de datos. Para el

principio de encapsulamiento. Aquí no se hace referencia a ninguna biblioteca de

clases.

Presentacion: En este proyecto de Windows Form se crearan los diseños de

formularios con lo que el usuario final (usará el sistema), e ingresará la

información. Aquí se hace referencia a las bibliotecas de negocio y entidad.

Código fuente en la Biblioteca de Clases conexionbd

Agregamos una clase del tipo Visual Basic, llamada conexión, cuyo código será el

siguiente:

Figura 5: Creación de Clase conexionbd.vb

Page 7: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Biblioteca de Clases entidades

Nos ubicamos en la biblioteca entidades, damos clic derecho y agregamos

una clase vb y le ponemos como nombre producto.

Page 8: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Biblioteca de Clases datos

Agregamos una clase del tipo vb, con el nombre de ProductoDAO y ahora si nos

ponemos a programar todos los metodos que necesitemos para que la aplicación

funcione.

NOTA

Recordar que las clases que creamos en la biblioteca datos deben hacer referencia

a las bibliotecas conexionbd y entidades

Figura 6: Estructura Biblioteca Datos

Page 9: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Antes de pasar a implementar los métodos de la clase ProductoDAO,

implementaremos los procedimientos almacenados que contendrán las instrucciones

SQL que se encargarán de contener nuestras Sentencias de Manipulación de

Información como: SELECT, INSERT, UPDATE y DELETE, que posteriormente

invocaremos en nuestros metodos de la clase ProductoDAO.

Procedimientos Almacenados para Producto

Page 10: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

6. Implementación de Métodos de la de Clase ProductoDAO en la Biblioteca de Clases

Datos

Imports Conexionbd Imports Entidades Imports System.Data Imports System.Data.SqlClient Public Class ProductoDAO

Public cmdProducto As New SqlCommand Public drProducto As SqlDataReader Dim objConexion As New Conexion Public Function AgregarProductos(ByVal objProductoE As Producto) As String

Dim mensaje As String 'la forma como vamos a insertar los datos 'Usar un comando, slqcommand 'Usar Procedimientos almacenados cmdProducto.CommandType = CommandType.StoredProcedure 'Nombre procedimiento almacenado cmdProducto.CommandText = "SP_Insertar_pro_Producto" 'obtener la conexion con la base de datos cmdProducto.Connection = objConexion.obtenerconexion 'Verificar el estado de la conexión If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

objConexion.obtenerconexion.Open() End If 'Creamos los parámetros 'Todos los atributos de la tabla Producto With cmdProducto.Parameters

'Obtenemos el IdProducto, usando el objProductoE .Add("@idProducto", SqlDbType.Int).Value = objProductoE.IdProducto 'Obtenemos el nomcProducto, usando el objProductoE .Add("@nomCProducto", SqlDbType.VarChar).Value = objProductoE.NombreProducto .Add("@PcProducto", SqlDbType.Decimal).Value = objProductoE.PCProducto .Add("@PvProducto", SqlDbType.Decimal).Value = objProductoE.PVproducto .Add("@StockProducto", SqlDbType.Int).Value = objProductoE.StockProducto .Add("@FechaActProducto", SqlDbType.DateTime).Value = objProductoE.FechaActProducto .Add("@MarcaProducto", SqlDbType.VarChar).Value = objProductoE.MarcaProducto .Add("@UnidMedProducto", SqlDbType.VarChar).Value = objProductoE.UnidMedProducto

End With Dim registros As Integer registros = cmdProducto.ExecuteNonQuery() If registros = 1 Then

mensaje = "Registro guardado correctamente" Return mensaje

Else mensaje = "Error en la transaccion" Return mensaje

End If cmdProducto.Parameters.Clear() objConexion.obtenerconexion.Close()

End Function Public Function ActualizarProductos(ByVal objProductoE As Producto) As String

Dim mensaje As String 'la forma como vamos a insertar los datos 'Usar un comando, slqcommand 'Usar Procedimientos almacenados cmdProducto.CommandType = CommandType.StoredProcedure 'Nombre procedimiento almacenado cmdProducto.CommandText = "SP_Actualizar_Producto" 'obtener la conexion con la base de datos cmdProducto.Connection = objConexion.obtenerconexion 'Verificar el estado de la conexión If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

objConexion.obtenerconexion.Open()

Page 11: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

End If

Page 12: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

'Creamos los parámetros 'Todos los atributos de la tabla Producto With cmdProducto.Parameters

'Obtenemos el IdProducto, usando el objProductoE .Add("@idProducto", SqlDbType.Int).Value = objProductoE.IdProducto 'Obtenemos el nomcProducto, usando el objProductoE .Add("@nomProducto", SqlDbType.VarChar).Value = objProductoE.NombreProducto .Add("@PcProducto", SqlDbType.Decimal).Value = objProductoE.PCProducto .Add("@PvProducto", SqlDbType.Decimal).Value = objProductoE.PVproducto .Add("@StockProducto", SqlDbType.Int).Value = objProductoE.StockProducto .Add("@FechaActProducto", SqlDbType.DateTime).Value = objProductoE.FechaActProducto .Add("@MarcaProducto", SqlDbType.VarChar).Value = objProductoE.MarcaProducto .Add("@UnidMedProducto", SqlDbType.VarChar).Value = objProductoE.UnidMedProducto

End With Dim registros As Integer registros = cmdProducto.ExecuteNonQuery() If registros = 1 Then

mensaje = "Registro Actualizado correctamente" Return mensaje

Else mensaje = "Error en la transaccion" Return mensaje

End If cmdProducto.Parameters.Clear() objConexion.obtenerconexion.Close()

End Function Public Function listarProductos() As List(Of Producto)

Dim lista As New List(Of Producto) Dim lector As SqlDataReader Dim objProducto As Producto cmdProducto = New SqlCommand("SP_Listar_Producto", objConexion.obtenerconexion) lector = cmdProducto.ExecuteReader While lector.Read

objProducto = New Producto objProducto.IdProducto = lector(0) objProducto.NombreProducto = lector(1) objProducto.PCProducto = lector(2) objProducto.PVproducto = lector(3) objProducto.StockProducto = lector(4) objProducto.FechaActProducto = lector(5) objProducto.MarcaProducto = lector(6) objProducto.UnidMedProducto = lector(7) lista.Add(objProducto)

End While Return lista

End Function Public Function listarProducto(ByVal codigo As Integer) As Producto

Dim lista As New List(Of Producto) Dim lector As SqlDataReader Dim objProducto As Producto objProducto = New Producto Dim objProducto1 As New Producto cmdProducto.CommandType = CommandType.StoredProcedure 'Nombre procedimiento almacenado cmdProducto.CommandText = "Sp_BuscarProducto" 'obtener la conexion con la base de datos cmdProducto.Connection = objConexion.obtenerconexion With cmdProducto.Parameters

'Obtenemos el IdProducto, usando el objProductoE .Add("@idProducto", SqlDbType.Int).Value = codigo

End With If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

objConexion.obtenerconexion.Open() End If lector = cmdProducto.ExecuteReader If lector.Read Then

Page 13: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

objProducto.IdProducto = lector(0) objProducto.NombreProducto = lector(1) objProducto.PCProducto = lector(2) objProducto.PVproducto = lector(3) objProducto.StockProducto = lector(4) objProducto.FechaActProducto = lector(5) objProducto.MarcaProducto = lector(6) objProducto.UnidMedProducto = lector(7)

End If Return objProducto

End Function Public Function llenarComboProducto() As Producto

Dim lista As New List(Of Producto) Dim lector As SqlDataReader Dim objProducto As Producto objProducto = New Producto Dim objProducto1 As New Producto cmdProducto = New SqlCommand("SP_Combo_Producto", objConexion.obtenerconexion) If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

objConexion.obtenerconexion.Open() End If lector = cmdProducto.ExecuteReader If lector.Read Then

objProducto.IdProducto = lector(0) objProducto.NombreProducto = lector(1)

End If Return objProducto

End Function Public Function codProducto() As Integer

Dim codigo As Integer Dim lector As SqlDataReader cmdProducto = New SqlCommand("SP_Generar_Codigo_Producto", objConexion.obtenerconexion) lector = cmdProducto.ExecuteReader If lector.Read Then

codigo = lector(0) End If Return codigo

End Function End Class

7. Capa negocio

Agregamos una clase con el nombre de ProductoNE y ahora si nos ponemos a

invocar los métodos implementados en la biblioteca de datos.

Imports Datos Imports Entidades

Public Class ProductoNE

Private objProductoDAO As ProductoDAO Public Sub New()

objProductoDAO = New ProductoDAO

End Sub Public Function AgregarProducto(ByVal objProductoE As Producto) As String

Return objProductoDAO.AgregarProductos(objProductoE) End Function Public Function ActualizarProducto(ByVal objProductoE As Producto) As String

Return objProductoDAO.ActualizarProductos(objProductoE) End Function Public Function CodProducto() As Integer

Return objProductoDAO.codProducto() End Function Public Function listarProductos() As List(Of Producto)

Page 14: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Return objProductoDAO.listarProductos End Function Public Function listarProducto(ByVal codigo As Integer) As Producto

Return objProductoDAO.listarProducto(codigo) End Function Public Function llenarComboProducto() As Producto

Return objProductoDAO.llenarComboProducto End Function

End Class

8. Capa Presentación

Finalmente llegamos a la capa de presentación, donde diseñaremos el formulario

que nos permita dar mantenimiento a los datos de la Tabla Productos, Además

de un Formulario Principal que tenga las opciones de menú.

8.1. Diseño de formulario FrmProducto

Figura 7:Diseño de Formulario Mantenimiento Productos

8.2. Código fuente formulario FrmProducto

Imports Entidades Imports Negocio Public Class FrmProducto

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim objProductoNE1 As ProductoNE objProductoNE1 = New ProductoNE dgvProductos.DataSource = objProductoNE1.listarProductos ConfigurarDataGrid() BuscarProductos(1) HabilitarCajas(False) habilitarBotones(True, False, False, False)

End Sub

Page 15: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

8.3. Botón Nuevo

Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click

HabilitarCajas(True) LimpiarCajas() habilitarBotones(False, True, False, True) Dim objProductoNE = New ProductoNE Me.txtCodigo.Text = objProductoNE.CodProducto()

End Sub

8.4. Botón Grabar

Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click

NuevoProducto() End Sub

8.5. Botón Actualizar

Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActualizar.Click

actualizarProductos() End Sub

8.6. Botón Cancelar

Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click

BuscarProductos(1) HabilitarCajas(False) habilitarBotones(True, False, False, False)

End Sub

8.7. Botón Buscar

Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click

Try Dim objProductoNE As ProductoNE objProductoNE = New ProductoNE Dim objProductoE As New Producto Dim codigo As Integer = CInt(InputBox("Ingrese Código Producto")) BuscarProductos(codigo)

Catch ex As Exception MsgBox("Dato no Encontrado")

End Try End Sub

8.8. Evento CellClick del DataGriView dgvProductos

Private Sub dgvProductos_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvProductos.CellClick

If dgvProductos.Rows.Count > 0 Then Dim dgvFila As DataGridViewRow = Me.dgvProductos.CurrentRow() Me.txtCodigo.Text = dgvFila.Cells(0).Value Me.txtDescripcion.Text = dgvFila.Cells(1).Value Me.txtPC.Text = dgvFila.Cells(2).Value Me.txtPV.Text = dgvFila.Cells(3).Value Me.txtStock.Text = dgvFila.Cells(4).Value Me.dtpFechAct.Value = dgvFila.Cells(5).Value

Page 16: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Me.txtMarca.Text = dgvFila.Cells(6).Value Me.txtUnidMed.Text = dgvFila.Cells(7).Value

Else MsgBox("No hay ningun registro seleccionado")

End If habilitarBotones(False, False, True, True) HabilitarCajas(True)

End Sub

8.9. Procedimiento para Agregar Nuevo Producto

Sub NuevoProducto()

Dim objProductoE = New Producto Dim objProductoNE = New ProductoNE objProductoE.IdProducto = CInt(txtCodigo.Text) objProductoE.NombreProducto = txtDescripcion.Text objProductoE.PCProducto = CDbl(txtPC.Text) objProductoE.PVproducto = CDbl(txtPV.Text) objProductoE.StockProducto = CDbl(txtStock.Text) objProductoE.FechaActProducto = CDate(dtpFechAct.Value) objProductoE.MarcaProducto = txtMarca.Text objProductoE.UnidMedProducto = txtUnidMed.Text Dim salida As String = objProductoNE.AgregarProducto(objProductoE) MsgBox(salida) dgvProductos.DataSource = objProductoNE.listarProductos habilitarBotones(True, False, False, False) HabilitarCajas(False)

End Sub

8.10. Procedimiento para Agregar Nuevo Producto

Sub actualizarProductos() If txtCodigo.Text <> "" Then

Dim objProductoE = New Producto Dim objProductoNE = New ProductoNE objProductoE.IdProducto = CInt(txtCodigo.Text) objProductoE.NombreProducto = txtDescripcion.Text objProductoE.PCProducto = CDbl(txtPC.Text) objProductoE.PVproducto = CDbl(txtPV.Text) objProductoE.StockProducto = CDbl(txtStock.Text) objProductoE.FechaActProducto = CDate(dtpFechAct.Value) objProductoE.MarcaProducto = txtMarca.Text objProductoE.UnidMedProducto = txtUnidMed.Text Dim salida As String = objProductoNE.ActualizarProducto(objProductoE) MsgBox(salida) dgvProductos.DataSource = objProductoNE.listarProductos

Else MsgBox("Ingrese los datos para actualizar")

End If habilitarBotones(True, False, False, False) HabilitarCajas(False)

End Sub

8.11. Procedimiento para Limpiar controles que tienen los datos del Producto.

Sub LimpiarCajas() Me.txtCodigo.Clear() Me.txtDescripcion.Clear() Me.txtPC.Clear() Me.txtPV.Clear() Me.txtStock.Clear() Me.txtMarca.Clear() Me.txtUnidMed.Clear()

Page 17: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Me.dtpFechAct.Value = Now End Sub

8.12. Procedimiento para habilitar controles que tienen los datos del Producto.

Sub HabilitarCajas(ByVal estado)

Me.txtCodigo.Enabled = False Me.txtDescripcion.Enabled = estado Me.txtPC.Enabled = estado Me.txtPV.Enabled = estado Me.txtStock.Enabled = estado Me.txtUnidMed.Enabled = estado Me.txtMarca.Enabled = estado Me.dtpFechAct.Enabled = estado Me.txtDescripcion.Focus()

End Sub

8.13. Procedimiento para configurar DataGridView dgvProducto

Sub ConfigurarDataGrid() dgvProductos.RowsDefaultCellStyle.BackColor = Color.LightYellow dgvProductos.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGreen

End Sub

8.14. Procedimiento para Activar los Botones

Sub habilitarBotones(ByVal btnnuevo As Boolean, ByVal btnAgregar As Boolean, ByVal btnActualizar As Boolean, ByVal btncancelar As Boolean)

Me.btnNuevo.Enabled = btnnuevo Me.btnGrabar.Enabled = btnAgregar Me.btnActualizar.Enabled = btnActualizar Me.btnCancelar.Enabled = btncancelar

End Sub

8.15. Procedimiento para buscar un producto por Código

Sub BuscarProductos(ByVal codigo As Integer) Dim objProductoNE As ProductoNE objProductoNE = New ProductoNE Dim objProductoE As New Producto Dim idProducto As Integer idProducto = objProductoNE.CodProducto() - 1 If codigo > idProducto Then

MsgBox("Registros no encontrado") Else

objProductoE = objProductoNE.listarProducto(codigo) Me.txtCodigo.Text = objProductoE.IdProducto Me.txtDescripcion.Text = objProductoE.NombreProducto Me.txtPC.Text = objProductoE.PCProducto Me.txtPV.Text = objProductoE.PVproducto Me.txtStock.Text = objProductoE.StockProducto Me.txtMarca.Text = objProductoE.MarcaProducto Me.txtUnidMed.Text = objProductoE.UnidMedProducto Me.dtpFechAct.Value = objProductoE.FechaActProducto

End If habilitarBotones(False, False, True, True) HabilitarCajas(True)

End Sub End Class

Page 18: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

8.16. Formulario FrmProducto, listo para realizar el Mantenimiento

Figura 8: Interfaz Gráfica Mantenimiento Productos

Creamos la clase Usuario

Public Class Usuario

Private mIdUsuario As Integer Private mLogin As String Private mPassword As String Private mIdVendedor As Integer Public Property IdUsuario() As Integer

Get Return mIdUsuario

End Get Set(ByVal value As Integer)

mIdUsuario = value End Set

End Property Public Property Login() As String

Get Return mLogin

End Get Set(ByVal value As String)

Page 19: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

mLogin = value End Set

End Property Public Property Password() As String

Get Return mPassword

End Get Set(ByVal value As String)

mPassword = value End Set

End Property Public Property IdVendedor() As Integer

Get Return mIdVendedor

End Get Set(ByVal value As Integer)

mIdVendedor = value End Set

End Property

End Class

Clase UsuarioDAO

Imports Conexionbd Imports Entidades Imports System.Data Imports System.Data.SqlClient Public Class UsuarioDAO

Public daUsuario As SqlDataAdapter Public cmdUsuario As New SqlCommand Public dsUsuario As DataSet Public drUsuario As SqlDataReader Dim objConexion As New Conexion Public Function listarUsuario(ByVal login As String) As Usuario

Dim lector As SqlDataReader Dim objUsuario As Usuario objUsuario = New Usuario cmdUsuario.CommandType = CommandType.StoredProcedure 'Nombre procedimiento almacenado cmdUsuario.CommandText = "SP_Listar_Usuarios" 'obtener la conexion con la base de datos cmdUsuario.Connection = objConexion.obtenerconexion With cmdUsuario.Parameters

.Add("@login", SqlDbType.VarChar).Value = login End With If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

Page 20: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

objConexion.obtenerconexion.Open() End If lector = cmdUsuario.ExecuteReader If lector.Read Then

objUsuario.IdUsuario = lector(0) objUsuario.Login = lector(1) objUsuario.Password = lector(2) objUsuario.IdVendedor = lector(3)

End If Return objUsuario

End Function End Class

Clase UsuarioNE

Imports Datos Imports Entidades Public Class UsuarioNE

Private objUsuarioDAO As UsuarioDAO Public Sub New()

objUsuarioDAO = New UsuarioDAO

End Sub Public Function listarUsuario(ByVal login As String) As Usuario

Return objUsuarioDAO.listarUsuario(login) End Function

End Class

Capa Presentación, Formulario de Acceso al Sistema; FrmAcceso

Diseño del formulario FrmAcceso

Figura 9: Diseño Formulario Acceso Al Sistema

Page 21: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Código fuente del Formulario de Acceso al Sistema.

Imports Entidades Imports Negocio

Public Class FrmAcceso

Procedimiento AutenticacionUusuario

Sub AutenticacionUsuarios() Try

Dim objUsuarioE = New Usuario Dim objUsuarioNE = New UsuarioNE Dim login As String login = Me.txtUsuario.Text Static cuenta As Integer objUsuarioE = objUsuarioNE.listarUsuario(login) FrmGenerarPedido.idVendedor = objUsuarioE.IdVendedor If objUsuarioE.Login = Trim(Me.txtUsuario.Text) And objUsuarioE.Password = Trim(Me.txtPassword.Text) Then

' el contenido la variable usuario podras utilizarla en cualquier form del ' sistema, para que veas el usuario que ingreso al sistema, por citar un ' ejemplo u otros usos que se le puede dar MsgBox("Esta Usted ingresando como Operador: " & objUsuarioE.Login) Me.Hide() Dim frm As New MDIPrincipal ' luego deberá ser FrmPrincipal frm.Show()

Else cuenta = cuenta + 1 If cuenta = 3 Then

MsgBox("PARA OTRA VEZ SERÁ", MsgBoxStyle.Critical, "LO SIENTO") End

End If MsgBox("Te queda: " + Str(3 - cuenta) + " oportunidad(es)", 16, "Error") txtPassword.Clear() : txtUsuario.Clear() : txtUsuario.Focus()

End If Catch ex As Exception

MsgBox(ex.Message) End Try

End Sub

Código fuente en el Botón Entrar, evento Click.

Private Sub btnEntrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEntrar.Click

AutenticacionUsuarios() End Sub

Código fuente en el Botón Salir, evento Click.

Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click

If MsgBox("Desea salir?", vbInformation + vbYesNo, "Salir") = vbYes Then Close()

End If End Sub

End Class

Procedimiento almacenado, para autenticar al usuario, dado que el login es único.

Page 22: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Antes de pasar a implementar los métodos de la clase FacturaDAO y DetalleDAO,

implementaremos los procedimientos almacenados que contendrán las instrucciones

SQL que se encargarán de contener nuestras Sentencias de Manipulación de

Información como: SELECT, INSERT, UPDATE y DELETE, que posteriormente

invocaremos en nuestros metodos de la clase FacturaDAO y DetalleDAO.

Procedimientos Almacenados para Gestión de Pedido (Factura y Detalle)

Page 23: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Biblioteca Entidades, Clase Factura

Public Class Facturas

Private mNum_Fact As Integer Private mIdVendedor As Integer Private mIdCliente As Integer Private mSub_Total As Decimal Private mIgv As Decimal Private mTotal As Decimal Private mFecha As Date Private mFgEli As Boolean Private mMotivoEli As String Public Property Num_Fact() As Integer

Get Return mNum_Fact

End Get Set(ByVal value As Integer)

mNum_Fact = value End Set

End Property

Public Property IdVendedor() As Integer Get

Return mIdVendedor End Get Set(ByVal value As Integer)

mIdVendedor = value End Set

End Property

Public Property IdCliente() As Integer Get

Return mIdCliente End Get Set(ByVal value As Integer)

mIdCliente = value End Set

End Property

Public Property Sub_Total() As Decimal Get

Return mSub_Total End Get Set(ByVal value As Decimal)

mSub_Total = value End Set

End Property

Page 24: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Public Property Igv() As Decimal

Get Return mIgv

End Get Set(ByVal value As Decimal)

mIgv = value End Set

End Property

Public Property Total() As Decimal Get

Return mTotal End Get Set(ByVal value As Decimal)

mTotal = value End Set

End Property

Public Property Fecha() As Date Get

Return mFecha End Get Set(ByVal value As Date)

mFecha = value End Set

End Property

Public Property FgEli() As Boolean Get

Return mFgEli End Get Set(ByVal value As Boolean)

mFgEli = value End Set

End Property

Public Property MotivoEli() As String Get

Return mMotivoEli End Get Set(ByVal value As String)

mMotivoEli = value End Set

End Property

End Class

Page 25: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Biblioteca Entidades Detalle

Public Class Detalle

Private mNum_Fact As Integer Private mIdProducto As Integer Private mCantidadVenta As Integer Private mPrecioVenta As Decimal Private mImporte As Decimal Public Property Num_Fact() As Integer

Get Return mNum_Fact

End Get Set(ByVal value As Integer)

mNum_Fact = value End Set

End Property Public Property IdProducto() As Integer

Get Return mIdProducto

End Get Set(ByVal value As Integer)

mIdProducto = value End Set

End Property Public Property CantidadVenta() As Integer

Get Return mCantidadVenta

End Get Set(ByVal value As Integer)

mCantidadVenta = value End Set

End Property Public Property PrecioVenta() As Decimal

Get Return mPrecioVenta

End Get Set(ByVal value As Decimal)

mPrecioVenta = value End Set

End Property Public Property Importe() As Decimal

Get Return mImporte

End Get Set(ByVal value As Decimal)

mImporte = value End Set

Page 26: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

End Property

End Class

Clases en la Capa Datos

Clase FacturaDAO

Imports Conexionbd Imports Entidades Imports System.Data Imports System.Data.SqlClient Public Class FacturaDAO

Public daFactura As SqlDataAdapter Public cmdFactura As New SqlCommand Public dsFactura As DataSet Public drFactura As SqlDataReader Dim objConexion As New Conexion Public Function AgregarFacturas(ByVal objFacturaE As Facturas) As String

Dim mensaje As String cmdFactura.CommandType = CommandType.StoredProcedure cmdFactura.CommandText = "SP_GrabarFactura" cmdFactura.Connection = objConexion.obtenerconexion If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

objConexion.obtenerconexion.Open() End If With cmdFactura.Parameters

.Add("@Num_Fact", SqlDbType.Int).Value = objFacturaE.Num_Fact

.Add("@IdVendedor", SqlDbType.Int).Value = objFacturaE.IdVendedor

.Add("@IdCliente", SqlDbType.Int).Value = objFacturaE.IdCliente

.Add("@Sub_Total", SqlDbType.Decimal).Value = objFacturaE.Sub_Total

.Add("@Igv", SqlDbType.Decimal).Value = objFacturaE.Igv

.Add("@total", SqlDbType.Decimal).Value = objFacturaE.Total

.Add("@fecha", SqlDbType.Date).Value = objFacturaE.Fecha

.Add("@FgEli", SqlDbType.Bit).Value = 1 End With Dim registros As Integer registros = cmdFactura.ExecuteNonQuery() If registros = 1 Then

mensaje = "Registro guardado correctamente" Return mensaje

Else mensaje = "Error en la transaccion" Return mensaje

End If cmdFactura.Parameters.Clear() objConexion.obtenerconexion.Close()

End Function Public Function listarFacturas() As List(Of Facturas)

Dim lista As New List(Of Facturas) Dim lector As SqlDataReader Dim objFactura As Facturas cmdFactura = New SqlCommand("Sp_ListFacturas", objConexion.obtenerconexion) lector = cmdFactura.ExecuteReader While lector.Read

objFactura = New Facturas objFactura.Num_Fact = lector(0) objFactura.IdVendedor = lector(1) objFactura.IdCliente = lector(2) objFactura.Sub_Total = lector(3) objFactura.Igv = lector(4) objFactura.Total = lector(5)

Page 27: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

objFactura.Fecha = lector(6) lista.Add(objFactura)

End While Return lista

End Function Public Function codFactura() As Integer

Dim codigo As Integer Dim lector As SqlDataReader cmdFactura = New SqlCommand("SP_Generar_Codigo_Factura",

objConexion.obtenerconexion) lector = cmdFactura.ExecuteReader If lector.Read Then

codigo = lector(0) End If Return codigo

End Function End Class

Clase DetalleDAO

Imports Conexionbd Imports Entidades Imports System.Data Imports System.Data.SqlClient Public Class DetalleDAO

Public cmdDetalle As New SqlCommand Public drDetalle As SqlDataReader Dim objConexion As New Conexion

Public Function AgregarDetalles(ByVal objDetalleE As Detalle) As String

Dim mensaje As String cmdDetalle.CommandType = CommandType.StoredProcedure cmdDetalle.CommandText = "Sp_GrabarDetalle_Venta" cmdDetalle.Connection = objConexion.obtenerconexion If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close() Else

objConexion.obtenerconexion.Open() End If With cmdDetalle.Parameters

.Add("@Num_Fact", SqlDbType.Int).Value = objDetalleE.Num_Fact

.Add("@IdProducto", SqlDbType.Int).Value = objDetalleE.IdProducto

.Add("@CantidadVenta", SqlDbType.Int).Value = objDetalleE.CantidadVenta

.Add("@PrecioVenta", SqlDbType.Decimal).Value = objDetalleE.PrecioVenta

.Add("@Importe", SqlDbType.Decimal).Value = objDetalleE.Importe End With Dim registros As Integer registros = cmdDetalle.ExecuteNonQuery() If registros > 0 Then

mensaje = "Detalle guardado correctamente" Return mensaje

Else mensaje = "Error en la transaccion" Return mensaje

End If cmdDetalle.Parameters.Clear() objConexion.obtenerconexion.Close()

End Function Public Function AgregarDetalles1(ByVal objDetalleE As List(Of Detalle)) As String

Dim mensaje As String Dim registros As Integer cmdDetalle.CommandType = CommandType.StoredProcedure cmdDetalle.CommandText = "Sp_GrabarDetalle_Venta" cmdDetalle.Connection = objConexion.obtenerconexion If objConexion.obtenerconexion.State = ConnectionState.Open Then

objConexion.obtenerconexion.Close()

Page 28: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Else objConexion.obtenerconexion.Open()

End If For Each listaDetalles As Detalle In objDetalleE

cmdDetalle.Parameters.Clear() With cmdDetalle.Parameters

.Add("@Num_Fact", SqlDbType.Int).Value = listaDetalles.Num_Fact

.Add("@IdProducto", SqlDbType.Int).Value = listaDetalles.IdProducto

.Add("@CantidadVenta", SqlDbType.Int).Value = listaDetalles.CantidadVenta

.Add("@PrecioVenta", SqlDbType.Decimal).Value = listaDetalles.PrecioVenta

.Add("@Importe", SqlDbType.Decimal).Value = listaDetalles.Importe End With registros = cmdDetalle.ExecuteNonQuery()

Next

If registros > 0 Then mensaje = "Detalle guardado correctamente" Return mensaje

Else mensaje = "Error en la transaccion" Return mensaje

End If cmdDetalle.Parameters.Clear() objConexion.obtenerconexion.Close()

End Function Public Function listarDetalles() As List(Of Detalle)

Dim lista As New List(Of Detalle) Dim lector As SqlDataReader Dim objDetalle As Detalle cmdDetalle = New SqlCommand("Sp_ListDetalles", objConexion.obtenerconexion) If objConexion.obtenerconexion.State = ConnectionState.Closed Then

objConexion.obtenerconexion.Open() End If lector = cmdDetalle.ExecuteReader While lector.Read

objDetalle = New Detalle objDetalle.Num_Fact = lector(0) objDetalle.IdProducto = lector(1) objDetalle.CantidadVenta = lector(2) objDetalle.PrecioVenta = lector(3) objDetalle.Importe = lector(4) lista.Add(objDetalle)

End While Return lista

End Function End Class

Clases en la Capa Negocio

Clase FacturaNE

Page 29: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Imports Datos Imports Entidades Public Class FacturaNE

Private objFacturaDAO As FacturaDAO Public Sub New()

objFacturaDAO = New FacturaDAO

End Sub Public Function AgregarFactura(ByVal objFacturaE As Facturas) As

String Return objFacturaDAO.AgregarFacturas(objFacturaE)

End Function

Public Function listarFacturas() As List(Of Facturas) Return objFacturaDAO.listarFacturas

End Function Public Function CodFactura() As Integer

Return objFacturaDAO.CodFactura() End Function

End Class

Clase DetalleNE

Imports Datos Imports Entidades Public Class DetalleNE

Private objDetalleDAO As DetalleDAO Public Sub New()

objDetalleDAO = New DetalleDAO

End Sub Public Function AgregarDetalles(ByVal objDetalleE As Detalle) As

String Return objDetalleDAO.AgregarDetalles(objDetalleE)

End Function Public Function AgregarDetalles1(ByVal objDetalleE As List(Of

Detalle)) As String Return objDetalleDAO.AgregarDetalles1(objDetalleE)

End Function Public Function listarDetalles() As List(Of Detalle)

Return objDetalleDAO.listarDetalles End Function

End Class

Page 30: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Formulario en la Capa Presentacion:

Diseño del Formulario de Pedido

Código fuente Formulario Pedido

Imports vb = Microsoft.VisualBasic Imports Entidades Imports Negocio Imports Conexionbd Imports System.Data.SqlClient Public Class FrmGenerarPedido

Dim objFacturaE As New Facturas Dim objFacturaNE As New FacturaNE

Dim objDetalleEn As New List(Of Detalle) Dim objDetalleNE As New DetalleNE

Dim objProducto As List(Of Producto) Dim objProductoNE As ProductoNE Dim objClienteNE As ClienteNE Dim idFactura As Integer Dim Facturas, DetalleFac As Boolean Dim objConexion As New Conexion Public idVendedor As Integer Sub cargarProducto()

Dim producto1 As New Producto objProducto = New List(Of Producto) objProductoNE = New ProductoNE objProducto = objProductoNE.listarProductos cboProducto.DataSource = Nothing cboProducto.DataSource = objProducto cboProducto.DisplayMember = "NombreProducto" cboProducto.ValueMember = "IdProducto"

End Sub

Sub BuscarCliente(ByVal codigo As String) Dim objClienteNE As ClienteNE

Page 31: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

objClienteNE = New ClienteNE Dim objClienteE As New Cliente

objClienteE = objClienteNE.listarClienteDNI(codigo) If objClienteE.idCliente > 0 Then

Me.txtIdCliente.Text = objClienteE.idCliente Me.txtDNIC.Text = objClienteE.DNICliente Me.txtCliente.Text = objClienteE.NombreCliente + " " + objClienteE.ApellidoCliente Me.txtTelefonoC.Text = objClienteE.TelefonoCliente Me.txtRUC.Text = objClienteE.RUCCliente Me.txtDireccion.Text = objClienteE.DireccionCliente

Else MsgBox("Datos No encontradosss") Me.txtDNIC.Clear() Me.txtDNIC.Focus()

End If End Sub Sub ActivarCajas(ByVal estado As Boolean)

Me.txtDNIC.Enabled = estado End Sub Sub LimpiarCliente()

Me.txtDNIC.Clear() Me.txtCliente.Clear() Me.txtIdCliente.Clear() Me.txtTelefonoC.Clear() Me.txtDireccion.Clear() Me.txtRUC.Clear()

End Sub Sub LimpiarProducto()

Me.txtIdProducto.Clear() Me.txt_Descripcion.Clear() Me.txtStockProducto.Clear() Me.txt_precio.Clear()

End Sub Sub BuscarProductos(ByVal codigo As Integer)

Dim objProductoNE As ProductoNE objProductoNE = New ProductoNE Dim objProductoE As New Producto Dim idProducto As Integer idProducto = objProductoNE.CodProducto() - 1 If codigo > idProducto Then

MsgBox("Registros no encontrado") Else

objProductoE = objProductoNE.listarProducto(codigo) Me.txtIdProducto.Text = objProductoE.IdProducto Me.txt_Descripcion.Text = objProductoE.NombreProducto Me.txt_precio.Text = objProductoE.PVproducto Me.txtStockProducto.Text = objProductoE.StockProducto

End If End Sub Sub cargarVendedor(ByVal codigo As Integer)

Dim objVendedorNE As New VendedorNE Dim objVendedorE As New Vendedor objVendedorE = objVendedorNE.listarVendedor(codigo) If objVendedorE.idVendedor > 0 Then

Me.txtCodVendedor.Text = objVendedorE.idVendedor Me.txtVendedor.Text = objVendedorE.NombreVendedor+""+ objVendedorE.ApellidoVendedor

Else MsgBox("Datos No encontradosss")

End If End Sub

Private Sub GuardarPedido()

If txtIdCliente.Text = "" Then

MessageBox.Show("Ingrese Nombre del Cliente", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information)

Page 32: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

txtIdCliente.Focus() ElseIf txtCodVendedor.Text = "" Then

MessageBox.Show("Ingrese la Dirección del Cliente", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information)

txtCodVendedor.Focus() ElseIf Me.dgvDetallePedido.RowCount = 0 Then

MessageBox.Show("Ingrese Productos a la Lista", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information)

txt_cantidad.Focus() ElseIf

MessageBox.Show("¿Desea Guardar la Venta?", "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = Windows.Forms.DialogResult.Yes Then

Try objFacturaE.Num_Fact = CInt(txtNumFac.Text) Dim numFacturas As Integer = CInt(txtNumFac.Text) objFacturaE.IdCliente = CInt(txtIdCliente.Text) objFacturaE.IdVendedor = CInt(txtCodVendedor.Text) objFacturaE.Sub_Total = CDec(lbl_vVenta.Text) objFacturaE.Igv = CDec(lbl_Igv.Text) objFacturaE.Total = CDec(lbl_pVenta.Text) objFacturaE.Fecha = CDate(lblFechaVenta.Text) Dim salida As String = objFacturaNE.AgregarFactura(objFacturaE) MsgBox(salida) 'Dim salidad As String Dim salidadLista As String

For n As Integer = 0 To Me.dgvDetallePedido.RowCount - 1 Dim objDetalleE As New Detalle objDetalleE.Num_Fact = numFacturas objDetalleE.IdProducto = CInt(Me.dgvDetallePedido.Rows(n).Cells(0).Value) objDetalleE.CantidadVenta = CInt(Me.dgvDetallePedido.Rows(n).Cells(2).Value) objDetalleE.PrecioVenta = CDec(Me.dgvDetallePedido.Rows(n).Cells(3).Value) objDetalleE.Importe = CDec(Me.dgvDetallePedido.Rows(n).Cells(4).Value) objDetalleEn.Add(objDetalleE)

Next salidadLista = objDetalleNE.AgregarDetalles1(objDetalleEn) MsgBox(salidadLista) 'dgvDetallePedido.Rows.Clear() 'dgvDetallePedido.DataSource = objDetalleEn Btn_Eliminar.Enabled = False Btn_Limpiar.Enabled = False Btn_Guardar.Enabled = False Btn_Imprimir.Enabled = True

MessageBox.Show("Venta Guardado Correctamente", "Felicitaciones", MessageBoxButtons.OK, MessageBoxIcon.Information) : Exit Sub

Catch ex As Exception

MessageBox.Show("Error al Guardar los Datos" & ex.Message.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) : Exit Sub

Finally

End Try End If

End Sub Private Sub Verificar_Cajas()

If txt_cantidad.Text = "" Then txt_cantidad.Focus() Exit Sub

ElseIf Trim(txt_Descripcion.Text) = "" Then txt_Descripcion.Focus() Exit Sub

ElseIf Trim(txt_precio.Text) = "" Then txt_precio.Focus() Exit Sub

ElseIf vb.Right(Me.txt_precio.Text, 1) = "." Then MessageBox.Show("¡Esto no es un Precio Válido!!!", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information)

txt_precio.Focus() Exit Sub

ElseIf Buscar_Producto_Gridview() = False Then

Page 33: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

MessageBox.Show("El Producto que intenta Agregar ya existe en la Lista" & Chr(13) & "Item Seleccionado en la Lista", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information)

Me.txt_Descripcion.Focus() Else Me.dgvDetallePedido.Rows.Add(Me.txtIdProducto.Text, Trim(Me.txt_Descripcion.Text), txt_cantidad.Text, Me.txt_precio.Text)

Realizar_Calculo() Limpiar() Me.txt_cantidad.Focus()

End If End Sub Private Function Buscar_Producto_Gridview()

For n As Integer = 0 To Me.dgvDetallePedido.RowCount - 1 If Me.dgvDetallePedido.Rows(n).Cells(1).Value = Trim(Me.txt_Descripcion.Text) Then

dgvDetallePedido.CurrentCell = dgvDetallePedido.Rows(n).Cells(1) dgvDetallePedido.Refresh() Return False Exit Function

End If Next Return True

End Function Private Sub Limpiar()

txt_cantidad.Clear() txt_Descripcion.Clear() txt_precio.Clear() txtIdProducto.Clear() txtStockProducto.Clear()

End Sub Private Sub Realizar_Calculo()

'-------------->>>><<<<<------------------------' Dim Cantidad As Double Dim IGV, Total, MTotal, MVenta, MIGV As Double Dim Precio As Double MTotal = 0 MVenta = 0 MIGV = 0 lbl_vVenta.Text = 0 lbl_Igv.Text = 0 lbl_pVenta.Text = 0

For n As Integer = 0 To dgvDetallePedido.RowCount - 1

Cantidad = Val(dgvDetallePedido.Rows(n).Cells(2).Value.ToString()).ToString Precio = Val(dgvDetallePedido.Rows(n).Cells(3).Value) Total = (Cantidad * Precio)

Me.dgvDetallePedido.Rows(n).Cells(4).Value = Total.ToString("##,##0.00")

Next

MTotal += Total

lbl_vVenta.Text = MTotal.ToString("##,##0.00") IGV = (MTotal * Val(txt_igvM.Text)) / 100 lbl_Igv.Text = IGV.ToString("##,##0.00") Total = MTotal + IGV lbl_pVenta.Text = Total.ToString("##,##0.00")

'Convertir_Letras()

End Sub

Private Sub FrmGenerarVenta_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles MyBase.Load lblFechaVenta.Text = Now txtCodVendedor.Text = idVendedor.ToString cargarVendedor(CInt(txtCodVendedor.Text)) cargarProducto()

End Sub

Page 34: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Private Sub txt_cantidad_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txt_cantidad.KeyDown If e.KeyData = Keys.Enter Then

Verificar_Cajas() End If

End Sub

Private Sub cboProducto_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboProducto.SelectedIndexChanged

Try txtIdProducto.Text = cboProducto.SelectedValue BuscarProductos(CInt(txtIdProducto.Text))

Catch ex As Exception MsgBox(ex.Message)

End Try End Sub

Private Sub btnBuscarCliente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarCliente.Click Try

If txtDNIC.Text <> "" Then Dim dniCliente = Me.txtDNIC.Text BuscarCliente(dniCliente) ActivarCajas(False) btnBuscarCliente.Enabled = False

Else MsgBox("Ingrese el DNI del cliente")

End If

Catch ex As Exception MsgBox("Dato no encontrado")

End Try End Sub

Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click

Try Dim objFacturaNE = New FacturaNE Me.txtNumFac.Text = objFacturaNE.CodFactura()

Catch ex As Exception MsgBox(ex.Message)

End Try

End Sub

Private Sub Btn_Guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Guardar.Click

GuardarPedido() dgvDetallePedido.Rows.Clear() LimpiarCliente()

End Sub End Class

Page 35: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Prueba del sistema, con el usuario Hobby, que será el vendedor.

Formulario Menú Principal

Page 36: Guia Nro 4.8 Desarrollo de Aplicac de 3 Capas Con Stored Proc

Diseño e Implement de Aplic de Escritorio Vb. Net

Menú Pedido, opción Generar Pedido.

Formulario de Gestión del Pedido/Clic en Nuevo, Buscamos el Cliente por su DNI, y

seleccionamos los productos, para generar nuestro pedido.

Hacemos clic en Grabar y Confirmamos los productos del pedido

1

2

3 3