lunes, 30 de abril de 2012

08 - Ejercicio Práctico Parte 2

ADO SOBRE ASP.NET

Dentro de este punto veremos como trabajar en una aplicación web sobre tres capas. Mostrando así que cosas se deben incluir dentro de una aplicación para poder operar de una forma que permita dividir las diversas capas que existan. También se pretende mostrar un nuevo enfoque de utilización de las conexiones a bases de datos, de una forma distinta a la que se mostró en los capítulos de ADO, modo conectado y desconectado.

Para ello, realizaremos los siguientes pasos:

Utilizaremos la Base de Creada en el punto Modo desconectado.

Crearemos las tablas que se utilizarán en la aplicación.

Crearemos la lógica de operación de las interfaces que administrarán el sitio.

Abrir el explorador de servidores.

Seleccionar el nodo que permite definir las conexiones a las bases de datos y, con el botón derecho del Mouse, seleccionar la opción Crear Conexión, como se muestra a continuación

Se abrirá una interfaz que permitirá seleccionar el servidor de base de datos en donde se desea crear la Base de Datos, solicitando el nombre de ésta. Como se muestra en la siguiente imagen.


En el espacio de definición de nombre de la base de datos agregar el nombre de esta. El resultado de la creación de la Base de Datos se reflejará en el navegador de servidores, como se observa en la siguiente imagen.

El siguiente paso será crear una tabla que llamaremos Cargos, para esto, expandiremos el nodo de la base de datos desde las conexiones que existen en el explorador de servidores, seleccionando con el botón derecho sobre la carpeta Tablas, la opción Agregar nueva tabla, como se muestra a continuación.



Se abrirá la ventana de creación de tablas, en donde definiremos los siguientes campos.

Car_Codigo, Integer
Car_Descripcion, nvarchar(70)
Car_Estado, Char(1)

Quedando como se muestra a continuación:



Posicionándonos sobre el campo Car_Codigo, definiremos este como clave primaria, para esto seleccionaremos este campo con el botón derecho y seleccionaremos la opción Definir como Clave Primaria. Como se observa a continuación.




En la ventana de propiedades del campo seleccionado, expandiremos la opción Especificación de Identidad y en la propiedad (Identidad), cambiaremos la opción a Si. Por defecto dejaremos el incremento como se define por defecto.



Para guardar los cambios realizados se debe presionar el botón de guardar que se encuentra disponible en los controles de acceso directo del Visual Estudio. Al realizar esta acción, se desplegará la interfaz que permitirá agregar el nombre de la Tabla, como se muestra a continuación.



Presionar el botón Aceptar. La tabla será incluida en la carpeta de tablas que se muestra en el nodo de la base de datos, desde el explorador de soluciones.


A continuación crearemos la tabla Usuarios utilizando la siguiente definición de campos.

CREATE TABLE [dbo].[Usuario] (
[Usu_Codigo] [int] IDENTITY (1, 1) NOT NULL ,
[Usu_Login] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Usu_PassWord] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Usu_Estado] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO

Podemos también crear la tabla siguiendo los pasos que se han definido en la definición de la tabla Cargos.

Adicionalmente crearemos las siguientes tablas:

CREATE TABLE [dbo].[Personal] (
[Per_Codigo] [decimal](5, 0) IDENTITY (1, 1) NOT NULL ,
[Tip_Codigo] [int] NOT NULL ,
[Car_Codigo] [int] NOT NULL ,
[Per_DNI] [varchar] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Per_Nombres] [varchar] (45) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Per_ApellidoPaterno] [varchar] (35) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Per_ApellidoMaterno] [varchar] (35) COLLATE Modern_Spanish_CI_AS NULL ,
[Per_CostoHH] [decimal](13, 2) NOT NULL ,
[Per_FechaIncorporacion] [datetime] NOT NULL ,
[Per_FechaTermino] [datetime] NULL ,
[Per_Sexo] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Per_Correo] [varchar] (55) COLLATE Modern_Spanish_CI_AS NULL ,
[Per_Estado] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Tipo] (
[Tip_Codigo] [int] IDENTITY (1, 1) NOT NULL ,
[Tip_Descripcion] [varchar] (75) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Tip_Estado] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Cargos] WITH NOCHECK ADD
CONSTRAINT [PK_Cargos] PRIMARY KEY CLUSTERED
(
[Car_Codigo] ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Personal] WITH NOCHECK ADD
CONSTRAINT [PK_Personal] PRIMARY KEY CLUSTERED
( [Per_Codigo] ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Tipo] WITH NOCHECK ADD
CONSTRAINT [PK_Tipo] PRIMARY KEY CLUSTERED
( [Tip_Codigo] ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Usuario] WITH NOCHECK ADD
CONSTRAINT [PK_Usuario] PRIMARY KEY CLUSTERED
( [Usu_Codigo] ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Personal] ADD
CONSTRAINT [FK_Personal_Cargos] FOREIGN KEY
( [Car_Codigo] ) REFERENCES [dbo].[Cargos] ( [Car_Codigo] ),
CONSTRAINT [FK_Personal_Tipo] FOREIGN KEY
( [Tip_Codigo] ) REFERENCES [dbo].[Tipo] ( [Tip_Codigo] )

