TUTORIAL DE LA APLICACIÓN

1. Base de Datos

1.1 Creando la Tabla Empleado

CREATE TABLE [Empleado](
 [CodEmpleado] [char](10) NOT NULL,
 [Nombres] [varchar](100) NULL,
 [ApePaterno] [varchar](50) NULL,
 [ApeMaterno] [varchar](50) NULL,
 [FecNacimiento] [date] NULL,
 [CodSexo] [char](3) NULL,
 [Foto] [image] NULL,
 [CodEstado] [char](3) NULL,
 [Terminal] [varchar](15) NULL,
 [FechaRegi] [datetime] NULL,
 [UsuarioRegi] [varchar](15) NULL,
 [FechaModi] [datetime] NULL,
 [UsuarioModi] [varchar](15) NULL,
 CONSTRAINT [PK_Empleado] PRIMARY KEY CLUSTERED 
(
 [CodEmpleado] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

1.2 Procedimientos Almacenados para Generar Codigo, Insertar, Actualizar, Eliminar y Listar

--STORED PROCEDURE PARA GENERAR CODIGO DE EMPLEADO
CREATE PROCEDURE [dbo].[USP_Empleado_GenerarCodigo]
AS
BEGIN
select 
'EMP' +
RIGHT('0000000'+CONVERT(VARCHAR(20),ISNULL(MAX(RIGHT(CodEmpleado,7)),0)+1),7)
from Empleado
END

GO

-- STORED PROCEDURE PARA INSERTAR
CREATE PROCEDURE [dbo].[USP_Empleado_Insertar]
(
 @CodEmpleado char(10),
 @Nombres varchar(100) = NULL,
 @ApePaterno varchar(50) = NULL,
 @ApeMaterno varchar(50) = NULL,
 @FecNacimiento date = NULL,
 @CodSexo char(3) = NULL,
 @Foto image = NULL,
 @CodEstado char(3) = NULL,
 @Terminal varchar(15) = NULL,
 @UsuarioRegi varchar(15) = NULL)
AS

BEGIN
 
  INSERT
  INTO [Empleado]
  (
  [CodEmpleado],
  [Nombres],
  [ApePaterno],
  [ApeMaterno],
  [FecNacimiento],
  [CodSexo],
  [Foto],
  [CodEstado],
  [Terminal],
  [FechaRegi],
  [UsuarioRegi]
  )
  VALUES
  (
  @CodEmpleado,
  @Nombres,
  @ApePaterno,
  @ApeMaterno,
  @FecNacimiento,
  @CodSexo,
  @Foto,
  @CodEstado,
  @Terminal,
  GETDATE(),
  @UsuarioRegi
  )
END

GO

--STORED PROCEDURE PARA ACTUALIZAR
CREATE PROCEDURE [USP_Empleado_Actualizar]
(
 @CodEmpleado char(10),
 @Nombres varchar(100) = NULL,
 @ApePaterno varchar(50) = NULL,
 @ApeMaterno varchar(50) = NULL,
 @FecNacimiento date = NULL,
 @CodSexo char(3) = NULL,
 @Foto image = NULL,
 @CodEstado char(3) = NULL,
 @Terminal varchar(15) = NULL,
 @UsuarioModi varchar(15) = NULL)
AS

BEGIN
  UPDATE [Empleado]
  SET 
  [CodEmpleado] = @CodEmpleado,
  [Nombres] = @Nombres,
  [ApePaterno] = @ApePaterno,
  [ApeMaterno] = @ApeMaterno,
  [FecNacimiento] = @FecNacimiento,
  [CodSexo] = @CodSexo,
  [Foto] = @Foto,
  [CodEstado] = @CodEstado,
  [Terminal] = @Terminal,
  [FechaModi] = GETDATE(),
  [UsuarioModi] = @UsuarioModi
  WHERE
  [CodEmpleado] = @CodEmpleado

END

GO

--STORED PROCEDURE PARA ELIMINAR
CREATE PROCEDURE [USP_Empleado_Eliminar]
(
 @CodEmpleado char(10)
)
AS

BEGIN
 
 DELETE FROM Empleado 
 WHERE [CodEmpleado] = @CodEmpleado

END

GO

--PROCEDURE PARA LISTAR REGISTROS POR CRITERIO DE BUSQUEDA
CREATE PROCEDURE [dbo].[USP_Empleado_Listar]
@Criterio varchar(150)
AS
begin 
select Empleado=ApePaterno+' '+ApeMaterno+' '+Nombres,* from Empleado
where (ApePaterno+''+ApeMaterno+''+Nombres) like '%'+@Criterio+'%'
end

2. Visual Studio 2008

2.1 Creando una solución en blanco

2.2 Añadiendo la Capa de Entidades

Una tabla es una entidad que en nuestro caso sera la tabla "Empleado". Esta entidad es la que recorrerá las distintas capas llevando o trayendo información.
Pasos:
  • Click derecho en la solución("Tutorial_NCapas") creada previamente y elegir la opcion agregar nuevo proyecto.
  • Seleccionar Librería de Clases y nombrarla "BusinessEntities" para identificar que dentro de ese proyecto estarán todas nuestras entidades.

2.2.1 Creando la Clase EmpleadoBE

Pasos:
  • Click derecho en el proyecto "BusinessEntities" y agregar una nueva clase con el nombre de "EmpleadoBE"
  • Agregar el siguiente codigo dentro de la clase "EmpleadoBE"
Public Class EmpleadoBE
    'Campos de la entidad
    Private _CodEmpleado As String
    Private _Nombres As String
    Private _ApePaterno As String
    Private _ApeMaterno As String
    Private _FecNacimiento As Date
    Private _CodSexo As String
    Private _Foto As Byte()
    Private _CodEstado As String
    Private _Terminal As String
    Private _FechaRegi As Date
    Private _UsuarioRegi As String
    Private _FechaModi As Date
    Private _UsuarioModi As String

    'Propiedades de la entidad
    Public Property CodEmpleado() As String
        Get
            Return _CodEmpleado
        End Get
        Set(ByVal value As String)
            _CodEmpleado = value
        End Set
    End Property

    Public Property Nombres() As String
        Get
            Return _Nombres
        End Get
        Set(ByVal value As String)
            _Nombres = value
        End Set
    End Property

    Public Property ApePaterno() As String
        Get
            Return _ApePaterno
        End Get
        Set(ByVal value As String)
            _ApePaterno = value
        End Set
    End Property

    Public Property ApeMaterno() As String
        Get
            Return _ApeMaterno
        End Get
        Set(ByVal value As String)
            _ApeMaterno = value
        End Set
    End Property

    Public Property FecNacimiento() As Date
        Get
            Return _FecNacimiento
        End Get
        Set(ByVal value As Date)
            _FecNacimiento = value
        End Set
    End Property

    Public Property CodSexo() As String
        Get
            Return _CodSexo
        End Get
        Set(ByVal value As String)
            _CodSexo = value
        End Set
    End Property

    Public Property Foto() As Byte()
        Get
            Return _Foto
        End Get
        Set(ByVal value As Byte())
            _Foto = value
        End Set
    End Property

    Public Property CodEstado() As String
        Get
            Return _CodEstado
        End Get
        Set(ByVal value As String)
            _CodEstado = value
        End Set
    End Property

    Public Property Terminal() As String
        Get
            Return _Terminal
        End Get
        Set(ByVal value As String)
            _Terminal = value
        End Set
    End Property

    Public Property FechaRegi() As Date
        Get
            Return _FechaRegi
        End Get
        Set(ByVal value As Date)
            _FechaRegi = value
        End Set
    End Property

    Public Property UsuarioRegi() As String
        Get
            Return _UsuarioRegi
        End Get
        Set(ByVal value As String)
            _UsuarioRegi = value
        End Set
    End Property

    Public Property FechaModi() As Date
        Get
            Return _FechaModi
        End Get
        Set(ByVal value As Date)
            _FechaModi = value
        End Set
    End Property

    Public Property UsuarioModi() As String
        Get
            Return _UsuarioModi
        End Get
        Set(ByVal value As String)
            _UsuarioModi = value
        End Set
    End Property
End Class


2.3 Añadiendo la Capa de Acceso a Datos

Es la encargada de acceder a los datos. Aqui se reciben las solicitudes de almacenamiento o recuperación de información desde la capa de negocio
Pasos:
  • Click derecho en la solución("Tutorial_NCapas") creada previamente y elegir la opcion agregar nuevo proyecto.
  • Seleccionar Biblioteca de Clases y nombrarla "DataAccess" para identificar que dentro de ese proyecto estarán todas las clases que van interactuar con la base datos
  • Click Derecho en el proyecto("DataAccess") y seleccionar "Agregar Referencia".
  • Ubicar la pestaña "Proyectos" y seleccionar como referencia "BusinessEntities" para poder heredar todas las clases creadas en la Capa de Entidades.

Agregar como Referencia la Capa de Entidades

2.3.1 Creando la Clase Conexion

Pasos:
  • Crear una Clase llamada "Conexion" para agregar la cadena de conexion necesaria y poder tener comunicación con la base de datos (SQL Server).
La Clase Conexion.vb
Imports System.Data
Imports System.Data.SqlClient

Public Class Conexion
    Public Function Conexion() As SqlConnection
        'Cambiar la Base de Datos y el Password de acuerdo a su configuracion
        Dim cadconex As String = "Server=.;DATABASE=xxx;User ID=sa;Password=xxx"
        Dim cn As New SqlConnection(cadconex)
        Return cn
    End Function
End Class

2.3.2 Creando la Clase EmpleadoDA

Pasos:
  • Click derecho en el proyecto "DataAccess" y agregar una nueva clase con el nombre de "EmpleadoDA"
  • Agregar el siguiente codigo dentro de la clase "EmpleadoDA"
La Clase EmpleadoDA.vb
Imports BusinessEntities 'Importamos la capa de entidades, si tienen error es porque no se agrego la referencia
Imports System.Data
Imports System.Data.SqlClient

Public Class EmpleadoDA
    'Instanciamos el objeto _Conexion de la clase Conexion para obtener la cadena de conexion a la BD
    Dim _Conexion As New Conexion

    'Funcion que me ve permitir generar el codigo del empleado
    Private Function GenerarCorrelativo() As String
        Dim cmd As New SqlCommand
        Dim da As New SqlDataAdapter
        Dim dt As New DataTable
        cmd.Connection = _Conexion.Conexion
        cmd.CommandText = "USP_Empleado_GenerarCodigo"
        cmd.CommandType = CommandType.StoredProcedure
        da.SelectCommand = cmd
        da.Fill(dt)
        Return dt.Rows(0).Item(0)
    End Function

    'Metodo para registrar un nuevo empleado
    Private Sub Registrar(ByVal EmpleadoBE As EmpleadoBE, ByVal sqlCon As SqlConnection, _
                          ByVal sqlTrans As SqlTransaction)
        Try
            Dim cmd As New SqlCommand
            cmd.CommandText = "USP_Empleado_Insertar"
            cmd.Connection = sqlCon
            cmd.Transaction = sqlTrans
            cmd.CommandType = CommandType.StoredProcedure

            'Los parametros que va recibir son las propiedades de la clase Empleado
            cmd.Parameters.Add("@CodEmpleado", SqlDbType.Char).Value = EmpleadoBE.CodEmpleado
            cmd.Parameters.Add("@Nombres", SqlDbType.VarChar).Value = EmpleadoBE.Nombres
            cmd.Parameters.Add("@ApePaterno", SqlDbType.VarChar).Value = EmpleadoBE.ApePaterno
            cmd.Parameters.Add("@ApeMaterno", SqlDbType.VarChar).Value = EmpleadoBE.ApeMaterno
            cmd.Parameters.Add("@FecNacimiento", SqlDbType.Date).Value = EmpleadoBE.FecNacimiento
            cmd.Parameters.Add("@CodSexo", SqlDbType.Char).Value = EmpleadoBE.CodSexo
            cmd.Parameters.Add("@Foto", SqlDbType.Image).Value = EmpleadoBE.Foto

            cmd.Parameters.Add("@CodEstado", SqlDbType.Char).Value = EmpleadoBE.CodEstado
            cmd.Parameters.Add("@Terminal", SqlDbType.VarChar).Value = EmpleadoBE.Terminal
            cmd.Parameters.Add("@UsuarioRegi", SqlDbType.VarChar).Value = EmpleadoBE.UsuarioRegi

            cmd.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

    End Sub

    'Metodo para Modificar un empleado
    Private Sub Modificar(ByVal EmpleadoBE As EmpleadoBE, ByVal sqlCon As SqlConnection, _
                          ByVal sqlTrans As SqlTransaction)
        Try
            Dim cmd As New SqlCommand
            cmd.CommandText = "USP_Empleado_Actualizar"
            cmd.Connection = sqlCon
            cmd.Transaction = sqlTrans
            cmd.CommandType = CommandType.StoredProcedure

            cmd.Parameters.Add("@CodEmpleado", SqlDbType.Char).Value = EmpleadoBE.CodEmpleado
            cmd.Parameters.Add("@Nombres", SqlDbType.VarChar).Value = EmpleadoBE.Nombres
            cmd.Parameters.Add("@ApePaterno", SqlDbType.VarChar).Value = EmpleadoBE.ApePaterno
            cmd.Parameters.Add("@ApeMaterno", SqlDbType.VarChar).Value = EmpleadoBE.ApeMaterno
            cmd.Parameters.Add("@FecNacimiento", SqlDbType.Date).Value = EmpleadoBE.FecNacimiento
            cmd.Parameters.Add("@CodSexo", SqlDbType.Char).Value = EmpleadoBE.CodSexo
            cmd.Parameters.Add("@Foto", SqlDbType.Image).Value = EmpleadoBE.Foto

            cmd.Parameters.Add("@CodEstado", SqlDbType.Char).Value = EmpleadoBE.CodEstado
            cmd.Parameters.Add("@Terminal", SqlDbType.VarChar).Value = EmpleadoBE.Terminal
            cmd.Parameters.Add("@UsuarioModi", SqlDbType.VarChar).Value = EmpleadoBE.UsuarioModi

            cmd.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

    End Sub

    'Metodo para Eliminar un empleado
    Private Sub Eliminar(ByVal EmpleadoBE As EmpleadoBE, ByVal sqlCon As SqlConnection, _
                          ByVal sqlTrans As SqlTransaction)
        Try
            Dim cmd As New SqlCommand
            cmd.CommandText = "USP_Empleado_Eliminar"
            cmd.Connection = sqlCon
            cmd.Transaction = sqlTrans
            cmd.CommandType = CommandType.StoredProcedure

            cmd.Parameters.Add("@CodEmpleado", SqlDbType.Char).Value = EmpleadoBE.CodEmpleado

            cmd.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

    End Sub

    'Funcion Principal que hara toda la logica para grabar la data
    Public Function GrabarEmpleado(ByVal EmpleadoBE As EmpleadoBE, ByVal flagAccion As String) As Boolean
        Dim resultado As Boolean = True
        Dim cn As New SqlConnection
        Dim sqlTrans As SqlTransaction
        Dim correlativo As String

        cn = _Conexion.Conexion
        cn.Open()
        sqlTrans = cn.BeginTransaction

        Try
            'N:Nuevo   M:Modificar   E:Eliminar 

            If flagAccion = "N" Then
                correlativo = GenerarCorrelativo()
                EmpleadoBE.CodEmpleado = correlativo
                Registrar(EmpleadoBE, cn, sqlTrans)
            End If

            If flagAccion = "M" Then
                Modificar(EmpleadoBE, cn, sqlTrans)
            End If

            If flagAccion = "E" Then
                Eliminar(EmpleadoBE, cn, sqlTrans)
            End If


            sqlTrans.Commit()
            resultado = True

        Catch ex As SqlException
            sqlTrans.Rollback()
            resultado = False
        Catch ex As Exception
            sqlTrans.Rollback()
            resultado = False
        Finally
            cn.Close()
            sqlTrans = Nothing
        End Try

        Return resultado
    End Function


    'Funcion que me va permitir capturar la lista de registros en la tabla empleado y que me va retornar
    'un Datatable
    Public Function ListarEmpleados(ByVal Criterio As String) As DataTable
        Dim cmd As New SqlCommand
        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        cmd.Connection = _Conexion.Conexion
        cmd.CommandText = "USP_Empleado_Listar"
        cmd.CommandType = CommandType.StoredProcedure

        cmd.Parameters.Add("@Criterio", SqlDbType.VarChar).Value = Criterio
        da.SelectCommand = cmd
        da.Fill(dt)
        Return dt
    End Function
End Class



2.4 Añadiendo la Capa Lógica

En esta capa es donde residen los programas que se ejecutan, se reciben las peticiones del usuario y se envían las respuestas tras el proceso.
Pasos:
  • Click derecho en la solución("Tutorial_NCapas") creada previamente y elegir la opcion agregar nuevo proyecto.
  • Seleccionar Biblioteca de Clases y nombrarla "BusinessLogic" para identificar que dentro de ese proyecto estará toda la logica del negocio
  • Click Derecho en el proyecto("BusinessLogic") y seleccionar "Agregar Referencia".
  • Ubicar la pestaña "Proyectos" y seleccionar como referencia "BusinessEntities" para poder heredar todas las clases creadas en la Capa de Entidades y "DataAccess" para poder heredar todas las clases creadas en la Capa de Acceso a Datos
Agregar como Referencia la Capa de Entidades y de Acceso a Datos

2.4.1 Creando la Clase EmpleadoBL

Pasos:
  • Click derecho en el proyecto "BusinessLogic" y agregar una nueva clase con el nombre de "EmpleadoBL"
  • Agregar el siguiente codigo dentro de la clase "EmpleadoBL"
La Clase EmpleadoBL.vb
Imports BusinessEntities 'Importamos la capa de entidades
Imports DataAccess 'Importamos la capa de acceso a datos
Public Class EmpleadoBL
    'Instanciamos el objeto _EmpleadoDA de la Clase EmpleadoDA
    Dim _EmpleadoDA As New EmpleadoDA

    Public Function GrabarEmpleado(ByVal EmpleadoBE As EmpleadoBE, _
                                   ByVal flagAccion As String) As Boolean
        Return _EmpleadoDA.GrabarEmpleado(EmpleadoBE, flagAccion)
    End Function

    Public Function ListarEmpleados(ByVal Criterio As String) As DataTable
        Return _EmpleadoDA.ListarEmpleados(Criterio)
    End Function
End Class


2.5 Añadiendo la Capa de Presentación

Esta capa es la que contiene las interfaces en las que el usuario interactua con el sistema.
Pasos:
  • Click derecho en la solución("Tutorial_NCapas") creada previamente y elegir la opcion agregar nuevo proyecto.
  • Seleccionar Windows Forms Application y nombrarla "Presentacion" para identificar que dentro de ese proyecto estarán todos los formularios.
  • Click Derecho en el proyecto("Presentacion") y seleccionar "Agregar Referencia".
  • Ubicar la pestaña "Proyectos" y seleccionar como referencia "BusinessEntities" para poder heredar todas las clases creadas en la Capa de Entidades y "Business Logic" para poder heredar todas las clases creadas en la Capa Lógica

Agregar como Referencia la Capa de Entidades y la Capa Lógica

2.5.1 Creando el Formulario FrmTutorial

Pasos:
  • Click derecho en el proyecto "Presentacion" y agregar una nuevo formulario con el nombre de "FrmTutorial"
  • SOLO configurar las propiedades indicadas en cada uno de los controles del formulario(Ver Cuadro de Controles), lo que no se indica dejarlo tal como está.

Cuadro de Controles
Botones TextFields ComboBox y DateTimePicker DataGridView y PictureBox
Para el boton "Nuevo":
  • Name: btnNuevo
  • Enable: True
  • Text: Nuevo
Para el boton "Modificar":
  • Name: btnModificar
  • Enable: True
  • Text: Modificar
Para el boton "Eliminar":
  • Name: btnEliminar
  • Enable: True
  • Text: Eliminar
Para el boton "Grabar":
  • Name: btnGrabar
  • Enable: False
  • Text: Grabar
Para el boton "Cancelar":
  • Name: btnCancelar
  • Enable: False
  • Text: Cancelar
Para el boton "Salir":
  • Name: btnSalir
  • Enable: True
  • Text: Salir
Para el boton "+" (Agregar Foto):
  • Name: btnAgregarFoto
  • Enable: False
Para el boton "x" (Quitar Foto):
  • Name: btnQuitarFoto
  • Enable: False
Para el Campo "Codigo":
  • Name: txtCodigo
  • ReadOnly: True
Para el Campo "Apellido Paterno":
  • Name: txtApePaterno
  • ReadOnly: True
Para el Campo "Apellido Materno":
  • Name: txtApeMaterno
  • ReadOnly: True
Para el Campo "Nombres":
  • Name: txtNombres
  • ReadOnly: True
Para el Campo "Ingrese Nombres":
  • Name: txtBusqueda
  • ReadOnly: False
Para el Campo "Registrado Por":
  • Name: txtUsuarioRegistra
  • Enable: False
Para el Campo "Modificado Por":
  • Name: txtUsuarioModifica
  • Enable: False
Para el Combo "Estado":
  • Name: cboEstado
  • Enable: False
  • DropDownStyle: DropDownList
  • Items:(Collection)>> ACTIVO, ANULADO
Para el Combo "Sexo":
  • Name: cboSexo
  • Enable: False
  • DropDownStyle: DropDownList
  • Items:(Collection)>> MASCULINO, FEMENINO
Para el DateTimePicker "Fecha Nacimiento":
  • Name: dtpFecNac
  • Enable: False
  • Format: Short
Para el DateTimePicker "Fecha Reg":
  • Name: dtpFechaRegistro
  • Enable: False
  • Format: Short
Para el DateTimePicker "Fecha Modif":
  • Name: dtpFechaModificacion
  • Enable: False
  • Format: Short
Para el DataGridView:
  • Name: dgvEmpleados
  • Selection Mode: FullRowSelect
Para el PictureBox de la Foto:
  • Name: pbFoto
  • BorderStyle: FixedSingle
  • SizeMode: StretchImage

Ingresar el siguiente codigo dentro del Formulario FrmTutorial
'Importando la Capa de Entidades y la Capa Logica
Imports BusinessEntities
Imports BusinessLogic
'Importacion necesaria para trabajar con las imagenes
Imports System.IO

Public Class FrmTutorial

    '**************  DECLARACION DE VARIABLES GLOBALES ****************'
    Dim _EmpleadoBL As New EmpleadoBL
    Dim flagAccion As String = ""

    '******************** METODOS *************************************'
    Private Sub NueModEli()
        btnNuevo.Enabled = False
        btnModificar.Enabled = False
        btnEliminar.Enabled = False
        btnGrabar.Enabled = True
        btnCancelar.Enabled = True
    End Sub
    Private Sub CancelarGrabar()
        btnNuevo.Enabled = True
        btnModificar.Enabled = True
        btnEliminar.Enabled = True
        btnGrabar.Enabled = False
        btnCancelar.Enabled = False
    End Sub
    Private Sub Habilitar()
        cboEstado.Enabled = True
        txtApePaterno.ReadOnly = False
        txtApeMaterno.ReadOnly = False
        txtNombres.ReadOnly = False
        dtpFecNac.Enabled = True
        cboSexo.Enabled = True
        btnAgregarFoto.Enabled = True
        btnQuitarFoto.Enabled = True
    End Sub
    Private Sub Deshabilitar()
        cboEstado.Enabled = False
        txtApePaterno.ReadOnly = True
        txtApeMaterno.ReadOnly = True
        txtNombres.ReadOnly = True
        dtpFecNac.Enabled = False
        cboSexo.Enabled = False
        btnAgregarFoto.Enabled = False
        btnQuitarFoto.Enabled = False
    End Sub
    Private Sub Limpiar()
        txtCodigo.Clear()
        cboEstado.SelectedIndex = -1
        txtApePaterno.Clear()
        txtApeMaterno.Clear()
        txtNombres.Clear()
        pbFoto.Image = Nothing
        dtpFecNac.Value = Now.Date
        cboSexo.SelectedIndex = -1
    End Sub

    Private Sub ListarEmpleados()
        Dim dtEmpleados As DataTable
        dtEmpleados = _EmpleadoBL.ListarEmpleados(txtBusqueda.Text)
        dgvEmpleados.DataSource = dtEmpleados

        FormatoGrilla()
    End Sub

    Private Function Validar() As Boolean
        If cboEstado.SelectedIndex = -1 Then
            MsgBox("Seleccione Estado", MsgBoxStyle.Critical)
            cboEstado.Focus()
            Return False
        End If
        If txtApePaterno.Text = "" Then
            MsgBox("Ingrese Apellido Paterno", MsgBoxStyle.Critical)
            txtApePaterno.Focus()
            Return False
        End If
        If txtApeMaterno.Text = "" Then
            MsgBox("Ingrese Apellido Materno", MsgBoxStyle.Critical)
            txtApeMaterno.Focus()
            Return False
        End If
        If txtNombres.Text = "" Then
            MsgBox("Ingrese Nombres", MsgBoxStyle.Critical)
            txtNombres.Focus()
            Return False
        End If
        If cboSexo.SelectedIndex = -1 Then
            MsgBox("Seleccione Sexo", MsgBoxStyle.Critical)
            cboSexo.Focus()
            Return False
        End If

        Return True
    End Function

    Private Sub FormatoGrilla()
        With dgvEmpleados
            .Columns(0).Visible = True
            .Columns(0).Width = 410

            .Columns(1).Visible = False
            .Columns(2).Visible = False
            .Columns(3).Visible = False
            .Columns(4).Visible = False
            .Columns(5).Visible = False
            .Columns(6).Visible = False
            .Columns(7).Visible = False
            .Columns(8).Visible = False
            .Columns(9).Visible = False
            .Columns(10).Visible = False
            .Columns(11).Visible = False
            .Columns(12).Visible = False
            .Columns(13).Visible = False
        End With
    End Sub

    Private Sub RecuperarDatosGrilla()
        With dgvEmpleados.CurrentRow
            txtCodigo.Text = .Cells("CodEmpleado").Value
            If (.Cells("CodEstado").Value) = "001" Then cboEstado.SelectedIndex = 0 Else cboEstado.SelectedIndex = 1
            If IsDBNull(.Cells("Nombres").Value) Then txtNombres.Text = "" Else txtNombres.Text = .Cells("Nombres").Value
            If IsDBNull(.Cells("ApePaterno").Value) Then txtApePaterno.Text = "" Else txtApePaterno.Text = .Cells("ApePaterno").Value
            If IsDBNull(.Cells("ApeMaterno").Value) Then txtApeMaterno.Text = "" Else txtApeMaterno.Text = .Cells("ApeMaterno").Value
            If (.Cells("CodSexo").Value) = "001" Then cboSexo.SelectedIndex = 0 Else cboSexo.SelectedIndex = 1
            If IsDBNull(.Cells("FecNacimiento").Value) Then dtpFecNac.Value = "" Else dtpFecNac.Value = .Cells("FecNacimiento").Value

            '''' Recuperando Imagen
            If (.Cells("Foto").Value) IsNot DBNull.Value Then
                Dim byteFoto() As Byte = .Cells("Foto").Value
                Dim recuperaFoto As New IO.MemoryStream(byteFoto)
                pbFoto.Image = System.Drawing.Image.FromStream(recuperaFoto)
            Else
                pbFoto.Image = Nothing
            End If
            ''''''''''''''''''''''''

            If IsDBNull(.Cells("FechaRegi").Value) Then dtpFechaRegistro.Value = "01/01/1900" Else dtpFechaRegistro.Value = Trim(.Cells("FechaRegi").Value)
            If IsDBNull(.Cells("UsuarioRegi").Value) Then txtUsuarioRegistra.Text = "" Else txtUsuarioRegistra.Text = Trim(.Cells("UsuarioRegi").Value)
            If IsDBNull(.Cells("FechaModi").Value) Then dtpFechaModificacion.Value = "01/01/1900" Else dtpFechaModificacion.Value = Trim(.Cells("FechaModi").Value)
            If IsDBNull(.Cells("UsuarioModi").Value) Then txtUsuarioModifica.Text = "" Else txtUsuarioModifica.Text = Trim(.Cells("UsuarioModi").Value)

        End With
    End Sub

    '**********  EL EVENTO LOAD DEL FORMULARIO**********************'
    Private Sub FrmTutorial_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call ListarEmpleados()
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON AGREGAR FOTO*************'
    Private Sub btnAgregarFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarFoto.Click
        Dim Buscar As New OpenFileDialog
        Buscar.Multiselect = False
        Buscar.Filter = "Archivo de Imagen (*.jpg)|*.jpg|Archivo de Imagen (*.gif)|*.gif|Archivo de Imagen (*.png)|*.png|Todos los archivos|*.*"
        Buscar.Title = "Seleccionar archivos"

        If Buscar.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.pbFoto.Image = Image.FromFile(Buscar.FileName)
        End If
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON QUITAR FOTO************'
    Private Sub btnQuitarFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuitarFoto.Click
        pbFoto.Image = Nothing
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON NUEVO********************'
    Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click
        NueModEli()
        Limpiar()
        Habilitar()
        cboEstado.SelectedIndex = 0
        flagAccion = "N"
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON MODIFICAR****************'
    Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click
        If txtCodigo.Text = "" Then
            MsgBox("Seleccione un Registro", MsgBoxStyle.Critical)
            Exit Sub
        End If
        NueModEli()
        Habilitar()
        flagAccion = "M"
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON ELIMINAR****************'
    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click
        If txtCodigo.Text = "" Then
            MsgBox("Seleccione un Registro", MsgBoxStyle.Critical)
            Exit Sub
        End If
       

        If MessageBox.Show("Esta seguro de Eliminar el Registro", _
                           "Tutorial", MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
                           MessageBoxDefaultButton.Button1) = DialogResult.Yes Then

            flagAccion = "E"
            Dim _EmpleadoBE As New EmpleadoBE
            _EmpleadoBE.CodEmpleado = RTrim(txtCodigo.Text)

            If _EmpleadoBL.GrabarEmpleado(_EmpleadoBE, flagAccion) Then
                MsgBox("Se Eliminó El Registro Correctamente", MsgBoxStyle.Information)
                Call ListarEmpleados()
                flagAccion = ""
                CancelarGrabar()
                Deshabilitar()
                Limpiar()
            Else
                MsgBox("Error al Grabar", MsgBoxStyle.Critical)
            End If
        Else
            MsgBox("Se Cancelo la operacion.", MsgBoxStyle.Exclamation)
        End If

       
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON GRABAR***************'
    Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click
        If Validar() = False Then
            Exit Sub
        End If

        Dim _EmpleadoBE As New EmpleadoBE
        _EmpleadoBE.CodEmpleado = RTrim(txtCodigo.Text)
        _EmpleadoBE.ApePaterno = RTrim(txtApePaterno.Text)
        _EmpleadoBE.ApeMaterno = RTrim(txtApeMaterno.Text)
        _EmpleadoBE.Nombres = RTrim(txtNombres.Text)
        _EmpleadoBE.FecNacimiento = dtpFecNac.Value.Date
        '001:MASCULINO    -  002: FEMENINO
        _EmpleadoBE.CodSexo = IIf(cboSexo.SelectedIndex = 0, "001", "002")

        'Capturando la Imagen'
        Dim data() As Byte
        If Not Me.pbFoto.Image Is Nothing Then
            Dim ms As New MemoryStream
            Me.pbFoto.Image.Save(ms, Imaging.ImageFormat.Jpeg)
            data = ms.ToArray
        Else
            data = Nothing
        End If
        _EmpleadoBE.Foto = data
        ''''''''''''''''''''''''''
        '001:ACTIVO    -  002: ANULADO
        _EmpleadoBE.CodEstado = IIf(cboEstado.SelectedIndex = 0, "001", "002")
        _EmpleadoBE.Terminal = System.Environment.MachineName
        _EmpleadoBE.UsuarioRegi = "ADM"
        _EmpleadoBE.UsuarioModi = "ADM"

        If _EmpleadoBL.GrabarEmpleado(_EmpleadoBE, flagAccion) Then
            MsgBox("Datos Grabados Correctamente", MsgBoxStyle.Information)
            flagAccion = ""
            NueModEli()
            CancelarGrabar()
            Deshabilitar()
            Call ListarEmpleados()

        Else
            MsgBox("Error al Grabar", MsgBoxStyle.Critical)
        End If

    End Sub

    
    '**********  EL EVENTO CLICK DEL BOTON CANCELAR***************'
    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        CancelarGrabar()
        Limpiar()
        Deshabilitar()
    End Sub

    '**********  EL EVENTO CLICK DEL BOTON SALIR********************'
    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        Me.Close()
    End Sub

    '**********  EL EVENTO TEXCHANGED DEL TEXTFIELD txtBusqueda ********************'
    Private Sub txtBusqueda_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBusqueda.TextChanged
        Call ListarEmpleados()
    End Sub

    '**********  EL EVENTO CELLCLICK DE LA GRILLA dgvEmpleados ********************'
    Private Sub dgvEmpleados_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvEmpleados.CellClick
        RecuperarDatosGrilla()
    End Sub

End Class

  • Doble Click en "My Project"(que está dentro del proyecto "Presentacion") y seleccionar la opción "Application" (está en la parte laterial izquierda), luego seleccionar a "FrmTutorial" como formulario de inicio (Ver figura)

  • La Estructura de la Solucion "Tutorial_NCapas" debe quedar con la estructura que a continuación se muestra en la figura:

FINALMENTE:
  • Click derecho en la solución "Tutorial_NCapas" y seleccionar lo opcion "Establecer Proyecto de Inicio", luego seleccionar como proyecto de inicio a "Presentacion" (Ver figura).

Video Demostrativo de la Aplicación

1. Tutorial de la Aplicación

1.1. Creacion de un Nuevo Proyecto en Eclipse


Indicaciones:

  • Project Name: AppDataStoreJDO. Puedes cambiar el nombre del proyecto por el que más te guste.
  • Package: com.gae.app. Puedes cambiar el nombre del paquete si deseas.
  • Quitar el "check" en la opción que dice "Use Google Web Toolkit"
  • Click en "Finish"
La estructura de la aplicación por defecto debe ser la siguiente:

1.2. Creando la Clase Empleado

La clase "Empleado" que va a ser la clase encargada de manejar la persistencia de datos.

Indicaciones:

  • Crear un nuevo paquete con el siguiente nombre: com.gae.app.bean
  • Dentro del paquete "com.gae.app.bean" crear una clase con el siguiente nombre: Empleado
Ingresar el siguiente código dentro de la clase Empleado:
package com.gae.app.bean;

import java.util.Date;
import javax.jdo.annotations.*;
import com.google.appengine.api.users.User;

//Especifica que la clase es Persistente
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class Empleado {
 //Va a ser la clave primaria de la clase Empleado
 @PrimaryKey
 //Para que genere el codigo de forma automatica
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Long id;
 @Persistent
 private User user;
 @Persistent
 private String userid;  
 @Persistent
 private String nombres;
 @Persistent
 private String apellidos;
 @Persistent
 private String dni;
 @Persistent
 private String sexo;
 @Persistent
 private Date fechanac;
 @Persistent
 private Date fechareg;
 
 //Constructor de la Clase
 public Empleado
 (User user, String userid, String nombres, String apellidos,
  String dni, String sexo, Date fechanac, Date fechareg)
 {
  this.user=user;
  this.userid=userid;
  this.nombres=nombres;
  this.apellidos=apellidos;
  this.dni=dni;
  this.sexo=sexo;
  this.fechanac=fechanac;
  this.fechareg=fechareg;
 }
 
 //Metodos get y set
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public User getUser() {
  return user;
 }
 public void setUser(User user) {
  this.user = user;
 }
 public String getUserid() {
  return userid;
 }
 public void setUserid(String userid) {
  this.userid = userid;
 }
 public String getNombres() {
  return nombres;
 }
 public void setNombres(String nombres) {
  this.nombres = nombres;
 }
 public String getApellidos() {
  return apellidos;
 }
 public void setApellidos(String apellidos) {
  this.apellidos = apellidos;
 }
 public String getDni() {
  return dni;
 }
 public void setDni(String dni) {
  this.dni = dni;
 }
 public String getSexo() {
  return sexo;
 }
 public void setSexo(String sexo) {
  this.sexo = sexo;
 }
 public Date getFechanac() {
  return fechanac;
 }
 public void setFechanac(Date fechanac) {
  this.fechanac = fechanac;
 }
 public Date getFechareg() {
  return fechareg;
 }
 public void setFechareg(Date fechareg) {
  this.fechareg = fechareg;
 }
}

1.3. Creando la Clase PMF

La clase "PMF" va a tener la variable encargada de controlar las peticiones de registros y búsqueda de la información almacenada.

Indicaciones:
  • Crear un nuevo paquete con el siguiente nombre: com.gae.app.dao
  • Dentro del paquete "com.gae.app.dao" crear una clase con el siguiente nombre: PMF
Ingresar el siguiente código dentro de la clase PMF :
package com.gae.app.dao;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public final class PMF {
 //Variable encargada de controlar las peticiones
 private static final PersistenceManagerFactory
 pmfInstancia=JDOHelper.getPersistenceManagerFactory("transactions-optional");
 
//Para que no puedan instanciar la clase
 private PMF(){}
 
//Retorna la instancia encargada de controlar las peticiones
 public static PersistenceManagerFactory get(){
  return pmfInstancia;
 }  
}

1.4. Creando la Clase EmpleadoDao

La clase "EmpleadoDao" va a tener los métodos para insertar, actualizar, eliminar y/o consultar datos persistentes utilizando JDO(Java Data Objects) y como Query Language a JDOQL .
 
Indicaciones:
  • Dentro del paquete "com.gae.app.dao" crear una clase con el siguiente nombre: EmpleadoDao
Ingresar el siguiente código dentro de la clase EmpleadoDao :
package com.gae.app.dao;

import javax.jdo.PersistenceManager;

import com.gae.app.bean.Empleado;
import java.util.*;
import com.google.appengine.api.users.*;
import javax.jdo.Query;

public class EmpleadoDao { 
 //Metodo para Insertar un Nuevo Registro
 public static void insertarEmpleado
 (User user,String userid,String nombres,String apellidos,String dni, String sexo,
  Date fechanac, Date fechareg) {
  //LLamamos a la clase que tendra la persistencia
  PersistenceManager pm = PMF.get().getPersistenceManager();
  // Nueva variable empleado
  Empleado empleado=new Empleado(user,userid,nombres,apellidos,dni,sexo,
          fechanac,fechareg);
  //Haciendo la persistencia de datos
  pm.makePersistent(empleado);  
 }
 
 @SuppressWarnings("unchecked")
 //Metodo para Listar Empleados
 public static List<Empleado> listarEmpleados(){
  PersistenceManager pm = PMF.get().getPersistenceManager();
  Query query = pm.newQuery("select from "+Empleado.class.getName()+"");  
  return (List<Empleado>) query.execute();
 }
}

1.5. Clase AppDataStoreJDOServlet

Después de realizar los pasos anteriores, proseguiremos a configurar el servlet para procesar las solicitudes y respuestas.
Ingresar el siguiente código fuente dentro del servlet:
package com.gae.app;

import com.gae.app.dao.*;
import com.gae.app.bean.*;
import java.util.*;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.http.*;
import com.google.appengine.api.users.*;

@SuppressWarnings("serial")
public class AppDataStoreJDOServlet extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, IOException
 { 
 if(req.getParameter("action").equals("registrar")){
 UserService userService= UserServiceFactory.getUserService();
    User user=userService.getCurrentUser(); 
    String userid=user.getUserId();
    Date fechareg = new Date();
    Date fechanac = new Date();
    String nombres=req.getParameter("nombres");
    String apellidos=req.getParameter("apellidos");
    String dni=req.getParameter("dni");
 String sexo=req.getParameter("sexo");
   
 try {
  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
  fechanac = sdf.parse(req.getParameter("fechanac"));  
  
 } catch (ParseException e) {
  
  System.out.println("Excepcion:" + e);
 }
   
 EmpleadoDao.insertarEmpleado(user,userid,nombres,apellidos,dni,sexo,fechanac,fechareg);
 
 List<Empleado> empleados = EmpleadoDao.listarEmpleados();
    req.setAttribute("empleados", empleados);
    RequestDispatcher rd =  getServletContext().getRequestDispatcher("/ListarEmpleados.jsp");
    rd.forward(req, resp);
 } 
    }


public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException  
  {
 if(req.getParameter("action").equals("listarEmpleados")){
  List<Empleado> empleados=EmpleadoDao.listarEmpleados();
  req.setAttribute("empleados", empleados);
     RequestDispatcher rd =  getServletContext().getRequestDispatcher("/ListarEmpleados.jsp");
     rd.forward(req, resp);
 } 
  } 
} 



1.6. Creando la Páginas JSP

1.6.1. index.jsp

Esta página contendrá el formulario de registro de un nuevo empleado previamente a un login de acceso(Cuenta en Gmail).
Ingresar el siguiente código en la página index.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="com.google.appengine.api.users.User" %>
<%@ page import="com.google.appengine.api.users.UserService" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory" %>

<html>
<head>
<title>Mantenimiento de Empleados</title>
<link rel="stylesheet" type="text/css" href="css/estilos.css" />
</head>
<body>
<%
    UserService userService = UserServiceFactory.getUserService();
 //Capturamos al Usuario Actual
    User user = userService.getCurrentUser();
    if (user != null) {
%>
<p align="center">&lt;&lt;Bienvenido, <%= user.getNickname() %>&gt;&gt; <a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">Cerrar Sesion</a>
<a href="/empleado?action=listarEmpleados">Listar Empleados</a>
</p>
<form action="/empleado" method="post">
  <div align="center">
  <table border="0" cellspacing="1" cellpadding="5">
      <tr bgcolor="#4B4B5A" style="color: white;" ><td colspan="2" align="center"><h3><u>Mantenimiento de Empleados</u></h3></td></tr>
      <tr>
       <td>Nombres:</td>
       <td><input type="text" name="nombres" /></td>
      </tr>
      <tr>
       <td>Apellidos:</td>
       <td><input type="text" name="apellidos" /></td>
      </tr>
      <tr>
       <td>DNI:</td>
       <td><input type="text" name="dni" /> </td>
      </tr>
      <tr>
      <td>Sexo:</td>
      <td><select name="sexo">
    <option value="-" selected> -- Seleccionar --</option>        
    <option value="M" >Masculino</option>
    <option value="F">Femenino</option>
     </select>
   </td>
      </tr>
      <tr>
       <td>Fecha de Nacimiento:</td>
       <td><input type="text" name="fechanac" />(dia/mes/anio) </td>
      </tr>
      <tr>
       <td colspan="2" align="center">
       <input type="hidden" name="action" value="registrar"/>
       <input type="submit" value="Registrar" class="boton" >
       </td>
      </tr>
   </table>
   </div>
   </form>
<%
    } else {
%>
<p>DEBE INICIAR SESION ... click
<a href="<%= userService.createLoginURL(request.getRequestURI()) %>">AQUI</a>
para loguearse.</p>
<%
    }
%> 
</body>
</html>

1.6.2. ListarEmpleados.jsp

Esta página contendrá un listado de todos los registros de los empleado que hagan los usuarios(logueados).
Ingresar el siguiente código en la página ListarEmpleados.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@page import="com.gae.app.*"%>
<%@page import="com.gae.app.bean.*"%>
<%@page import="com.gae.app.dao.*"%>
<%@page import="java.util.*"%>
<%@page import="java.text.SimpleDateFormat" %>

<%
List<Empleado> empleados =(List<Empleado>)request.getAttribute("empleados");

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
%>
<html>
<head>
<title>Listar Empleados</title>
<link rel="stylesheet" type="text/css" href="css/estilos.css" />
</head>
<body>
<% if (empleados.size() > 0) { %>
  <div align="center">
  <table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
        <tr><td colspan="6" align="center" ><%= empleados.size() %> resultados encontrados ::::: </td></tr>
  <tr align="center" class="cabeceraTable">
   <td><b>#</b></td>
   <td><b>Nombres</b></td>
   <td><b>Apellidos</b></td>
   <td><b>DNI</b></td>
   <td><b>Sexo</b></td>
   <td><b>Fecha de Nacimiento</b></td>   
        
  </tr>
  <% int n=1; %>
  <% for (int i = 0;i<empleados.size();i++) { %>
   <% Empleado e = (Empleado)empleados.get(i); %>
   <tr style="background:#ffffff" onMouseOver="this.style.background='#eeeeee';" onMouseOut="this.style.background='#ffffff';">
    <td><%= n++%></td>     
    <td><%= e.getNombres() %></td>
    <td><%= e.getApellidos()%></td>
    <td align="center"><%= e.getDni() %></td>
    <td align="center"><%= e.getSexo() %></td>
    <td align="center"><%= sdf.format(e.getFechanac())%></td>          
   </tr>
  <% } %>
  </table>
  <% } else { %>
    <table>
    <tr><td>Ningun resultado. </td></tr>
    </table></div>
   <% } %> 
</body>
</html>

estilos.css

body {
  font:12px "Lucida Grande", "Lucida Sans", "Trebuchet MS",verdana, sans-serif;
  color:#4B4B5A;
}
table {
  font:12px "Lucida Grande", "Lucida Sans", "Trebuchet MS",verdana, sans-serif;
  border:1px solid #4B4B5A;
  color: #4B4B5A; 
  font-weight: bold;
}
.boton{
 background-color:#4B4B5A;
 font:11px "Lucida Grande", "Lucida Sans", "Trebuchet MS",verdana, sans-serif;
 color:white;
}
.cabeceraTable{
 background-color:#4B4B5A;
 font:11px "Lucida Grande", "Lucida Sans", "Trebuchet MS",verdana, sans-serif;
 color:white;
}

1.7. Archivo web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <servlet>
  <servlet-name>empleado</servlet-name>
  <servlet-class>com.gae.app.AppDataStoreJDOServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>empleado</servlet-name>
  <url-pattern>/empleado</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>

1.8. Archivo jdoconfig.xml

Dejar el archivo por defecto tal y como se muestra a continuación:
<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

   <persistence-manager-factory name="transactions-optional">
       <property name="javax.jdo.PersistenceManagerFactoryClass"
           value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
       <property name="javax.jdo.option.ConnectionURL" value="appengine"/>
       <property name="javax.jdo.option.NontransactionalRead" value="true"/>
       <property name="javax.jdo.option.NontransactionalWrite" value="true"/>
       <property name="javax.jdo.option.RetainValues" value="true"/>
       <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
   </persistence-manager-factory>
</jdoconfig>

2. Corriendo la Aplicación de Manera Local: localhost:8888


A los usuarios no logueados les aparecerá este mensaje.



Login.


Formulario de Registro de Empleado.



Ingresando Datos de un Nuevo Empleado.


Listando los Registros de todos los Empleados.
viernes, 4 de marzo de 2011

CREAR UN SERVIDOR PROXY CON GOOGLE APP ENGINE

Instala Gratis tu Propio Servidor Proxy


Una simple búsqueda en Google nos devuelve docenas de scripts PHP con los cuales podemos crear servidores proxy gratuitamente. La única limitación con los proxies basados en PHP es que requieren de un servidor para alojar el proxy y en segundo lugar, de un nombre de dominio que actúe de dirección para el proxy.

La mayoría de empresas, escuelas o instituciones públicas, bloquean infinidad de sitios web con la finalidad de no permitir que los empleados o estudiantes disminuyan su productividad o simplemente se distraigan más de lo debido. ¿Qué sucede cuando deseamos y no podemos entrar a un sitio web del trabajo?

Si no dispones de un dominio propio o de espacio en el servidor, aún puedes darte el gusto de crear un servidor proxy personal sin gastar un centavo y sin necesitar de conocimientos técnicos profundos...

Pasos para Crear tu Servidor Proxy

http://trujillosoft-proxy.appspot.com/ es un sitio proxy que tiene acceso a cualquier pagina web (como si estuvieras en tu casa!) y se creo con la finalidad de poder acceder a sitios bloqueados desde cualquier red que tenga restringido el acceso a "ciertos sitios web".
Este ejemplo esta creado con Google App Engine y el proceso es sumamente sencillo.

  • Paso 2. Haz clic en el botón “Create an Application”. Si esta es tu primera vez, Google te enviará un sms de verificación a tu móvil. Escribe el código y ya estas listo para crear tu aplicación con Google App Engine.
  • Paso 3. Escoge el sub-dominio donde alojarás tu servidor proxy. Asegúrate de que el dominio este disponible, acepta los términos y condiciones de Google y da clic en “Save”. Es subdominio será también tu App ID, y servirá para identificar tu aplicación proxy.
  • En el ejemplo, usaremos trujillosoft-proxy como la App ID, pero puedes escoger cualquier otro nombre.
  • Paso 4. Bien, ahora que hemos reservado la ID, es el momento de crear y subir el servidor proxy (la aplicación) a Google App Engine. Vamos a python.org, descargamos el 2.6.4 MSI Installer e instalamos Python.   
  • Paso 5. Una vez que hemos instalado Python, vamos a code.google.com y descargamos el Google App Engine SDK para Python y lo instalamos.  
  • Paso 6. Descargamos este ejemplo fichero ZIP y lo extraemos en alguna carpeta de nuestro escritorio. El fichero ZIP, por curiosidad, contiene un par de archivos de texto (escritos en HTML y Python) que podemos leer con el notepad.
  • Paso 7. Corremos el programa Google App Engine desde el escritorio y establecemos los valores correctos bajo “Edit >> Preferences”.
  • Paso 8. Damos clic en “File >> Add Existing Application” en el programa de Google App y buscamos el archivo "app.yaml" que se encuentra en el directorio creado en el Paso 6. Damos clic en el botón “Edit” y reemplazamos “YOUR_APP_ID” por la ID “subdominio” que hemos reservado en el Paso 3.

Podemos editar el archivo main.html para cambiar la apariencia de tu servidor proxy y puedes colocar los tags de Analytics y Adsense en caso se vuelva popular. La aplicación esta abierta a todos los usuarios, pero deben autenticarse con su cuenta Google para poder montar su servidor proxy.
Copyright © 2014 Trujillo - Perú