Capa negocio con clases en VB
description
Transcript of Capa negocio con clases en VB
Capa NegocioUsando clases en VB
Jesús Alejandro Flores Hernández
1
IntroducciónEsta presentación muestra un ejemplo de codificación de la capa de negocio en Visual
Basic, conectando con procedimientos almacenados en MySql.
Objetivo. Programar la capa de negocio para la aplicación ProvPar
Materias: Programación avanzada, Bases de datos
Requerimientos
1. Tener la base de datos provPar en MySql (ver
http://es.slideshare.net/ltidesdaci/procedimientosalmacenados)
2. Tener definidos los SP para insertar y consultar a porvPar (ver
http://es.slideshare.net/ltidesdaci/capadatosconprocedimientosalmacenados)
3. Tener instalado el Sharp Develop (ver http://www.icsharpcode.net/opensource/sd/)
4. Tener instalado el controlador de MySql para NET (ver
http://es.slideshare.net/ltidesdaci/instalardrivernetparamysql)
2
Pasos para programar la capa de negocio
Los pasos para programar nuestra capa de negocio son:
Paso 1 Tener una narrativa que describa el problema
Paso 2 Diseñar las clases del sistema a partir de la narrativa
Paso 3 Tener programada la capa de datos del sistema (en este caso con
procedimientos almacenados en MySql)
Paso 4 Codificar la Capa de negocio.
3
Paso 1 Crear una aplicación para VB
en Sharp Develop
Suponga que se tiene una descripción de un problema ( aquí un extracto):
La empresa PROVPAR.S.A. Dedicada a la venta de refacciones desea llevar elcontrol de su información para los proveedores, partes, pedidos y notas deventa, para esto la empresa cuenta con una agenda de proveedores en dondeguarda el rfc, nombre, teléfono, dirección, e-mail y calificación delproveedor, donde calificación es un número del 1 al 10 con el que nuestraempresa califica el servicio prestado por el proveedor, si una empresa tiene unservicio excelente tendrá una calificación de 10 y si es pésimo será de 0. Laempresa también cuenta con una lista de partes donde almacena unaclave, nombre, existencia, stock mínimo, stock máximo, peso, cc y cv, donde stockmínimo es la cantidad mínima de este artículo que la empresa requiere enexistencia es decir su existencia en almacén no debe bajar de estacantidad, stock máximo es la cantidad máxima de artículos o partes que puedealmacenar la empresa en su almacén, peso es el peso de la parte en kg y será unnúmero entero, ...
4
Paso 2 A partir de ahí se diseñaron las clases en UML5
Métodos
Siguiendo el ejemplo se asocia la funcionalidad (métodos) a las clases, aquí
se muestran algunos que usaremos en este material:
Métodos clsAlmacen
insertaParte(p as clsParte)
Métodos clsListaPedidos
traePedidos
6
Paso 3 En la capa de datos se tiene
En MySql se tienen los procedimientos almacenados:
spAltaParte
spPedidos
7
En la capa de datos se tiene el spPedidos8
spPedidos con el parámetro de
entrada opción y devuelve la lista
de pedidos según la opción
1 Todos
2 Todos con nombre de proveedor y
descripción de parte, etcétera
Y además tiene el spAltaParte9
El spAltaparte tiene 7 parámetros los
primeros 6 (que se muestran aquí)
corresponden a los valores de los
campos a insertar y el séptimo es
una parámetro de salida (llamado
miSalida) donde se almacenará un
letrero que indica si se realizó
correctamente la inserción.
Resumen paso 1,2 y 3
Por lo tanto se tiene una narrativa, un diseño de clases y una capa de datos
con procedimientos almacenados en MySql llamados:
spAltaParte
spPedidos
A continuación la capa de negocio.
10
Paso 4 Capa de negocio
En esta capa se programa las reglas pertinentes a la aplicación particular, en nuestro caso aesta capa corresponde ejecutar las solicitudes de acceso a la información de la base dedatos, solicitada por la capa de presentación (formularios). Para este ejemplo la capa dereglas del negocio corresponde a las clases en UML:
AgendaProveedores
Almacen
ListaPedidos
ListaNotaVenta
Pedido
Proveedor
Parte
NotaVenta
11
Clase clsParte12
Clase clsAlmacen13
Clase clsListaPedidos14
Y para conexión a la BD15
Se tiene la clase clsDBMySql con
los atributos que se muestran aquí
y los métodos que se muestran en
las siguiente diapositiva.
16
Métodos de la clase clsDBMySql
Explicación
La clase clsBdMySql sirve para realizar la conexión a la base de datos, tiene los atributos:
Dim cadCon as String="server=localhost;user id=root; password=; database=provpar;
pooling=false"
Dim conn As MySqlConnection
Dim da As MySqlDataAdapter
Dim comando As MySqlCommand = nothing
Dim miError As String=""
Dim ps as Object
17
Explicación clase clsBdMySql - atributos
La clase clsBdMySql sirve para realizar la conexión a la base de datos, tiene los atributos:
Dim cadCon as String="server=localhost;user id=root; password=; database=provpar;
pooling=false"
Dim conn As MySqlConnection
Dim comando As MySqlCommand = nothing
cadCon contiene la cadena de conexión para conectarse a un servidor local de MySql a labase de datos provpar.
Conn en el objeto conexión que realizará el enlace a partir de la cadena de conexión.
Comando en el objeto que permitirá ejecutar los procedimientos almacenados.
18
Explicación clase clsBdMySql - métodos
La clase clsBdMySql tiene el método:
Public Sub defineSP(miSp As String )
conn = New MySqlConnection(cadCon)
comando = New MySqlCommand(miSP, conn)
comando.CommandType = CommandType.StoredProcedure
End sub
Esté método crea una conexión utilizando la cadena definida en cadCon, crea un nuevo comando
con la conexión creada y el nombre del procedimiento almacenado que le enviaron en el
parámetro miSP, indica que lo que ejecutará es un procedimiento almacenado y listo, aun no lo
ejecuta nada solo define el comando.
19
Explicación clase clsBdMySql - métodosLa clase clsBdMySql tiene el método:
Public Function agregaParametro_IN(miParametro as String, miTipo as MySql.Data.MySqlClient.MySqlDbType, miValor as String) As Boolean
If isnothing(Me.comando ) Then
return false
End If
'si ya esta definido el comando
Dim p As New MySqlParameter("?" & miParametro, miTipo) 'MySql.Data.MySqlClient.MySqlDbType.VarChar)
p.Value = miValor
p.Direction = ParameterDirection.Input
comando.Parameters.Add(p)
return true
End Function
Esté método permite agregar al procedimiento almacenado un parámetro de entrada (Input), unparámetro de entrada sirve para enviarle datos al SP. El SP debe estar previamente definido en elobjeto comando, el nombre del parámetro se envía en el parámetro miParametro, su tipo en miTipo ysu contenido en miValor. A partir de estos datos agrega este parámetro al SP.
20
Explicación clase clsBdMySql - métodos
La clase clsBdMySql tiene el método:
Public Function agregaParametro_OUT(miParametro as String ) As Boolean
If isnothing(Me.comando ) Then
return false
End If
'si ya esta definido el comando
ps = New MySqlParameter("?" & miParametro, MySql.Data.MySqlClient.MySqlDbType.VarChar)
ps.Value = ""
ps.Direction = ParameterDirection.InputOutput
comando.Parameters.Add(ps)
return true
End Function
Esté método permite agregar un parámetro de salida al SP que servirá para recibir una repuesta de
como se ejecute el procedimiento almacenado.
21
Explicación clase clsBdMySql - métodos
„Finalmente la clase clsBdMySql tiene el método:
Public Function ejecutaSP( ) As String
If isnothing(Me.comando ) Then
return "No se ha definido el SP"
End If
'conectar a mysql
conn.Open()
comando.ExecuteNonQuery
conn.Close()
Return ps.Value
End Function
Esté método permite ejecutar el SP previamente definido y devolver el valor de su parámetro de salida.
22
Explicación capa de negocio
A continuación la explicación del código de la capa de negocio
23
Clase clsAlmacen – método insertaParte
„Y el método de la clase clsAlmacen:
Public Function insertaParte (miP as clsParte ) As String
Dim respuesta As String=""
Dim objdb As New clsDBMySql
objdb.defineSP("spAltaParte")
objdb.agregaParametro_IN("miID",MySql.Data.MySqlClient.MySqlDbType.VarChar,mip.id)
objdb.agregaParametro_IN("miDescripcion",MySql.Data.MySqlClient.MySqlDbType.VarChar,mip.descripcion)
objdb.agregaParametro_IN("miPeso",MySql.Data.MySqlClient.MySqlDbType.Int32,mip.peso)
objdb.agregaParametro_IN("miColor",MySql.Data.MySqlClient.MySqlDbType.VarChar,mip.color)
objdb.agregaParametro_IN("miCU",MySql.Data.MySqlClient.MySqlDbType.Double ,mip.CU)
objdb.agregaParametro_IN("miExistencia",MySql.Data.MySqlClient.MySqlDbType.Int32 ,mip.existencia)
objdb.agregaParametro_OUT("miSalida")
respuesta= objdb.ejecutaSP()
return respuesta
End Function
24
Crea un objeto de la clase clsDBMySql (1) define el
procedimiento almacenado “spAltaParte” (2), le agrega
los parámetros que contienen los datos a insertar y un
parámetro de salida (3) y ejecuta el procedimiento alta
parte (4), finalmente devuelve la respuesta que dio el SP.
1
2
3
4
Clase clsListaPedidos– método traePedidos
„El método de la clase clsListaPedidos:
Public Function traePedidos As Data.DataTable
Dim t As New Data.DataTable
Dim objdb As New clsDBMySql
Dim sql As String="call spPedidos(1)"
t=objdb.traeTabla(sql)
return t
End Function
25
Ejecuta el procedimiento almacenado “spPedidos”
este llamado es mas fácil por que el procedimiento
almacenado no tiene parámetros que dependan de
los valores del usuario, solo el parámetro (1) que
indica el tipo de consulta que se desea (ver la
definición del SP).
Capa de presentación
Finalmente estamos listos para; desde la capa de presentación llamar a la
capa de negocio para que se realicen las operaciones de acceso a la base
de datos.
26
Capa de presentación – insertar parte27
Para dar de alta podemos tener un
formulario con sus campos de texto y su
botón agregar.
Código del evento clic del botón28
El evento clic del botón agregar sería:
Sub BtnAltaClick(sender As Object, e As EventArgs)
Dim miParte As New clsParte
'recuperar los datos desde los controles de interfaz
miParte.id=Me.txtID.Text
miParte.descripcion=Me.txtDescripcion.Text
miParte.color=Me.txtColor.Text
miParte.CU=iif(isnumeric(me.txtCU.Text),me.txtCU.Text ,0)
miParte.Peso=iif(isnumeric(Me.txtPeso.Text),Me.txtPeso.Text ,0)
miParte.Existencia=iif(isnumeric(me.txtExistencia.Text),me.txtExistencia.Text ,0)
'
Dim miAlmacen As New clsAlmacen
'insertar el dato en el almacen
Dim s As String= miAlmacen.insertaParte(miParte)
Me.lblLetrero.Text=s
me.limpiaTexto()
End Sub
El evento clic del botón tendría el código:
obtiene los datos de los controles y los
almacena en un objeto del tipo clsParte
(1), Crea un objeto del tipo clsAlmacen (2),
ejecuta el método insertaParte del objeto
de la clase clsAlmacen (3).
1
2
3
Capa de presentación – consulta datos29
Suponga que para mostrar los datos de todos los pedidos tiene un formulario
con un control del tipo DataGridView llamado dgvDatos, el código del evento
Load del formulario podría quedar así:
Sub frmMostrarPartesLoad(sender As Object, e As EventArgs)
Dim a As New clsListapedidos
Me.dgvDatos.DataSource = a.traePedidos()
End Sub
Resumen
La capa de interfaz solo contiene los controles y el código que tienen que ver conla presentación de los datos como colores formatos etcétera, esta capa depresentación o interfaz toma los datos de los controles introducidos por el usuariolos almacena en algún objeto y solicita a la capa de negocio introducirlos comoen la diapositiva 24. La capa de negocio a su vez recibe los datos y solicita lainserción a la capa de datos por medio de la ejecución de procedimientosalmacenados. De forma similar cuando se requieren consultas como en ladispositiva 29, la capa de interfaz solicita los datos a la capa de negocio y esta asu vez a la capa de datos.
Trabajar de esta manera ahorra mucho tiempo en el mantenimiento, por ejemplose puede modificar toda la interfaz sin tocar las otras capas. O se puedenmodificar los métodos de la capa de negocio solo teniendo el cuidado derespetar los nombres y parámetros de los métodos. Se pueden optimizar losprocedimientos almacenados sin tocar nada de la codificación de la aplicación.
30
Fin
http://www.elguille.info/colabora/2007/gatonegro_parametros_MySQL.htm
http://dev.mysql.com/doc/refman/5.0/es/stored-procedure-syntax.html
http://dev.mysql.com/doc/refman/5.0/es/stored-procedures.html
http://es.slideshare.net/ltidesdaci/procedimientosalmacenados
http://fcocastan.wordpress.com/2010/12/29/procedimiento-almacenado-y-
estructuras-de-control-en-mysql-while-if-then-else-switch/
http://es.slideshare.net/ltidesdaci/instalaciondmysqlwamp-y-heidisql
31