Está en la página 1de 208

3

Programador

.NET 2012

AUMENTA TU PRODUCTIVIDAD

Centro de Educacin Continua


Universidad Continental
Material para fines de Estudio del Programa: Programador .NET
Elaborado por: Ing. Rolando R. Zapata Marav

Queda prohibida la reproduccin total o parcial del contenido de este documento en


cualquiera de sus formas, sean electrnicas o mecnicas, sin el consentimiento previo y
por escrito del autor y el Centro de Educacin Continua.

Programa: Programador .NET

SESIN

Implementacin de
Clases

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Reconocer y aplicar los elementos principales de la POO en el desarrollo de programas


bsicos.

Comprender la relacin entre Visual Studio y la POO.

TEMAS:

Creacin de clases.
Campos y propiedades
Constructor

Modulo: Fundamentos de Programacin

Pag. 1

Programa: Programador .NET

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:

El DNI debe contener exactamente 8 dgitos.

Los nombres y apellidos deben contener como mnimo 3 letras, y deben ser almacenados
en maysculas.

Para el sexo se considera M si fuera masculino y F si fuera femenino.

La edad mnima es 18 aos.

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

Modulo: Fundamentos de Programacin

Pag. 2

Programa: Programador .NET


Para revisar detalles adicionales sobre Programacin Orientada a Objetos, puede
consultar la sesin nmero 4 de Fundamentos de Programacin

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

Luego escribimos clsParticipante en el nombre de la clase.

Figura N 3

Hacemos click en el botn Add, e inmediatamente se mostrar la ventana de cdigo que


contiene la clase que acabamos de crear.

Modulo: Fundamentos de Programacin

Pag. 3

Programa: Programador .NET

Figura N 4

El siguiente paso es implementar contenido a la clase, primero agregaremos campos y


propiedades para representar los datos solicitados del participante.

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

Modulo: Fundamentos de Programacin

Pag. 4

Programa: Programador .NET


Como podemos apreciar, los campos se crean de manera muy similar a una variable, con la
diferencia de que esta vez en lugar de Dim utilizamos Private, esto indica que los campos son
privados, es decir, que no se pueden visualizar desde otras clases. Tal como indicamos
anteriormente, los campos contienen datos puros y por ende no debemos exponerlos a
cualquier otra clase ya que se recomienda que los nicos que pueden acceder directamente a
los campos son las propiedades.
En trminos tcnicos, el modificador de acceso Private permite que el miembro pueda
ser visible nicamente en la clase donde se ha declarado.

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:

Modulo: Fundamentos de Programacin

Pag. 5

Programa: Programador .NET


Public Class clsParticipante
Private _DNI, _Nombres, _Apellidos, _Sexo, _Observaciones As String
Private _Edad As Byte
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
Public Property Nombres As String
Get
Return _Nombres
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El nombre no debe quedar vaco.")
ElseIf value.Trim.Length < 3 Then
Throw New Exception("Mnimo 3 caracteres para el nombre.")
Else
_Nombres = value.Trim.ToUpper
End If
End Set
End Property
Public Property Apellidos As String
Get
Return _Apellidos
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El apellido no debe quedar vaco.")
ElseIf value.Trim.Length < 3 Then
Throw New Exception("Mnimo 3 caracteres para el apellido.")
Else
_Apellidos = value.Trim.ToUpper
End If
End Set
End Property
Public Property Sexo As String
Get
Return _Sexo
End Get
Set(value As String)
If value.Trim.ToUpper = "M" Or value.Trim.ToUpper = "F" Then
_Sexo = value.Trim.ToUpper
Else
Throw New Exception("Sexo invlido.")
End If
End Set
End Property
Public Property Edad As Byte
Get
Return _Edad

Modulo: Fundamentos de Programacin

Pag. 6

Programa: Programador .NET


End Get
Set(value As Byte)
If value >= 18 Then
_Edad = value
Else
Throw New Exception("La edad mnima es 18 aos")
End If
End Set
End Property
Public Property Observaciones As String
Get
Return _Observaciones
End Get
Set(value As String)
If value.Trim.Length = 0 Then
_Observaciones = String.Empty
ElseIf value.Trim.Length > 250 Then
Throw New Exception("Las obs. no pueden exceder de 250 caracteres.")
Else
_Observaciones = value.Trim
End If
End Set
End Property
End Class

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

Modulo: Fundamentos de Programacin

Pag. 7

Programa: Programador .NET


Como podemos apreciar, hemos incluido todos los campos a excepcin de las observaciones,
esto se da porque observaciones es un dato opcional. Recordemos que el constructor se utiliza
para determinar valores obligatorios e inicializar valores.
Bien, por el momento ya tenemos definida una clase con campos, propiedades y un
constructor. En la siguiente sesin, vamos a crear una interfaz de usuario y aplicaremos la clase
creada.

Modulo: Fundamentos de Programacin

Pag. 8

Programa: Programador .NET

SESIN

Utilizacin de
Clases

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Utilizar clases en combinacin con formularios.


Controlar excepciones en una aplicacin.

TEMAS:

Interfaz de usuario
Control de excepciones

Modulo: Fundamentos de Programacin

Pag. 9

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 10

Programa: Programador .NET


Ahora vamos al evento click del botn registrar y lo primero que haremos es crear un objeto
basado en la clase clsParticipante.

Dim miParticipante As clsParticipante


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
lstParticipantes.Items.Add(miParticipante.Nombres & " " _
& miParticipante.Apellidos)
lstParticipantes.Items.Add(miParticipante.Nombres)

Observemos que primero declaramos una variable llamada miParticipante de tipo


clsParticipante, y a continuacin si fuera masculino creamos el objeto con el sexo masculino
M, o F si fuera femenino. Notemos que estamos invocando al constructor de la clase (New)
que recibe los parmetros obligatorios definidos en el mismo.
Luego utilizamos el identificador del objeto para capturar las observaciones ingresadas, sta no
se captura dentro del constructor porque es un dato opcional. Finalmente ingresamos el
nombre y apellido del participante en la lista.
Vamos a ejecutar la aplicacin y la probaremos con los siguientes datos:
DNI

89188890

Nombres

CAROLINA

Apellidos

CASTRO

Sexo

FEMENINO

Edad

30

Observaciones

JUGADORE DE VOLEY
Tabla N 1

Modulo: Fundamentos de Programacin

Pag. 11

Programa: Programador .NET

Figura N 6

Luego presionamos el botn registrar e inmediatamente el programa ingresar el nombre y


apellido del participante en la lista.

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.

Modulo: Fundamentos de Programacin

Pag. 12

Programa: Programador .NET

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)

Modulo: Fundamentos de Programacin

Pag. 13

Programa: Programador .NET


El bloque Try incluye el cdigo fuente que es propenso a error, en el caso anterior, es factible
que el usuario ingrese datos invlidos en los controles de captura respectivos. El bloque Catch
se ejecuta siempre y cuando se produzca un error en el bloque Try, en el bloque anterior
se indica que se debe mostrar en un MsgBox el mensaje de error de la aplicacin
(ex.message), luego de mostrar el mensaje se establece el foco en txtDNI y finalmente se
termina el procedimiento actual (Exit Sub).
Ahora ejecutamos nuevamente la aplicacin y hacemos click en el botn registrar sin incluir
ningn dato.

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.

Modulo: Fundamentos de Programacin

Pag. 14

Programa: Programador .NET

SESIN

Creacin de
Mtodos

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Implementar mtodos en una clase.


Diferenciar las caractersticas entre propiedades y mtodos.

TEMAS:

Mtodos
Caso prctico

Modulo: Fundamentos de Programacin

Pag. 15

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 16

Programa: Programador .NET


vaco y en caso de ingresarse no debe exceder de 100 caracteres, por el lado de la edad,
validaremos que se registren jugadores entre los 18 y 50 aos.
Public Class clsJugador
Private _Nombre As String
Private _Edad As Byte
Sub New(parNombre As String, parEdad As String)
Nombre = parNombre
Edad = parEdad
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 jugador no puede quedar vaco.")
ElseIf value.Trim.Length > 100 Then
Throw New Exception("El nombre no debe exceder de 100 caracteres.")
Else
_Nombre = value.Trim.ToUpper
End If
End Set
End Property
Public Property Edad As Byte
Get
Return _Edad
End Get
Set(value As Byte)
If value >= 18 And value <= 50 Then
_Edad = value
Else
Throw New Exception("Edad fuera del rango.")
End If
End Set
End Property
End Class

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

Modulo: Fundamentos de Programacin

Pag. 17

Programa: Programador .NET


_Nombre = value.Trim.ToUpper
End If
End Set
End Property
Public Property RelacionDeJugadores As List(Of clsJugador)
Get
Return _RelacionDeJugadores
End Get
Set(value As List(Of clsJugador))
_RelacionDeJugadores = value
End Set
End Property
End Class

Adicionalmente a los campos, propiedades y constructor de la clase clsEquipo, vamos a


agregar un mtodo llamado AgregarJugador que nos permitir agregar un nuevo jugador a
un equipo determinado.
Public Property RelacionDeJugadores As List(Of clsJugador)
Get
Return _RelacionDeJugadores
End Get
Set(value As List(Of clsJugador))
_RelacionDeJugadores = value
End Set
End Property
Sub AgregarJugador(parJugador As clsJugador)
RelacionDeJugadores.Add(parJugador)
End Sub

El mtodo AgregarJugador recibe un parmetro de tipo clsJugador, que representa al


jugador que se agregar a un determinado equipo (en realidad se agregar a la propiedad
RelacionDeJugadores).
Ahora vamos a utilizar la clase que acabamos de crear, para ello abrimos el cdigo del
formulario y escribimos el siguiente cdigo:
Public Class Form1
Dim eqA As New clsEquipo("Equipo A")
Dim eqB As New clsEquipo("Equipo B")
End Class

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

Modulo: Fundamentos de Programacin

Pag. 18

Programa: Programador .NET


Try
nuevoJugador = New clsJugador(txtNombre.Text, nudEdad.Value)
Catch ex As Exception
MsgBox(ex.Message)
txtNombre.Focus()
Exit Sub
End Try
'Determinando el equipo
If rbEquipoA.Checked = True Then
eqA.AgregarJugador(nuevoJugador)
Else
eqB.AgregarJugador(nuevoJugador)
End If
'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

Ahora vamos a ejecutar la aplicacin y presionamos el botn registrar sin ingresar dato alguno:

Figura N 11

Modulo: Fundamentos de Programacin

Pag. 19

Programa: Programador .NET


Como podemos apreciar, la clase est validando correctamente, ahora vamos a registrar
algunos jugadores para ambos equipos.

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

Modulo: Fundamentos de Programacin

Pag. 20

Programa: Programador .NET


equipo A. La cantidad de iteraciones que realizar este bucle es igual a la cantidad de jugadores
que existe en el equipo A.
Para finalizar, agregaremos Close() a al evento Click del botn Cerrar.
Private Sub btnCerrar_Click(sender As Object, e As EventArgs) _
Handles btnCerrar.Click
Close()
End Sub

Modulo: Fundamentos de Programacin

Pag. 21

Programa: Programador .NET

SESIN

Propiedades de
Solo Lectura

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Identificar los escenarios comunes de aplicacin de propiedades de slo lectura.

TEMAS:

Propiedades de slo lectura


Caso prctico

Modulo: Fundamentos de Programacin

Pag. 22

Programa: Programador .NET

Propiedades de slo lectura


Una propiedad de slo lectura se utiliza en el caso de que se cuenten con datos calculados en
una clase, por ejemplo, si tenemos una propiedad que representa a la fecha de nacimiento, se
puede crear una propiedad de slo lectura llamada edad, ya que esta se puede calcular en
base a la fecha de nacimiento.
Una propiedad de slo lectura cuenta solamente con el bloque get, ya que nicamente
recuperaremos un valor y no asignaremos ninguno. Para comprender mejor el funcionamiento y
creacin de este tipo de propiedades, vamos resolver un ejercicio.

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

Modulo: Fundamentos de Programacin

Pag. 23

Programa: Programador .NET


Throw New Exception("El valor de la base es invlido.")
Else
_base = value
End If
End Set
End Property
Public Property altura As Byte
Get
Return _altura
End Get
Set(value As Byte)
If value = 0 Then
Throw New Exception("El valor de la altura es invlido.")
Else
_altura = value
End If
End Set
End Property
End Class

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

Modulo: Fundamentos de Programacin

Pag. 24

Programa: Programador .NET


Public ReadOnly Property hipotenusa As Single
Get
Return Math.Sqrt(Math.Pow(base, 2) + Math.Pow(altura, 2))
End Get
End Property
Public ReadOnly Property perimetro As Single
Get
Return base + altura + hipotenusa
End Get
End Property

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

Ahora probamos la aplicacin:

Figura N 14

Modulo: Fundamentos de Programacin

Pag. 25

Programa: Programador .NET