GO



VALIDACIÓN DE EXISTENCIA DE USUARIO EN BASE DE DATOS

Antes de crear la lógica de validación de registros de usuario en la base de datos, realizaremos las siguientes acciones:

Si no ha ingresado los usuarios, ingresar los usuarios que operarán en el sistema.

insert into Usuario

values('marovi','marovi','A')


Si inspeccionamos los registros desde el administrador de tablas, del nodo de conexión creado, se observará la siguiente ventana:






Agregaremos un proyecto de clase en la solución, al cual llamaremos capa de datos (CapaDato).

Dentro de este proyecto agregaremos un nuevo elemento que será del tipo de Conjunto de datos, nombrándolo dsUsuario.

Desde el explorador de servidores generaremos una conexión a la base de datos oracle y agregaremos la tabla Usuario. Quedando este, de la siguiente forma:






Dentro del TableAdapter que se ha creado, modificaremos la consulta definida, la cual será la que utilizaremos, para verificar la existencia del usuario en la base de datos, para esto:

· Seleccionaremos los métodos Fill y GetData del table adapter, con el botón derecho del Mouse, seleccionado la opción Configurar, como se muestra a continuación:




· En la interfaz que se ha presentado, al seleccionar la opción especificada, ingresar la siguiente consulta:

SELECT USU_CODIGO, USU_LOGIN, USU_PASSWORD, USU_ESTADO
FROM "SYSTEM".USUARIO
WHERE
USU_LOGIN = @USU_LOGIN and USU_PASSWORD=@USU_PASSWORD





· Presionar el botón Finalizar.


Agregaremos un nuevo proyecto de clases, el cual llamaremos CapaNegocio. A este proyecto agregaremos una referencia al proyecto de clase CapaDatos.

Dentro de este proyecto de clases, agregaremos un nuevo elemento del tipo de Clase de Componente, el cual llamaremos Usuario.

Antes de agregar cualquier elemento al archivo Usuario, creado en la capa de datos, generaremos el proyecto de CapaDato.

Dentro del archivo Usuario creado en la CapaNegocios, arrastraremos el control USUARIOTableAdapter al cual llamaremos dalUsuario.

Dentro del archivo Usuario agregaremos las siguientes líneas de código, que permitirá invocar el dataset tipado y consultar sobre los usuarios.

Public Function ObtenerUsuario(ByVal usu As String, ByVal pws As String) As CapaDato.dsUsuario.USUARIODataTable

Return Me.dalUsuario.GetData(usu, pws)

End Function

Dentro del proyecto de solución, agregaremos las referencias sobre los proyectos CapaDatos y CapaNegocio.

En el método que atiende el evento clic del botón btnIngresar, agregaremos las siguientes líneas de código (dentro del bloque If Page.IsValid Then), que permitirán consultar si el usuario al que se está consultando existe.

Primero crearemos un data table que rescatará el usuario que se desea consultar.

Dim dtUsuario As New CapaDato.dsUsuario.USUARIODataTable

En segundo lugar, instanciaremos la clase Usuario, que permitirá llamar el método ObtenerUsuario

Dim usu As New CapaNegocio.Usuario

Luego ejecutaremos el procedimiento que verificará la existencia del usuario ingresado, esto se puede hacer de dos formas, asignando el valor del resultado de la consulta al datatable creado o ejecutando el método y consultando directamente en el if, para ambos casos se presentan las siguientes líneas de código:

Caso I

dtUsuario = usu.ObtenerUsuario(usuario, clave)

If dtUsuario.Rows.Count > 0 Then

Session("NombreUsuario") = usuario

System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)

End If


Caso II.

If usu.ObtenerUsuario(usuario, clave).Rows.Count > 0 Then

