Desarrollo de una aplicación en tres capas con interfase Cliente Windows, uso de Data Access A. Blocks, DataSets tipados y ...
http://www.desarrolladoras.com -
[email protected]
otras yerbas… Inspirada en la Aplicación Pachacamac de Daniel Seara. Gracias Daniel por enseñarnos tanto!
En el día de la Tradición… ¿nos darán un mate al menos …?
por Vilma Hinterwimmer
[email protected]
http://www.desarrolladoras.com -
[email protected]
Temas a tratar....
si llegamos a tiempo!
• Identificando las capas y los proyectos • Creando la solución y los proyectos • DataSet tipados • Donde almacenamos la cadena de conexión • Usando el Data Access Application Blocks
http://www.desarrolladoras.com -
[email protected]
….mas temas • La
Clase Entidad y sus derivadas
• Herencia de Formularios • Armado de un formulario tipo Outlook Express • Principales propiedades, métodos y eventos de algunos controles
http://www.desarrolladoras.com -
[email protected]
La Aplicación
http://www.desarrolladoras.com -
[email protected]
Identificando las capas Cliente
Negocio
Datos
Web o Windows
Reglas y Entidades
DAAB
Usuario
Aplicación
http://www.desarrolladoras.com -
[email protected]
Repositorio de Datos
Capas Cliente Interfaz gráfica con el Usuario, puede ser Web o Windows Negocio Reglas de negocio
Entidades
Clases cuyos métodos implementan las reglas de negocio globales Clases bases y sus heredades que definen los objetos a utilizar en la aplicación: Cliente, Proveedor, Factura, etc.
Datos Acceso a repositorios de Datos directo o a través del DAAB http://www.desarrolladoras.com -
[email protected]
Creando la solución y los proyectos • Creamos una Solución en blanco • Agregamos los Proyectos: Nombre del proyecto Alumnos AluNegocio AluDatos Cliente Negocio AluGlobal Data Access Application Block
Tipo de proyecto Aplicación para Windows Biblioteca de Clases Biblioteca Datos de Clases Biblioteca de Clases Existente
http://www.desarrolladoras.com -
[email protected]
Relación entre las capas y los proyectos APLICACION Cliente
Negocio
Datos
ALU Negocio
ALU
NEGOCIO
DATOS
ALU GLOBAL
DAAB
ALUMNOS
Cliente
Proyecto
Capa
Referencias entre proyectos
http://www.desarrolladoras.com -
[email protected]
Capa de Datos http://www.desarrolladoras.com -
[email protected]
DataSets tipados La difícil tarea de crear DataSets tipados en tan solo 4 Pasos...
http://www.desarrolladoras.com -
[email protected]
• Agregar un Archivo DataSet.xsd al proyecto
http://www.desarrolladoras.com -
[email protected]
1. Agregar una conexión a datos en el Explorador de Servidores
http://www.desarrolladoras.com -
[email protected]
Dos pasos mas para llegar a tener... ¡Un DataSet Tipado!
http://www.desarrolladoras.com -
[email protected]
1. Agregar la definición de la tabla al DataSet tipado ( drag and drop – arrastrar y soltar )
http://www.desarrolladoras.com -
[email protected]
1. Generar la clase (Generar conjunto de datos)
y..... LISTO!!!!! http://www.desarrolladoras.com -
[email protected]
Este es nuestro DataSet tipado
Un archivo .vb que contiene una clase... la escribió Visual Studio por nosotros... y ahora la podemos usar.... http://www.desarrolladoras.com -
[email protected]
y... ¿Para que sirve un Dataset Tipado?
Para facilitarnos... ¡LA VIDA! http://www.desarrolladoras.com -
[email protected]
Escribiendo código con un DataSet tipado
http://www.desarrolladoras.com -
[email protected]
La definición del dataset ahora será Tabla o Procedimiento Almacenado
TCliente Nombre del Campo
Tipo del Campo
Nombre
varchar
Direccion
varchar
Saldo
decimal
Clave
varbinary
Sucursal
smallint
Dim dstCliente As New dsCliente La tabla será
dstCliente.TCliente
A los campos de la fila n los llamamos: dstCliente.TCliente(n).Nombre dstCliente.TCliente(n).Direccion dstCliente.TCliente(n).Saldo dstCliente.TCliente(n).Clave dstCliente.TCliente(n).Sucursal
http://www.desarrolladoras.com -
[email protected]
donde antes escribíamos…
ComboBox1.DataSource = dstCliente.Tables( _ “TCliente”) ahora podemos a escribir…..
ComboBox1.DataSource = dstCliente.TCliente donde antes escribíamos…
txtnombre.Text = dstCliente.Tables( _ “TCliente”).Rows(n).Item(0).ToString ahora podemos a escribir…..
txtnombre.Text = dstCliente.TCliente(n).Nombre http://www.desarrolladoras.com -
[email protected]
¿Donde guardamos la cadena de conexión?
http://www.desarrolladoras.com -
[email protected]
Almacenaremos la cadena de conexión en el archivo de configuración de la Aplicación ¿A que proyecto lo agregamos? Al proyecto...
ALUMNOS http://www.desarrolladoras.com -
[email protected]
Agregamos un archivo App.Config al Proyecto Alumnos (Capa Cliente)
http://www.desarrolladoras.com -
[email protected]
Agregamos la clave y el valor de la cadena de conexión al archivo de configuración
http://www.desarrolladoras.com -
[email protected]
Así se verá en el Visual Studio nuestro archivo de configuración
Habría que encriptar la cadena de configuración para guardarla en el Archivo de Configuración. Lo dejaremos para el próximo evento...
http://www.desarrolladoras.com -
[email protected]
Accedemos al valor desde el código
Dim strconn as String = _ Configuration.ConfigurationSettings.AppSettings( _ “StrConn")
http://www.desarrolladoras.com -
[email protected]
Data Access Application Blocks
http://www.desarrolladoras.com -
[email protected]
La clase y los métodos principales Clase SqlHelper Métodos ExecuteReader ExecuteNonQuery ExecuteDataset FillDataset http://www.desarrolladoras.com -
[email protected]
ExecuteReader Devuelve un SQLDataReader con el cual accedemos a las filas ExecuteReader(ByVal connectionString As String, _ ByVal commandType As CommandType, _ ByVal commandText As String, _ ByVal ParamArray commandParameters() As SqlParameter)
ExecuteNonQuery Devuelve el numero de filas afectadas ExecuteNonQuery(ByVal connectionString As String, _ ByVal commandType As CommandType, ByVal commandText As String, _ ByVal ParamArray commandParameters() As SqlParameter)
http://www.desarrolladoras.com -
[email protected]
ExecuteDataset Devuelve un DataSet
ExecuteDataset(ByVal connectionString As String, _ ByVal commandType As CommandType, _ ByVal commandText As String, _ ByVal ParamArray commandParameters() As SqlParameter)
FillDataset Llena de datos un DataSet que le pasamos como argumento, no devuelve ningún valor
FillDataset(connectionString As String, commandType As CommandType, _ commandText As String, _ dataSet As DataSet, _ tableNames() As String, _ ByVal ParamArray commandParameters() As SqlParameter) http://www.desarrolladoras.com -
[email protected]
Ejemplos ExecuteReader Imports Microsoft.ApplicationBlocks.Data.SqlHelper ...
Dim drCat1 As SqlDataReader drCat1 = SqlHelper.ExecuteReader( strconn, _ CommandType.StoredProcedure, _ "GetProductsByCategory", _ New SqlParameter("@CategoryID", 1)) ... drCat1.Close()
http://www.desarrolladoras.com -
[email protected]
Ejemplos ExecuteNonQuery Imports Microsoft.ApplicationBlocks.Data.SqlHelper Public Shared Function GrabarCliente(ByVal cliente As String) _ as Integer Dim Params(0) As SqlParameter Params(0) = New SqlParameter("@NomCliente", _ SqlDbType.VarChar, 50) Params(0).Value = cliente Return ExecuteNonQuery( strconn, _ CommandType.StoredProcedure, _ “Clientes_Insert", Params) End Function
http://www.desarrolladoras.com -
[email protected]
Ejemplos ExecuteDataset
Imports Microsoft.ApplicationBlocks.Data.SqlHelper Public Shared Function LeerTodos( ) As DataSet Return ExecuteDataset( strconn,CommandType.StoredProcedure, _ “Clientes_GetAll“) End Function
http://www.desarrolladoras.com -
[email protected]
Ejemplos FillDataset Imports Microsoft.ApplicationBlocks.Data.SqlHelper Public Shared Function LeerTodos( ByVal ds as Dataset ) _ As DataSet Dim strTabla() As String = {“Parametros_GetAll"} FillDataset( strconn, CommandType.StoredProcedure, _ "Parametros_GetAll", ds, strTabla) Return ds End Function
http://www.desarrolladoras.com -
[email protected]
Pausa
Mate Break http://www.desarrolladoras.com -
[email protected]
Escribiendo el código de la Capa de Datos •
Agregamos una clase al proyecto AluDatos.
•
Esta clase va a tener varios métodos compartidos para las distintas operaciones que necesitemos hacer sobre la Base de Datos. TraerDataSet Actualizar Borrar GuardarValor
http://www.desarrolladoras.com -
[email protected]
Escribiendo el código de la Capa de Datos Public Class CGrlDatos Shared ConnAlu As String = _ Configuration.ConfigurationSettings.AppSettings("ConnALU") Public Shared Function TraerDataset( _ ByVal entidad As String) As DataSet Try Return ExecuteDataset(ConnAlu, _ CommandType.StoredProcedure, entidad & "_GetAll") Catch ex As Exception Throw ex End Try End Function ... End Class
http://www.desarrolladoras.com -
[email protected]
Capa Negocio
http://www.desarrolladoras.com -
[email protected]
Escribiendo el código de la Capa Negocio •Agregamos una Clase CEntidad al proyecto AluNegocio. •Va a ser la Clase base de la cual vamos a heredar para crear mas fácilmente las demás. •Esta Clase va a estar compuesta por: Declaración de Variables Un constructor Propiedades Métodos
http://www.desarrolladoras.com -
[email protected]
Clase CEntidad Public Class CEntidad Declaración de Variables Constructores Propiedades Metodos End Class
http://www.desarrolladoras.com -
[email protected]
Clase CEntidad Variables #Region "Declaración de Variables“ Friend mNomEnt As String Friend mId As Integer Protected Friend mDatos As DataRow Protected Friend mTDatos As DataSet #End Region
http://www.desarrolladoras.com -
[email protected]
Clase CEntidad Constructor #Region "Constructores" Sub New(ByVal NombreEntidad As String) mNomEnt = NombreEntidad End Sub #End Region
http://www.desarrolladoras.com -
[email protected]
C l a s e C E n t i d a d
#Region "Propiedades" Public Overridable Property Id() As Integer Get Return mId End Get Set(ByVal Value As Integer) Try mId = Value CGrlDatos.TraerDataset(mTDatos, mNomEnt, mId) If mTDatos.Tables(0).Rows.Count > 0 Then mDatos = mTDatos.Tables(0).Rows(0) Else mDatos = mTDatos.Tables(0).NewRow mTDatos.Tables(0).Rows.Add(mDatos) End If Catch ex As Exception Throw ex End Try End Set End Property #End Region
http://www.desarrolladoras.com -
[email protected]
P r o p i e d a d e s
Clase CEntidad Métodos Public Overridable Function TraerTodos() As DataSet Try Return CGrlDatos.TraerDataset(New DataSet, _ mNomEnt, mNomEnt & "_GetAll") Catch ex As Exception Throw ex End Try End Function Public Overridable Function TraerLista() As DataSet Try Return CGrlDatos.TraerDataset(New DataSet, _ mNomEnt, mNomEnt & "_GetList") Catch ex As Exception Throw ex End Try End Function http://www.desarrolladoras.com -
[email protected]
Clase CEntidad Métodos Public Overridable Function TraerUno() As DataSet Try Return CGrlDatos.TraerDataset(New DataSet, _ mNomEnt & "_GetByNro" & _ mNomEnt.PadLeft(3), Me.Id) Catch ex As Exception Throw ex End Try End Function
http://www.desarrolladoras.com -
[email protected]
Clase CEntidad Métodos Public Overridable Sub Actualizar() Try Dim DatosUno() As Object = _ mTDatos.Tables(0).Rows(0).ItemArray() If Me.Id <> -1 Then CGrlDatos.Actualizar(mDatos, mNomEnt & "_Update") Else CGrlDatos.ActualizarSal(mDatos, mNomEnt & "_Insert") Me.Id = DatosUno(0) End If Catch ex As Exception Throw ex End Try End Sub
http://www.desarrolladoras.com -
[email protected]
Clase CEntidad Métodos Public Overridable Function Eliminar(ByVal Id As Integer, _ ByVal nomparam As Array) As Integer Try Return CGrlDatos.Borrar(nomparam, _ mNomEnt & "_Delete", Id) Catch ex As Exception Throw ex End Try End Function
http://www.desarrolladoras.com -
[email protected]
Escribiendo el código de la Capa Negocio •
Agregamos una Clase por cada entidad que necesitemos, en este caso Alumnos, Curso, Asignaturas, Localidades, Paises, etc... al proyecto AluNegocio.
•
Estas Clases van a heredar de la Clase base CEntidad
•
Cada una de estas Clases va a estar compuesta por: Declaración de Variables Un constructor Propiedades Métodos
http://www.desarrolladoras.com -
[email protected]
Clase CPais Public Class CPais Inherits ALU.AluNegocio.CEntidad Declaración de Variables Constructores Propiedades Actualización End Class
http://www.desarrolladoras.com -
[email protected]
Clase CPais Variables #Region "Declaración de Variables“ Protected Friend mTodosDatos As New dsPaises Private Pais As dsPaises.PaisesRow
#End Region
http://www.desarrolladoras.com -
[email protected]
#Region "Constructores"
C l a s e C P a i s
Sub New(ByVal value As Integer) MyBase.New("Paises") Try MyBase.mId = value mTodosDatos.Clear() CGrlDatos.TraerDataset(mTodosDatos, mNomEnt, value) If mTodosDatos.Tables(0).Rows.Count = 0 Then Pais = mTodosDatos.Paises.NewPaisesRow Pais.PaiNroPai = -1 Pais.PaiDesc = "" Else Pais = mTodosDatos.Paises.Rows(0) End If MyBase.mTDatos = mTodosDatos MyBase.mDatos = Pais Catch ex As Exception Throw ex End Try End Sub #End Region http://www.desarrolladoras.com -
[email protected]
C o n s t r u c t o r
C l a s e C P i a s
#Region "Propiedades"
Public Overrides Property Id() As Integer Get Return MyBase.mId End Get Set(ByVal Value As Integer) MyBase.mId = Value End Set End Property Public Property Desc() As String Get Return Pais.PaiDesc End Get Set(ByVal Value As String) Pais.PaiDesc = Value End Set End Property #End Region
http://www.desarrolladoras.com -
[email protected]
P r o p i e d a d e s
Clase CPais Métodos #Region "Actualización" Public Overrides Sub Actualizar() Try If Me.Id > 0 Then CGrlDatos.Actualizar(Pais, Me.mNomEnt & "_Update") Else mId = CGrlDatos.ActualizarSal(Pais, _ Me.mNomEnt & "_Insert") End If Catch ex As Exception Throw ex End Try End Sub #End Region http://www.desarrolladoras.com -
[email protected]
Capa Cliente
http://www.desarrolladoras.com -
[email protected]
Herencia de Formularios
http://www.desarrolladoras.com -
[email protected]
Formulario Base • Creamos un Formulario del cual van a heredar la mayoría de los Formularios de nuestra Aplicación • Colocamos P este Formulario en el Proyecto AluGlobal para poder hacer referencia a él desde el Proyecto Alumnos y cualquier otro Proyecto que u agreguemos en la capa Cliente.
b l i • Agregamos a este Formulario todas las cosas que se van a repetir en todos loscformularios. Icono del Sistema, Nombre de la Empresa, etc... C • Generamos la solución para que se genere el Assembly y así poder l heredarloa s s http://www.desarrolladoras.com -
[email protected]
Formulario Heredado Agregamos un Formulario que va a heredar todas las características de nuestro Formulario Base
http://www.desarrolladoras.com -
[email protected]
Formulario Heredado También podríamos haber elegido Formulario Heredado del cuadro de diálogo Agregar Nuevo Elemento
Elegimos el Formulario del cual vamos a heredar
http://www.desarrolladoras.com -
[email protected]
Formulario Heredado • Ya tenemos nuestro Formulario Heredado • Todo lo que agregamos en el Formulario Base va a estar en todos los formularios heredados del mismo. • Ahora nos dedicamos a agregarle a los Formularios heredados los controles particulares del mismos sin tener que preocuparnos que las cosas generales queden en distinto formato en los distintos formularios de la aplicación.
No tendremos que volver a agregar estos controles y este código nunca mas! Todos van a ser iguales! http://www.desarrolladoras.com -
[email protected]
Armado de un Formulario estilo “Outlook Express”
http://www.desarrolladoras.com -
[email protected]
Formulario estilo “Outlook Express”
Es fácil!!! Son sólo 10 pasos http://www.desarrolladoras.com -
[email protected]
Formulario estilo “Outlook Express” •
Colocar en el Formulario todos los controles que vayan pegados sobre sus bordes. ToolBar, StatusBar, etc...
•
Colocar un control Panel y cambiar su propiedad Dock a Left
•
Colocar un control Splitter en el Formulario y cambiar su propiedad Dock a Left
•
Colocar un control ListView en el Formulario y cambiar su propiedad Dock a Fill
http://www.desarrolladoras.com -
[email protected]
Formulario estilo “Outlook Express” •
Colocar un control Panel dentro del primer Panel y cambiar su propiedad Dock a Top
•
Colocar un control Splitter dentro del primer Panel y cambiar su propiedad Dock a Top
•
Colocar otro control Panel dentro del primer Panel y cambiar su propiedad Dock a Fill
Sólo faltan 3 pasos mas... http://www.desarrolladoras.com -
[email protected]
Formulario estilo “Outlook Express” •
Dentro de cada uno de los dos últimos Panel que colocamos, colocar un control Button y cambiar su propiedad Dock a Top
•
Colocar un control TreeView dentro de cada uno de los 2 últimos Panel y cambiar su propiedad Dock a Fill
•
Colocar 2 controles ImageList en el formulario
Listo!!!
Ahora sólo falta escribir un poquito para llenar de datos los controles y para que además funcionen... http://www.desarrolladoras.com -
[email protected]
Principales
Propiedades, Métodos y Eventos de algunos Controles
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles
ImageList Propiedades
Images: Colección de imágenes, aquí se cargan los Iconos
ImageSize: Cambiando esta propiedad podemos hacer que los Iconos se vean mas chicos o mas grandes
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles TreeView Propiedades
ImageList: Asignar el nombre del ImageList del cual se van a tomar los Iconos a mostrar
ItemHeight: Altura de cada nodo
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles TreeView Propiedades
Nodes: Colección de nodos, creamos los nodos, le asignamos el texto a mostrar y el índice de icono. También podemos hacer esto por código
SelectedNode: Nodo seleccionado en un instante dado
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles
TreeView Métodos
GetNodeAt: Devuelve el nodo, si existe, que se encuentra en el lugar donde se hizo click en base a las coordenadas x e y
ExpandAll: Expande todos los nodos del árbol
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles TreeView Eventos
AfterSelected: Se produce luego de seleccionar un nuevo nodo
MouseDown: Se produce al presionar cualquier botón del mouse. Lo utilizamos para saber si hizo click sobre un nodo o no y para cambiar de nodo seleccionado apretando cualquier botón del mouse
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles ListView Propiedades
LargeImageList: Asignar el nombre del ImageList del cual se van a tomar los Iconos a mostrar de tamaño grande
SmallImageList: Asignar el nombre del ImageList del cual se van a tomar los Iconos a mostrar de tamaño pequeño
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles
ListView Propiedades
View: Estilo de Vista en la que se muestra el ListView SelectedItems: Colección de elementos seleccionados en el control en un instante dado
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles
ListView Eventos
SelectedIndexChanged: Se produce al cambiar el elemento seleccionado
http://www.desarrolladoras.com -
[email protected]
Principales Propiedades, Métodos y Eventos de algunos controles
Splitter Eventos
SplitterMoved: Se produce al arrastrar el Splitter
http://www.desarrolladoras.com -
[email protected]
Links útiles: Universidad.Net: Universidad.Net http://www.microsoft.com/spanish/msdn/comunidad/uni.net/ Sitio de Microsoft dedicado a .Net Windows Forms: http://www.windowsforms.net Data Access Aplication Blocks: http://msdn.microsoft.com/library/en-us/dnbda/html/daabrm.asp?frame=true http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=c20d12b0af52-402b-9b7c-aaeb21d1f431 Desarrollador Cinco Estrellas: http://www.microsoft.com/spanish/msdn/comunidad/dce/default.asp PanoramaBox: http://www.panoramabox.com/
http://www.desarrolladoras.com -
[email protected]
http://www.desarrolladoras.com -
[email protected]
Muchas Gracias desarrolladoras www.desarrolladoras.com
http://www.desarrolladoras.com -
[email protected]
Clases Instanciadas versus Clases Compartidas
http://www.desarrolladoras.com -
[email protected]
Clases Compartidas •
Las clases NO pueden ser compartidas. Sus métodos, propiedades y variables SI pueden serlo
•
Para que un Método, Propiedad y/o Variable sean compartidos debemos calificarlos con la palabra reservada SHARED
•
Un Método, Propiedad y/o Variable compartidos pueden ser usados en cualquier parte del código sin necesidad de crear un nuevo objeto, haciendo referencia al mismo a través del nombre de la clase. Ej: MiClase.MiMetodo()
http://www.desarrolladoras.com -
[email protected]
Clases Compartidas Public Class MiClase Public Shared MiVariable As String Public Shared Sub MiMetodo() MiVariable = "Hola Mundo" End Sub Public Class OtraClase End Class
Public Sub OtroMetodo() MiClase.MiVariable = "Hola Gente" MiClase.MiMetodo() End Sub End Class
http://www.desarrolladoras.com -
[email protected]
Clases Instanciadas •
Las clases tal cual las definimos normalmente serán instanciadas mientras NO le agreguemos a algunos de sus miembros el calificativo SHARED (Algunos miembros podrán ser SHARED y a los mismos los podremos invocar a través del nombre de la Clase)
•
Para acceder a sus miembros, Métodos, Propiedades y/o Variables deberemos crear un objeto de esa Clase. Crearemos una nueva instancia.
•
Los Métodos, Propiedades y/o Variables de estas clases pueden ser usados en cualquier parte del código a través de la variable de objeto creada a partir de esta clase.
http://www.desarrolladoras.com -
[email protected]
Clases Instanciadas Public Class MiClase Public MiVariable As String Public Sub MiMetodo() MiVariable = "Hola Mundo" End Sub Public Class OtraClase End Class
Public Sub OtroMetodo() Dim obj As MiClase = New MiClase obj.MiVariable = "Hola Gente" obj.MiMetodo() End Sub End Class
http://www.desarrolladoras.com -
[email protected]