Ahora probamos con nmeros distintos hasta obtener resultados con decimales:

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.

El resultado de la hipotenusa y permetro se muestran con varios decimales, si lo que deseamos


es mostrar los resultados a 2 decimales nicamente entonces podemos modificar las
propiedades respectivas de la clase:
Public ReadOnly Property area As Single
Get
Return Math.Round(base * altura / 2, 2)
End Get
End Property
Public ReadOnly Property hipotenusa As Single
Get
Return Math.Round(Math.Sqrt(Math.Pow(base, 2) + Math.Pow(altura, 2)), 2)
End Get
End Property
Public ReadOnly Property perimetro As Single
Get
Return Math.Round(base + altura + hipotenusa, 2)
End Get
End Property

Probamos nuevamente el formulario utilizando los datos anteriores:

Modulo: Fundamentos de Programacin

Pag. 26

Programa: Programador .NET

Figura N 16

Modulo: Fundamentos de Programacin

Pag. 27

Programa: Programador .NET

SESIN

Ejercicio

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Reafirmar su conocimiento terico-prctico de Programacin Orientada a Objetos.

TEMAS:

Ejercicio propuesto

Modulo: Fundamentos de Programacin

Pag. 28

Programa: Programador .NET

Ejercicio propuesto
Crear

un

proyecto

de

tipo

Windows

Forms

Application

con

el

nombre

EjemploCuadrado_POO, luego elaborar la siguiente interfaz:

Figura N 17

Se trata de ingresar la coordenada del punto A y la longitud de lado de un cuadrado, a partir


de estos datos se debe calcular el punto B, C, D y el rea del cuadrado. Se debe desarrollar el
ejercicio utilizando POO. Tome como referencia el siguiente grfico:

Figura N 18

Modulo: Fundamentos de Programacin

Pag. 29

Programa: Programador .NET

SESIN

Proyecto de
Aplicacin

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Aplicar los conceptos bsicos de POO en situaciones reales.


Entender la relacin entre el diagrama de clases y el diagrama de base de datos.

TEMAS:

Creacin de base de datos.


Implementacin de procedimientos almacenados bsicos.

Modulo: Fundamentos de Programacin

Pag. 30

Programa: Programador .NET

Creacin de base de datos


Para aplicar lo que hemos estado aprendiendo hasta ahora, vamos a crear una base de datos
muy sencilla para luego crear clases con propiedades y mtodos con acceso a datos.
Cree una base de datos con el nombre AGENDA, y luego elabore un diagrama con las
siguientes tablas:

Figura N 19

Implementacin de procedimientos almacenados


bsicos
Vamos a crear un procedimiento almacenado para insertar un nuevo grupo y un nuevo
contacto, por lo tanto, vamos a abrir una nueva ventana de consulta y escribimos lo siguiente:
CREATE PROCEDURE usp_Insertar_Grupo
@nombre VARCHAR(20),
@descripcion VARCHAR(250)
AS
INSERT INTO tblgrupo
VALUES (@nombre,@descripcion)

Ahora crearemos el procedimiento almacenado para insertar un nuevo contacto.


CREATE PROCEDURE usp_Insertar_Contacto
@nombreIdentificador VARCHAR(20),

Modulo: Fundamentos de Programacin

Pag. 31

Programa: Programador .NET


@nombres VARCHAR(40),
@apellidoPaterno VARCHAR(30),
@apellidoMaterno VARCHAR(30),
@observaciones VARCHAR(250),
@grupo VARCHAR(20)
AS
INSERT INTO tblContacto
VALUES (
@nombreIdentificador,
@nombres,
@apellidoPaterno,
@apellidoMaterno,
@observaciones,
@grupo
)

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

Modulo: Fundamentos de Programacin

Pag. 32

Programa: Programador .NET

SESIN

Conexin a Base de
Datos

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Conocer y aplicar ADO .Net como tcnica de acceso a datos.


Implementar clases con mtodos que accedan a datos.

TEMAS:

ADO .Net.
Implementacin de clases para la base de datos agenda.
Mtodos de acceso a datos

Modulo: Fundamentos de Programacin

Pag. 33

Programa: Programador .NET

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:

Implementacin de clases para la base de


datos agenda
Para realizar un ejemplo bsico de conexin, vamos a crear una clase que represente a la tabla
grupo de la base de datos AGENDA. Vamos a crear un proyecto nuevo en Visual Studio con el
nombre DemoAgenda. Y luego agregamos una clase con el nombre clsContacto con los
siguientes miembros:

Figura N 20

Ahora vamos a implementar sus propiedades de la siguiente manera:


Public Class clsGrupo
Private _nombre As String
Private _descripcion As String
Sub New(parNombre As String)
nombre = parNombre
End Sub
Public Property nombre As String
Get
Return _nombre
End Get

Modulo: Fundamentos de Programacin

Pag. 34

Programa: Programador .NET


Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El nombre del grupo no puede quedar vaco.")
ElseIf value.Trim.Length > 20 Then
Throw New Exception("El nombre no puede exceder de 20 caract..")
Else
_nombre = value.Trim.ToUpper
End If
End Set
End Property
Public Property descripcion As String
Get
Return _descripcion
End Get
Set(value As String)
If value.Trim.Length = 0 Then
_descripcion =String.Empty
ElseIf value.Trim.Length > 250 Then
Throw New Exception("La descrip. no puede exceder de 250 caract..")
Else
_nombre = value.Trim.ToUpper
End If
End Set
End Property
End Class

Ahora vamos a crear un formulario que nos permita registra un nuevo grupo de contacto:

Figura N 21

Mtodos de acceso a datos


Ya tenemos listo el formulario de registro, ahora vamos a crear un mtodo que nos permita
realizar el registro de un grupo de contacto, para ello abrimos la clase clsGrupo y creamos el
siguiente mtodo:
Sub Insertar()
End Sub

Modulo: Fundamentos de Programacin

Pag. 35

Programa: Programador .NET


Como vamos a trabajar con libreras de conexin a base de datos de Microsoft SQL Server
2012, vamos agregar el siguiente cdigo a la cabecera de la clase:
Imports System.Data.SqlClient
Public Class clsGrupo

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)

El objeto llamado comando recibe 2 parmetros en su constructor, el nombre del procedimiento


almacenado o cdigo T-SQL que se desea utilizar, y un objeto de tipo SqlConnection que
indica la conexin que utilizar el parmetro anterior.
Ahora debemos indicar que el objeto comando es un procedimiento almacenado, eso lo
hacemos con la siguiente lnea de cdigo:
comando.CommandType = CommandType.StoredProcedure

Como comando es un procedimiento almacenado que recibe parmetros, vamos a asignar


cada parmetro de la siguiente forma:
comando.Parameters.AddWithValue("nombre", nombre)
If descripcion = String.Empty Then
comando.Parameters.AddWithValue("descripcion", DBNull.Value)
Else
comando.Parameters.AddWithValue("descripcion", descripcion)
End If

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

Modulo: Fundamentos de Programacin

Pag. 36

Programa: Programador .NET


debe asignar al parmetro el valor NULL de base de datos (que viene representado en Visual
Basic .Net por DBNull.Value).
Una vez establecido el comando y los parmetros necesarios, vamos a ejecutar el comando,
para ello debemos abrir la conexin, luego ejecutar el comando y finalmente cerrar la conexin.
con.Open()
comando.ExecuteNonQuery()
con.Close()

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.")

Lo primero que hicimos es declara un objeto con el nombre nuevoGrupo perteneciente a la


clase clsGrupo, luego utilizamos el constructor para ingresar su nico dato obligatorio
(nombre), notemos que el dato referido a la descripcin lo capturamos despus ya que por ser
un dato opcional no se incluye dentro del constructor, por ltimo invocamos al mtodo
Insertar para guardar el nuevo grupo en la base de datos. Recordemos que todo el cdigo
debe encontrarse en una estructura Try Catch para controlar los errores que la clase
podra lanzar. Ahora vamos a ejecutar el programa para realizar las pruebas respectivas.

Figura N 22

Modulo: Fundamentos de Programacin

Pag. 37

Programa: Programador .NET


Para comprobar el proceso de insertado, vamos a realizar una consulta a la tabla tblGrupo de
la base de datos Agenda.

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

Como podemos apreciar, en caso de que no se ingrese una descripcin, es recomendable


guardar NULL en la tabla.

Modulo: Fundamentos de Programacin

Pag. 38

Programa: Programador .NET

SESIN

Consulta de Datos

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Mostrar el resultado de una consulta en controles especializados.


Crear formularios de permitan realizar consultas a la base de datos.

TEMAS:

Procedimientos almacenados de consulta


Mtodos estticos

Modulo: Fundamentos de Programacin

Pag. 39

Programa: Programador .NET

Procedimientos almacenados de consulta


En la sesin anterior elaboramos una insercin de datos, el siguiente paso es mostrar el
resultado de una consulta de tipo SELECT en un determinado control. Lo primero que haremos
ser abrir el proyecto DemoAgenda y agregaremos el siguiente formulario:

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

Modulo: Fundamentos de Programacin

Pag. 40

Programa: Programador .NET


clase respectiva y luego podemos invocar al mtodo deseado. Por ejemplo, observemos las
siguientes lneas de cdigo utilizadas anteriormente:
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.")

En el cdigo anterior, necesitamos crear la instancia llamada nuevoGrupo para utilizar el


mtodo Insertar (que es de tipo Sub). Esto se da ya que el mtodo Sub fue creado de una
manera ordinaria, aqu mostramos la forma como el mtodo fue creado en la clase clsGrupo.
Sub Insertar()
Dim con As New SqlConnection("SERVER=localHost;database=Agenda;integrated
security=true")
Dim comando As New SqlCommand("usp_Insertar_Grupo", con)
comando.CommandType = CommandType.StoredProcedure
comando.Parameters.AddWithValue("nombre", nombre)
If descripcion = String.Empty Then
comando.Parameters.AddWithValue("descripcion", DBNull.Value)
Else
comando.Parameters.AddWithValue("descripcion", descripcion)
End If
con.Open()
comando.ExecuteNonQuery()
con.Close()
End Sub

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)

Modulo: Fundamentos de Programacin

Pag. 41

Programa: Programador .NET


con.Open()
Dim contenedorDeDatos As SqlDataReader
contenedorDeDatos = comando.ExecuteReader
While contenedorDeDatos.Read = True
Dim item As New clsGrupo(contenedorDeDatos.Item("nombre"))
If contenedorDeDatos.Item("nombre") Is DBNull.Value Then
item.descripcion = String.Empty
Else
item.descripcion = contenedorDeDatos.Item("nombre")
End If
miListaDeGrupos.Add(item)
End While
con.Close()

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

no recibe ningn parmetro. Adems, el procedimiento

almacenado retorna una grilla de datos, esto lo podemos comprobar si ejecutamos el


procedimiento almacenado en una nueva consulta en Microsoft SQL Server 2012.

Figura N 27

Como vemos, el procedimiento almacenado retornar un conjunto de datos, cuando tenemos un


procedimiento de este tipo, entonces debemos utilizar un contenedor de datos llamado
SqlDataReader, es por ello que hemos creado al objeto contenedorDeDatos que pertenece
a la clase SqlDataReader.
Para la ejecucin del comando debemos utilizar ExecuteReader, esto porque el procedimiento
almacenado retorna una grilla de datos (en el caso del mtodo Insertar usbamos
ExecuteNonQuery porque el procedimiento no devuelve valores).
Para recorrer el objeto contenedorDeDatos, debo utilizar el mtodo Read, ste mtodo
recorre fila por fila el contenido del SqlDataReader, al inicio recorre la primera fila, y si
hubieran ms registros retorna true, si ya no existen ms registros debajo retorna false, es por
eso que se utiliza este mtodo dentro de un bucle While.
Mientras se recorre fila a fila cada uno de los registros que tiene contenedorDeDatos,
estamos creando un objeto llamado tem y luego lo agregamos a la objeto lista llamado
miListaDeGrupos.

Modulo: Fundamentos de Programacin

Pag. 42

Programa: Programador .NET


En conclusin, lo que hacemos es recorrer cada fila de la base de datos y lo convertimos a un
objeto, de esta manera ser ms fcil el manejo del mismo.
Ahora vamos a cargar el combo que corresponde a los grupos registrados, para ello vamos a
codificar en el evento Load del formulario.
cmbGrupo.Items.Clear()
For Each i As clsGrupo In clsGrupo.Listar
cmbGrupo.Items.Add(i.nombre)
Next
cmbGrupo.SelectedIndex = 0

La propiedade SelectedIndex del ComboBox permite indicar el elemento seleccionado del


combo, de esta manera mostraremos el primer grupo seleccionado por defecto al momento de
cargar el formulario.

Figura N 28

Modulo: Fundamentos de Programacin

Pag. 43

Programa: Programador .NET

SESIN

Interfaz de
Documento
Mltiple

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Aplicar la interfaz de documento mltiple en el desarrollo de aplicaciones.