Session("NombreUsuario") = usuario

System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)

End If

Con esto, podremos ver que se logra realizar consultas desde la capa de usuarios ingresando por la capa de negocios y luego por la capa de datos.

Ahora construiremos las páginas que deben administrar la información de usuarios como se ha hecho en la aplicación Windows.

El bloque de código completo se puede observar a continuación:

If Page.IsValid Then

Dim usuario As String = Me.txtUsuario.Text

Dim clave As String = Me.txtClave.Text

Dim dtUsuario As New CapaDato.dsUsuario.USUARIODataTable

Dim usu As New CapaNegocio.Usuario

dtUsuario = usu.ObtenerUsuario(usuario, clave)

If dtUsuario.Rows.Count > 0 Then

Session("NombreUsuario") = usuario

System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)

End If

End If

End If

O también.

If Page.IsValid Then

Dim usuario As String = Me.txtUsuario.Text

Dim clave As String = Me.txtClave.Text

Dim dtUsuario As New CapaDato.dsUsuario.USUARIODataTable

Dim usu As New CapaNegocio.Usuario

If usu.ObtenerUsuario(usuario, clave).Rows.Count > 0 Then

Session("NombreUsuario") = usuario

System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)

End If

End If



ADMINISTRACIÓN DE TIPOS DE PERSONAL.

Antes de crear la aplicación que administrará los tipos de personal, agregaremos en la capa de datos el dataset que definirá la administración de las tablas Cgp_PersonalTipo, Cgp_PersonalCargo y Cgp_Personal.

Para ello se deben seguir os siguientes pasos:

Crear una nueva página utilizando la plantilla MasteraPage.master, con el nombre de frmPersonalTipo.aspx.

Agregar un Label en la primera sección de la página definiendo el siguiente texto.

Agregar la referencia al archivo frmPersonalTipo.aspx en el archivo Web.sitemap, de la siguiente forma:

<siteMapNode url="" title="Parámetros" description="Permite la administración de parámetros">

<siteMapNode url="" title="Cargos" description="Administración de cargos del personal"/>

<siteMapNode url="frmPersonalTipo.aspx " title="Tipos" description="Administración de los tipos de personal"/>

siteMapNode>

Ejecutar la aplicación e ingresar a ésta, se podrá observar que al seleccionar la opción de menú de Parámetros>Tipo, se podrá ir a la interfaz de administración de tipos de Personal (frmPersonalTipo.aspx).






En el proyecto de Biblioteca de Clase CapaDato, agregaremos un nuevo elemento del tipo de conjunto de datos, con el nombre dsPersonal. Dentro de este archivo agregar las Tablas Tipo, Cargo y Personal, quedando de la siguiente forma:






En el formulario frmPersonalTipo.aspx, agregaremos los elementos que se muestran en la interfaz siguiente:



Label1, Name = lblAleatorio

TextBox1, Name = txtAleatorio

LinkButton1, Name = lnkAleatorio

Listbox1, Name = lbxTipo

LinkButton2, Name = lnkIngresar, Text = Ingresar Tipo

LinkButton3, Name = lnkModificar, Text = Modoficar Tipo

LinkButton4, Name = lnkEliminar, Text = Eliminar Tipo

LinkButton4, Name = lnkVolver, Text = Volver

Cambiar el estado de visibilidad de los controles lblAleatorio, txtAleatorio y lnkAleatorio a False, desde la ventana de propiedades.

En el editor de código de la página frmPersonalTipo.aspx, agregaremos el siguiente procedimiento:

Public Sub P_Inicializar(ByVal txt As String, ByVal estado As Boolean)

Me.txtAleatorio.Visible = estado

Me.lblAleatorio.Visible = estado

Me.lnkAleatorio.Visible = estado

Me.txtAleatorio.Text = ""

Me.lblAleatorio.Text = txt

Me.lnkAleatorio.Text = txt

End Sub

En el archivo Global.asax en el método que atiende el evento Session_Star agregar la siguiente variable:

Session("Opcion") = ""

Dentro de cada uno de los métodos que atienden los eventos clic de los linkButton agregar las siguientes líneas de código:

Protected Sub lnkIngresar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkIngresar.Click

Session("Opcion") = "Ingresar"

P_Inicializar(Session("Opcion").ToString(), True)

End Sub

Protected Sub lnkModificar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkModificar.Click

Session("Opcion") = "Modificar"

P_Inicializar(Session("Opcion").ToString(), True)

End Sub

Protected Sub lnkEliminar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkEliminar.Click

