Académique Documents
Professionnel Documents
Culture Documents
Programador
.NET 2012
AUMENTA TU PRODUCTIVIDAD
SESIN
Implementacin de
Clases
TEMAS:
Creacin de clases.
Campos y propiedades
Constructor
Pag. 1
Creacin de clases
Anteriormente abordamos el concepto de clase de manera terica, recordemos que
bsicamente una clase es una plantilla que sirve para crear objetos, principalmente se define
2 elementos en una clase: Propiedades (caractersticas de la clase) y mtodos (acciones que
puede realizar la clase).
No olvidemos que Programacin Orientada a Objetos se hizo popular porque su estilo y forma
de programacin se asemeja mucho a la realidad. Esta vez vamos a crear una clase que
represente a un participante (de un congreso o seminario) con 4 datos: DNI, Nombres,
Apellidos, Sexo, Edad y Observaciones.
Las reglas a considerar son las siguientes:
Los nombres y apellidos deben contener como mnimo 3 letras, y deben ser almacenados
en maysculas.
Las observaciones son opcionales, pero en caso se ingrese no debe superar los 250
caracteres.
Para crear una clase que involucre las reglas anteriormente mencionadas, vamos a crear un
nuevo proyecto de tipo Windows Forms Applicacion con el nombre DemoClases01.
Figura N 1
Pag. 2
Para agregar una clase al proyecto vamos a hacer click derecho en el nombre del proyecto,
luego seleccionamos Add y finalmente la opcin Class.
Figura N 2
Figura N 3
Pag. 3
Figura N 4
Campos y propiedades
Una propiedad representa una caracterstica de una clase, por ejemplo, si tenemos una clase
Globo podemos contar con color y forma como propiedades principales. Si observamos el
caso planteado al inicio de la presente sesin, notaremos de que se listan 6 propiedades: DNI,
nombres, apellidos, edad, sexo y observaciones; cada una de ellas viene a ser una
caracterstica de la clase Participante.
Un campo tambin representa una caracterstica de una clase, sin embargo, la diferencia con
una propiedad es que el campo almacena datos puros o consistentes. Debemos saber que
una propiedad acta como filtro (aplicando reglas de validacin) de datos que envan
otros objetos, de esta manera la propiedad determina los datos que son correctos o que
respeten las reglas de validacin y los asigna al campo (es por eso que mencionamos que
los campos contienen datos puros). En caso de que el dato recibido sea incorrecto, se puede
lanzar un error.
Veamos un ejemplo para entender la diferencia de una manera ms clara, si deseamos ingresar
la edad del participante lo ms recomendable es utilizar objeto denominado nudEdad
perteneciente a la clase NumericUpDown, imaginemos que este objeto enva el nmero 15 (a
travs de su propiedad Value) a la propiedad Edad de la clase clsParticipante, la propiedad
recibe el valor pero por las reglas de validacin correspondientes enva un mensaje de error ya
que la edad debe ser mayor o igual a 18 aos.
Vamos a crear los campos de la siguiente manera:
Public Class clsParticipante
Private _DNI, _Nombres, _Apellidos, _Sexo, _Observaciones As String
Private _Edad As Byte
End Class
Pag. 4
El siguiente paso es implementar las propiedades, iniciaremos con la propiedad DNI, el cual
debe incluir 8 dgitos y es obligatorio.
Public Property DNI As String
Get
Return _DNI
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El DNI no puede quedar vaco.")
ElseIf value.Trim.Length <> 8 Then
Throw New Exception("El DNI tiene un formato invlido.")
Else
_DNI = value.Trim
End If
End Set
End Property
Las propiedades se crean utilizando Property seguido del nombre de la propiedad y el tipo de
dato de la propiedad. Notaremos que una propiedad est dividida en 2 partes: GET y SET, el
primero se usa para obtener el valor de la propiedad (en este caso obtendremos el valor del
campo ya que la propiedad trabaja directamente con l), debe incluir la palabra return para
devolver un valor determinado. Por otro lado, el SET se usa para establecer o asignar un
valor en la propiedad, ese valor viene representado por la variable con el nombre value. Por
ejemplo, si tenemos una propiedad edad y deseamos asignarle un valor 25, dicho valor escalar
viene representado por la variable value.
Adicionalmente el bloque SET se usa para realizar validaciones, en el ejemplo de cdigo
anterior, se utiliza una estructura IF ELSEIF para validar que el DNI no reciba un valor
(value) vaco y contenga exactamente 8 caracteres, si pasa ambos filtros, se guarda el valor
en el campo _DNI.
Para realizar las dems validaciones, vamos a crear ms propiedades:
Pag. 5
Pag. 6
Como podemos apreciar, cada una de las propiedades tiene una validacin respectiva que se
define al momento de establecer las reglas del negocio. Debemos tener en cuenta que Throw
New Exception permite arrojar errores con un determinado mensaje. Por otro lado debemos
considerar que las propiedades vienen a ser pblicas (public) porque pueden ser accedidas
desde cualquier clase, esto indica que una propiedad recibe valores (value) desde otras clases,
luego verifica si los valores recibidos son correctos y en caso de ser as los asigna al campo,
sino simplemente enva un error por medio de Throw New Exception.
Constructores
Un constructor nos permite ejecutar cdigo al momento de crear un objeto basado en una
clase, es decir, cuando se realiza el proceso de instanciacin (es por ello que algunas veces se
refiere a los objetos como instancias).
El constructor es til para inicializar valores o para indicar datos obligatorios, adems
debemos tener en cuenta que un objetivo cobra vida cuando es ejecutado su constructor.
Para crear el constructor a la clase clsParticipante vamos a hacer uso de la palabra reservada
New.
Sub New(parDNI As String, parNombres As String, parApellidos As String, _
parSexo As String, parEdad As String)
DNI = parDNI
Nombres = parNombres
Apellidos = parApellidos
Sexo = parSexo
Edad = parEdad
End Sub
Pag. 7
Pag. 8
SESIN
Utilizacin de
Clases
TEMAS:
Interfaz de usuario
Control de excepciones
Pag. 9
Interfaz de usuario
Para testear la clase elaborada en la sesin anterior, vamos a crear la siguiente interfaz de
usuario:
Figura N 5
No olvidemos de asignar los nombres correctos teniendo en cuenta los prefijos definidos de
cada control..
Vamos a empezar a codificar el control ms sencillo, el botn Cerrar, para ello vamos a dar
doble click en el mismo y escribimos Close, que permite cerrar el formulario actual.
Public Class Form1
Private Sub btnCerrar_Click(sender As Object, e As EventArgs) _
Handles btnCerrar.Click
Close()
End Sub
End Class
Pag. 10
89188890
Nombres
CAROLINA
Apellidos
CASTRO
Sexo
FEMENINO
Edad
30
Observaciones
JUGADORE DE VOLEY
Tabla N 1
Pag. 11
Figura N 6
Figura N 7
Ahora vamos a detener la aplicacin y luego la ejecutaremos nuevamente, pero esta vez vamos
a presionar el botn registrar sin ingresar dato alguno.
Pag. 12
Figura N 8
Como vemos la aplicacin emite un error, mejor dicho, la clase lanza un error indicando que
el DNI no puede quedar vaco, este procedimiento es correcto ya que no hemos ingresado
valor alguno en el DNI, sin embargo lo que no es correcto es la forma como se est
presentando el mensaje. Ahora vamos a aprender a controlar excepciones (errores) que la clase
podra lanzar si se produce algn error en la validacin de datos.
Control de excepciones
Para controlar errores usaremos Try Catch, es una sentencia que permite seleccionar
cdigo propenso a errores y realizar algn tipo de accin si se produce error. Vamos a dirigirnos
al evento click del botn registrar y realizaremos la siguiente modificacin al cdigo que ya
tenemos:
Dim miParticipante As clsParticipante
Try
If rbMasculino.Checked = True Then
miParticipante = New clsParticipante(txtDNI.Text, _
txtNombres.Text, _
txtApellidos.Text, _
"M", nudEdad.Value)
Else
miParticipante = New clsParticipante(txtDNI.Text, _
txtNombres.Text, _
txtApellidos.Text, _
"F", nudEdad.Value)
End If
miParticipante.Observaciones = txtObservaciones.Text
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Aviso")
txtDNI.Focus()
Exit Sub
End Try
lstParticipantes.Items.Add(miParticipante.Nombres & " " _
& miParticipante.Apellidos)
Pag. 13
Figura N 9
Como podemos apreciar, en esta ocasin el error que enva la clase se muestra controlado, de
esta manera el usuario puede ingresar los datos nuevamente.
Pag. 14
SESIN
Creacin de
Mtodos
TEMAS:
Mtodos
Caso prctico
Pag. 15
Mtodos
Los mtodos vienen a ser acciones que puede realizar una clase, tambin reciben el nombre
de operaciones. La creacin de un mtodo es muy similar al de un procedimiento y funcin
que tratamos en la primera parte del curso (Fundamentos de Programacin sesin nmero 11),
por lo tanto podemos decir que existen principalmente 2 tipos de mtodos: Los de tipo Sub y
los de tipo Function, el primero se caracteriza por realizar una accin y no retornar valor,
mientras que el segunda realiza una accin y debe retornar un valor a travs de la palabra
reservada return.
Caso prctico
Para hacer uso de mtodos, vamos a realizar un programa que permita registrar el nombre
completo y la edad de un jugador, seguidamente vamos a seleccionar uno de 2 equipos
disponibles y finalmente vamos a mover jugadores entre ambos equipos. La interfaz de usuario
es la siguiente:
Figura N 10
Ahora vamos a crear 2 clases, la primera con el nombre clsJugador para representar al
jugador a registrar, y la segunda con el nombre clsEquipo que permite representar a un
equipo con un conjunto de jugadores. Vamos a validar que el nombre del jugador no quede
Pag. 16
Ahora crearemos la clase clsEquipo, la cual se compone de una serie de jugadores, para
representar a una coleccin de objetos utilizaremos una lista (que es similar, pero mejor que
un vector), y se crean con List(of ).
Public Class clsEquipo
Private _Nombre As String
Private _RelacionDeJugadores As New List(Of clsJugador)
Sub New(parNombre As String)
Nombre = parNombre
End Sub
Public Property Nombre As String
Get
Return _Nombre
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El nombre del equipo no puede quedar vaco.")
ElseIf value.Trim.Length > 20 Then
Throw New Exception("El nombre no debe exceder de 20 caracteres.")
Else
Pag. 17
Lo que estamos haciendo es crear dos instancias de la clase equipo (eqA y eqB), cada una
representa a los equipos A y B respectivamente. Ahora vamos abrir el evento click de
btnRegistrar y escribimos el siguiente cdigo para registrar y asignar el jugador a un equipo:
'Declarando a la variable que representa al jugador
Dim nuevoJugador As clsJugador
'Creando al nuevo jugador
Pag. 18
Ahora vamos a ejecutar la aplicacin y presionamos el botn registrar sin ingresar dato alguno:
Figura N 11
Pag. 19
Figura N 12
Ahora vamos a analizar el cdigo de carga de jugadores, para realizar este procedimiento
tenemos la siguiente porcin de cdigo:
'Cargando la lista de jugadores
lstEquipoA.Items.Clear()
For Each i As clsJugador In eqA.RelacionDeJugadores
lstEquipoA.Items.Add(i.Nombre)
Next
lstEquipoB.Items.Clear()
For Each i As clsJugador In eqB.RelacionDeJugadores
lstEquipoB.Items.Add(i.Nombre)
Next
El fragmento de cdigo anterior, realiza la carga de datos en el ListBox por medio de un bucle
FOR EACH, ste se utiliza generalmente para facilitar el recorrido de colecciones de elementos
(como un List por ejemplo).
La lnea For Each i As clsJugador In eqA.RelacionDeJugadores quiere decir Para cada objeto
de tipo clsJugador en la relacin de jugadores del equipo A, por otro lado la variable i
es la encargada de representar a cada jugador que existe en la relacin de jugadores del
Pag. 20
Pag. 21
SESIN
Propiedades de
Solo Lectura
TEMAS:
Pag. 22
Ejercicio prctico
Vamos a ingresar la base y la altura de un tringulo rectngulo y luego vamos a mostrar su
permetro y rea respectiva. Lo primero que haremos es crear un nuevo proyecto en Visual
Studio 2012, donde disearemos la siguiente interfaz:
Figura N 13
Ahora vamos a crear una clase que nos permita representar al tringulo rectngulo del
ejercicio.
Public Class clsTriangulo
Private _base, _altura As Byte
Sub New(parBase As Byte, parAltura As Byte)
base = parBase
altura = parAltura
End Sub
Public Property base As Byte
Get
Return _base
End Get
Set(value As Byte)
If value = 0 Then
Pag. 23
Ya tenemos lista la clase con 2 datos, la base y la altura, nicamente consideramos ambos ya
que son los datos de entrada (es decir, datos que el usuario debe ingresar para el
funcionamiento del programa). Para el rea y permetro del tringulo, vamos a crear
propiedades de slo lectura, esto porque son datos calculados.
Cualquier dato calculado se debe establecer como propiedad de slo lectura.
Para crear una propiedad de slo lectura, nicamente debemos incluir la palabra reservada
ReadOnly en la definicin de la propiedad, veamos cmo crear la propiedad para calcular el
rea del tringulo.
Public ReadOnly Property area As Single
Get
Return base * altura / 2
End Get
End Property
Como podemos apreciar, una propiedad de slo lectura contiene nicamente la seccin GET,
esto se da porque no se le puede asignar valores.
Para obtener el permetro el tringulo necesitamos sumar la base, la altura y la hipotenusa del
tringulo, este ltimo dato no lo tenemos, por lo cual debemos calcularlo de preferencia en otra
propiedad de slo lectura.
Public ReadOnly Property area As Single
Get
Return base * altura / 2
End Get
End Property
Pag. 24
Como podemos apreciar, la propiedad de slo lectura permetro hace uso de la propiedad de
slo lectura hipotenusa, de esta manera hemos completado la clase del ejercicio, el siguiente
paso es utilizar la clase desde el formulario.
Vamos a abrir el evento Click del botn Calcular y vamos a crear un instancia de la clase
clsTriangulo que acabamos de crear.
Dim miTriangulo As clsTriangulo
Try
miTriangulo = New clsTriangulo(nudBase.Value, nudAltura.Value)
Catch ex As Exception
MsgBox(ex.Message)
nudBase.Focus()
Exit Sub
End Try
txtArea.Text = miTriangulo.area
txtHipotenusa.Text = miTriangulo.hipotenusa
txtPerimetro.Text = miTriangulo.perimetro
Figura N 14
Pag. 25
Figura N 15
Como podemos apreciar, las reglas de negocio o las operaciones que vamos realizando
en una aplicacin se definen dentro de la clase.
Pag. 26
Figura N 16
Pag. 27
SESIN
Ejercicio
TEMAS:
Ejercicio propuesto
Pag. 28
Ejercicio propuesto
Crear
un
proyecto
de
tipo
Windows
Forms
Application
con
el
nombre
Figura N 17
Figura N 18
Pag. 29
SESIN
Proyecto de
Aplicacin
TEMAS:
Pag. 30
Figura N 19
Pag. 31
Para mostrar los nombres de los grupos al momento de registrar un contacto, vamos a crear un
procedimiento almacenado que muewinstra la lista de grupos existentes.
CREATE PROCEDURE usp_Listar_Grupos
AS
SELECT nombre,descripcion
FROM tblgrupo
ORDER BY nombre
Pag. 32
SESIN
Conexin a Base de
Datos
TEMAS:
ADO .Net.
Implementacin de clases para la base de datos agenda.
Mtodos de acceso a datos
Pag. 33
ADO .Net
ADO .Net es una tecnologa de acceso a datos que permite interactuar con diferentes orgenes
de datos como base de datos, hojas de clculo electrnicas, etc. sta tcnica es muy utilizada
para acceder a bases de datos relacionales, es ms veloz (en rendimiento) que otras tcnicas
de acceso a datos como LINQ por ejemplo.
Durante el presente mdulo vamos a crear clases que accedan a base de datos en Microsoft
SQL Server 2012 utilizando ADO .Net. Recordemos que tambin podemos acceder con ADO
.Net a base de datos elaboradas en MySQL u ORACLE:
Figura N 20
Pag. 34
Ahora vamos a crear un formulario que nos permita registra un nuevo grupo de contacto:
Figura N 21
Pag. 35
Volvemos al mtodo insertar y lo primero que necesitamos para acceder a una base de datos es
una conexin, ella debe contener el nombre del servidor, el nombre de la base de datos y
el tipo de autenticacin que vamos a utilizar (autenticacin Windows o autenticacin SQL
Server).
Dim
con
As
New
SqlConnection("SERVER=MiServidor;database=Agenda;integrated
security=true")
La lnea anterior est creando un objeto llamado con de la clase SqlConnection, la cual nos
permite realizar la conexin a la base de datos agenda que hemos creado anteriormente. Este
objeto recibe como parmetro en su constructor a la cadena de conexin respectiva, que consta
del nombre del servidor (especificado a travs de la palabra SERVER), el nombre de la base de
datos (mediante la palabra DATABASE) y el tipo de seguridad (representado por integrated
security, que se refiere a la Autenticacin Windows).
El siguiente paso a dar es indicar qu vamos a hacer (INSERT, DELETE, UPDATE, SELECT,
etc.), esto lo expresamos empleando un objeto de clase SqlCommand.
Dim comando As New SqlCommand("usp_Insertar_Grupo", con)
Notemos que en el caso de la descripcin se realiza una evaluacin para determinar si est
vaco, esto se realiza porque en caso de que se encuentre vaco la propiedad descripcin, se
Pag. 36
Cuando trabajamos con un procedimiento almacenado o cdigo T-SQL que no devuelve valores,
entonces debemos utilizar el mtodo ExecuteNonQuery(). En nuestro caso el procedimiento
almacenado usp_Insertar_Grupo realiza un INSERT INTO y no devuelve valores.
Abrimos el evento click del botn registrar y vamos a utilizar la clase que acabamos de crear.
Dim nuevoGrupo As clsGrupo
Try
nuevoGrupo = New clsGrupo(txtNombreGrupo.Text)
nuevoGrupo.descripcion = txtDescripcionGrupo.Text
nuevoGrupo.Insertar()
Catch ex As Exception
MsgBox(ex.Message)
txtNombreGrupo.Focus()
Exit Sub
End Try
MsgBox("Grupo registrado.")
Figura N 22
Pag. 37
Figura N 23
Ahora vamos a insertar otro grupo pero sin incluir una descripcin.
Figura N 24
Realizamos la consulta respectiva para verificar si los datos fueron insertados correctamente.
Figura N 25
Pag. 38
SESIN
Consulta de Datos
TEMAS:
Pag. 39
Figura N 26
El formulario anterior tiene por objetivo realizar el registro de un contacto, lo que haremos
primero es cargar el combo del grupo con los nombres de cada grupo registrado en la tabla
tblGrupo. Ahora crearemos un procedimiento almacenado que permita mostrar todos los
grupos de nuestra base de datos, por lo tanto generamos una nueva consulta con el siguiente
cdigo:
CREATE PROCEDURE usp_Listar_GruposDeContacto
AS
SELECT nombre,descripcion
FROM tblgrupo
ORDER BY nombre
Para realizar la carga respectiva vamos a crear un tipo de mtodo especial llamado esttico,
que detallaremos en el siguiente punto.
Mtodos estticos
En sesiones anteriores tocamos que un mtodo puede ser de 2 tipos, Sub o Function, y la
diferencia principal es que el primero de ellos no retorna valores, mientras que el segundo s.
Para invocar a un mtodo de tipo Sub o de tipo Function, debemos de crear una instancia de la
Pag. 40
Para poder crear un mtodo esttico, lo nico que debemos incluir es la palabra reservada
Shared antes de indicar si el mtodo es de tipo Sub o de tipo Function. Debemos recordar
que para utilizar un mtodo esttico NO necesitamos crear una instancia de un objeto,
sino que lo podemos utilizar indicando nicamente el nombre de la clase seguido del
nombre del mtodo.
Vamos a crear un mtodo esttico que retorne una lista que tienen los grupos registrados en la
tabla tblGrupo. Como va a retornar un valor, necesitamos que sea un mtodo esttico de tipo
Function, nos ubicamos en la clase clsGrupo y vamos a crear el siguiente mtodo debajo del
mtodo Insertar.
Shared Function Listar() As List(Of clsGrupo)
Dim con As New SqlConnection("SERVER=localhost;database=Agenda;integrated
security=true")
Dim comando As New SqlCommand("usp_Listar_GruposDeContacto", con)
comando.CommandType = CommandType.StoredProcedure
Dim miListaDeGrupos As New List(Of clsGrupo)
Pag. 41
Los primeros pasos son similares al mtodo Insertar, pero en esta ocasin notaremos que no
agregamos
ningn
parmetro
usp_Listar_GruposDeContacto
ya
que
el
procedimiento
almacenado
Figura N 27
Pag. 42
Figura N 28
Pag. 43
SESIN
Interfaz de
Documento
Mltiple
TEMAS:
Formularios MDI.
Creacin de una estructura de documento mltiple.
Pag. 44
Formularios MDI
La estructura de interfaz de documento mltiple implica 2 partes principales: El formulario
padre y los formularios hijos, el primero de ellos viene a ser el contenedor principal de los
dems formularios (llamados hijos). Si por algn se cierra el formulario padre, automticamente
se cierran tambin los formularios hijos, por el contrario, si se cierra un formulario hijo no
afecta al formulario padre.
Adicionalmente debemos saber que todos los formularios hijos se ubican dentro del formulario
padre, es decir, no pueden quedar fuera de los lmites del formulario padre. La estructura MDI,
es bastante utilizada en el desarrollo de aplicaciones y sistemas de informacin, ya que permite
establecer un orden y otorgar lmites a los objetos formularios de nuestro proyecto.
Creacin
mltiple
de
una
estructura
de
documento
Figura N 29
Pag. 45
Figura N 30
Figura N 31
Figura N 32
Bien, ahora vamos a llamar desde la opcin Insertar (dentro de contactos) a nuestro formulario
de registro de grupos de contactos. Para ello hacemos un doble click en el tem Insertar, y
luego agregamos el siguiente cdigo:
Private Sub InsertarToolStripMenuItem_Click(sender As Object
frmRegistrarGrupoDeContacto.Show()
End Sub
Pag. 46
Figura N 33
Como podemos apreciar, el formulario de insercin de grupo se muestra fuera del formulario
principal. Para hacer dicho formulario se muestre como hijo, debemos de agregar un lnea al
cdigo escrito anteriormente.
frmRegistrarGrupoDeContacto.MdiParent = Me
frmRegistrarGrupoDeContacto.Show()
Figura N 34
Pag. 47
Pag. 48
SESIN
Ejercicio
10
TEMAS:
Ejercicio propuesto
Pag. 49
Ejercicio propuesto
Se solicita elaborar el registro de un contacto, para ello debemos elaborar los siguientes pasos:
1. Crear la clase clsContacto, implementar sus campos y propiedades validados
correctamente.
2. Elaborar un mtodo registrar, que conecte a la base de datos y realice la insercin
respectiva en la tabla tblContacto (utilizar un procedimiento almacenado).
3. En el botn Registrar del formulario de registro de contacto, se debe utilizar la clase
anteriormente creada.
4. Una vez registrado el contacto, se debe mostrar un mensaje de confirmacin.
Figura N 35
Pag. 50
SESIN
Programacin n
capas Parte I
11
Temas:
Programacin n capas
Creacin de una solucin con 3 capas
Implementando la capa de datos
Pag. 51
Programacin n capas
La programacin con capas es una forma de implementar una aplicacin muy utilizada y
conocida en el mercado de soluciones de software, sus ventajas principales son el orden y
flexibilidad para realizar mantenimiento.
Principalmente se trabaja con 3 capas:
Capa presentacin
Concierne la interfaz de la aplicacin que ser utilizada por el usuario para la manipulacin
de la aplicacin, comprende por ejemplo formularios estilo Windows, formularios Web (en
el caso de aplicaciones Web), la consola de Windows, etc.
Pag. 52
Figura N 36
Figura N 37
Pag. 53
Figura N 38
Como podemos apreciar, tenemos una solucin (AplicacionDemo) y 3 capas. Notaremos que el
nombre del proyecto que contiene la capa presentacin se encuentre en negrita, esto se debe a
que es el proyecto inicial, es decir, es el proyecto que se ejecutar primero. Ahora que tenemos
nuestra estructura en capas, el siguiente paso ser implementar la capa de datos.
Figura N 39
Pag. 54
Figura N 40
Figura N 41
As como una base de datos contiene tablas, una DataSet contiene DataTables,vamos a
agregar un DataTable que nos permita representar a la tabla tblGrupo, para ello vamos a
Pag. 55
Figura N 42
Asignamos el nombre Grupo, ya que har referencia a la tabla tblGrupo que tenemos en la base
de datos Agenda.
Figura N 43
Figura N 44
Vamos a agregar 2 columnas: Nombre y descripcin, de tal manera que el DataTable sea
parecido a la siguiente figura:
Pag. 56
Figura N 45
Ahora vamos a agregar cdigo a nuestro DataTable, para ello hacemos click derecho en Grupo
y seleccionamos la opcin View Code.
Figura N 46
Luego creamos un mtodo esttico para obtener todos los grupos registrados en la base de
datos, no olvidemos que como vamos a conectarnos a Microsoft SQL Server 2012, debemos
realizar el imports respectivo.
Imports System.Data.SqlClient
Partial Class Datos01
Partial Class GrupoDataTable
Shared Function Listar() As GrupoDataTable
End Function
End Class
End Class
Como podemos apreciar, el mtodo retorna un DataTable que hace referencia a los grupos. El
siguiente paso ser agregar un mdulo con el nombre mdlVariables a la capa de datos para
almacenar variables que puedan ser utilizadas en varios puntos de dicha capa, hacemos click
derecho en el nombre del proyecto y seleccionamos Add y luego la opcin Module.
Pag. 57
Figura N 47
Figura N 48
Pag. 58
El mtodo esttico retorna una DataTable con todos los grupos registrados en la base de datos,
debemos comprender que un DataTable est conformado por diversos DataRow que
simplemente representan a las filas o registros que podra contener el DataTable. En el
fragmento de cdigo anterior guardamos el resultado de la ejecucin del comando en un
DataReader y luego lo recorremos de inicio a fin, y mientras vamos recorriendo, vamos
agregando filas al DataTable que posteriormente ser retornado.
Pag. 59
SESIN
Programacin n
capas Parte II
12
Temas:
Pag. 60
Figura N 49
Pag. 61
Ahora vamos a crear un mtodo que nos permita listar los grupos registrados en la base de
datos, como ste mtodo necesita acceder a la base de datos necesitamos hacer uso de la capa
de datos. Para enlazar una capa con otra, necesitamos agregar una referencia a nuestro
proyecto, para ello hacemos click derecho en el nombre del proyecto (CapaReglaDeNegocio) y
seleccionamos la opcin Add Reference
Figura N 50
En la siguiente ventana seleccionamos el proyecto que deseamos enlazar, en este caso ser la
capa de acceso a datos:
Figura N 51
Pag. 62
Figura N 52
Pag. 63
Figura N 53
Figura N 54
Ahora ya tenemos enlazadas ambas capas, el siguiente paso es acceder al evento Load del
formulario y cargar el ComboBox correspondiente a los grupos.
Pag. 64
Figura N 55
Como podemos apreciar, hemos dividido la funcionalidad de la aplicacin por medio de capas,
esto provoca que la labor de mantenimiento sea ms sencilla y que los cambios futuros que se
quieran realizar sean ms flexibles.
Pag. 65
SESIN
Programacin n
capas Parte III
13
Temas:
Funcionalidades adicionales
Insertando datos
Pag. 66
Funcionalidades adicionales
En un sistema de informacin existen diversas funcionalidades de acuerdo a la complejidad del
mismo, anteriormente vimos como cargar datos de una base de datos, ahora procederemos a
realizar una insercin de un contacto.
El procedimiento de insercin en la base de datos lo realizaremos en la capa de acceso a datos,
mientras que la validacin que abarca que el Nick del contacto no se debe repetir podemos
realizarla en la capa regla de negocio.
Adicionalmente debemos saber que no necesariamente todas las capas tienen que
implementarse en el mismo lenguaje, es decir, podemos tener la capa de acceso a datos y
presentacin en Visual Basic .Net y la capa regla de negocio en C Sharp .Net.
Insertando datos
Para realizar la insercin del contacto, vamos a agregar un nuevo DataTable que represente a
los contactos, para ello vamos a dar un click derecho en una zona vaca de dataset y luego
seleccionamos la opcin Add.
Figura N 56
Luego agregamos las filas necesarias tal y como se muestra en la siguiente figura:
Figura N 57
Pag. 67
Figura N 58
Como vemos, ahora ya tenemos asignada una llave primaria para el DataTable Contacto.
Figura N 59
Figura N 60
Pag. 68
Figura N 61
Una vez que arrastramos la relacin, se mostrar un cuadro para indicar las filas por las cuales
queremos relacionar ambos DataTables, en este caso debemos emparejar Nombre de Grupo
con Grupo de Contacto.
Figura N 62
Pag. 69
Figura N 63
Figura N 64
Pag. 70
Figura N 65
Pag. 71
Figura N 66
Pag. 72
Pag. 73
Como vemos en la parte final, se ha agregado un mtodo para insertar un nuevo contacto, en
el contenido del mtodo se invoca al mtodo agregar creado en la capa de datos, el cual recibe
como parmetros las propiedades de la clase clsContacto que acabamos de agregar.
El siguiente paso es trabajar en la capa presentacin, vamos a ejecutar el formulario dicha capa
para recordar la interfaz de usuario:
Figura N 67
En vista diseo vamos a ingresar al evento Click del botn guardar para realizar el cdigo de
insercin respectivo. Lo primero que haremos ser crear un objeto de la clase clsContacto.
Dim nuevoContacto As clsContacto
Notemos que cuando llamamos al constructor, el ltimo parmetro viene a ser un objeto de la
clase clsGrupo:
Figura N 68
Pag. 74
Figura N 69
El constructor recibe como ltimo parmetro a parGrupo que debe ser un objeto de la clase
clsGrupo, sin embargo nosotros contamos con un String (por medio de la propiedad
SelectedItem) dentro del Combo cmbGrupo. Por lo tanto, lo que debemos hacer es crear un
mtodo que realice la bsqueda del nombre de un grupo y nos retorne un objeto respectivo,
para este propsito vamos volver a la capa de acceso a datos y vamos a agregar un mtodo
llamado Buscar al DataTable que representa al Grupo.
Imports System.Data.SqlClient
Partial Class Datos01
Partial Class ContactoDataTable
Shared Sub Agregar(Identificador As String, Nombres As String, _
ApellidoPaterno As String, _
ApellidoMaterno As String, _
Observaciones As String, _
Grupo As String)
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Insertar_Contacto", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("nombreIdentificador", Identificador)
cmd.Parameters.AddWithValue("nombres", Nombres)
cmd.Parameters.AddWithValue("apellidoPaterno", ApellidoPaterno)
cmd.Parameters.AddWithValue("apellidoMaterno", ApellidoMaterno)
If Observaciones = String.Empty Then
cmd.Parameters.AddWithValue("observaciones", DBNull.Value)
Else
cmd.Parameters.AddWithValue("observaciones", Observaciones)
End If
cmd.Parameters.AddWithValue("grupo", Grupo)
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
End Sub
End Class
Partial Class GrupoDataTable
Shared Function Listar() As GrupoDataTable
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Listar_Grupos", cn)
cmd.CommandType = CommandType.StoredProcedure
cn.Open()
Dim miTabla As New GrupoDataTable
Dim dr As SqlDataReader
dr = cmd.ExecuteReader
While dr.Read
Dim fila As DataRow
fila = miTabla.NewRow
fila("Nombre") = dr.Item("Nombre")
If dr.Item("Descripcion") Is DBNull.Value Then
fila("Descripcion") = String.Empty
Else
fila("Descripcion") = dr.Item("Descripcion")
End If
miTabla.Rows.Add(fila)
Pag. 75
Pag. 76
Pag. 77
Notemos que usamos el mtodo esttico buscar para obtener un objeto de clase clsGrupo de
acuerdo a lo que el usuario selecciona (por medio de la propiedad SelectedItem) en el Combo
cmbGrupo.
Ahora procederemos a ejecutar la aplicacin e ingresamos datos de prueba.
Figura N 70
Figura N 71
Pag. 78
Figura N 72
Ahora vamos a realizar otra insercin pero sin incluir observaciones, ingresamos los siguientes
datos:
Figura N 73
Presionamos el botn registrar, y una vez que se muestra el mensaje de confirmacin vamos a
verificar la base de datos.
Figura N 74
Como podemos apreciar, en caso de que no se ingrese las observaciones se guarda un valor
NULL en la base de datos. Esto se da gracias a las siguientes lneas que estn ubicadas en el
mtodo agregar del DataTable Contacto:
Pag. 79
Si la observacin tiene un valor vaco, entonces se le otorga un valor NULL de base de datos al
parmetro observaciones, en caso contrario, se le asigna el valr ingresado.
Pag. 80
SESIN
Programacin n
capas Parte IV
14
Temas:
Pag. 81
Figura N 75
Tenemos las 3 capas principales, ahora vamos a agregar una capa presentacin adicional, pero
esta vez ser un proyecto de tipo Consola. Para agregar dicho proyecto, vamos a hacer click
derecho en el nombre de la solucin (AplicacionDemo) y seleccionamos la opcin Add y luego
New Project.
Figura N 76
Pag. 82
Figura N 77
Figura N 78
Presionamos el botn OK, y luego revisamos el Solution Explorer para ver el resultado.
Figura N 79
Pag. 83
Figura N 80
lo primero que
Figura N 81
Pag. 84
Figura N 82
Imports CapaReglaDeNegocio
Module Module1
Sub Main()
Console.WriteLine("Los grupos registrados son:")
Console.WriteLine()
For Each i As clsGrupo In clsGrupo.Listar
Console.WriteLine(i.nombre)
Next
End Sub
End Module
Pag. 85
Figura N 83
Figura N 84
Pag. 86
Bien, ahora ejecutamos la solucin y observaremos que todos los grupos registrados en la base
de datos se muestran de manera correcta.
Figura N 85
Pag. 87
Ejercicio propuesto
Con ayuda del instructor se solicita que elabore el cdigo necesario para registrar un nuevo
contacto mediante la consola de Windows.
Pag. 88
SESIN
Integracion con C#
15
Temas:
Introduccin
Agregando una capa presentacin en C#
Pag. 89
Introduccin
El lenguaje de programacin C# pertenece a Visual Studio 2012, a diferencia de Visual Basic
.Net es un lenguaje ms estricto y fuertemente tipado.
Una ventaja adicional de utilizar programacin con capas en una aplicacin es que nos brinda la
posibilidad de crear capas en diferentes lenguajes. En esta sesin vamos a agregar una capa
presentacin que utilice C# para utilizar la capa regla de negocio elaborada en Visual Basic
.Net, notaremos que no existir ningn problema de compatibilidad entre las capas.
Figura N 86
Pag. 90
Figura N 87
Figura N 88
Pag. 91
Figura N 89
En el nico formulario que aparece dentro de la capa, vamos a dibujar la siguiente interfaz tal
cual lo hacamos con una aplicacin en Visual Basic .Net.
Figura N 90
Pag. 92
Figura N 91
Figura N 92
Pag. 93
Figura N 93
En esta etapa debemos tener cuidado con las maysculas y minsculas ya que C# los distingue.
Ahora si podemos empezar con la codificacin del registro del contacto:
private void btnGuardar_Click(object sender, EventArgs e)
{
clsContacto nuevoContacto;
try
{
nuevoContacto =new clsContacto(txtNick.Text,
txtNombres.Text,txtApellidoPaterno.Text,
txtApellidoMaterno.Text,
clsGrupo.Buscar(cmbGrupo.SelectedItem.ToString()));
nuevoContacto.Observaciones =txtObservaciones.Text;
nuevoContacto.Insertar();
MessageBox.Show("Contacto insertado.");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
txtNick.Focus ();
return;
}
}
Pag. 94
Figura N 94
Ahora ya tenemos todo codificado, para probar nuestra aplicacin no olvidemos cambiar el
proyecto de inicio haciendo click derecho en CapaPresentacionCS y seleccionando la opcin
Set as Start Up Project.
Pag. 95
Figura N 95
Figura N 96
Pag. 96
Figura N 97
Ahora realizamos la consulta respectiva en la base de datos para verificar los datos
almacenados.
Figura N 98
Pag. 97
Pag. 98
SESIN
Ejercicio Propuesto
16
Temas:
Ejercicio propuesto
Pag. 99
Ejercicio propuesto
En los ejercicios anteriores hemos registrado el contacto mediante un formulario, sin embargo
existe un detalle a tener encuenta: Si agreamos un Nick que ya existe en la base de datos, la
aplicacin nos muestra el mensaje referente a la repeticin de la llave primaria, veamos un
ejemplo:
Figura N 99
Pag. 100
SESIN
Informes Parte I
17
Conocer las herramientas que proporciona Visual Studio 2012 para la implementacin de
reportes.
Identificar y aplicar una solucin a posibles problemas comunes relacionados a la
impresin de reportes.
Temas:
Creacin de informes
Elementos comunes en un informe
Pag. 101
Creacin de informes
La mayora de aplicaciones en el mercado informtico cuenta con diversas opciones ara generar
reportes, ya sea para imprimir formatos empresariales como boletas, facturas, tickets, etc; o
quizs reportes que resumen informacin el negocio para la toma de decisiones.
Un informe puede ser tan sencillo como una lista de productos o medianamente complejo como
mostrar una proyeccin de ventas para los siguientes 2 aos, cualquiera que sea el caso Visual
Studio 2012 nos provee las herramientas necesarias para crear informes.
Figura N 100
Pag. 102
Figura N 101
Figura N 102
Pag. 103
Figura N 103
Lo primero que haremos ser agregar el encabezado y pie de pgina del informe, ambos
elementos tienen las mismas caractersticas que el encabezado y pie de pgina de cualquier
editor de texto, es decir, que se presentan en todas las pginas del informe. Para agregar el
encabezado hacemos click derecho en una zona vaca del informe, seleccionamos la opcin
Insert y luego seleccionamos Page Header.
Figura N 104
Hacemos el mismo procedimiento para agregar el pie de pgina del informe, slo que esta vez
seleccionaremos la opcin Page Footer.
Luego de realizar ambos procedimientos, notaremos que el diseador de informe se divide en 3
zonas, el encabezado, pie de pgina y contenido.
Pag. 104
Figura N 105
Enel encabezado vamos a agregar un control TextBox donde escribiremos un ttulo Lista de
contactos registrados y una lnea a manera de subrayado.
Figura N 106
Para mejorar la presentacin del encabezado, seleccionamos el TextBox del ttulo y ubicamos la
propiedad Font en el panel propiedades. En ella vamos a asignar un tipo de letra, un tamao y
el estilo negrita.
Figura N 107
Cada vez que se disean informes para diversos propsitos es inevitable realizar mediciones,
para ste propsito podemos activar la regla ubicada en la barra de herramientas.
Figura N 108
Pag. 105
Figura N 109
Hacemos lo mismo para el pie de pgina, es decir, vamos a agregar una lnea y un TextBox en
la parte inferior derecha de la hoja, en ella indicaremos el nmero de pgina del reporte.
Figura N 110
Para establecer el nmero de pgina vamos a dar click derecho sobre la caja de texto y
seleccionamos la opcin Expression.
Figura N 111
Pag. 106
Figura N 112
Del panel derecho seleccionamos PageNumber y le hacemos doble click para incluir su
definicin en el panel superior.
Figura N 113
Figura N 114
Pag. 107
Figura N 115
Figura N 116
La ventana anterior nos solicita determinar el origen de datos para el contenido del informe,
vamos a hacer click en el botn New para crear un nuevo origen de datos.
Pag. 108
Figura N 117
Seleccionamos Object ya que vamos a obtener los datos a partir de un objetos, en este caso
podemos seleccionar dicha opcin porque tenemos un proyecto elaborado con capas. Una vez
seleccionada la opcin mencionada hacemos click en el botn Next.
Figura N 118
En la ventana mostrada seleccionamos la capa regla de negocio que contiene las clases que
hemos elaborado en sesiones anteriores. Finalmente presionamos el botn Finish para
terminar la seleccin del origen de datos.
Pag. 109
Figura N 119
Presionamos el botn OK y seleccionamos los datos principales del contacto tal y como se
muestra en la siguiente figura:
Figura N 120
Pag. 110
Figura N 121
Ahora las cabeceras de los reportes adquieren una forma parecida a la siguiente:
Figura N 122
Figura N 123
Finalmente vamos a configurar la hoja de trabajo, esta es una tarea que se debe considerar
siempre ya que los formatos o documentos empresariales siempre tienen diversos formatos.
Para configurar la hoja adecuadamente en la barra de herramientas encontraremos el botn
Report Properties.
Figura N 124
Pag. 111
Figura N 125
Pag. 112
SESIN
Informes Parte II
18
Conocer las herramientas que proporciona Visual Studio 2012 para la implementacin de
reportes.
Identificar y aplicar una solucin a posibles problemas comunes relacionados a la
impresin de reportes.
Temas:
Aplicando el informe
Pag. 113
Aplicando el informe
Una vez creado el informe, vamos a crear un formulario para poder visualizarlo, para ello
agregamos un nuevo formulario a nuestra capa presentacin principal y luego realizamos el
siguiente diseo:
Figura N 126
Figura N 127
Figura N 128
Pag. 114
Figura N 129
Para acoplar el ReportViewer a la zona superior del formulario, vamos a cambiar su propiedad
Dock.
Figura N 130
Figura N 131
Ahora vamos a agregar un botn con el texto mostrar en la zona inferior izquierda del
formulario.
Pag. 115
Figura N 132
El evento Click est vaco, pero notemos que el evento Load contiene un lnea de cdigo, esta
sirve para actualizar el ReportViewer. Vamos a cortar esa lnea de cdigo y la ubicamos en el
evento click de nuestro botn Mostrar.
Public Class frmReporteContactos
Private Sub frmReporteContactos_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
End Sub
Private Sub btnMostrar_Click(sender As Object, e As EventArgs) Handles
btnMostrar.Click
Me.ReportViewer1.RefreshReport()
End Sub
End Class
El siguiente paso es indicar el origen de datos para el reporte, observemos que al momento de
vincular el ReportViewer con el reporte rptContactos se ha agregado un BindingSource en la
parte inferior del diseo.
Pag. 116
Figura N 133
Este control nos sirve para especificar el origen de datos del reporte, en este caso debemos
crear un mtodo que permita obtener todos los contactos registrados de la base de datos, as
que nos trasladamos a la capa de acceso a datos, abrimos el DataSet Datos01.xsd y
visualizamos su cdigo.
Imports System.Data.SqlClient
Partial Class Datos01
Partial Class ContactoDataTable
Shared Sub Agregar(Identificador As String, Nombres As String, _
ApellidoPaterno As String, _
ApellidoMaterno As String, _
Observaciones As String, _
Grupo As String)
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Insertar_Contacto", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("nombreIdentificador", Identificador)
cmd.Parameters.AddWithValue("nombres", Nombres)
cmd.Parameters.AddWithValue("apellidoPaterno", ApellidoPaterno)
cmd.Parameters.AddWithValue("apellidoMaterno", ApellidoMaterno)
If Observaciones = String.Empty Then
cmd.Parameters.AddWithValue("observaciones", DBNull.Value)
Else
cmd.Parameters.AddWithValue("observaciones", Observaciones)
End If
cmd.Parameters.AddWithValue("grupo", Grupo)
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
End Sub
End Class
Partial Class GrupoDataTable
Shared Function Listar() As GrupoDataTable
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Listar_Grupos", cn)
Pag. 117
Como podemos apreciar, tenemos un mtodo llamado Agregar para insertar un nuevo contacto,
debajo de ese mtodo vamos a crear un mtodo Listar() que nos permita obtener todos los
contactos registrados en la base de datos. Lo primero que haremos ser crear el procedimiento
almacenado respectivo:
CREATE PROC usp_Listar_Contactos
AS
SELECT nombreIdentificador,Nombres,ApellidoPaterno,
ApellidoMaterno,Observaciones,Grupo
FROM tblContacto
ORDER BY Nombres
Ahora si creamos el mtodo esttico Listar() debajo del mtodo Agregar de la clase
ContactoDataTable.
Pag. 118
Una vez creado el mtodo en la clase clsContacto, procedemos a abrir el evento click del botn
Mostrar ubicado en la capa Presentacin del ltimo formulario que hemos creado y agregamos
el siguiente cdigo:
Private Sub btnMostrar_Click(sender As Object, e As EventArgs) Handles
btnMostrar.Click
clsContactoBindingSource.DataSource = CapaReglaDeNegocio.clsContacto.Listar
Me.ReportViewer1.RefreshReport()
End Sub
Pag. 119
Figura N 134
Como podemos observar, se muestran todos los contactos registrados, en la parte superior del
informe se muestra una pequea barra que contiene opciones comunes como imprimir, navegar
por la cantidad de pginas del documento, refrescar el reporte (en el caso de que se hayan
agregado ms contactos) , etc.
Un detalle resaltante de la barra superior es que permite exportar a algunos formatos conocidos
y bastante solicitados en lo que se refiere a reportes, para visualizar esta caracterstica vamos a
hacer click el siguiente icono:
Figura N 135
Para realizar una prueba seleccionamos la opcin Excel, luego indicamos la ubicacin del
archivo, le asignamos un nombre y presionamos el botn Guardar. Ahora abrimos el documento
para ver el resultado.
Pag. 120
Figura N 136
Pag. 121
SESIN
Seguridad a Nivel
Usuario Parte I
19
Temas:
Generalidades
Seguridad a nivel de base de datos
Pag. 122
Generalidades
Para brindar seguridad a una aplicacin existen diversas tcnicas, la tcnica que abordaremos
ahora es la de crear una tabla que almacene los usuarios que pueden tener acceso a la base de
datos. Cada usuario contar con una clave que se mantendr encriptada en la base de datos.
Figura N 137
La clave tiene una longitud de 250 caracteres ya que la vamos almacenar encriptada, sin
embargo en la clase que crearemos ms adelante vamos a validar que como mximo se ingrese
15 caracteres.
El siguiente paso es crear un procedimiento almacenado que permita insertar un nuevo usuario,
as que vamos a aperturar una nueva ventana de consulta y escribimos lo siguiente:
Ejecutamos el script para crear el procedimiento almacenado y luego nos dirigimos a la capa de
acceso a datos para crear el DataTable que muestra la siguiente figura:
Pag. 123
Figura N 138
Una vez creado el DataTable correspondiente, vamos a crear un mtodo que nos permita
realizar la insercin respectiva de un nuevo usuario.
Partial Class UsuarioDataTable
Shared Sub Agregar(NombreUsuario As String, _
Clave As String, _
Tipo As Char, _
Descripcion As String)
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Insertar_Usuario", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("nombreUsuario", NombreUsuario)
cmd.Parameters.AddWithValue("clave", Clave)
cmd.Parameters.AddWithValue("tipo", Tipo)
If Descripcion = String.Empty Then
cmd.Parameters.AddWithValue("descripcion", DBNull.Value)
Else
cmd.Parameters.AddWithValue("descripcion", Descripcion)
End If
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
End Sub
End Class
Pag. 124
Pag. 125
Pag. 126
Ahora crearemos un mtodo denominado Insertar debajo de las propiedades para realizar la
insercin respectiva.
Sub Insertar()
UsuarioDataTable.Agregar(nombreUsuario, clave, tipo, descripcion)
End Sub
Bien, ya tenemos listo la mayor parte del cdigo, el siguiente paso es crear la interfaz de
registro de usuario.
Pag. 127
SESIN
Seguridad a Nivel
Usuario Parte II
20
Temas:
Registro de usuario
Pag. 128
Registro de usuario
Para terminar el ejercicio de la sesin anterior, vamos a disear la siguiente interfaz de usuario
en la capa presentacin que hemos creado:
Figura N 139
Luego ingresamos al evento click del botn Guardar y agregamos el siguiente fragmento de
cdigo:
Imports CapaReglaDeNegocio
Public Class frmRegistroDeUsuario
Private Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles
btnCancelar.Click
Close()
End Sub
Private Sub btnGuardar_Click(sender As Object, e As EventArgs) Handles
btnGuardar.Click
Dim nuevoUsuario As clsUsuario
Try
If rbAdministrador.Checked = True Then
nuevoUsuario = New clsUsuario(txtNombreUsuario.Text, txtClave.Text,
"A")
Else
nuevoUsuario = New clsUsuario(txtNombreUsuario.Text, txtClave.Text,
"T")
End If
nuevoUsuario.descripcion = txtDescripcion.Text
Pag. 129
Figura N 140
Figura N 141
Como podemos apreciar, la clave del usuario se muestra encriptada, lo cual nos brinda cierto
grado de seguridad para la aplicacin que estemos desarrollando.
Pag. 130
Figura N 142
Otro detalle a tener en cuenta es que la clave al momento del registro de muestra tal como es,
lo ms comn es mostrar la clave protegida con algn smbolo (el carcter asterisco es lo ms
comn y utilizado). Para este propsito vamos a seleccionar el TextBox del formulario y
seleccionamos la propiedad PasswordChar, donde le estableceremos como valor un
asterisco.
Figura N 143
Ahora ejecutamos la aplicacin nuevamente y notaremos que Trabajador es el tipo por defecto.
Figura N 144
Pag. 131
Figura N 145
Pag. 132
SESIN
Ejercicio Propuesto
21
Temas:
Ejercicio propuesto
Pag. 133
Ejercicio propuesto
En la sesin anterior, elaboramos un formulario que permite el registro de un determinado
usuario a la base de datos. Como tambin hemos observado, la clave se guarda encriptada en
la base de datos. Lo que se debe hacer ahora es crear un formulario de inicio de sesin, es
decir, se debe elaborar un formulario que realice la validacin respectiva del usuario y su clave
ingresada.
Se recomienda que el diseo del formulario sea similar a la siguiente figura:
Figura N 146
Elabore el ejercicio utilizando el proyecto anterior, recuerde que debe elaborar los mtodos
necesarios en las capas indicadas.
Pag. 134
SESIN
Herencia
22
Temas:
Herencia
Aplicacin de herencia
Pag. 135
Herencia
Herencia es uno de los principios de la programacin orientada a objetos, algunos lo conocen
con el nombre Reutilizacin de Cdigo. Este principio permite crear clases con distintos
miembros (Constructor, campos, propiedades y mtodos) con la posibilidad de ser reutilizados
ms adelante. Por ejemplo: Si en una universidad cuento con docentes a tiempo completo y
docentes por hora, entonces puedo crear una clase genrica denominada clsDocente donde
defino las caractersticas comunes entre los docentes de tiempo completo y de hora; luego
puedo crear 2 clases (clsDocenteTiempoCompleto y clsDocentePorHoras) que hereden todos los
miembros de clsDocente, con la posibilidad de poder de ingresar miembros adicionales.
Aplicacin de herencia
Veamos un ejemplo prctico de herencia, vamos a crear un nuevo proyecto de tipo Windows
Forms Application con el nombre DemoHerencia. Luego de ello vamos a agregar un nuevo
elemento de tipo Class Diagram.
Figura N 147
Figura N 148
Este elemento de tipo diagrama nos permite crear clases utilizando un estilo Visual, de tal
manera que permite tener una visin general de las clases que componen nuestra aplicacin.
Pag. 136
Figura N 149
Figura N 150
Pag. 137
Figura N 151
Figura N 152
Como podemos apreciar en la siguiente figura, todo lo que replicamos en el panel Class
Details se replica en la clase ubicada en la parte superior.
Figura N 153
Pag. 138
Pag. 139
Bien, ya tenemos la clase lista, ahora a partir de la clase clsPersona vamos a crear 2 clases:
clsDocente y clsAlumno, as que abrimos nuevamente el diagrama y agregamos estas clases
tal y como lo hicimos con la clase clsPersona.
La clase
clsDocente deber contener los datos DNI, nombres, apellidos, sexo, profesin y
perfil; por otro lado la clase clsAlumno contendr DNI, nombres, apellidos, sexo, cdigo y fecha
Pag. 140
Figura N 154
Figura N 155
Figura N 156
Pag. 141
Figura N 157
Figura N 158
Una vez que realizamos el proceso de herencia, todos los miembros de la clase Padre
(clsPersona) pasarn automticamente a las clases hijas (clsDocente y clsAlumno). Cualquier
cambio que realicemos en la clase padre, automticamente se reflejar en las clases hijas,
notemos que adicionalmente a los miembros que heredan las clases hijas pueden contener sus
propios miembros.
Pag. 142
Figura N 159
Incluso podemos seguir heredando de clases hijas, por ejemplo, podemos crear la clase
clsDocenteTiempoCompleto
clsDocentePorHoras
que
hereden
de
la
clase
clsDocente.
Figura N 160
Pag. 143
SESIN
Caso Practico
23
Temas:
Caso prctico
Pag. 144
Caso prctico
Elaborar el registro de personal de RRHH teniendo en cuenta que por cada persona se
almacena el DNI, nombres, apellidos, fecha de nacimiento, fecha de registro, correo electrnico
(2 en total, uno corporativo y otro personal), telfonos de contacto (fijo, mvil o red privada
mvil), sexo y deportes que prctica. Todos los datos son obligatorios a excepcin del deporte
(ya que quizs no practica ninguno) y los telfonos (ya que podra no utilizar ninguno).
Adicionalmente, se debe elaborar un de consulta que permita buscar a una determinada
persona por DNI o por apellido paterno, adems debe crear un formulario que muestre las
estadsticas del los trabajadores, que incluyen los siguientes elementos:
Una lista que contenga los nombres y apellidos de los empleados que son hermanos.
Finalmente se debe mostrar 1 reporte que muestre la lista total de trabajadores incluyendo
todos sus datos y ordenado por apellido paterno.
Notas
Debe crear la base de datos utilizando los tipos de datos ms adecuados para cada caso y
con un modelamiento correcto.
Aplique una interfaz simple y eficiente para facilitar el trabajo del usuario final
Pag. 145
SESIN
Aplicaciones Web
con ASP .Net
24
Temas:
Pag. 146
Figura N 161
Figura N 162
Pag. 147
Figura N 163
Hacemos click en el botn OK e inmediatamente Visual Studio crear una aplicacin Web en
ASP .Net vaca, para comprobarlo observemos el contenido del explorador de soluciones:
Figura N 164
Ahora vamos a crear nuestro primer formulario Web, para ello hacemos click derecho en el
nombre del proyecto, luego seleccionamos la opcin Add y luego la opcin Add New Item,
luego de hacer este procedimiento Visual Studio mostrar la siguiente ventana:
Figura N 165
Pag. 148
Figura N 166
Actualmente estamos en la Vista Source que es aquella que muestra el cdigo HTML (lenguaje
utilizado para crear pginas Web) de la pgina. Si queremos ver el diseo de la pgina (que por
ahora est vaca) podemos hacer click en Design.
Figura N 167
Figura N 168
Figura N 169
Pag. 149
Figura N 170
Notemos que el botn ahora tiene el nombre del Navegador predeterminado del equipo
La aplicacin se debe mostrar de la siguiente manera:
Figura N 171
Recordemos que la aplicacin se muestra en el navegador porque ASP .Net es una tecnologa
con interfaz Web.
Pginas maestras
Es muy comn en la mayora de Pginas Web utilizar plantillas, este elemento nos sirve para
fijar la estructura de la pgina Web y determinar aquellas zonas estticas (zonas que no
cambian mientras se navega por la pgina Web, por ejemplo el encabezado o el men) y zonas
de contenido (aquello que cambia mientras se navega por la pgina Web, generalmente
ubicado en la zona central de la pgina). Visual Studio 2012 nos permite crear plantillas o
pginas maestras para este propsito, en el proyecto que acabamos de crear vamos a agregar
una pgina maestra que nos sirva como base para crear pginas adicionales.
Lo primero que haremos es hacer click derecho en el nombre del proyecto, seleccionamos la
opcin Add, luego Add New Item. De la lista mostrada seleccionamos Master Page y le
asignamos el nombre Plantilla01.master.
Figura N 172
El Master page que acabamos de crear es similar a una plantilla, como explicamos hace un
momento, las plantillas tienen zonas estticas y zonas de contenido (aquelas que se modifican
Pag. 150
Figura N 173
Como podemos apreciar, una vez creado el Master Page automticamente se ha agregado un
ContentPlaceHolder en su contenido, vamos a eliminar las etiquetas correspondientes al
ContentPlaceHolder de tal manera que el cdigo quede muy similar a la siguiente figura:
Figura N 174
Como mencionamos hace un momento la vista Source muestra el cdigo HTML de la pgina,
este cdigo es el corazn de toda pgina Web y es un lenguaje basado netamente en etiquetas,
Pag. 151
Pag. 152
SESIN
25
Temas:
Pag. 153
Figura N 175
Figura N 176
Ahora hacemos click derecho en el nombre de la carpeta que acabamos de crear y vamos a
agregar un elemento de tipo Style Sheet, le asignamos el nombre estructura.css.
Pag. 154
Figura N 177
Figura N 178
Una vez agregada la hoja de estilo, obtendremos una vista similar a la siguiente figura:
Figura N 179
Eliminamos el cdigo en el interior, y luego vamos crear los estilos necesarios para maquetar la
pgina de acuerdo a la siguiente estructura:
ENCABEZADO
MEN LATERAL
CONTENIDO
Pag. 155
El nombre del estilo es contenedor y tiene un ancho de 800 pixeles y su altura es automtica,
ya que depende del contenido que se agregue a la pgina. Ahora procederemos a elaborar el
encabezado.
#contenedor {
width:800px;
height:auto;
}
#encabezado {
width:800px;
height:170px;
}
El encabezado tiene un ancho igual al del contenedor principal de la pgina, pero tiene una
altura de 170px. Ahora procederemos a crear el men lateral izquierdo y el contenido
mostrados en la tabla anterior.
#contenedor {
width:800px;
height:auto;
}
#encabezado {
width:800px;
height:170px;
}
#menuLateral {
width:200px;
height:500px;
float:left;
}
#contenido {
width:590px;
height:500px;
float;left;
margin-left:10px;
}
Esta vez hemos agregado un primer estilo llamado menuLateral el cual representa al men
izquierdo mostrado en la estructura propuesta, la novedad con respecto a los otros estilos es
que estamos agregando una lnea con la propiedad float la cual establece que el estilo se
acoplar al lado izquierdo, la misma propiedad tiene el estilo contenido ya que ambos estilos se
Pag. 156
Aplicacin de CSS
Ahora vamos a utilizar los estilos creados anteriormente, para ello nos ubicamos en la seccin
head de la pgina plantilla que hemos creado en sesiones anteriores.
<%@ Master Language="VB" CodeFile="Plantilla01.master.vb" Inherits="Plantilla01" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Vamos a establecer un ttulo a las pginas creadas a partir del masterPage, para ello nos
ubicamos en la etiqueta tittle y escribimos el siguiente ttulo: Demo sobre ASP .Net.
<%@ Master Language="VB" CodeFile="Plantilla01.master.vb" Inherits="Plantilla01" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
Pag. 157
Para empezar a utilizar los estilos tenemos que crear una referencia de la hoja que queremos
utilizar (algo parecido a lo que hacamos anteriormente con Imports System.Data.SqlClient).
Este proceso lo tenemos que realizar en la seccin head del documento, para lograrlo
simplemente arrastramos la hoja CSS a la posicin indicada en el siguiente grfico:
Figura N 180
Ahora empezaremos a aplicar los estilos anteriormente creados, primero incluiremos una
etiqueta div dentro del formulario que haga referencia al estilo #contenedor creado
anteriormente.
<%@ Master Language="VB" CodeFile="Plantilla01.master.vb" Inherits="Plantilla01" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
Pag. 158
Figura N 181
El encabezado debe ubicarse dentro del contenedor, por lo tanto dentro del estilo contenedor
agregamos una divisin que incluya el estilo #encabezado.
<%@ Master Language="VB" CodeFile="Plantilla01.master.vb" Inherits="Plantilla01" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Demo sobre ASP .Net</title>
<link href="CSS/estructura.css" rel="stylesheet" />
</head>
<body>
<form id="form1" runat="server">
<div id="contenedor">
<div id="encabezado">
</div>
</div>
</form>
</body>
</html>
Veamos el resultado:
Figura N 182
Pag. 159
</div>
<div id="contenido">
</div>
</div>
</form>
</body>
</html>
Figura N 183
Ahora vamos a agregar una zona editable a la seccin contenido de la plantilla, recordemos que
esta zona es la nica que puede recibir modificaciones. Para indicar la zona editable de la
Pag. 160
Figura N 184
Para verificar el resultado de nuestra plantilla, vamos a crear un formulario Web que utilice
nuestra pgina maestra. Para ello agregamos un nuevo elemento de tipo Web Form a nuestro
proyecto y le asignamos el nombre PortadaPrincipal.
Figura N 185
Para indicar que utilice la plantilla que creamos en la seccin anterior marcamos la opcin
Select master page ubicada en la zona inferior derecha de la ventana.
Figura N 186
Pag. 161
Figura N 187
Seleccionamos el nico Master Page que tenemos y presionamos OK. Veamos el resultado:
Figura N 188
Figura N 189
Pag. 162
Figura N 190
Figura N 191
Presionamos el botn de los 3 puntos y luego vamos a indicar el nombre de la pgina que
queremos llamar al momento de hacer click en el HyperLink, en este caso ser la pgina que
contiene la portada principal.
Figura N 192
Presionamos el botn OK, para terminar la edicin de la propiedad. Ahora vamos a seleccionar
la pgina de inicio del proyecto, en este caso ser la pgina Default.aspx, por lo tanto en el
explorador de soluciones vamos a seleccionar dicha pgina, luego le aplicamos un click derecho
y seleccionamos la opcin Set As Start Page.
Pag. 163
Figura N 193
Pag. 164
SESIN
Controles de
Validacin
26
Temas:
Validacin de datos
Controles de validacin
Pag. 165
Validacin de datos
A menudo es necesario capturar datos por parte de los usuarios, ya sea para realizar registros
de datos, enviar comentarios o consultas, etc. Si la validacin es simple (verificar campos
obligatorios, verificar un rango numrico, etc) entonces se uede hacer en el lado del cliente (en
el navegador que usa el usuario para acceder a la aplicacin Web) sin la necesidad de ir hasta
el servidor Web que contiene nuestra aplicacin.
Visual Studio 2012 provee controles en el cuadro de herramientas para realizar validaciones
sencillas.
Controles de validacin
Vamos a crear un nuevo proyecto Web pero esta vez en la ventana mostrada en la parte
inferior vamos a seleccionar ASP .NET Web Forms Site.
Figura N 194
Figura N 195
Pag. 166
Figura N 196
En el siguiente cuadro vamos a agregar una tabla de 5 filas por 3 columnas, el ancho de la
tabla ser de 700px.
Figura N 197
Figura N 198
Pag. 167
Figura N 199
Figura N 200
Ahora vamos a utilizar los controles de validacin, estos se ubican en la categora Validation
del cuadro de herramientas.
Figura N 201
Pag. 168
Figura N 202
El prefijo para el RequiredFieldValidator es rfv, por lo tanto vamos a asignar los nombres
rfvNombre, rfvEdad y rfvCorreo respectivamente. Ahora vamos a configurar las principales
propiedades de rfvNombre, para ello lo seleccionamos y aperturamos el panel propiedades.
La primera propiedad es ControlToValidate que indica el control que queremos validar.
Figura N 203
Pag. 169
Figura N 204
Figura N 205
Figura N 204
Pag. 170
Figura N 205
Acabamos de terminar de incluir todos los controles de validacin, pero an falta un detalle
adicional, para mostrar todos los mensajes de error que hemos establecido necesitamos un
control denominado ValidationSummary, lo vamos a agregar al lado derecho del botn
Registrar.
Figura N 206
Pag. 171
Figura N 207
Figura N 208
Como vemos la aplicacin est realizando las validaciones necesarias, ahora vamos a ingresar
nicamente el nombre del paciente:
Figura N 209
Pag. 172
Figura N 210
Figura N 211
Pag. 173
SESIN
Parmetros
27
Temas:
Pag. 174
Figura N 212
Figura N 213
Luego en la pgina Desinto simplemente ubicamos un label, el cual debe contenedor el valor
vaco propiedad Text y cuyo nombre ser lblValorRecibido.
Figura N 214
Pag. 175
Figura N 215
Luego escribimos la siguiente lnea de cdigo que nos permite recuperar el valor de un
determinado parmetro:
Partial Class Destino
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
lblValorRecibido.Text = Request.QueryString("nombre")
End Sub
End Class
Pag. 176
Figura N 216
Pag. 177
SESIN
Ejercicio Propuesto
28
Temas:
Pag. 178
Logo
Men
Publicidad
Men
Contenido01
Contenido02
Pie de pgina
Crditos y autores
Las zonas editables de la pgina son aquellas que se encuetran subrayadas. EL ancho de la
pgina lo debe determinar el estudiante.
Prctica de parmetros
Agregar 2 formularios Web al proyecto con ls nombres
DatosGenerales.aspx
Pag. 179
SESIN
Acceso a Datos
Parte I
29
Temas:
Enlazando a datos
Controles de acceso a datos
Pag. 180
Enlazando a datos
Vamos a trabajar una aplicacin de acceso a datos utilizando lo que hemoscreado en la sesin
25 donde ya tenemos estructurado el contenido de la pgina. En la seccin del men lateral
vamos a mostrar una serie de categoras pertenecientes a diversos productos, el objetivo es
hacer un explorador de productos por categoras.
Crearemos una base de datos en Microsoft SQL Server 2012 con el siguiente diagrama:
Figura N 217
Ahora crearemos un procedimiento almacenado que nos permita listar las categoras registradas
de la base de datos:
CREATE PROCEDURE usp_Listar_Categorias
AS
SELECT codigo,nombre
FROM tblCategoria
ORDER BY nombre
Pag. 181
Figura N 218
Figura N 219
Pag. 182
Figura N 220
Figura N 221
Figura N 222
Pag. 183
Figura N 223
Figura N 224
Pag. 184
Figura N 225
Ahora vamos indicar que queremos trabajar con el procedimiento almacenado creado
anteriormente, para ello seleccionamos la opcin Specify a custom SQL statement or
stored procedure, luego hacemos click en el botn Next.
Figura N 226
Pag. 185
Figura N 227
Opcionalmente podemos hacer click en el botn Test Query, y luego hacemos click en el
botn Finish.
Bien, ya tenemos configuradoel origen de datos, el siguiente paso es enlazar el origen de datos
al DataList, para ello simplemente hacemos click en la etiqueta inteligente del DataList y
seleccionamos la opcin Choose Data Source para vincular con el origen de datos creado
anteriormente.
Figura N 228
Ya tenemos enlazado a datos el DataList, en la siguiente sesin procederemos con la modificacin del DataList para
mejorar su presentacin.
Pag. 186
SESIN
Acceso a Datos
Parte II
30
Temas:
Pag. 187
Figura N 229
Figura N 230
Pag. 188
Figura N 231
Figura N 232
Pag. 189
Figura N 233
Pag. 190
SESIN
Acceso a Datos
Parte III
31
Temas:
Pag. 191
Figura N 234
Ahora hacemos click en la etiqueta inteligente del HyperLink y seleccionamos la opcin Edit
DataBindings. En la ventana flotante vamos a ubicar la propiedad NavigateURL y
seleccionamos en la derecha la opcin Custom Binding.
Figura N 235
Pag. 192
Figura N 236
Figura N 237
Ahora vamos a crear una pgina llamada Productos.aspx que est basada en el Master Page
que hemos creado inicialmente.
Figura N 238
Ejecutamos la aplicacin Web para visualizar la portada principal, una vez ejecutada la Web
hacemos click en alguna categora y luego observamos la barra de direcciones
Pag. 193
Figura N 239
Figura N 240
Como podemos observar, se captura el cdigo del elemento seleccionado del men, ese cdigo
nos servir para mostrar su listade productos respectiva.
Pag. 194
SESIN
Acceso a Datos
Parte IV
32
Temas:
Pag. 195
Figura N 241
Figura N 242
Pag. 196
Figura N 243
Hacemos click en el botn Next y seleccionamos la opcin para trabajar con un procedimiento almacenado:
Figura N 244
Pag. 197
Figura N 245
Figura N 246
Pag. 198
Figura N 247
Figura N 248
Veamos el resultado:
Pag. 199
Figura N 249
Ahora eliminamos su contenido y agregamos un label para el nombre, otro para el precio y otro
para el stock.
Figura N 250
Pag. 200
Figura N 251
Figura N 252
Pag. 201
Figura N 253
Como podemos apreciar, cada vez que seleccionamos una categora, automticamente se
muestran sus productos.
Pag. 202
SESIN
Ejercicio Propuesto
33
Temas:
Ejercicio propuesto
Pag. 203
Ejercicio propuesto
Se trata de elaborar una aplicacin que permita el registro de participantes para un congreso
nacional, la aplicacin debe funcionar en Internet y debe permitir ingresar los siguientes datos:
Nombres (Obligatorio)
Apellidos (Obligatorio)
Comentarios (Opcional)
Cree la base de datos respectiva con la aplicacin Web en ASP .Net utilizando estilos y los
controles adecuados. Adicionalmente la pgina de registro deber incluir algn Link o Botn
para mostrar otro formulario Web donde se muestren todos los participantes registrados
ordenados por Apellidos y Nombres.
Pag. 204
SESIN
Caso Prctico
34
Temas:
Caso prctico
Pag. 205
Caso prctico
Elaborar una aplicacin Web que permita registrar los siguientes datos de un libro:
Ttulo
Autor
Resumen
Cantidad de pginas
Editorial
Todos los datos son obligatorios a excepcin del resumen, en caso de que no se conociera el
autor de algn libro, se debe almacenar ANNIMO en la base de datos.
Adicionalmente, la aplicacin debe incluir una pgina donde se visualice los libros organizados
por categoras.
Notas:
Pag. 206