Identificar las principales ventajas del uso de formularios MDI.

TEMAS:

Formularios MDI.
Creacin de una estructura de documento mltiple.

Modulo: Fundamentos de Programacin

Pag. 44

Programa: Programador .NET

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

En el proyecto DemoAgenda vamos a agregar un formulario comn y corriente con el nombre


frmPrincipal. A continuacin, para indicar que dicho formulario es padre, es decir, es un
contenedor de formularios hijos, vamos cambiar el valor de la propiedad IsMDIContainer de
False a True, inmediatamente notaremos que el fondo del formulario se torna de un color
oscuro:

Figura N 29

Modulo: Fundamentos de Programacin

Pag. 45

Programa: Programador .NET


El siguiente paso es crear una barra de men, para ello agregamos un control llamado
MenuStrip del cuadro de herramientas.

Figura N 30

Ahora ingresaremos los siguientes elementos:

Figura N 31

Tambin agregaremos un segundo men:

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

Modulo: Fundamentos de Programacin

Pag. 46

Programa: Programador .NET


De esa manera podemos llamar al formulario frmRegistrarGrupoDeContacto, ahora vamos
a ejecutar la aplicacin para visualizar el resultado.

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()

Ejecutamos nuevamente la aplicacin y observemos el resultado.

Figura N 34

Modulo: Fundamentos de Programacin

Pag. 47

Programa: Programador .NET


MDIParent se utiliza para indicar quien ser el formulario padre de un determinado formulario
(en este caso frmRegistrarGrupoContacto), la palabra Me hace referencia a la clase actual, en
este caso la clase actual viene a ser el frmPrincipal, para poder comprobarlo observemos las
primeras lneas de cdigo de frmPrincipal.
Public Class frmPrincipal
Private Sub InsertarToolStripMenuItem_Click(sender
frmRegistrarGrupoDeContacto.MdiParent = Me
frmRegistrarGrupoDeContacto.Show()
End Sub
End Class

Modulo: Fundamentos de Programacin

Pag. 48

Programa: Programador .NET

SESIN

Ejercicio

10

AL FINALIZAR LA PRESENTE SESIN, EL PARTICIPANTE ESTAR EN LA CAPACIDAD


DE:

Implementar clases bsicas para resolver situaciones empresariales.


Aplicar Visual Basic .Net. orientado a base de datos

TEMAS:

Ejercicio propuesto

Modulo: Fundamentos de Programacin

Pag. 49

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 50

Programa: Programador .NET

SESIN

Programacin n
capas Parte I

11

Al finalizar la presente sesin, el participante estar en la capacidad de:

Conocer los principios fundamentales de la programacin con capas.


Identificar y diferenciar la capa presentacin, capa regla de negocio y capa de acceso a
datos.
Utilizar programacin con capas en el desarrollo de aplicaciones.

Temas:

Programacin n capas
Creacin de una solucin con 3 capas
Implementando la capa de datos

Modulo: Fundamentos de Programacin

Pag. 51

Programa: Programador .NET

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.

Capa regla de negocio


Es aquella que comprende las validaciones y restricciones del negocio, en realidad es una
capa de gran importancia ya que comprende todos los procesos que automatizar la
aplicacin.

Capa de acceso a datos


Aquella que nos permite interactuar con la base de datos para realizar diversas
operaciones, como por ejemplo insertar, actualizar y consultar.

La programacin con capas nos permite estructurar adecuadamente la aplicacin, de esta


manera se obtiene una aplicacin ordenada y flexible de mantener, por ejemplo, si
deseamos cambiar de proveedor de base de datos simplemente tenemos que modificar la capa
de acceso a datos y listo. Otro caso se da cuando tenemos una aplicacin elaborada en base a
formularios Windows y luego queremos migrarla a WPF, lo nico que haramos sera actualizar
la capa presentacin y listo.
Lo ms comn es trabajar con 3 capas, sin embargo una aplicacin podra contener
nicamente 2 capas o quizs 4,5 o ms. Todo esto depende de cmo se desarrolle la
aplicacin o sistema de informacin.

Creacin de una solucin con 3 capas


Para aplicar lo anteriormente detallado, vamos a iniciar el Visual Studio y luego crearemos una
aplicacin de tipo Windows Form Application. Al momento de guardar el aplicativo,
debemos asignar en el nombre del proyecto CapaPresentacion y en el nombre de la
solucin AplicacionDemo.
La solucin viene a ser el todo, puede contener el nombre de la aplicacin o software a
desarrollar, mientras que el nombre del proyecto se refiere a un mdulo o parte de la solucin.

Modulo: Fundamentos de Programacin

Pag. 52

Programa: Programador .NET


Por lo tanto, podemos indicar que una solucin se puede componer de varios proyectos, en este
caso utilizaremos 3 proyectos, una para cada capa.
Para agregar la capa regla de negocio, simplemente hacemos click en el men File, opcin Add
y finalmente seleccionamos la opcin New Project.

Figura N 36

Inmediatamente se mostrar la ventana que ya conocemos, para la capa regla de negocio


vamos a seleccionar el tipo Class Library (Biblioteca de clases), en ella incluiremos todas las
clases que necesitamos para representar los procesos a automatizar y establecer validaciones.

Figura N 37

En el nombre del proyecto asignamos CapaReglaDeNegocio y presionamos el botn OK.


Para agregar la capa de acceso a datos, repetimos el proceso anterior, es decir, agregamos un
nuevo proyecto a travs del men File, seleccionamos Class Library como tipo de proyecto y le
asignamos el nombre CapaAccesoADatos.

Modulo: Fundamentos de Programacin

Pag. 53

Programa: Programador .NET


Una vez creada la solucin, el explorador de soluciones debe mostrar una vista similar a la
siguiente figura:

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.

Implementando la capa de datos


Lo primero que haremos es eliminar el elemento Class1.vb, que viene a ser una clase por
defecto que nos incluye un proyecto de biblioteca de clases. El paso siguiente ser agregar un
elemento de tipo Dataset a la capa de acceso a datos, para ello hacemos click derecho en el
nombre del proyecto, seleccionamos la opcin nuevo elemento, seleccionamos de la lista el
elemento Dataset (en la categora Data), luego le asignamos el nombre Datos01 y finalmente
hacemos click en el botn Add.

Figura N 39

Modulo: Fundamentos de Programacin

Pag. 54

Programa: Programador .NET

Figura N 40

Un DataSet es un estructura que permite almacenar datos, lo utilizaremos para


almacenar registros provenientes de una base de datos, para luego procesarlos y mostrar
resultados. Vamos a trabajar con la base de datos Agenda creada en sesiones anteriores,
veamos el diagrama:

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

Modulo: Fundamentos de Programacin

Pag. 55

Programa: Programador .NET


hacer un click derecho en una zona vaca del DataSet, seleccionamos la opcin Add y luego la
opcin DataTable.

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

Ahora le agregaremos columnas, haciendo un click derecho sobre el DataTable y seleccionando


Add, opcin New Column.

Figura N 44

Vamos a agregar 2 columnas: Nombre y descripcin, de tal manera que el DataTable sea
parecido a la siguiente figura:

Modulo: Fundamentos de Programacin

Pag. 56

Programa: Programador .NET

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.

Modulo: Fundamentos de Programacin

Pag. 57

Programa: Programador .NET

Figura N 47

Figura N 48

Ingresamos el nombre y luego hacemos click en el botn Add.


Un mdulo puede ser considerado como un repositorio comn de aquellos elementos
que necesitamos en todo el proyecto, puede contener variables, procedimientos y
funciones por ejemplo.

Modulo: Fundamentos de Programacin

Pag. 58

Programa: Programador .NET


Una vez creado el mdulo, vamos a agregar una variable que represente a la cadena de
conexin.
Module mdlVariables
Friend cadena As String = "Server=localhost;database=Agenda;Integrated
Security=True"
End Module

Ahora volvemos al mtodo esttico creado anteriormente y lo implementamos.


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)
End While
cn.Close()
Return miTabla
End Function

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.

Modulo: Fundamentos de Programacin

Pag. 59

Programa: Programador .NET

SESIN

Programacin n
capas Parte II

12

Al finalizar la presente sesin, el participante estar en la capacidad de:

Conocer los principios fundamentales de la programacin con capas.


Identificar y diferenciar la capa presentacin, capa regla de negocio y capa de acceso a
datos.
Utilizar programacin con capas en el desarrollo de aplicaciones.

Temas:

Implementando la capa regla de negocio


Implementando la capa presentacin

Modulo: Fundamentos de Programacin

Pag. 60

Programa: Programador .NET

Implementando la capa regla de negocio


Una vez elaborada la capa de datos vamos a proceder a implementar la capa regla de negocio,
al momento de crear esta capa por defecto se agrega una clase con el nombre Class1.vb,
vamos a eliminarla y vamos a agregar una clase con el nombre clsGrupo.

Figura N 49

Ahora vamos a crear los campos, constructores y propiedades necesarias:


Public Class clsGrupo
Private _nombre, _descripcion As String
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 grupo no puede quedar vaco.")
ElseIf value.Trim.Length > 20 Then
Throw New Exception("El nombre del grupo no debe exceder de 20
caracteres.")
Else
_nombre = value.Trim.ToUpper
End If
End Set
End Property
Public Property descripcion As String
Get
Return _descripcion
End Get
Set(value As String)
If value.Trim.Length = 0 Then
_descripcion = String.Empty
ElseIf value.Trim.Length > 250 Then
Throw New Exception("La desc. del grupo no debe exceder de 250
caracteres.")
Else
_descripcion = value.Trim.ToUpper
End If
End Set

Modulo: Fundamentos de Programacin

Pag. 61

Programa: Programador .NET


End Property
End Class

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

Modulo: Fundamentos de Programacin

Pag. 62

Programa: Programador .NET


Marcamos el check ubicado a la izquierda del nombre del proyecto, y luego hacemos click en el
botn OK. Luego de ese proceso la capa regla de negocio est enlazada con la capa acceso a
datos.
Debemos tener en cuenta de que se agreg la referencia de la capa de acceso a datos a la capa
regla de negocio y no de manera inversa ya que la capa regla de negocio hace uso de la
capa de acceso a datos.
El siguiente paso ser crear el mtodo respectivo que nos permita acceder a los grupos
registrados en la base de datos:
Public Shared Function Listar() As List(Of clsGrupo)
Dim miTabla As CapaAccesoADatos.Datos01.GrupoDataTable
miTabla = CapaAccesoADatos.Datos01.GrupoDataTable.Listar()
Dim miLista As New List(Of clsGrupo)
For i As Integer = 0 To miTabla.Rows.Count - 1
Dim item As New clsGrupo(miTabla(i).Nombre)
item.descripcion = miTabla(i).Descripcion
miLista.Add(item)
Next
Return miLista
End Function

Implementando la capa presentacin


La capa presentacin comprende la interfaz que utilizar el usuario para interactuar con la
aplicacin. Vamos a eliminar el nico formulario que tenemos en la capa presentacin y luego
vamos a agregar un formulario con el nombre frmRegistrarContacto con el siguiente
contenido:

Figura N 52

Modulo: Fundamentos de Programacin

Pag. 63

Programa: Programador .NET


La capa presentacin necesita de la capa regla de negocio para su adecuado funcionamiento,
entonces el siguiente paso ser agregar una referencia a la capa presentacin, para ello
hacemos click derecho sobre el nombre de la capa y luego seleccionamos la opcin Add
Reference

Figura N 53

Seleccionamos la capa regla de negocio y luego hacemos click en el botn OK.

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.

Modulo: Fundamentos de Programacin

Pag. 64

Programa: Programador .NET


Imports CapaReglaDeNegocio
Public Class frmRegistrarContacto
Private Sub frmRegistrarContacto_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
cmbGrupo.Items.Clear()
For Each i As clsGrupo In clsGrupo.Listar
cmbGrupo.Items.Add(i.nombre)
Next
If cmbGrupo.Items.Count > 0 Then
cmbGrupo.SelectedIndex = 0
End If
End Sub
End Class

Ahora ejecutamos el formulario para ver el resultado:

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.

Modulo: Fundamentos de Programacin

Pag. 65

Programa: Programador .NET

SESIN

Programacin n
capas Parte III

13

Al finalizar la presente sesin, el participante estar en la capacidad de:

Conocer los principios fundamentales de la programacin con capas.


Identificar y diferenciar la capa presentacin, capa regla de negocio y capa de acceso a
datos.
Utilizar programacin con capas en el desarrollo de aplicaciones.

Temas:

Funcionalidades adicionales
Insertando datos

Modulo: Fundamentos de Programacin

Pag. 66

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 67

Programa: Programador .NET


El DataTable tiene la posibilidad de agregar llave primaria, para ello vamos a seleccionar Nick
del DataTable Contacto, luego le hacemos Click con el botn derecho del mouse y
seleccionamos la opcin Set Primary Key.

Figura N 58

Como vemos, ahora ya tenemos asignada una llave primaria para el DataTable Contacto.

Figura N 59

Repetimos el proceso con el DataTable Grupo

Figura N 60

Modulo: Fundamentos de Programacin

Pag. 68

Programa: Programador .NET


El siguiente paso ser crear una relacin entre ambos DataTable, para ello vamos a seleccionar
el elemento Relation del ToolBox.

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

Modulo: Fundamentos de Programacin

Pag. 69

Programa: Programador .NET


Finalmente, obtenemos el siguiente resultado:

Figura N 63

Ahora hacemos doble click en el DataTable Contacto y se abrir automticamente la ventana de


cdigo, recordemos que ya tenemos un mtodo creado para el DataTable Grupo.

Figura N 64

Vamos a eliminar el evento ContactoRowChanging y creamos un nuevo mtodo para el


DataTable Contacto que nos permita insertar un nuevo contacto en la base de datos. El nuevo
mtodo llevar el nombre Agregar y contiene el siguiente cdigo:
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)

Modulo: Fundamentos de Programacin

Pag. 70

Programa: Programador .NET


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

Como podemos apreciar, es un mtodo esttico muy similar en contenido a mtodos de


insercin que hemos creado anteriormente. El siguiente paso es crear una clase llamada
clsContacto en la capa regla de negocio con los campos, propiedades y constructores
respectivos.

Figura N 65

En la siguiente ventana agregamos el nombre clsContacto.


Para crear clases en nuestro proyecto, podemos realizarlo grficamente agregando el
elemento Class Diagram o manualmente agregando el elemento Class.

Modulo: Fundamentos de Programacin

Pag. 71

Programa: Programador .NET

Figura N 66

Ahora vamos a implementar la clase:


Imports CapaAccesoADatos.Datos01
Public Class clsContacto
Private _NombreIdentificador As String
Private _Nombres As String
Private _ApellidoPaterno As String
Private _ApellidoMaterno As String
Private _Observaciones As String
Private _Grupo As clsGrupo
Sub New(parIdentificador As String, parNombres As String, _
parApellidoPaterno As String, parApellidoMaterno As String, _
parGrupo As clsGrupo)
NombreIdentificador = parIdentificador
Nombres = parNombres
ApellidoPaterno = parApellidoPaterno
ApellidoMaterno = parApellidoMaterno
Grupo = parGrupo
End Sub
Public Property NombreIdentificador() As String
Get
Return _NombreIdentificador
End Get
Set(ByVal value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El identificador no puede quedar vaco.")
ElseIf value.Trim.Length > 20 Then
Throw New Exception("El identificador no puede exceder de 20
caracteres.")
End If
_NombreIdentificador = value.Trim.ToUpper
End Set
End Property
Public Property Nombres() As String
Get
Return _Nombres
End Get
Set(ByVal value As String)

Modulo: Fundamentos de Programacin

Pag. 72

Programa: Programador .NET


If value.Trim.Length = 0 Then
Throw New Exception("El nombre del contacto no puede quedar vaco.")
ElseIf value.Trim.Length > 40 Then
Throw New Exception("El nombre no puede exceder de 40 caracteres")
Else
_Nombres = value.Trim.ToUpper
End If
End Set
End Property
Public Property ApellidoPaterno() As String
Get
Return _ApellidoPaterno
End Get
Set(ByVal value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El apellido paterno no puede quedar vaco.")
ElseIf value.Trim.Length > 30 Then
Throw New Exception("El apellido paterno no puede exceder de 30
caracteres.")
Else
_ApellidoPaterno = value.Trim.ToUpper
End If
End Set
End Property
Public Property ApellidoMaterno() As String
Get
Return _ApellidoMaterno
End Get
Set(ByVal value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El apellido materno no puede quedar vaco.")
ElseIf value.Trim.Length > 30 Then
Throw New Exception("El apellido materno no puede exceder de 30
caracteres.")
Else
_ApellidoMaterno = value.Trim.ToUpper
End If
End Set
End Property
Public Property Observaciones() As String
Get
Return _Observaciones
End Get
Set(ByVal value As String)
If value.Trim.Length = 0 Then
_Observaciones = String.Empty
ElseIf value.Trim.Length > 250 Then
Throw New Exception("La observacin no puede exceder de 250
caracteres.")
Else
_Observaciones = value.Trim.ToUpper
End If
End Set
End Property
Public Property Grupo As clsGrupo
Get
Return _Grupo
End Get
Set(value As clsGrupo)
If value Is Nothing Then
Throw New Exception("El grupo del contacto no puede quedar vaco.")
Else

Modulo: Fundamentos de Programacin

Pag. 73

Programa: Programador .NET


_Grupo = value
End If
End Set
End Property
Sub Insertar()
ContactoDataTable.Agregar(NombreIdentificador, Nombres, ApellidoPaterno,
ApellidoMaterno, Observaciones, Grupo.nombre)
End Sub
End Class

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

Modulo: Fundamentos de Programacin

Pag. 74

Programa: Programador .NET


Veamos la etiqueta de ayuda de una manera ms grande:

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)

Modulo: Fundamentos de Programacin

Pag. 75

Programa: Programador .NET


End While
cn.Close()
Return miTabla
End Function
Shared Function Buscar(parNombre As String) As GrupoRow
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Buscar_Grupo", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("nombre", parNombre)
cn.Open()
Dim miTabla As New GrupoDataTable
Dim dr As SqlDataReader
dr = cmd.ExecuteReader
Dim fila As DataRow = Nothing
While dr.Read
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
End While
cn.Close()
Return fila
End Function
End Class
End Class

Ahora creamos su equivalente en la capa regla de negocio, dentro de la clase clsGrupo:


Public Shared Function Buscar(parnombre As String) As clsGrupo
Dim resultado As CapaAccesoADatos.Datos01.GrupoRow
resultado = CapaAccesoADatos.Datos01.GrupoDataTable.Buscar(parnombre)
If resultado Is Nothing Then
Return Nothing
End If
Dim miGrupo As clsGrupo
miGrupo = New clsGrupo(resultado.Nombre)
miGrupo.descripcion = resultado.Descripcion
Return miGrupo
End Function

De esta manera, la clase clsGrupo tendra el siguiente aspecto:


Imports CapaAccesoADatos
Public Class clsGrupo
Private _nombre, _descripcion As String
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 grupo no puede quedar vaco.")

Modulo: Fundamentos de Programacin

Pag. 76

Programa: Programador .NET


ElseIf value.Trim.Length > 20 Then
Throw New Exception("El nombre del grupo no debe exceder de 20
caracteres.")
Else
_nombre = value.Trim.ToUpper
End If
End Set
End Property
Public Property descripcion As String
Get
Return _descripcion
End Get
Set(value As String)
If value.Trim.Length = 0 Then
_descripcion = String.Empty
ElseIf value.Trim.Length > 250 Then
Throw New Exception("La desc. del grupo no debe exceder de 250
caracteres.")
Else
_descripcion = value.Trim.ToUpper
End If
End Set
End Property
Public Shared Function Listar() As List(Of clsGrupo)
Dim miTabla As CapaAccesoADatos.Datos01.GrupoDataTable
miTabla = CapaAccesoADatos.Datos01.GrupoDataTable.Listar()
Dim miLista As New List(Of clsGrupo)
For i As Integer = 0 To miTabla.Rows.Count - 1
Dim item As New clsGrupo(miTabla(i).Nombre)
item.descripcion = miTabla(i).Descripcion
miLista.Add(item)
Next
Return miLista
End Function
Public Shared Function Buscar(parnombre As String) As clsGrupo
Dim resultado As CapaAccesoADatos.Datos01.GrupoRow
resultado = CapaAccesoADatos.Datos01.GrupoDataTable.Buscar(parnombre)
If resultado Is Nothing Then
Return Nothing
End If
Dim miGrupo As clsGrupo
miGrupo = New clsGrupo(resultado.Nombre)
miGrupo.descripcion = resultado.Descripcion
Return miGrupo
End Function
End Class

Ahora terminaremos de codificar el evento Click del botn Registrar:


'Guardando el contacto
Dim nuevoContacto As clsContacto
Try
nuevoContacto = New clsContacto(txtNick.Text, txtNombres.Text, _
txtApellidoPaterno.Text, _
txtApellidoMaterno.Text, _
clsGrupo.Buscar(cmbGrupo.SelectedItem))
nuevoContacto.Observaciones = txtObservaciones.Text
nuevoContacto.Insertar()
MsgBox("Contacto registrado.", MsgBoxStyle.Information, "Demo")

Modulo: Fundamentos de Programacin

Pag. 77

Programa: Programador .NET


Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Atencin")
txtNick.Focus()
Exit Sub
End Try

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

Presionamos el botn guardar, y observemos que se muestra el mensaje de confirmacin


respectivo.

Figura N 71

Modulo: Fundamentos de Programacin

Pag. 78

Programa: Programador .NET


Vamos a comprobar el resultado realizando una consulta en SQL Server 2012.

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:

Modulo: Fundamentos de Programacin

Pag. 79

Programa: Programador .NET


If Observaciones = String.Empty Then
cmd.Parameters.AddWithValue("observaciones", DBNull.Value)
Else
cmd.Parameters.AddWithValue("observaciones", Observaciones)
End If

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.

Modulo: Fundamentos de Programacin

Pag. 80

Programa: Programador .NET

SESIN

Programacin n
capas Parte IV

14

Al finalizar la presente sesin, el participante estar en la capacidad de:

Conocer los principios fundamentales de la programacin con capas.


Identificar y diferenciar la capa presentacin, capa regla de negocio y capa de acceso a
datos.
Utilizar programacin con capas en el desarrollo de aplicaciones.

Temas:

Utilizando una aplicacin de consola.


Ejercicio propuesto

Modulo: Fundamentos de Programacin

Pag. 81

Programa: Programador .NET

Utilizando una aplicacin de consola


Una aplicacin elaborada con capas permite utilizar una serie de ventajas, en esta sesin vamos
a realizar una pequea demostracin de la flexbilidad que puede tener una aplicacin basada
en este estilo de programacin.
Observemos el Solution Explorer de nuestra aplicativo:

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

Modulo: Fundamentos de Programacin

Pag. 82

Programa: Programador .NET


Inmediatamente se muestra la ventana para seleccionar el tipo de proyecto que deseamos
agregar, de la lista vamos a seleccionar Console Application.

Figura N 77

Al nuevo proyecto le vamos a asignar el nombre CapaPresentacionConsola en la seccin


name de la ventana mostrada en la Figura N 77.

Figura N 78

Presionamos el botn OK, y luego revisamos el Solution Explorer para ver el resultado.

Figura N 79

Modulo: Fundamentos de Programacin

Pag. 83

Programa: Programador .NET


Hemos agregado una nueva capa presentacin que viene a ser una aplicacin de Consola, estas
aplicaciones se caracterizan porque carecen de una interfaz rica en contenido visual pero
ahorran recursos. Una vez que hemos agregado la capa, veremos que se crea un mdulo tal y
como muestra la siguiente figura:

Figura N 80

Ahora vamos mostrar los grupos registrados en la consola de Windows,

lo primero que

haremos es agregar la referencia de la capa regla de negocio a la capa presentacin del


proyecto de consola. Esto lo hacemos porque la capa presentacin necesita de la capa regla de
negocio para su adecuado funcionamiento.

Figura N 81

Ahora seleccionamos nicamente la capa regla de negocio.

Modulo: Fundamentos de Programacin

Pag. 84

Programa: Programador .NET

Figura N 82

El siguiente paso ser codificar en el Main() de la aplicacin de consola. Para imprimir en la


Consola de Windows debemos utilizar el mtodo Write o WriteLine de la clase Console, la
diferencia entre ambos es que WriteLine agrega un salto de lnea (como si presionaramos la
tecla Enter).

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

Si ejecutamos la solucin, notaremos que se ejecuta la primera capa presentacin que


habamos agregado. Para cambiar el proyecto de inicio a CapaPresentacionConsola vamos a
hacerle un click derecho y seleccionamos la opcin Set as StartUp Project.

Modulo: Fundamentos de Programacin

Pag. 85

Programa: Programador .NET

Figura N 83

Notaremos que el nombre del proyecto CapaPresentacionConsola se torna en negrita, eso


quiere decir que es el proyecto inicial de nuestra solucin.

Figura N 84

Modulo: Fundamentos de Programacin

Pag. 86

Programa: Programador .NET


SI ejecutamos la solucin presionando F5 o a travs del botn Start, notaremos que la consola
se abre y se cierra rpidamente, para evitar ese inconveniente vamos a utilizar el mtodo
ReadLine() de la clase Console. Este mtodo se utiliza para capturar un texto ingresado por
el usuario, en este caso lo utilizaremos para evitar que la Consola de Windows se cierre
rpidamente.
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
Console.ReadLine()
End Sub
End Module

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

Para poder realizar la aplicacin nicamente invocamos al mtodo respectivo, es decir,


reutilizamos mtodos existentes, esto facilitara el escenario en el cual tengamos que cambiar la
presentacin de una aplicacin, donde solamente tendramos que adaptar la capa presentacin
a los nuevos requerimientos. Lo mismo sucedera si posteriormente se desea trabajar con otro
sistema gestor de base de datos, nicamente modificaramos la capa de acceso a datos.

Modulo: Fundamentos de Programacin

Pag. 87

Programa: Programador .NET

Ejercicio propuesto
Con ayuda del instructor se solicita que elabore el cdigo necesario para registrar un nuevo
contacto mediante la consola de Windows.

Modulo: Fundamentos de Programacin

Pag. 88

Programa: Programador .NET

SESIN

Integracion con C#

15

Al finalizar la presente sesin, el participante estar en la capacidad de:

Identificar de manera prctica las ventajas de la programacin con capas.


Conocer a nivel bsico el lenguaje de programacin C#.

Temas:

Introduccin
Agregando una capa presentacin en C#

Modulo: Fundamentos de Programacin

Pag. 89

Programa: Programador .NET

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.

Agregando una capa presentacin en C#


Vamos a agregar un nuevo proyecto a la solucin, para ello hacemos un click derecho en el
nombre de la solucin y seleccionamos la opcin Add y luego New Project.

Figura N 86

En la siguiente ventana seleccionamos el lenguaje de programacin C# y luego el tipo de


proyecto Windows Forms Application.

Modulo: Fundamentos de Programacin

Pag. 90

Programa: Programador .NET

Figura N 87

Figura N 88

Asignamos el nombre CapaPresentacionEnCS al proyecto y luego presionamos el botn OK,


observemos el explorador de soluciones para analizar su contenido:

Modulo: Fundamentos de Programacin

Pag. 91

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 92

Programa: Programador .NET


El siguiente paso es hacer doble click en el botn guardar para acceder a su evento Click donde
codificaremos el registro del contacto, adems conoceremos algunos detalles bsicos del
lenguaje de programacin C#.
Para empezar a utilizar las clases que hemos creado anteriormente debemos asignar la
referencia correspondiente, para ello hacemos click derecho en la capa presentacin que hemos
agregado y seleccionamos la opcin Add Reference.

Figura N 91

Luego seleccionamos la capa regla de negocio.

Figura N 92

Modulo: Fundamentos de Programacin

Pag. 93

Programa: Programador .NET


Ahora retornamos al evento Click del botn Registrar y lo primero que haremos es especificar
que vamos a utilizar la capa regla de negocio.

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;
}
}

Modulo: Fundamentos de Programacin

Pag. 94

Programa: Programador .NET


Como podemos apreciar el cdigo es similar al de Visual Basic .Net, sin embargo debemos tener
en cuenta de que cada lnea de cdigo termina con un punto y coma, adems las llaves se
utilizan para agrupar cdigo.
Por otro lado el funcionamiento de try.. catch es similar, lo nico que cambia es la sintaxis
mas no el modode funcionamiento. Recordemos que este lenguaje distingue las maysculas de
las minsculas as que debemos tener mucho cuidado con momento de codificar.
Ahora vamos a dar un doble click a la barra de ttulo del formulario en vista diseo para acceder
al evento Load y realizar el cdigo para mostrar los grupos en cmbGrupo.

Figura N 94

Luego de abrir el evento, codificamos las siguientes lneas:


private void Form1_Load(object sender, EventArgs e)
{
cmbGrupo.Items.Clear();
foreach (clsGrupo item in clsGrupo.Listar())
{
cmbGrupo.Items.Add(item.nombre);
}
cmbGrupo.SelectedIndex = 0;
}

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.

Modulo: Fundamentos de Programacin

Pag. 95

Programa: Programador .NET

Figura N 95

Ejecutamos el proyecto e ingresamos los siguientes datos:

Figura N 96

Presionamos el botn guardar y observamos el resultado.

Modulo: Fundamentos de Programacin

Pag. 96

Programa: Programador .NET

Figura N 97

Ahora realizamos la consulta respectiva en la base de datos para verificar los datos
almacenados.

Figura N 98

Como podemos apreciar el resultado es corecto.


En conclusin, podemos mencionar que la programacin con capas brinda grandes posibilidades
al momento de crear aplicaciones. Nos brinda independencia para contar con una aplicacin
flexible y fcil de mantener, aparte de que promueve una programacin ms ordenada y limpia.
Adicionalmente podemos concluir que podemos utilizar este tipo de programacin en
aplicaciones de formularios convencionales, aplicaciones de consola, aplicaciones Windows

Modulo: Fundamentos de Programacin

Pag. 97

Programa: Programador .NET


Presentation Foundation, aplicaciones Web (que veremos ms adelante con ASP .Net), entre
otros.
Finalmente debemos entender que programacin con capas no solamente se puede aplicar con
lenguajes que pertenecen a la plataforma .Net, sino tambin con otros lenguajes como Java.

Modulo: Fundamentos de Programacin

Pag. 98

Programa: Programador .NET

SESIN

Ejercicio Propuesto

16

Al finalizar la presente sesin, el participante estar en la capacidad de:

Ampliar perspectiva orientada a objetos.


Conocer y aplicar diversas tcnicas de validado de datos.

Temas:

Ejercicio propuesto

Modulo: Fundamentos de Programacin

Pag. 99

Programa: Programador .NET

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

No es recomendable mostrarle el mensaje anterior al usuario ya que no es un error entendible


para el, lo ms correcto es mostrarle un mensaje de error que el pueda entender y de esa
manera pueda darse cuenta por si mismo en que est fallando.
El ejercicio consiste en elaborar el cdigo necesario para verificar si el Nick que intenta registrar
el usuario existe o no en la base de datos, en caso de que ya se haya registrado, la aplicacin
debe mostrar un mensaje adecuado al usuario.
Elabore la solucin al problema en la misma demostracin presentada en sesiones anteriores.

Modulo: Fundamentos de Programacin

Pag. 100

Programa: Programador .NET

SESIN

Informes Parte I

17

Al finalizar la presente sesin, el participante estar en la capacidad de:

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

Modulo: Fundamentos de Programacin

Pag. 101

Programa: Programador .NET

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.

Elementos comunes en un informe


Vamos a elaborar un informe que muestre todos los contactos registrados, lo primero que
haremos es dar un click derecho sobre el nombre del proyecto y seleccionamos la opcin Add,
luego hacemos click sobre la opcin New Item.

Figura N 100

En el panel izquierdo de la ventana mostrada seleccionamos el elemento Reporting.

Modulo: Fundamentos de Programacin

Pag. 102

Programa: Programador .NET

Figura N 101

Luego en el panel derecho seleccionamos el elemento Report y presionamos el botn Add.

Figura N 102

En el nombre ingresamos rptContactos y hacemos click en el botn Add, consideremos que


rpt es la abreviatura recomendada para reportes.
Ahora Visual Studio 2012 mostrar el diseador de informes que tiene una apariencia similar a
la siguiente figura:

Modulo: Fundamentos de Programacin

Pag. 103

Programa: Programador .NET

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.

Modulo: Fundamentos de Programacin

Pag. 104

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 105

Programa: Programador .NET


Una vez activada la regla veremos que se muestra de manera muy similar a los programas
editores de texto.

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

Modulo: Fundamentos de Programacin

Pag. 106

Programa: Programador .NET


El cuadro que se muestra a continuacin permite insertar una frmula para el contenido de la
caja de texto, podemos utilizar funciones de cadena, funciones incorporadas, entre otros. En
este caso vamos a utilizar una funcin que nos permita obtener la pgina actual, para ello
seleccionamos Built in Fields.

Figura N 112

Del panel derecho seleccionamos PageNumber y le hacemos doble click para incluir su
definicin en el panel superior.

Figura N 113

Finalmente presionamos el botn OK y notaremos que el TextBox toma la siguiente apariencia:

Figura N 114

Modulo: Fundamentos de Programacin

Pag. 107

Programa: Programador .NET


El siguiente pas es disear el contenido, para ello vamos a arrastrar un control Table a la
zona central del informe.

Figura N 115

Una vez agregado el elemento se mostrar la siguiente ventana:

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.

Modulo: Fundamentos de Programacin

Pag. 108

Programa: Programador .NET

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.

Modulo: Fundamentos de Programacin

Pag. 109

Programa: Programador .NET


Notaremos que Visual Studio ya reconoci las clases involucradas, ahora en la siguiente
ventana seleccionamos la clase clsContacto ya que el reporte mostrar los datos principales
de los contactos registrados.

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

Adicionalmente podemos aplicar un poco de formato a la tabla, para ello selecionamos la


primera fila y trabajamos con la propiedad Font del panel propiedades.

Modulo: Fundamentos de Programacin

Pag. 110

Programa: Programador .NET

Figura N 121

Ahora las cabeceras de los reportes adquieren una forma parecida a la siguiente:

Figura N 122

Incluso podemos cambiar los textos mostrados en la cabecera simplemente seleccionndolos y


modificando su contenido.

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

Modulo: Fundamentos de Programacin

Pag. 111

Programa: Programador .NET


Al hacerle click se nos mostrar la siguiente ventana:

Figura N 125

En la ventana anterior podemos seleccionar las principales propiedades de configuracin como


el tamao de papel, orientacin y margen, es un proceso muy similar a la configuracin de
pginas de un procesador de texto habitual.

Modulo: Fundamentos de Programacin

Pag. 112

Programa: Programador .NET

SESIN

Informes Parte II

18

Al finalizar la presente sesin, el participante estar en la capacidad de:

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

Modulo: Fundamentos de Programacin

Pag. 113

Programa: Programador .NET

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

Luego agregamos un control ReportViewer ubicado en el cuadro de herramientas al formulario


que acabamos de crear.

Figura N 127

Figura N 128

En la seccin Choose Report que se muestra en la etiqueta inteligente, vamos a seleccionar el


reporte que acabamos de crear.

Modulo: Fundamentos de Programacin

Pag. 114

Programa: Programador .NET

Figura N 129

Para acoplar el ReportViewer a la zona superior del formulario, vamos a cambiar su propiedad
Dock.

Figura N 130

De tal manera que sea muy similar a la siguiente figura:

Figura N 131

Ahora vamos a agregar un botn con el texto mostrar en la zona inferior izquierda del
formulario.

Modulo: Fundamentos de Programacin

Pag. 115

Programa: Programador .NET

Figura N 132

Ingresamos al avento Click del botn y observemos el cdigo.


Public Class frmReporteContactos
Private Sub frmReporteContactos_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
Me.ReportViewer1.RefreshReport()
End Sub
Private Sub btnMostrar_Click(sender As Object, e As EventArgs) Handles
btnMostrar.Click
End Sub
End Class

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.

Modulo: Fundamentos de Programacin

Pag. 116

Programa: Programador .NET

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)

Modulo: Fundamentos de Programacin

Pag. 117

Programa: Programador .NET


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)
End While
cn.Close()
Return miTabla
End Function
Shared Function Buscar(parNombre As String) As GrupoRow
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Buscar_Grupo", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("nombre", parNombre)
cn.Open()
Dim miTabla As New GrupoDataTable
Dim dr As SqlDataReader
dr = cmd.ExecuteReader
Dim fila As DataRow = Nothing
While dr.Read
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
End While
cn.Close()
Return fila
End Function
End Class
End Class

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.

Modulo: Fundamentos de Programacin

Pag. 118

Programa: Programador .NET


Shared Function Listar() As ContactoDataTable
Dim cn As New SqlConnection(mdlVariables.cadena)
Dim cmd As New SqlCommand("usp_Listar_Contactos", cn)
cmd.CommandType = CommandType.StoredProcedure
cn.Open()
Dim miTabla As New ContactoDataTable
Dim dr As SqlDataReader
dr = cmd.ExecuteReader
While dr.Read
Dim fila As DataRow
fila = miTabla.NewRow
fila("Nick") = dr.Item("nombreIdentificador")
fila("Nombres") = dr.Item("Nombres")
fila("ApellidoPaterno") = dr.Item("ApellidoPaterno")
fila("ApellidoMaterno") = dr.Item("ApellidoMaterno")
fila("Grupo") = dr.Item("Grupo")
If dr.Item("Observaciones") Is DBNull.Value Then
fila("Observaciones") = String.Empty
Else
fila("Observaciones") = dr.Item("Observaciones")
End If
miTabla.Rows.Add(fila)
End While
cn.Close()
Return miTabla
End Function

Ahora nos trasladamos a la clase clsContacto de la capa regla de negocio y agregamos un


mtodo llamado Listar() debajo del mtodo Insertar().
Sub Insertar()
ContactoDataTable.Agregar(NombreIdentificador, Nombres, _
ApellidoPaterno, ApellidoMaterno, _
Observaciones, Grupo.nombre)
End Sub
Public Shared Function Listar() As List(Of clsContacto)
Dim miTabla As CapaAccesoADatos.Datos01.ContactoDataTable
miTabla = CapaAccesoADatos.Datos01.ContactoDataTable.listar
Dim miLista As New List(Of clsContacto)
For i As Integer = 0 To miTabla.Rows.Count - 1
Dim item As New clsContacto(miTabla(i).Nick, _
miTabla(i).Nombres, _
miTabla(i).ApellidoPaterno, _
miTabla(i).ApellidoMaterno, _
clsGrupo.Buscar(miTabla(i).Grupo))
item.Observaciones = miTabla(i).Observaciones
miLista.Add(item)
Next
Return miLista
End Function

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

Modulo: Fundamentos de Programacin

Pag. 119

Programa: Programador .NET


Finalmente, cambiamos el formulario de inicio al objeto que acabamos de crear, y luego
ejecutamos la aplicacin.

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.

Modulo: Fundamentos de Programacin

Pag. 120

Programa: Programador .NET

Figura N 136

Modulo: Fundamentos de Programacin

Pag. 121

Programa: Programador .NET

SESIN

Seguridad a Nivel
Usuario Parte I

19

Al finalizar la presente sesin, el participante estar en la capacidad de:

Aplicar un algoritmo de encriptado conocido para proteger datos sensibles.


Analizar de una manera ms detallada el funcionamiento de programacin con capas.

Temas:

Generalidades
Seguridad a nivel de base de datos

Modulo: Fundamentos de Programacin

Pag. 122

Programa: Programador .NET

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.

Seguridad a nivel de base de datos


Para empezar, vamos a crear una tabla que almacene todos los usuarios de la aplicacin, as
que accedemos a la base de datos Agenda y creamos la siguiente tabla:

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:

CREATE PROC usp_Insertar_Usuario


@nombreUsuario VARCHAR(20),
@clave VARCHAR(250),
@descripcion VARCHAR(500),
@tipo CHAR(1)
AS
INSERT INTO tblUsuario
VALUES (@nombreUsuario,@clave,
@descripcion,@tipo)

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:

Modulo: Fundamentos de Programacin

Pag. 123

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 124

Programa: Programador .NET


Como podemos apreciar, la clase est siendo guardada tal y como indica el parmetro, sin
embargo lo que pretendemos en esta demostracin es guardar la clave de acceso de cada
usuario pero encriptada. Para este propsito vamos a agregar unas lneas de cdigo para
encriptar la clave utilizando el algoritmo SHA, que es uno de los tantos algoritmos que existen
para poder encriptar.
Vamos a modificar el cdigo anterior de la siguiente manera:
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)
'Encriptando la clave
Dim Proveedor As New SHA1CryptoServiceProvider
Dim vectorBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(cadena)
Dim vectorEncriptado As Byte() = Proveedor.ComputeHash(vectorBytes)
Proveedor.Clear()
cmd.Parameters.AddWithValue("clave", Convert.ToBase64String(vectorEncriptado))
'---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

Al inicio se est importando la librera System.Security.Crytography, luego se crea un objeto


que haga referencia a la clase del algoritmo que se quiere utilizar para realizar el proceso de
encritptado, a este objeto lo estamos llamando proveedor. Luego de ello estamos
descomponiendo la cadena que queremos encriptar en Bytes, los mismo que sern guardados
temporalmente en un vector llamado vectorBytes. Una vez que tenemos el vector con los
bytes que contiene la cadena, vamos a encriptar el vector en uno nuevo llamado
vectorEncriptado, finalmente, una vez encriptado el vector los retornamos convertido a una
valor de tipo cadena.
De esta manera ya tenemos el cdigo listo para guardar usuarios en la base de datos con una
clave encriptada. Ahora vamos a agregar en la capa regla de negocio una clase con el
nombre clsUsuario. Luego vamos a realizar las validaciones tal y como hicimos con otras
clases que fueron creadas anteriormente.

Modulo: Fundamentos de Programacin

Pag. 125

Programa: Programador .NET


Public Class clsUsuario
Private _nombreUsuario As String
Private _clave As String
Private _tipo As Char
Private _descripcion As String
Sub New(parUsuario As String, parClave As String, parTipo As String)
nombreUsuario = parUsuario
clave = parClave
tipo = parTipo
End Sub
Public Property nombreUsuario As String
Get
Return _nombreUsuario
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El nombre de usuario no puede quedar vaco")
ElseIf value.Trim.Length > 20 Then
Throw New Exception("El nombre de usuario no puede exceder de 20
caract.")
Else
_nombreUsuario = value.Trim.ToUpper
End If
End Set
End Property
Public Property clave As String
Get
Return _clave
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("La clave no puede quedar vaca.")
ElseIf value.Trim.Length > 15 Then
Throw New Exception("La clave no puede exceder de 15 caracteres.")
Else
_clave = value
End If
End Set
End Property
Public Property descripcion As String
Get
Return _descripcion
End Get
Set(value As String)
If value.Trim.Length = 0 Then
_descripcion = String.Empty
ElseIf value.Trim.Length > 500 Then
Throw New Exception("La desc. no puede exceder de 500 caracteres.")
Else
_descripcion = value.Trim.ToUpper
End If
End Set
End Property
Public Property tipo As Char
Get
Return _tipo
End Get
Set(value As Char)
If value.ToString.Trim.ToUpper = "A" Or _
value.ToString.Trim.ToUpper = "T" Then
_tipo = value.ToString.Trim.ToUpper
Else

Modulo: Fundamentos de Programacin

Pag. 126

Programa: Programador .NET


Throw New Exception("Tipo de usuario incorrecto.")
End If
End Set
End Property
End Class

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.

Modulo: Fundamentos de Programacin

Pag. 127

Programa: Programador .NET

SESIN

Seguridad a Nivel
Usuario Parte II

20

Al finalizar la presente sesin, el participante estar en la capacidad de:

Aplicar un algoritmo de encriptado conocido para proteger datos sensibles.


Analizar de una manera ms detallada el funcionamiento de programacin con capas.

Temas:

Registro de usuario

Modulo: Fundamentos de Programacin

Pag. 128

Programa: Programador .NET

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

Ahora procederemos a codificar el botn ms fcil, el botn cancelar.


Public Class frmRegistroDeUsuario
Private Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles
btnCancelar.Click
Close()
End Sub
End Class

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

Modulo: Fundamentos de Programacin

Pag. 129

Programa: Programador .NET


nuevoUsuario.Insertar()
MsgBox("Usuario registrado.")
Catch ex As Exception
MsgBox(ex.Message)
txtNombreUsuario.Focus()
Exit Sub
End Try
End Sub
End Class

Ahora vamos a ejecutar el aplicativo para probar la aplicacin.

Figura N 140

Presionamos el botn guardar y efectivamente se muestra el mensaje de confirmacin, ahora


vamos a visualizar el resultado en la base de datos.

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.

Modulo: Fundamentos de Programacin

Pag. 130

Programa: Programador .NET


Adicionalmente, vamos a mejorar la presentacin del formulario de registro de usuario, lo
primero que haremos es mostrar por defecto el tipo Trabajador, para ello seleccionamos
rbAdministrador y modificamos su propiedad Checked de False a True.

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

Modulo: Fundamentos de Programacin

Pag. 131

Programa: Programador .NET


De igual forma, la clave que ingresa el usuario tambin est protegida.

Figura N 145

Modulo: Fundamentos de Programacin

Pag. 132

Programa: Programador .NET

SESIN

Ejercicio Propuesto

21

Al finalizar la presente sesin, el participante estar en la capacidad de:

Implementar un formulario de inicio de sesin bsico para brindar seguridad a una


aplicacin.

Temas:

Ejercicio propuesto

Modulo: Fundamentos de Programacin

Pag. 133

Programa: Programador .NET

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.

Modulo: Fundamentos de Programacin

Pag. 134

Programa: Programador .NET

SESIN

Herencia

22

Al finalizar la presente sesin, el participante estar en la capacidad de:

Conocer de manera terica y prctica el principio herencia de programacin orientada a


objetos..

Temas:

Herencia
Aplicacin de herencia

Modulo: Fundamentos de Programacin

Pag. 135

Programa: Programador .NET

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

En el nombre asignamos Diagrama01.

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.

Modulo: Fundamentos de Programacin

Pag. 136

Programa: Programador .NET


Ahora vamos a crear una clase en el diagrama, para ello hacemos un click derecho sobre una
zona vaca del diagrama y seleccionamos la opcin Add y luego Class.

Figura N 149

Asignamos el nombre de la clase a clsPersona y presionamos el botn OK. Inmediatamente


Visual Studio muestra una venta similar a la siguiente:

Figura N 150

Modulo: Fundamentos de Programacin

Pag. 137

Programa: Programador .NET


Para empezar a agregar los miembros de la clase, lo primero que haremos es seleccionar la
clase con un click y luego nos ubicamos en el panel Class Details.

Figura N 151

Agregamos los campos, y propiedades.

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

Modulo: Fundamentos de Programacin

Pag. 138

Programa: Programador .NET


Para visualizar el cdigo de los campos y propiedades que hemos creado, simplemente
hacemos doble click en la clase mostrada en el pnale superior, inmediatamente Visual Studio
mostrar el siguiente cdigo:
Public Class clsPersona
Private _DNI As String
Private _Nombres As String
Private _Apellidos As String
Private _Sexo As String
Public Property DNI As String
Get
End Get
Set(value As String)
End Set
End Property
Public Property Nombres As String
Get
End Get
Set(value As String)
End Set
End Property
Public Property Apellidos As String
Get
End Get
Set(value As String)
End Set
End Property
Public Property Sexo As String
Get
End Get
Set(value As String)
End Set
End Property
End Class

Lo que debemos hacer ahora es simplemente realizar las validaciones necesarias:


Public Class clsPersona
Private _DNI As String
Private _Nombres As String
Private _Apellidos As String
Private _Sexo As String
Public Property DNI As String
Get
Return _DNI
End Get
Set(value As String)

Modulo: Fundamentos de Programacin

Pag. 139

Programa: Programador .NET


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 debe tener 8 dgitos.")
Else
_DNI = value.Trim
End If
End Set
End Property
Public Property Nombres As String
Get
Return _Nombres
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El nombre no puede quedar vaco")
ElseIf value.Trim.Length > 30 Then
Throw New Exception("El nombre no debe exceder de 30 caracteres.")
Else
_Nombres = value.Trim.ToUpper
End If
End Set
End Property
Public Property Apellidos As String
Get
Return _Apellidos
End Get
Set(value As String)
If value.Trim.Length = 0 Then
Throw New Exception("El apellido no puede quedar vaco")
ElseIf value.Trim.Length > 30 Then
Throw New Exception("El apellido no debe exceder de 30 caracteres.")
Else
_Apellidos = value.Trim.ToUpper
End If
End Set
End Property
Public Property Sexo As String
Get
Return _Sexo
End Get
Set(value As String)
If value.Trim.ToUpper = "MASCULINO" Or _
value.Trim.ToUpper = "FEMENINO" Then
_Sexo = value.Trim.ToUpper
Else
Throw New Exception("Sexo invlido.")
End If
End Set
End Property
End Class

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

Modulo: Fundamentos de Programacin

Pag. 140

Programa: Programador .NET


de ingreso. Como los primeros 4 datos estn en la clase clsPersona, entonces simplemente
vamos a heredar de esa clase y los datos adicionales los ingresaremos
manualmente.

Figura N 154

Las propiedades y campos de cada clase se muestran a continuacin:

Figura N 155

Figura N 156

Modulo: Fundamentos de Programacin

Pag. 141

Programa: Programador .NET


Ahora vamos a crear el vnculo de herencia entre las clases, para ello debemos seleccionar la
herramienta Inheritance del cuadro de herramientas, luego de ello arrastramos de
clsDocente a clsPersona, y luego realizamos el mismo procedimiento para clsAlumno y
clsPersona.

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.

Modulo: Fundamentos de Programacin

Pag. 142

Programa: Programador .NET


Si hacemos doble click sobre la clase clsDocente noteremos que Visual Studio ha agregado una
lnea adicional para aplicar el proceso de herencia.

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

Modulo: Fundamentos de Programacin

Pag. 143

Programa: Programador .NET

SESIN

Caso Practico

23

Al finalizar la presente sesin, el participante estar en la capacidad de:

Aplicar programacin orientada a objetos en la implementacin de aplicaciones.


Crear una base adecuada para escenarios empresariales.

Temas:

Caso prctico

Modulo: Fundamentos de Programacin

Pag. 144

Programa: Programador .NET

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:

Cantidad de varones y mujeres (incluyendo sus porcentajes)

Cantidad de empleados mayores de 40 aos (incluyendo el porcentaje que representan)

Los datos personales del trabajador ms joven y el ms longevo.

Una lista que contenga los nombres y apellidos de los empleados que son hermanos.

Una lista de los empleados que tienen ms de 10 aos de antigedad en la empresa.

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.

Utilice programacin con capas para dar solucin al caso.

Aplique una interfaz simple y eficiente para facilitar el trabajo del usuario final

Modulo: Fundamentos de Programacin

Pag. 145

Programa: Programador .NET

SESIN

Aplicaciones Web
con ASP .Net

24

Al finalizar la presente sesin, el participante estar en la capacidad de:

Conocer la tecnologa ASP .Net para la implementacin de aplicaciones Web.


Identificar la estructura de una aplicacin Web.

Temas:

Conociendo ASP .Net


Creacin de una aplicacin Web ASP .Net con Visual Studio
Pginas maestras

Modulo: Fundamentos de Programacin

Pag. 146

Programa: Programador .NET

Conociendo ASP .Net


ASP .Net es una tecnologa que proporciona Microsoft para la creacin de aplicaciones Web,
una aplicacin Web a diferencia de una pgina Web es un portal que contiene acceso a datos,
es decir, tiene la capacidad de almacenar y consumir informacin de un origen de datos
persistente. Algunos ejemplos sencillos de aplicaciones Web son los portales de comercio
electrnico, redes sociales como Facebook o servicios de correo electrnico como Hotmail o
Gmail.
Debemos recordar que en Visual Studio .Net podemos crear aplicaciones Web utilizando Visual
Basic .Net o Visual C#, adems podemos utilizar programacin con capas para brindar una
mejor estructura a nuestra aplicacin.

Creacin de una aplicacin Web ASP .Net con


Visual Studio
Para crear una aplicacin Web en Visual Studio debemos hacer click en el men File opcin
New Web Site. Inmediatamente se mostrar una pgina similar a la siguiente:

Figura N 161

Figura N 162

Modulo: Fundamentos de Programacin

Pag. 147

Programa: Programador .NET


En el panel izquierdo podemos seleccionar el lenguaje de programacin que se quiere utilizar
para implementar la aplicacin, en este caso seleccionamos Visual Basic y en el panel central
seleccionamos ASP .NET Empty Web Site. Luego, en la parte inferior de la ventana debemos
seleccionar la ubicacin de la aplicacin Web, que de preferencia debe ser una carpeta vaca del
disco duro.

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

Modulo: Fundamentos de Programacin

Pag. 148

Programa: Programador .NET


Seleccionamos el elemento Web Form y dejamos su nombre en Default.aspx. Finalmente
hacemos click en el botn Add.
Luego de unos segundos Visual Studio mostrar una interfaz similar la siguiente figura:

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

En la vista Design vamos a ingresar un mensaje de bienvenida y un vnculo para ir a la pgina


principal, para ello vamos a agregar el texto Bienvenido a mi Sitio Web y debajo vamos a
dibujar un control llamado HyperLink (ubicado en el cuadro de herramientas).

Figura N 168

Para cambiar el texto mostrado en el HyperLink vamos a modificar su propiedad Text a Ir a


la pgina principal.

Figura N 169

Modulo: Fundamentos de Programacin

Pag. 149

Programa: Programador .NET


Para probar nuestra aplicacin Web vamos a presionar la tecla F5 o sino hacemos Click en el
botn Iniciar ubicado en la barra de herramientas.

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

Modulo: Fundamentos de Programacin

Pag. 150

Programa: Programador .NET


mientras se va navegando por un sitio Web). Para definir una zona de contenido, debemos
utilizar un control llamado ContentPlaceHolder ubicado en el cuadro de herramientas o
Toolbox. Ingresamos al Master Page, y luego vamos cambiar a la vista Source y vamos a
analizar el cdigo.

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,

Modulo: Fundamentos de Programacin

Pag. 151

Programa: Programador .NET


por ejemplo, notemos que en el cdigo tenemos etiquetas como head, body, title, div, form,
etc.
Toda etiqueta tiene un inicio y fin, este ltimo se diferencia del primero porque recibe un slash
antes del nombre de la etiqueta, por ejemplo, la etiqueta head inicia con <head> y termina con
</head>.

Modulo: Fundamentos de Programacin

Pag. 152

Programa: Programador .NET

SESIN

Diseo Bsico con


CSS

25

Al finalizar la presente sesin, el participante estar en la capacidad de:

Utilizar CSS para estructurar una pgina Web.


Conocer el rol que cumple CSS en la implementacin de Sitios Web.

Temas:

Creacin e implementacin de un archivo CSS


Aplicacin de CSS

Modulo: Fundamentos de Programacin

Pag. 153

Programa: Programador .NET

Creacin e implementacin de un archivo CSS


CSS quiere decir en espaol Hojas de Estilo en Cascada, se utiliza principalmente para
maquetar o construir la estructura de una pgina Web, es una tcnica ampliamente
utilizada dentro de diseo de pginas Web. El presente curso no est orientado a profundizar
en el diseo de una pgina Web, sino en su programacin, sin embargo en esta sesin
abordaremos algunas aspectos bastante bsicos de las Hojas de Estilo en Cascada.
Para mantener un orden en nuestra aplicacin Web, vamos a crear una carpeta en nuestro
proyecto, para ello hacemos click derecho en el nombre y seleccionamos la opcin Add y luego
New Folder.

Figura N 175

A la nueva carpeta creada le vamos a signar el nombre CSS.

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.

Modulo: Fundamentos de Programacin

Pag. 154

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

CONTENIDO

Pag. 155

Programa: Programador .NET


Lo primero que haremos es crear una contenedor general para la pgina Web, para ello vamos
a definir el primer estilo de la siguiente manera:
#contenedor {
width:800px;
height:auto;
}

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

Modulo: Fundamentos de Programacin

Pag. 156

Programa: Programador .NET


encuentran en la misma lnea. Adicionalmente agregamos la propiedad margin-left para
otorgar una ligera separacin entre entre el men lateral izquierdo y el contenido

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>

Primero eliminaremos el ContentPlaceHolder de la seccin head y la seccin body,


incluyendo la etiqueta div ubicada dentro del formulario form1. El cdigo debe quedar de la
siguiente manera:
<%@ Master Language="VB" CodeFile="Plantilla01.master.vb" Inherits="Plantilla01" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
</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">

Modulo: Fundamentos de Programacin

Pag. 157

Programa: Programador .NET


<head runat="server">
<title>Demo sobre ASP .Net</title>
</head>
<body>
<form id="form1" runat="server">
</form>
</body>
</html>

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

El cdigo quedar de manera similar al siguiente fragmento:


<%@ 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>
</form>
</body>
</html>

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">

Modulo: Fundamentos de Programacin

Pag. 158

Programa: Programador .NET


<head runat="server">
<title>Demo sobre ASP .Net</title>
</head>
<body>
<form id="form1" runat="server">
<div id="contenedor">
</div>
</form>
</body>
</html>

Ahora veamos el contenido de la vista Design.

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

Modulo: Fundamentos de Programacin

Pag. 159

Programa: Programador .NET


Finalmente agregamos los estilos referentes al men lateral y al contenido:
<%@ 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 id="menuLateral">

</div>
<div id="contenido">

</div>
</div>
</form>
</body>
</html>

Veamos el resultado final:

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

Modulo: Fundamentos de Programacin

Pag. 160

Programa: Programador .NET


plantilla vamos a utilizar el control ContentPlaceHolder as que arrastramos este control a la
zona del contenido de nuestra plantilla:

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

Modulo: Fundamentos de Programacin

Pag. 161

Programa: Programador .NET


Ahora Visual Studio nos solicita seleccionar la plantilla o Master Page que queremos utilizar ya
que podramos tener varios en el Proyecto.

Figura N 187

Seleccionamos el nico Master Page que tenemos y presionamos OK. Veamos el resultado:

Figura N 188

Como vemos nicamente podemos modificar la zona que incluye el ContentPlaceHolder.


Como es la portada principal de la pgina, vamos a agregar un texto pequeo de bienvenida.

Figura N 189

Modulo: Fundamentos de Programacin

Pag. 162

Programa: Programador .NET


Ahora vamos a abrir la pgina Default.aspx y vamos a seleccionar el HyperLink creado
anteriormente y vamos a modificar su propiedad NavigateURL.

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.

Modulo: Fundamentos de Programacin

Pag. 163

Programa: Programador .NET

Figura N 193

Ejecutamos la aplicacin Web para ver el resultado.

Modulo: Fundamentos de Programacin

Pag. 164

Programa: Programador .NET

SESIN

Controles de
Validacin

26

Al finalizar la presente sesin, el participante estar en la capacidad de:

Implementar validacin de datos en formularios Web.

Temas:

Validacin de datos
Controles de validacin

Modulo: Fundamentos de Programacin

Pag. 165

Programa: Programador .NET

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

Observemos el Explorador de Soluciones.

Figura N 195

Modulo: Fundamentos de Programacin

Pag. 166

Programa: Programador .NET


En realidad muestra un proyecto que incluye ya algunos elementos predeterminados, en los
ejercicios anteriores crebamos un proyecto totalmente vaco.
A continuacin vamos a agregar un formulario Web con el nombre Default2.aspx, en dicho
formulario web vamos a agregar una tabla utilizando el men Table y seleccionando la opcin
Insert Table.

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

Combinamos la primera fila para agregar un ttulo.

Figura N 198

Modulo: Fundamentos de Programacin

Pag. 167

Programa: Programador .NET


Luego agregamos el ttulo Registro de paciente.

Figura N 199

Ahora elaboramos el siguiente diseo:

Figura N 200

No olvidemos que para agregar nombre a un control en aplicaciones Web, debemos de


utilizar la propiedad ID.

Ahora vamos a utilizar los controles de validacin, estos se ubican en la categora Validation
del cuadro de herramientas.

Figura N 201

Modulo: Fundamentos de Programacin

Pag. 168

Programa: Programador .NET


El primer control que analizaremos es el RequiredFieldValidator que se utiliza para indicar
datos obligatorios. Vamos a dibujar un RequiredFieldValidator al lado derecho del nombre
completo, edad y correo electrnico, ya que todos ellos vienen a ser obligatorios.

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

La siguiente propiedad es ErrorMessage que detalla el mensaje de error en caso de que no se


respete la validacin, en esta propiedad asignamos el texto El nombre completo no puede
quedar vaco. Luego en la propiedad Text vamos a escribir un asterisco, que indica campo
obligatorio en Web.
Hacemos el mismo procedimiento para los dems RequiredFieldValidator.
Ahora vamos a trabajar con el siguiente control de validacin, el RangeValidator, este control
permite establecer rangos determinados, por ejemplo, vamos a validar que la edad ingresada
se encuentre entre 20 y 50 aos.
Agregamos un RangeValidator al lado derecho del RequiredFieldValidator de la edad y le
asignamos el nombre rvEdad. Le asignamos txtEdad a su propiedad ControlToValidate, en
la propiedad ErrorMessage le asignamos Edad fuera del rango, luego en la propiedad
MinimumValue le asignamos 20 y en MaximumValue le asignamos 50. En la propiedad Text

Modulo: Fundamentos de Programacin

Pag. 169

Programa: Programador .NET


le asignamos Ingrese un nmero entre 20 y 50, finalmente en la propiedad Type le
asignamos Integer para que pueda validar datos numricos.

Figura N 204

Para validar el correo electrnico vamos a utilizar un control RegularExpressionValidator,


este control se utiliza para validar expresiones cotidianas como por ejemplo nmeros
telefnicos, cdigos postales, direcciones de correo electrnico o la direccin de una pgina
Web.
Vamos a agregar un ReglarExpressionValidator a la derecha del correoe electrnico tal y
como muestra la siguiente figura:

Figura N 205

Ahora le asignamos txtCorreoElectronico a la propiedad ControlToValidate, luego en la


propiedad ErrorMessage le asignamos el texto Formato de correo electrnico invlido ,
en la propiedad Text le asignamos Ingrese correo electrnico vlido y finalmente en la
propiedad ValidationExpression vamos a asignar la mscara de correo electrnico.

Figura N 204

Modulo: Fundamentos de Programacin

Pag. 170

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 171

Programa: Programador .NET

Figura N 207

Ahora vamos a probar la aplicacin, presionamos F5 y luego hacemos click en el botn


Registrar sin ingresar dato alguno.

Figura N 208

Como vemos la aplicacin est realizando las validaciones necesarias, ahora vamos a ingresar
nicamente el nombre del paciente:

Figura N 209

Modulo: Fundamentos de Programacin

Pag. 172

Programa: Programador .NET


Ahora ingresamos todos los datos pero incluimos una edad fuera del rango.

Figura N 210

Si se ingresa todos los datos correctamente, entonces la aplicacin continua.

Figura N 211

Modulo: Fundamentos de Programacin

Pag. 173

Programa: Programador .NET

SESIN

Parmetros

27

Al finalizar la presente sesin, el participante estar en la capacidad de:

Aplicar tcnicas para enviar y recepcionar datos entre pginas Web.

Temas:

Identificando los parmetros


Enviar parmetros de una pgina a otra
Recuperando valores de diversos parmetros

Modulo: Fundamentos de Programacin

Pag. 174

Programa: Programador .NET

Identificando los parmetros


Es bastante comn que las pginas dentro de una aplicacin intercambien informacin por
medio de parmetros, ya sea para trabajar con operaciones internas o simplemente para
establecer parmetros y detalles de configuracin.
De cualquier manera, ASP .Net nos permite utilizar parmetros para diversos prosito, vamos a
crear un proyecto Web vaco y vamos a agregar 2 pginas, la primera con el nombre
Origen.aspx y la segunda con el nombre Destino.aspx.

Figura N 212

En la pgina Origen.aspx vamos a dibujar un HyperLink con el texto Enviar valor.

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

Modulo: Fundamentos de Programacin

Pag. 175

Programa: Programador .NET

Enviar parmetros de una pgina a otra


Para enviar un parmetro desde la pgina Origen.aspx a la pgina Destino.aspx, vamos a
hacer uso del HyperLinkcreado hace un momento, seleccionamos el HyperLink de la pgina
Origen.aspx y ubicamos su propiedad NavigateURL donde ingresamos el siguiente texto:
Destino.aspx?nombre=Ana&Edad=23
Primero incluimos el nombre de la pgina que queremos invocar, luego a atravs del signo de
interrogacin estamos indicando que vamos a enviar parmetros, en este caso enviamos el
parmetro nombre con el valor Ana y otro parmetro Ead con el valor 23. Debemos saber
que para separar parmetros utilizamos &.
Ejecutamos la aplicacin Web con la pgina Origen.aspx como pgina de inicio, y luego le
damos un click al HyperLink que hemos agregado, observemos la barra de direcciones:

Figura N 215

Recuperando valores de diversos parmetros


Ahora nos ubicamos en la pgina Destino.aspx y le vamos a hacer doble click al fonde de la
pgina en Vista Diseo, esto lo hacemos para ingresar a su evento Load.
Partial Class Destino
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
End Sub
End Class

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

Modulo: Fundamentos de Programacin

Pag. 176

Programa: Programador .NET


Luego ejecutamos la aplicacin para verificar el resultado:

Figura N 216

Modulo: Fundamentos de Programacin

Pag. 177

Programa: Programador .NET

SESIN

Ejercicio Propuesto

28

Al finalizar la presente sesin, el participante estar en la capacidad de:

Crear la estructura base de una pgina Web.


Enviar y recibir parmetros entre formularios Web.

Temas:

Prctica sobre CSS


Prctica de parmetros

Modulo: Fundamentos de Programacin

Pag. 178

Programa: Programador .NET

Prctica sobre CSS


Elaborar una pgina maestra que muestre la siguiente estructura:
Encabezado

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

DatosEspecificos.aspx, en la primera pgina se deben capturar los siguientes datos:


Nombres, apellido patenro, apellido materno y fecha de nacimiento. Por medio de un botn
Enviar, se debe mostrar en la siguiente pgina DatosEspecificos.aspx que muestra nicamnte
2 cosas: Nombre completo (nombres y apellidos) y edad, en esta segunda pgina se debe crear
un botn llamado Registrar, que al hacerle click que hace una verificacin de si existe o no el
nombre recibido en la base de datos, en caso de que no exista registra el nombre y edad
recibidos, sino muestra un mensaje de error.

Modulo: Fundamentos de Programacin

Pag. 179

Programa: Programador .NET

SESIN

Acceso a Datos
Parte I

29

Al finalizar la presente sesin, el participante estar en la capacidad de:

Implementar una aplicacin Web con acceso a datos.


Conocer los principales controles de acceso a datos.

Temas:

Enlazando a datos
Controles de acceso a datos

Modulo: Fundamentos de Programacin

Pag. 180

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 181

Programa: Programador .NET

Controles de acceso a datos


En la aplicacin Web, vamos a abrir plantila01.master, luego nos ubicamos en la zona del
men lateral izquierdo y agregamos dos controles, el primero es el SqlDataSource y el segundo
un DataList, el primero nos ayudar a determinar los procedimientos de conexin a un
determinado origen de datos y el segundo mostrar el contenido del origen de datos.

Figura N 218

Ahora hacemos un click en la etiqueta inteligente del SqlDataSource y seleccionamos la primera


opcin.

Figura N 219

Modulo: Fundamentos de Programacin

Pag. 182

Programa: Programador .NET


Hacemos click en el botn New Connection para crear una nueva conexin con la base
de datos que acabamos de crear.

Figura N 220

Seleccionamos el tipo de conexin que queremos realizar:

Figura N 221

Agregamos el nombre del servidor y seleccionamos la base de datos a la cual queremos


conectarnos, en este caso Ventas.

Figura N 222

Modulo: Fundamentos de Programacin

Pag. 183

Programa: Programador .NET


Hacemos click al botn OK.

Figura N 223

Ahora click en Next.

Figura N 224

Modulo: Fundamentos de Programacin

Pag. 184

Programa: Programador .NET


En cl cuadro anterior nos solicita guardar la conexin con un nombre, vamos a dejarlo como
est y hacemos click en el botn Next.

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

Modulo: Fundamentos de Programacin

Pag. 185

Programa: Programador .NET


Hacemos click en el botn siguiente.

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.

Modulo: Fundamentos de Programacin

Pag. 186

Programa: Programador .NET

SESIN

Acceso a Datos
Parte II

30

Al finalizar la presente sesin, el participante estar en la capacidad de:

Implementar una aplicacin Web con acceso a datos.


Conocer los principales controles de acceso a datos.

Temas:

Modificando la presentacin del men

Modulo: Fundamentos de Programacin

Pag. 187

Programa: Programador .NET

Modificando la presentacin del men


Una vez creado el men, vamos a seleccionar como pgina de inicio a PortadaPrincipal.aspx
luego ejecutamos la aplicacin para ver la presentacin del men.

Figura N 229

Como vemos la presentacin no es del todo adecuada, terminamos la aplicacin y luego


abrimos el Master Page y nos ubicamos en la seccin del men lateral, all vamos hacer click en
la etiqueta inteligente del DataList y seleccionamos la opcin Edit Templates.

Figura N 230

Modulo: Fundamentos de Programacin

Pag. 188

Programa: Programador .NET


Vamos a borrar el contenido establecido y luego agregamos un HyperLink.

Figura N 231

Hacemos click en la etiqueta inteligente del HyperLink y seleccionamos la opcin Edit


DataBindings.

Figura N 232

Seleccionamos la propiedad text y en la lista de la derecha seleccionamos nombre. Luego


hacemos click en el botn OK y ejecutamos la aplicacin para visualizar el resultado.

Modulo: Fundamentos de Programacin

Pag. 189

Programa: Programador .NET

Figura N 233

Modulo: Fundamentos de Programacin

Pag. 190

Programa: Programador .NET

SESIN

Acceso a Datos
Parte III

31

Al finalizar la presente sesin, el participante estar en la capacidad de:

Implementar una aplicacin Web con acceso a datos.


Conocer los principales controles de acceso a datos.

Temas:

Enviar parmetros desde el men

Modulo: Fundamentos de Programacin

Pag. 191

Programa: Programador .NET

Enviando parmetros desde el men


Cada vez que el usuario hace click en un elemento del men lateral izquierdo, vamos a mostrar
los productos que pertenecen a dicha categora. Para habilitar esta caracterstica vamos enviar
el cdigo de la categora cada vez que el usuario hace un click en algn elemento del men
lateral.
Volvemos al Mater Page que hemos creado, y hacemos click en la etiqueta inteligente del
DataList y seleccionamos la opcin Edit Templates.

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

Ahora escribimos lo siguiente:

Modulo: Fundamentos de Programacin

Pag. 192

Programa: Programador .NET

Figura N 236

Hacemos click en el botn OK.


Con el cdigo mostrado anteriormente, vamos a hacer que se envie el cdigo de la categora
seleccionada cada vez que se hace click en algn element del men. Recordemos que la pgina
Productos.aspx an no est creada.
Ahora terminamos la edidicin del DataList haciendo click en su etiqueta inteligente y
seleccionando la opcin End Template Editing.

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

Modulo: Fundamentos de Programacin

Pag. 193

Programa: Programador .NET

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.

Modulo: Fundamentos de Programacin

Pag. 194

Programa: Programador .NET

SESIN

Acceso a Datos
Parte IV

32

Al finalizar la presente sesin, el participante estar en la capacidad de:

Implementar una aplicacin Web con acceso a datos.


Conocer los principales controles de acceso a datos.

Temas:

Mostrando la lista de productos

Modulo: Fundamentos de Programacin

Pag. 195

Programa: Programador .NET

Mostrando la lista de productos


Para mostrar la lista de productos por categoras, vamos a crear un procedimiento almacenado
que realice dicho proceso, para luego invocarlo desde un formulario Web.
CREATE PROCEDURE usp_Listar_Productos
@codigoCategoria TINYINT
AS
SELECT codigo,nombre,precio,stock,descripcion,categoria,foto
FROM tblProducto
WHERE categoria=@codigoCategoria
ORDER BY nombre

Ahora abrimos la pgina Productos.aspx y dibujamos un DataList y un SqlDataSource tal y


como muestra ls siguiente figura:

Figura N 241

Figura N 242

Modulo: Fundamentos de Programacin

Pag. 196

Programa: Programador .NET


Ahora configuramos el SqlDataSource haciendo click en la etiqueta inteligente del mismo y
seleccionando la opcin Configure Data Source.
En la ventana siguiente simplemente seleccionamos la cadena de conexin que ya creamos
anteriormente:

Figura N 243
Hacemos click en el botn Next y seleccionamos la opcin para trabajar con un procedimiento almacenado:

Figura N 244

Modulo: Fundamentos de Programacin

Pag. 197

Programa: Programador .NET


Seleccionamos el procedimiento que acabamos de crear:

Figura N 245

Hacemos click en el botn Next y en la siguiente ventana se detecta que el procedimiento


almacenado recibe un parmtro. Debemos especificar el origen de dicho parmetro, en este
caso seleccionamos QueryString y le asignamos el nombre del parmetro que pasamos por la
barra de direcciones.

Figura N 246

Modulo: Fundamentos de Programacin

Pag. 198

Programa: Programador .NET

Figura N 247

Finalmente hacemos click en el botn Next y luego en el botn Finish.


Ahora enlazamos el SqlDataSource a nuestro DataList.

Figura N 248

Veamos el resultado:

Modulo: Fundamentos de Programacin

Pag. 199

Programa: Programador .NET

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

Modulo: Fundamentos de Programacin

Pag. 200

Programa: Programador .NET


Ahora vamos a enlazar el primer label al nombre del producto, para ello hacemos click en su
etiqueta inteligente y seleccionamos la opcin Edit DataBindings.

Figura N 251

En el siguiente cuadro seleccionamos el nombre.

Figura N 252

Hacemos click en el botn OK y ya tenemos enlazado el primer dato, enlazamos tambin el


precio y el stock en los labels restantes.
Una vez terminado el proceso ejecutamos la aplicacin para ver el resultado.

Modulo: Fundamentos de Programacin

Pag. 201

Programa: Programador .NET

Figura N 253

Como podemos apreciar, cada vez que seleccionamos una categora, automticamente se
muestran sus productos.

Modulo: Fundamentos de Programacin

Pag. 202

Programa: Programador .NET

SESIN

Ejercicio Propuesto

33

Al finalizar la presente sesin, el participante estar en la capacidad de:

Aplicar tcnicas de registro de datos en un entorno Web.

Temas:

Ejercicio propuesto

Modulo: Fundamentos de Programacin

Pag. 203

Programa: Programador .NET

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)

Edad (Entre 18 y 50 aos)

Nmero de celular (Debe iniciar con 9 y deben ser exactamente 9 dgitos)

Correo electrnico (Obligatorio, este dato es nico por cada participante)

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.

Modulo: Fundamentos de Programacin

Pag. 204

Programa: Programador .NET

SESIN

Caso Prctico

34

Al finalizar la presente sesin, el participante estar en la capacidad de:

Aplicar diversas de tnicas de acceso a datos para la implementacin de aplicaciones


Web.
Utilizar adecuadamente los diversos controles para aplicaciones Web.

Temas:

Caso prctico

Modulo: Fundamentos de Programacin

Pag. 205

Programa: Programador .NET

Caso prctico
Elaborar una aplicacin Web que permita registrar los siguientes datos de un libro:

Ttulo

Autor

Resumen

Cantidad de pginas

Categora (Informtica, Administracin, Gastronoma, Contabilidad o Diseo de


Interiores)

Editorial

Cantidad de ejemplares (mnimo 1 y mximo 10)

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:

Elabora el diseo de la aplicacin utilizando CSS.

Utilizar correctamente los controles necesarios para la aplicacin.

Establecer los nombres ms adecuados para cada control.

Modulo: Fundamentos de Programacin

Pag. 206

También podría gustarte