Session("Opcion") = "Eliminar"

lnkAleatorio_Click(sender, e)

End Sub

Protected Sub lnkVolver_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkVolver.Click

Response.Redirect("Default.aspx")

End Sub

En el método que atiende el evento clic del botón btnAleatorio, agregar las siguientes líneas de código:

Select Case Session("Opcion").ToString()

Case "Ingresar"

Case "Modificar"

Case "Eliminar"

End Select

Response.Redirect("frmPersonalTipo.aspx")

En el proyecto CapaNegocio, agregaremos un archive de Clase de Componente, que llamaremos Personal.

Arrastraremos desde el cuadro de herramientas el control TIPOTableAdapter, renombrándolo dalTipo.

Dentro del espacio de nombre de la clase de formulario frmPersonalTipo.aspx, agregaremos una instancia a la clase Personal, la cual se encuentra definida en el proyecto CapaNegocio.

Dim clsCn As New CapaNegocio.Personal

En el DataTable TIPO del Proyecto CapaDato agregaremos la siguiente consulta

SELECT TIP_CODIGO, TIP_DESCRIPCION, TIP_ESTADO

FROM TIPO

where TIP_ESTADO = 'A'

Quedando esta de la siguiente forma:






Asignaremos los nombres que se muestran en la siguiente imagen a los métodos Fill y GetData de la nueva consulta:






Presionar el botón siguiente y finalizar la generación de la consulta.

En el editor de código de la clase de componente Personal, definida en el proyecto CapaNegocio, agregaremos el siguiente procedimiento:

Public Function TipoConsultar() As CapaDato.dsPersonal.TIPODataTable

Return Me.dalTipo.GetDataByTipoConsultar()

End Function

Desde el administrador de propiedades de acceso directo del control lbxTipo, definido, agregaremos un proveedor de datos para desplegar la información de tipos en el lbxTipo, siguiendo los siguientes pasos:

· Seleccionar Elegir origen de datos, como se muestra en la siguiente figura:






· Seleccionar un nuevo origen de datos.





· Seleccionar origen de datos de objeto y asignar el nombre odsTipo, como se muestra en la siguiente figura:




· Inhabilitar la opción Mostrar solo componentes de datos y seleccionar desde la lista Objeto comercial, la opción CapaNegocio.Personal y presionar el botón siguiente




· En la interfaz de configuración de origen de datos, seleccionar el método TipoConsultar y presionar el botón siguiente. Como se muestra en la siguiente imagen




· Definir los campos que se van a mostrar y los que se van a asignar como valor



· Quedando el formulario, en esquena de diseño de la siguiente forma:




· Si ejecutamos la aplicación, veremos que los datos se despliegan de la siguiente forma:





Crear la lógica de ingreso de datos

Para crear la lógica de ingreso de datos, en el proyecto CapaDato y CapaNegocio, agregaremos las siguientes líneas de código.

  1. En el TableAdapter Tipo, que se encuentra en el dataset dsPersonal, definido en el proyecto CapaDato, crearemos una consulta que permitirá verificar, si un tipo definido, existe en la tabla Tipo, buscando por su descripción, de la siguiente forma:

SELECT TIP_CODIGO, TIP_DESCRIPCION, TIP_ESTADO FROM TIPO

WHERE TIP_DESCRIPCION = @TIP_DESCRIPCION

Nombraremos a esta consulta, para los métodos fill y get de la siguiente forma:

FillByTipoDescripcion

GetDataByTipoDescripcion

  1. Ahora crearemos la consulta que permitirá insertar los datos de tipo en la base de datos, como se muestra a continuación:

INSERT INTO TIPO

(TIP_DESCRIPCION, TIP_ESTADO)

VALUES ( @TIP_DESCRIPCION, 'A')

Nombrando la consulta InsertQuery como InsertQueryTipoInsertar

  1. Ahora, si el registro existe, lo que se debe hacer es habilitar el estado a Activo, para que se vuelva a mostrar en la lista, agregando la consulta de la siguiente forma:

UPDATE TIPO SET

TIP_ESTADO = 'A'

WHERE (TIP_DESCRIPCION = @TIP_DESCRIPCION)

Nombrando el UpdateQuery como UpdateQueryTipoInsertar

  1. En el proyecto de biblioteca de clase CapaNegocio, específicamente en el editor de código de la clase de componente Personal, agregar los siguientes métodos:

' consulta si existe lo que se esta ingresando

Public Function TipoDescripcion(ByVal txt As String) As CapaDato.dsPersonal.TIPODataTable

Return Me.dalTipo.GetDataByTipoDescripcion(txt)

End Function

' inserta un registro a la tabla Tipo

Public Sub TipoInsertar(ByVal txt As String)

Me.dalTipo.InsertQueryTipoInsertar(txt)

End Sub

' habilita un registro de la tabla tipo

Public Sub TipoInsertarActualizar(ByVal txt As String)

Me.dalTipo.UpdateQueryTipoInsertar(txt)

End Sub

  1. En el método lnkAleatorio_Click que se encuentra en el formulario frmPersonalTipo.aspx, el cual atiende el evento click del botón lnkAleatorio, agregar las siguientes líneas de código:

Select Case Session("Opcion").ToString()

Case "Ingresar"

If Me.txtAleatorio.Text.Length > 0 Then

End If

Case "Modificar"

Case "Eliminar"

End Select

Response.Redirect("frmPersonalTipo.aspx")

  1. En el case que atiende la opción Ingresar, agregaremos las siguientes líneas, dentro del bloque if, definido, como se muestra a continuación:

If Me.txtAleatorio.Text.Length > 0 Then

Dim dt As CapaDato.dsPersonal.TIPODataTable

dt = Me.clsCn.TipoDescripcion(Me.txtAleatorio.Text)

If dt.Rows.Count = 0 Then

Me.clsCn.TipoInsertar(Me.txtAleatorio.Text)

Else

Me.clsCn.TipoInsertarActualizar(Me.txtAleatorio.Text)

End If

End If

Crear la lógica de Modificación de datos

Para realizar esta acción, deberemos agregar las siguientes líneas de código en los proyectos CapaDato y CapaNegocio, siguiendo los siguientes pasos.

  1. En el TableAdapter Tipo, que se encuentra en el dataset dsPersonal, definido en el proyecto CapaDato, crearemos una consulta que permitirá modificar la descripción de un tipo definido, como se muestra a continuación:

UPDATE TIPO

SET TIP_DESCRIPCION = @TIP_DESCRIPCION

WHERE (TIP_CODIGO = @TIP_CODIGO)

Definiendo la consulta UpdateQuery com UpdateQueryTipoModificar

  1. En la Clase de Componente Personal, definida en el proyecto CapaNegocio, agregaremos las siguientes líneas de código:

' actualiza la descripción de un tipo habilitado

Public Sub TipoModificar(ByVal txt As String, ByVal cod As Decimal)

Me.dalTipo.UpdateQueryTipoModificar(txt, cod)

End Sub

  1. En el método lnkAleatorio_Click que atiende el evento clic del botón lnkAleatorio, que se encuentra en el formulario frmPersonalTipo.aspx, agregaremos las siguientes líneas de código, en la sección del Case “Modificar”:

If Me.txtAleatorio.Text.Length > 0 And _

Me.lbxTipo.SelectedIndex > -1 Then

Me.clsCn.TipoModificar(Me.txtAleatorio.Text, _

Decimal.Parse(Me.lbxTipo.SelectedValue.ToString()))

End If

Crear la lógica de eliminación de datos

Para realizar esta acción, deberemos agregar las siguientes líneas de código en los proyectos CapaDato y CapaNegocio, siguiendo los siguientes pasos.

  1. En el TableAdapter Tipo, que se encuentra en el dataset dsPersonal, definido en el proyecto CapaDato, crearemos una consulta que permitirá eliminar lógicamente un tipo definido, como se muestra a continuación:

UPDATE TIPO SET

TIP_ESTADO = 'I'

WHERE (TIP_CODIGO = @TIP_CODIGO)

Definiendo la consulta UpdateQuery con UpdateQueryTipoEliminar

  1. En la clase de Componente Personal, definido en el proyecto CapaNegocio, agregaremos las siguientes líneas de código:

' eliminar un registro lógicamente

Public Sub TipoEliminar(ByVal cod As Decimal)

Me.dalTipo.UpdateQueryTipoEliminar(cod)

End Sub

  1. En el método lnkAleatorio_Click que atiende el evento clic del botón lnkAleatorio, que se encuentra en el formulario frmPersonalTipo.aspx, agregaremos las siguientes líneas de código, en la sección del Case “Eliminar”:

If Me.lbxTipo.SelectedIndex > -1 Then

Me.clsCn.TipoEliminar( _

Decimal.Parse(Me.lbxTipo.SelectedValue.ToString()))

End If