You are on page 1of 57

El presente instructivo tiene como objetivo transmitir los conocimientos necesarios para manipular

base de datos con Sql Compact 3.5 SP1, presentando el desarrollo de una aplicacin de una agencia
de viaje utilizando Visual Studio 2008 (Visual Basic).
Pueda que la base de datos no se encuentre completa, pero se tomaron las entidades necesarias
para poder ejemplificar las operaciones bsicas que son: Insercin de datos, actualizar datos,
eliminar datos y consultar datos. Y por ltimo se tomar en cuenta el diseo de un reporte para
cumplir con la ley informtica de entrada proceso salida.

Es un motor de base de datos relacional, de libre descarga y distribucin, tanto para dispositivos
mviles como para aplicaciones escritorio. Especialmente orientada a sistemas ocasionalmente
conectados, ofrece unas caractersticas especialmente tiles para clientes ligeros. La versin ms
reciente es SQL Server Compact 3.5 SP1. Anteriormente era conocida como SQL Server CE o SQL
Server Mobile. Desde la versin 2.0, el lanzamiento de SQL Server Compact ha ido ligado al de
Microsoft Visual Studio .NET.

Nuevas caractersticas de SQL Server Compact 3.5 Service Pack 1


SQL Server Compact 3.5 Service Pack 1 (SP1) est incluido con SQL Server 2008 y Visual Studio 2008
SP1. Para obtener informacin detallada, vea el tema "Lo nuevo en SQL Server Compact Edition" en
los Libros en pantalla de SQL Server Compact 3.5 Service Pack 1.
A partir de la versin de SQL Server Compact 3.5 SP1, SQL Server Compact proporciona las siguientes
caractersticas nuevas para los programadores:
SQL Server Compact admite ADO.NET Entity Framework. Entity Framework permite trabajar con
datos en forma de objetos y propiedades especficos del dominio, como clientes y direcciones de
cliente, sin tener que preocuparse de las tablas y columnas de las bases de datos subyacentes donde
se almacenan dichos datos.
La compatibilidad para ADO.NET Entity Framework permite a los programadores crear consultas
flexibles, con establecimiento inflexible de tipos, contra el contexto del objeto de Entity Framework
utilizando directamente expresiones LINQ y operadores de consulta estndar LINQ directamente del
entorno de desarrollo.
SQL Server Compact admite las intercalaciones con distincin entre maysculas y minsculas en el
nivel de base de datos.
Puede administrar una base de datos SQL Server Compact que est almacenada en un Smart Device
o en un equipo de escritorio utilizando SQL Server Management Studio (SSMS) en SQL Server 2008.

SQL Server Compact proporciona compatibilidad para la replicacin de los nuevos tipos de datos en
SQL Server 2008, como date, time, datetime2, datetimeoffset, geography y geometry. Los nuevos
tipos de datos en SQL Server 2008 corresponden a nchar, nvarchar, image y otros tipos de datos.
Para obtener ms informacin sobre los tipos de datos en SQL Server 2008, vea Tipos de datos en los
Libros en pantalla de SQL Server 2008.
SQL Server Compact se puede ejecutar de forma nativa en un entorno de 64 bits. Los archivos .msi
afectados son Tiempo de ejecucin de 64 bits de SQL Server Compact (SSCERuntime-ENU.msi) y
Herramientas de servidor de 64 bits de SQL Server Compact (SSCEServerTools-ENU.msi). La
compatibilidad para los archivos .msi de 32 bits no ha cambiado. Los programadores que estn
utilizando la implementacin ClickOnce para sus aplicaciones deben especificar las direcciones URL
de descarga de 32 bits y de 64 bits.
SQL Server Compact admite la replicacin de datos con SQL Server 2000, SQL Server 2005 y SQL
Server 2008 mediante Microsoft Synchronization Services for ADO.NET. Microsoft Synchronization
Services for ADO.Net est disponible para equipos de escritorio y dispositivos mviles.
SQL Server Compact admite la replicacin de datos con SQL Server 2005 y SQL Server 2008 mediante
la replicacin de mezcla y el acceso a datos remoto (RDA).
SQL Server Compact incluye la compatibilidad de la versin mejorada entre SQL Server Compact y
SQL Server para la replicacin de mezcla.
Se pueden descargar Herramientas de servidor para configurar la replicacin de mezcla y RDA
mediante SQL Server Compact 3.5 SP1 del Centro de descarga de Microsoft. No se pueden instalar
Herramientas de servidor de SQL Server Compact 3.5 SP1 lado a lado con versiones anteriores de
Herramientas de servidor en el equipo que est actuando como servidor de Internet Information
Services (IIS). Herramientas de servidor de SQL Server Compact 3.5 SP1 pueden replicar datos entre
SQL Server Compact 3.5 y SQL Server 2005 o SQL Server 2008. Herramientas de servidor de SQL
Server Compact 3.5 SP1 tambin admiten la replicacin de datos entre SQL Server 2005 Compact
Edition o SQL Server 2005 Mobile Edition y SQL Server 2005 o SQL Server 2008.
SQL Server Compact admite Windows Server 2008. Para obtener una lista de todas las versiones de
Windows compatibles, vea Requisitos de hardware y software en los Libros en pantalla de SQL Server
Compact.
SQL Server Compact incluye varias mejoras para registro.

La base de datos est estructurada de la siguiente forma:


Tabla Catlogos: Tipo de pago, Categora, Pas, Regin, Ciudad, Sexo, Atracciones, Clientes.
Transaccionales: Viajes con su respectivo detalle.
Reportes: Se van a generar los reportes por viajes, informe econmico mensual.

TABLA TIPOPAGO
sta tabla la vamos a utilizar para que se pueda llenar un combobox en la interfaz y muestre si el
pago el cliente lo va realizar al crdito, contado o con tarjeta de crdito.

TABLA CATEGORIA
sta tabla vamos a almacenar la categora de las atracciones si son: Museo, playa, isla, parques, etc.

TABLA REGION
sta tabla se va a utilizar para almacenar la regin en la que se encuentra el pas (o sea el
continente).

TABLA PAIS
sta tabla se va a utilizar para almacenar los pases por si la atraccin turstica se encuentra en otro
pas que no sea Honduras.

TABLA CIUDAD
sta tabla se va a utilizar para almacenar las ciudades en las que se encuentran las atracciones
tursticas.

TABLA SEXO
Hasta tabla solo va ser utilizada para almacenar Femenino y Masculino, esto con el objetivo de no
saturar la base de datos con demasiados caracteres, pero no se le va ser una catlogo ya que
sabemos que solo esos dos tipos de sexo existen.

TABLA ATRACCIONES
Esta nos va a servir para ir almacenar las atracciones tursticas as como en que categora se
encuentran si son museo, playa, parques, etc. Y la ciudad en la que est ubicada geogrficamente
sta atraccin.

TABLA CLIENTES:
En sta tabla nos interesa almacenar los datos generales de los clientes que van a comprar los
paquetes tursticos de las atracciones.

TABLA VIAJES
Esta tabla va a funcionar como una factura es el mismo proceso viajes es el header por ende va a
tener una que se llame details o detalles ya que en un viaje que va a un atraccin turstica x pueden
ir varios clientes.
Observaciones: En esta parte la tabla puede llevar ms atributos, pero los limitamos a estos ya que
no tenemos una documentacin de una empresa turstica para as saber con certeza todos los datos
que necesitamos almacenar.

TABLA DETALLES DE VIAJES


sta tabla detalles se hace necesario porque en un viaje a x atraccin tursticas pueden ir varios
clientes, y se coloca la casilla de pago por si hay algunos de la tercera edad y se les hace el descuento
de la tercera edad que es de 25%.

Esto es en cuanto a la estructura de las tablas. Por si no se acuerdan como realizar un relacin les voy
a describir los pasos.

Para detallar los pasos se va a crear el Varrel (relacin) entre la tabla de pas y regin.
1. Nos posicionamos en la tabla que contiene la Fk o sea a la que hace referencia en este caso
es pas a regin, entonces nos ubicamos en pas.

2. Damos clic derecho sobre pas y seleccionamos la opcin propiedades.

3. En el men de las propiedades damos clic donde dice agregar relacin.

4. Le escribimos nombre a la relacin en este caso sera RegionPais. Y nos queda la siguiente
configuracin:

5. Ahora le damos clic en agregar columnas. Y nos queda la siguiente pantalla.

6. Ahora le damos clic en agregar relacin. Y nos saldr una ventana de mensaje y le damos
aceptar.

7. Para comprobar que la relacin se realiz de la forma correcta, nos vamos a la opcin
administrar relaciones.

Y listo ya tenemos realizada la relacin entre la tabla pas y regin, por varrel RegionID. (Ver
Videtutorial Crear relaciones en sql compact 3.5 sp1).

La aplicacin la vamos a categorizar desarrollando las interfaces de las tablas catlogos, cabe
mencionar que no todas las tablas catlogos necesitan interfaces, nicamente aquellas que en un
futuro pueden ir generando ms informacin pero las que ya estn establecida no la necesitamos.

El orden en que se va a desarrollar la aplicacin es:


1. Categora
2. Pas
3. Ciudad
4. Atracciones
5. Clientes
6. Viajes
7. Detalles de viajes
La tabla catlogo de las regiones no le vamos a disear una interfaz ya que sabemos que son 5
continentes y que no se va a crear otro, entonces los agregamos directamente en la base de datos.
Antes de iniciar a Disear lo primero que tenemos que establecer es la conexin a la base de datos.
Vamos a copiar la base de datos viajes en la carpeta bin del proyecto.

Esto se hace con el objetivo de tener una visibilidad de la base de datos y poder trabajarla desde el
visual studio sin tener que abrir en administrador de sql server.
1. Nos vamos a la pestaa de server explorer, si usted no ve en su IDE sta pestaa la puede
activar en: View Server Explorer

2. Dar clic derecho en la opcin de data Connections, y seleccionar Add Connections.

3. Nos aparece la siguiente ventana con Microsoft Sql Server como default.

4. Le damos clic en Change, y Seleccionamos Microsoft Server Compact 3.5, y le damos clic en
OK.

5. Le indicamos el path de la base de datos que deseamos utilizar, dando clic en Browse.

6. Cuando hayamos seleccionado la base de datos le damos clic en abrir. Y nos queda el path de
la base de datos.

7. Damos clic en test connection para saber si la conexin a la base de datos fue satisfactoria.

8. Y con esto ya estamos listos.


Nota: Para mayor comprensin remtase al video que se titula agregar una base de datos al
proyecto.

Este mdulo nos va a permitir llamar la conexin a la base de datos en cualquier parte del cdigo.
1. Dar clic donde dice Add new tem. Y seleccionamos un mdulo.

2. Le damos el nombre que deseamos y le damos aceptar y nos manda a la ventana de cdigo
del mdulo.

3. Lo primero que hacemos es importar las libreras necesarias para realizar la conexin.

4. Luego realizamos el cdigo para la Conexin.

5. Y con esto estamos listo para abrir la conexin a la base de datos donde lo necesitemos.

Nota importante: Si tienes problemas porque no te aparece el SqlServerCe para importarlo en la


conexin, esto se debe que se encuentran deshabilitados en los controles.

1. Nos ubicamos en la ventana de los controles. Le damos clic derecho y seleccionamos la


opcin choose tems.

2.

Nos aparece la siguiente ventana y seleccionamos los siguientes elementos.

3. Luego le damos Ok, y se nos van agregar a la barra de controles.

4. Luego arrastramos la que dice SqlCeConnection al formulario y ya con esto estamos listos
para realizar la conexin, y hacer uso de estas referencias.

La interfaz la vamos a disear un poco dinmica que no se vea un formulario esttico.


Por eso el diseo tiene dos fases:
Fase 1:

Fase 2:

DESCRIPCION DE LOS CONTROLES:


Como se observa en la interfaz se necesitan 3 Label, 2 textbox, 3 button, 1 panel, 1 checkbox,
1 ListView.
Descripcin de las propiedades de los controles utilizados
Primer Textbox:
Button Nuevo:
CheckBox
ListView:
Name:
Name: BtnNuevo
Name: ChkVer
TxtIdCategora
Text : Nuevo
Text : Ver Categoras
Name: LsvCategoria
Enabled: False
FullRowSelect: True
Button Guardar:
Panel1 solo para
GridLines: True
Segundo TextBox:
Name: BtnGuardar
contener la label y el
View: Details
Name:
Text: Guardar
listview.

TxtNombreCategora Enabled : Flase


Button Actualizar:
Name: BtnActualizar
Text: Actualizar
Visible: False

Columnas:
1----Name: CategoriaID
Text: Id Categoria
2---Name:
NombreCategoria
Text: Nombre
Categoria.

Ahora que ya tenemos la descripcin de los controles, vamos a lo emocionante a hacerlo funcional
con el cdigo.
Lo primero que vamos hacer es que aparezca en el TxtIdCategoria el nmero correlativo que se va
generando en este caso lo dejamos auto numricos solo nos va a servir como una referencia.
Para eso creamos un sub procedimiento para investigar el nmero correlativo.

' Sub Procedimiento para mostrar el numero correlativo del registro a crear.
Public Sub InvestigarCorrelativo()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("Select max(CategoriaID) + 1 CategoriaID from
Categoria", con)
Dim categoriareader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If categoriareader.Read = True Then
If categoriareader("CategoriaID") Is DBNull.Value Then
Me.TxtIdCategoria.Text = 1
Else
Me.TxtIdCategoria.Text = categoriareader("CategoriaID").ToString
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "Agencia de Viajes")
Finally
con.Close()
End Try
End Sub
Cuando creamos este sub procedimiento desarrollamos la codificacin del Button Nuevo.
Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnNuevo.Click
Me.BtnGuardar.Enabled = True
Call InvestigarCorrelativo()
Me.TxtNombreCategoria.Focus() //Para que le de el enfoque para empezar a escribir.
End Sub

Luego de haber desarrollado el cdigo para el Button Nuevo, vamos a desarrollar el de guardar,
siempre me gusta crear el sub procedimiento para guardar y en el botn hacer el llamado.

' Codigo que se utiliza para guardar los datos generales de la categora.
Sub GuardarCategoria()
Try
Dim Categoria As String
Categoria = " Insert Into categoria " _
& " (NombreCategoria) " _
& " values ( '" & Trim(Me.TxtNombreCategoria.Text) & "') "
con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(Categoria, con)
Command.ExecuteNonQuery()
MessageBox.Show("Los datos de la Categora se ingresaron correctamente", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Cdigo del button Guardar.


Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnGuardar.Click
Call GuardarCategoria()
Call limpiar()
Me.BtnGuardar.Enabled = False
End Sub

Notamos que se llama a un sub procedimiento limpiar para que limpie los textbox y no lo hemos
declarado, entonces vamos a desarrollar el cdigo para que el sub procedimiento est listo.
Public Sub limpiar()
Me.TxtIdCategoria.Text = Nothing
Me.TxtNombreCategoria.Text = Nothing
End Sub

Ahora que ya estamos almacenando informacin, es necesario consultarla, para darnos cuenta que la
informacin se est almacenando fsicamente en la base de datos.
Para esto ya tenemos que tener configurado el ListView anteriormente he detallado las mismas.
En primer lugar vamos a desarrollar el cdigo de la consulta que va a poblar de datos al ListView.

'' Sub Procidimiento para consultar los datos de las categoras en la base de datos.
Public Sub ConsultarCategorias()
Me.LsvCategoria.Items.Clear()
Try
Dim sql As String = "Select CategoriaID, NombreCategoria from Categoria "
con.Open()
Dim ConsultaC As New SqlServerCe.SqlCeCommand(sql, con)
Dim Lector As SqlServerCe.SqlCeDataReader = ConsultaC.ExecuteReader()
While Lector.Read
With Me.LsvCategoria.Items.Add(Lector.Item("CategoriaID").ToString)
.SubItems.Add(Lector.Item("NombreCategoria").ToString)
End With
End While
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Ahora que tenemos codificado el sub procedimiento para poblar el listview va a realizar la
programacin en el CheckBox ya que nuestra interfaz tiene dos fases, que ya las expliqu
anteriormente.
Cuando ejecutemos el formulario para agregar categora se tiene que ver de esta forma:

Ahora agregamos el cdigo que va ir en el checkbox porque este nos va a permitir jugar con las
dimensiones del formulario, aclaro que stas son las dimensiones de mi form, usted tendr que
adaptar a las dimensiones de su formulario.

Private Sub ChkVer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles ChkVer.CheckedChanged
If Me.ChkVer.Checked = True Then
Me.Panel1.Visible = True
Me.Width = 434
Me.Height = 383
Call ConsultarCategorias()
Else
Me.Panel1.Visible = False
Me.Width = 434
Me.Height = 187
End If
End Sub

Con la programacin del cdigo de check box cuando le demos clic nos tiene que salir lo siguiente:

Ahora vamos a retomar el asunto de la actualizacin de registros, en esta interfaz va a seguir el


siguiente procedimiento, al darle doble clic en la fila donde se encuentra el registro nos va a pasar

esos valores a las textbox , para que all podramos hacer la modificacin correspondiente, y luego
darle clic en el boton actualizar.
Un registro listo para ser editado se ver de la siguiente forma:

Como podemos observar al darle doble clic al registro se pone como visible el button actualizar.
Ahora vamos a escribir el cdigo que se necesita para realizar esta operacin. Lo vamos a realizar en
el evento doble clic del control ListView.

Private Sub LsvCategoria_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles


LsvCategoria.DoubleClick
Me.TxtIdCategoria.Text = Me.LsvCategoria.FocusedItem.Text
Me.TxtNombreCategoria.Text = Me.LsvCategoria.FocusedItem.SubItems(1).Text
Me.BtnActualizar.Visible = True
Me.BtnNuevo.Enabled = False
End Sub

Ahora vamos a crear el sub procedimiento que va a actualizar el registro seleccionado.


' Codigo que se utiliza para actualizar los datos de las categoras.
Sub ActualizarCategoria()
Try
Dim Categoria As String
Categoria = " Update categoria " _
& " set NombreCategoria = '" & Me.TxtNombreCategoria.Text & "' " _
& " where CategoriaID = " & Val(Me.TxtIdCategoria.Text) & ""

con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(Categoria, con)
Command.ExecuteNonQuery()
MessageBox.Show("Los Datos de la categoria se actualizaron satisfactoriamente", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Vamos ahora a escribir el cdigo que va a tener el button actualizar.


Private Sub BtnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BtnActualizar.Click
Call ActualizarCategoria()
Call limpiar()
Call ConsultarCategorias()
Me.BtnNuevo.Enabled = True
Me.BtnActualizar.visible = false
End Sub

Como se haba mencionado las interfaces de los formularios de las tablas catlogos llevan dos fases.
Nada ms que en este formulario se le agrega un control ms un combobox, ya que un pas
pertenece a una regin (Continente) en s (Amrica, Oceana, Asia, Europa, Africa). Y como sta es
una informacin que no va a generar un nuevo registro entonces almacenamos los datos de forma
manual y la mostramos en el combobox que lo llamaremos CboRegion.
Fase 1:

Fase 2:

Descripcin de las propiedades de los controles utilizados


Primer Textbox:
Button Nuevo:
CheckBox
ListView:
Name: TxtIdPais
Name: BtnNuevo
Name: ChkVer
Enabled: False
Text : Nuevo
Text : Ver Pases
Name: LsvPais
FullRowSelect: True
Segundo TextBox:
Button Guardar:
Panel1 solo para
GridLines: True
Name:
Name: BtnGuardar
contener la label y el
View: Details
TxtNombrePais.
Text: Guardar
listview.
MaxLength: 100
Enabled : Flase
Columnas:
1----Combobox
Button Actualizar:
Name: PaisID
Name: CboRegion
Name: BtnActualizar
Text: Id Pais
Text: Actualizar
Visible: False
2---Name: NombrePais
Text: Nombre Pais
3---Name: Region
Text: Regin

Lo primero que vamos hacer es que aparezca en el TxtidCiudad el nmero correlativo que se va
generando en este caso lo dejamos auto numricos solo nos va a servir como una referencia.
Para eso creamos un sub procedimiento para investigar el nmero correlativo.

' Sub Procedimiento para mostrar el numero correlativo del registro a crear.
Public Sub InvestigarCorrelativo()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("Select max(PaisID) + 1 PaisID from Pais", con)
Dim PaisReader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If PaisReader.Read = True Then
If PaisReader ("PaisID") Is DBNull.Value Then
Me.TxtIdPais.Text = 1
Else
Me. TxtIdPais.Text = PaisReader ("PaisID").ToString
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "Agencia de Viajes")
Finally
con.Close()
End Try
End Sub

Ahora creamos el sub procedimiento que va a poblar de datos el combobox regin ya que lo vamos a
llamar en el botn nuevo.

Public Sub LlenarComboRegion()


'Muestra todas las regiones (continentes) disponibles en la base de datos
Try
Dim Region As String
Dim Ds As New DataSet
con.Open()
Region = "Select RegionID, NombreRegion " _
& " from Region " _
& " Order By RegionID Asc "
Dim da As New SqlServerCe.SqlCeDataAdapter(Region, con)
Dim dt As New DataTable
da.Fill(Ds, "Region")
Me.CboRegion.DataSource = Ds.Tables(0)
Me.CboRegion.DisplayMember = Ds.Tables(0).Columns("NombreRegion").ToString
Me.CboRegion.ValueMember = Ds.Tables(0).Columns("RegionID").ToString
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Ahora si estamos listo para escribir el cdigo del botn nuevo.
Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnNuevo.Click
Call InvestigarCorrelativo()
Me.TxtNombrePais.Focus()
Call LlenarComboRegion()
Me.BtnGuardar.Enabled = True
End Sub
Ahora vamos al boton guardar, tomando en cuenta la seguridad que planti en el formulario catlogo
anterior.
El cdigo de la funcin quedara de la siguiente forma:
' Cdigo que se utiliza para validar el registro y no se ingrese duplicado.
Private Function ExisteRegistro() As Boolean
Try
Dim Pais As String = "Select Count(NombrePais) from Pais where NombrePais = "

Pais &= " '" & Trim(Me.TxtNombrePais.Text) & "'"


con.Open()
Dim sql As New SqlServerCe.SqlCeCommand(Pais, con)
Dim i As Integer
i = CInt(sql.ExecuteScalar())
If i > 0 Then
Return True
Else
Return False
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Function

Ahora utilizamos esa funcin en nuestro sub procedimiento de guardar.


Public Sub guardar()
If ExisteRegistro() = False Then
Try
Dim Pais As String
Pais = " Insert Into Pais " _
& " (NombrePais, RegionID) " _
& " values ( '" & Trim(Me.TxtNombrePais.Text) & "'," & Me.CboRegion.SelectedValue & ")"
con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(Ciudad, con)
Command.ExecuteNonQuery()
MessageBox.Show("Los datos del pas se ingresaron correctamente", "Agencia de Viajes",
MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try

Else
MessageBox.Show("Ya existe este pas en la base de datos", "Agencia de Viajes",
MessageBoxButtons.OK, MessageBoxIcon.Information)
Call Limpiar()
Exit Sub
End If
End Sub

En el sub procedimiento de guardar hacemos referencias al sub procedimiento limpiar y no lo hemos


creado, entonces quedara de la siguiente forma:
Public Sub limpiar()
Me.TxtIdPais.Text = Nothing
Me.TxtNombrePais.Text = Nothing
Me.CboRegion.DataSource = Nothing
Me.CboRegion.Text = Nothing
End Sub
Ahora colocamos la codificacin que va en el botn guardar.
Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnGuardar.Click
Call guardar()
Call limpiar()
Me.BtnGuardar.Enabled = False
End Sub
Hasta aqu ya estamos almacenando datos en la base de datos, ahora vamos a consultar si esos datos
estan fisicamente en la misma, y es cuando vamos a hacer uso del listview, poblandolo con una
consulta utilizando un inner join natural.
Lo primero que vamos hacer es el diseo de la consulta para que poble de informacin al listview.

'' Sub Procidimiento para consultar los datos de los pases en la base de datos.
Public Sub ConsultarPaises()
Me.LsvPais.Items.Clear()
Try
Dim sql As String = "Select a.PaisID, a.NombrePais, b.NombreRegion " _
& "From Pais a inner join Region b on a.RegionId = b.RegionId"
con.Open()
Dim ConsultaC As New SqlServerCe.SqlCeCommand(sql, con)
Dim Lector As SqlServerCe.SqlCeDataReader = ConsultaC.ExecuteReader()
While Lector.Read

With Me.LsvPais.Items.Add(Lector.Item("PaisID").ToString)
.SubItems.Add(Lector.Item("NombrePais").ToString)
.SubItems.Add(Lector.Item("NombreRegion").ToString)
End With
End While
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Ahora el cdigo del checkbox que va a mostrar el listview.


Private Sub ChkVer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles ChkVer.CheckedChanged
If Me.ChkVer.Checked = True Then
Me.Panel1.Visible = True
Me.Width = 417
Me.Height = 377
Call ConsultarPaises()
Else
Me.Panel1.Visible = False
Me.Width = 417
Me.Height = 202
End If
End Sub
Ahora pasamos a la parte de actualizar registros.
Primero codificamos que cuando se le de doble clic al registro en el listview pase los datos a las
textbox y combobox.
Private Sub LsvPais_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles
LsvPais.DoubleClick
Me.TxtIdPais.Text = Me.LsvPais.FocusedItem.Text
Me.TxtNombrePais.Text = Me.LsvPais.FocusedItem.SubItems(1).Text
Call LlenarComboRegion()
Me.CboRegion.Text = Me.LsvPais.FocusedItem.SubItems(2).Text
Me.BtnActualizar.Visible = True
Me.BtnNuevo.Enabled = False
End Sub

Ahora creamos el sub procedimiento para actualizar, los datos en la base de datos.
' Codigo que se utiliza para actualizar los datos de los paises.
Sub ActualizarPaises()
Try
Dim Pais As String
Pais = " Update Pais " _
& " set NombrePais = '" & Me.TxtNombrePais.Text & "'," _
& " RegionID = " & Me.CboRegion.SelectedValue & "" _
& " where PaisID = " & Val(Me.TxtIdPais.Text) & ""
con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(Pais, con)
Command.ExecuteNonQuery()
MessageBox.Show("Los Datos del pas se actualizaron satisfactoriamente", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Sigue la codificacin del botn actualizar.
Private Sub BtnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BtnActualizar.Click
Call ActualizarPaises()
Call limpiar()
Call ConsultarPaises()
Me.BtnNuevo.Enabled = True
Me.BtnActualizar.Visible = False
End Sub

Como se haba mencionado las interfaces de los formularios de las tablas catlogos llevan dos fases.
Nada ms que en este formulario se le agrega un control ms un combobox, ya que tenemos una
dependencia funcional en cuanto a ciudad con pas, entonces le vamos asignar a la ciudad el pas al
cual pertenece entonces decimos que ciudad es funcionalmente dependiente de pas. En ste
contexto es necesario tomar en cuenta al momento de disear las interfaces cual necesitamos
primero para crear la otra.

Fase 1:

Fase 2:

Descripcin de las propiedades de los controles utilizados


Primer Textbox:
Button Nuevo:
CheckBox
ListView:
Name: TxtIdCiudad
Name: BtnNuevo
Name: ChkVer
Enabled: False
Text : Nuevo
Text : Ver Ciudades
Name: LsvCiudades
FullRowSelect: True
Segundo TextBox:
Button Guardar:
Panel1 solo para
GridLines: True
Name:
Name: BtnGuardar
contener la label y el
View: Details
TxtNombreCiudad
Text: Guardar
listview.
MaxLength: 200
Enabled : Flase
Columnas:
1----Combobox
Button Actualizar:
Name: CiudadID
Name: CboPais
Name: BtnActualizar
Text: Id Ciudad
Text: Actualizar
Visible: False
2---Name: NombreCiudad
Text: Nombre Ciudad
3---Name: Pais
Text: Pas

Lo primero que vamos hacer es que aparezca en el TxtIdCiudad es el nmero correlativo que se va
generando en este caso lo dejamos auto numricos solo nos va a servir como una referencia.
Para eso creamos un sub procedimiento para investigar el nmero correlativo.

' Sub Procedimiento para mostrar el numero correlativo del registro a crear.
Public Sub InvestigarCorrelativo()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("Select max(CiudadID) + 1 CiudadID from
Ciudad", con)
Dim ciudadreader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If ciudadreader.Read = True Then
If ciudadreader("CiudadID") Is DBNull.Value Then
Me.TxtIdCiudad.Text = 1
Else
Me.TxtIdCiudad.Text = ciudadreader("CiudadID").ToString
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "Agencia de Viajes")
Finally
con.Close()
End Try
End Sub

Ahora creamos el sub procedimiento que va a poblar de datos el combobox Pas ya que lo vamos a
llamar en el botn nuevo.

Public Sub LlenarComboPais()


'Muestra todas los pases disponibles en la base de datos
Try
Dim pais As String
Dim Ds As New DataSet
con.Open()
pais = "Select PaisID, NombrePais " _
& " From Pais " _
& " Order By PaisID Asc "
Dim da As New SqlServerCe.SqlCeDataAdapter(pais, con)
Dim dt As New DataTable
da.Fill(Ds, "pais")
Me.CboPais.DataSource = Ds.Tables(0)
Me.CboPais.DisplayMember = Ds.Tables(0).Columns("NombrePais").ToString
Me.CboPais.ValueMember = Ds.Tables(0).Columns("PaisID").ToString
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Ahora si estamos listo para escribir el cdigo del botn nuevo.

Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


BtnNuevo.Click
Me.BtnGuardar.Enabled = True
Call InvestigarCorrelativo()
Me.TxtNombreCiudad.Focus()
Call LlenarComboPais()
End Sub
Ahora vamos al boton guardar, pero antes nos vamos a deterner en un punto importante que obvi
en la primera catlogo y es en cuanto a la duplicidad de datos, vamos a disear una funcin que me
permita verificar si la ciudad que estoy registrando ya existe en la base de datos y si ya existe que no
me permita duplicarlo.

El cdigo de la funcin quedara de la siguiente forma:


' Cdigo que se utiliza para validar el registro y no se ingrese duplicado.
Private Function ExisteRegistro() As Boolean
Try
Dim Ciudad As String = "Select Count(NombreCiudad) from Ciudad where NombreCiudad = "

Ciudad &= " '" & Trim(Me.TxtNombreCiudad.Text) & "'"


con.Open()
Dim sql As New SqlServerCe.SqlCeCommand(Ciudad, con)
Dim i As Integer
i = CInt(sql.ExecuteScalar())
If i > 0 Then
Return True
Else
Return False
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Function
Ahora utilizamos esa funcin en nuestro sub procedimiento de guardar.
Public Sub guardar()
If ExisteRegistro() = False Then
Try
Dim Ciudad As String
Ciudad = " Insert Into Ciudad " _
& " (NombreCiudad, PaisID) " _
& " values ( '" & Trim(Me.TxtNombreCiudad.Text) & "'," & Me.CboPais.SelectedValue & ")"
con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(Ciudad, con)
Command.ExecuteNonQuery()
MessageBox.Show("Los datos de la ciudad se ingresaron correctamente", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)

Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
Else
MessageBox.Show("Ya existe esta ciudad en la base de datos", "Agencia de Viajes",
MessageBoxButtons.OK, MessageBoxIcon.Information)
Call Limpiar()
Exit Sub
End If
End Sub
En el sub procedimiento de guardar hacemos referencias al sub procedimiento limpiar y no lo hemos
creado, entonces quedara de la siguiente forma:
Public Sub limpiar()
Me.TxtIdCiudad.Text = Nothing
Me.TxtNombreCiudad.Text = Nothing
Me.CboPais.DataSource = Nothing
Me.CboPais.Text = Nothing
End Sub
Ahora colocamos la codificacin que va en el botn guardar.
Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnGuardar.Click
Call guardar()
Call limpiar()
Me.BtnGuardar.Enabled = False
End Sub

Hasta aqu ya estamos almacenando datos en la base de datos, ahora vamos a consultar si esos datos
estan fisicamente en la misma, y es cuando vamos a hacer uso del listview, poblandolo con una
consulta utilizando un inner join.
Lo primero que vamos hacer es el diseo de la consulta para que poble de informacin al listview.

'' Sub Procidimiento para consultar los datos de las ciudades en la base de datos.
Public Sub ConsultarCiudades()
Me.LsvCiudades.Items.Clear()
Try

Dim sql As String = "Select a.CiudadID, a.NombreCiudad, b.NombrePais " _


& "From Ciudad a inner join Pais b on a.PaisID = b.PaisID"
con.Open()
Dim ConsultaC As New SqlServerCe.SqlCeCommand(sql, con)
Dim Lector As SqlServerCe.SqlCeDataReader = ConsultaC.ExecuteReader()
While Lector.Read
With Me.LsvCiudades.Items.Add(Lector.Item("CiudadID").ToString)
.SubItems.Add(Lector.Item("NombreCiudad").ToString)
.SubItems.Add(Lector.Item("NombrePais").ToString)
End With
End While
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Ahora el cdigo del checkbox que va a mostrar el listview.


Private Sub ChkVer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles ChkVer.CheckedChanged
If Me.ChkVer.Checked = True Then
Me.Panel1.Visible = True
Me.Width = 419
Me.Height = 383
Call ConsultarCiudades()
Else
Me.Panel1.Visible = False
Me.Width = 419
Me.Height = 208
End If
End Sub
Ahora pasamos a la parte de actualizar registros.
Primero codificamos que cuando se le de doble clic al registro en el listview pase los datos a las
textbox y combobox.

Private Sub LsvCiudades_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles


LsvCiudades.DoubleClick
Me.TxtIdCiudad.Text = Me.LsvCiudades.FocusedItem.Text
Me.TxtNombreCiudad.Text = Me.LsvCiudades.FocusedItem.SubItems(1).Text
Call LlenarComboPais()
Me.CboPais.Text = Me.LsvCiudades.FocusedItem.SubItems(2).Text
Me.BtnActualizar.Visible = True
Me.BtnNuevo.Enabled = False
End Sub
Ahora creamos el sub procedimiento para actualizar, los datos en la base de datos.
' Codigo que se utiliza para actualizar los datos de las ciudades

Sub ActualizarCiudades()
Try
Dim Ciudad As String
Ciudad = " Update Ciudad " _
& " set NombreCiudad = '" & Me.TxtNombreCiudad.Text & "'," _
& " PaisID = " & Me.CboPais.SelectedValue & "" _
& " where CiudadId = " & Val(Me.TxtIdCiudad.Text) & ""
con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(Ciudad, con)
Command.ExecuteNonQuery()
MessageBox.Show("Los Datos de la ciudad se actualizaron satisfactoriamente", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Sigue la codificacin del botn actualizar.
Private Sub BtnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BtnActualizar.Click
Call ActualizarCiudades()
Call limpiar()
Call ConsultarCiudades()
Me.BtnNuevo.Enabled = True
Me.BtnActualizar.Visible = False
End Sub

Como toda la dinmica igual sta va a tener dos fases, para que se vea algo de interaccin. Nos
encontramos ante una tabla que tiene dos referencias a tablas distintas por esto sta lleva un poco
ms de cdigo, pero bsicamente es la misma lgica de las que venamos haciendo.
Tambin se va a notar un poco ms de complejidad ya que vamos a implementar ms controles. Pero
eso lo va hacer interesante, aclarando que sta fue mi forma de visualizar para dar un ejemplo, usted
con los conocimientos bsicos puede disear la interfaz de su aplicativo empleando toda su
creatividad.
Es importante mencionar que en sta interfaz vamos a necesitar importar dos libreras, ya que las
fotos le vamos a dar un tratamiento binario para que se puedan almacenar en la base de datos.
Las libreras son:
Imports System.Data
Imports System.IO

Fase 1:

T1

T2

C1

P1

C2

T3
k1

B1

B2

T4

B3

Descripcin de las propiedades de los controles utilizados


Primer Textbox (T1):
Name: TxtIdAtraccion
Enabled: False

Button Nuevo (B1):


Name: BtnNuevo
Text : Nuevo

CheckBox (k1):
Name: ChkVer
Text : Ver Atracciones

Segundo TextBox (T2):


Name: TxtNombreAtraccion
MaxLength: 200

Button Guardar (B2):


Name: BtnGuardar
Text: Guardar
Enabled : Flase

PictureBox (P1):
Name: PcbAtraccion
BorderStyle: FixedSingle
SizeMode: StretchImage
ToolTip on ToolTip1:
"De doble clic para seleccionar una foto"

Tercer TextBox (T3):


Name: TxtDescripcion
MaxLength: 200
Cuarto TextBox (T4):
Name: TxtMensaje
Primer Combobox (C1):
Name: CboCategora

Button Actualizar (B3):


Name: BtnActualizar
Text: Actualizar
Visible: False
Segundo ComboBox (C2):
Name: CboPas

ToolTip1 y un OpenFileDialog1

Fase 2

L1

P1

Lv1

P2
L3

K1

L2

Descripcin de las propiedades de los controles utilizados


Label (L1):
Text: Atracciones agregadas al
sistemas.

PictureBox (P1):
Name: PcbAtraccionVer
SizeMode: StretchImage

LinkLabel (L2):
Name: LinkLabel1

Panel (P2):
Name: VerFotoPanel

Label (L3):
Name: LblAtraccion
Text: Cerrar
CheckBox (K1):
Name: ChkVerFoto
Text: Ver Foto

ListView (Lv1):
Columnas.
1---Name: AtraccionID
Text: Id Atraccion
Width: 70

2---Name: NombreAtraccion
Text: Nombre Atraccin
Width: 200

5---Name: Ciudad
Text: Ciudad
Width: 130

3---Name: Descripcion
Text: Descripcin
Width: 200
4---Name: Categoria
Text: Categora
Width: 130

Espero que haya quedado claro, o que se entienda bien cada uno de los controles, ahora voy a
explicar la que contiene todos esos controles, aqu se ha utilizado lo que es el control TabControl, con
dos TabPages.
La primera TabPage en la propiedad name: TbpAtraccion y en la propiedad text: Atracciones.
La segunda TabPage en la propiedad name: TbpVerAtracciones y en la propiedad Text: Ver
Atracciones.
Ahora s, despus de haber salido de este enrollo de la explicacin de los controles vamos a pasar a la
parte de la codificacin.
Lo primero, como en todos los formularios es crear el cdigo de investigar el numero correlativo de
la transaccin, recuerde que todas las tablas tienen identity true en su atributo Clave por ende estn
auto numricos, pero lo visualizamos para que nos sirva de referencia nada ms.

' Sub Procedimiento para mostrar el numero correlativo del registro a crear.
Public Sub InvestigarCorrelativo()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("Select max(AtraccionID) + 1 AtraccionID from
Atraccion", con)
Dim atraccionreader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If atraccionreader.Read = True Then
If atraccionreader("AtraccionID") Is DBNull.Value Then
Me.TxtIdAtraccion.Text = 1
Else
Me.TxtIdAtraccion.Text = atraccionreader("AtraccionID").ToString
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "Agencia de Viajes")
Finally
con.Close()
End Try
End Sub
Ahora llenaremos los combobox que vamos a necesitar para que se facilite al usuario la seleccin de
la categora de la atraccin y la ciudad a la que pertenece.
Public Sub LlenarComboCategoria()
'Muestra todas categoras disponibles en la base de datos
Try
Dim Categoria As String
Dim Ds As New DataSet
con.Open()
Categoria = "Select CategoriaID, NombreCategoria " _
& " From Categoria " _
& " Order By CategoriaID Asc "
Dim da As New SqlServerCe.SqlCeDataAdapter(Categoria, con)
Dim dt As New DataTable
da.Fill(Ds, "Categoria")
Me.CboCategoria.DataSource = Ds.Tables(0)
Me.CboCategoria.DisplayMember = Ds.Tables(0).Columns("NombreCategoria").ToString
Me.CboCategoria.ValueMember = Ds.Tables(0).Columns("CategoriaID").ToString
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Public Sub LlenarComboCiudad()


'Muestra todas las ciudades disponibles en la base de datos
Try
Dim Ciudades As String
Dim Ds As New DataSet
con.Open()
Ciudades = "Select CiudadID, NombreCiudad " _
& " From Ciudad " _
& " Order By CiudadID Asc "
Dim da As New SqlServerCe.SqlCeDataAdapter(Ciudades, con)
Dim dt As New DataTable
da.Fill(Ds, "Ciudades")
Me.CboCiudad.DataSource = Ds.Tables(0)
Me.CboCiudad.DisplayMember = Ds.Tables(0).Columns("NombreCiudad").ToString
Me.CboCiudad.ValueMember = Ds.Tables(0).Columns("CiudadID").ToString
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Seguimos con creando el cdigo que va tener el botn nuevo.


Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnNuevo.Click
Me.BtnGuardar.Enabled = True
Call InvestigarCorrelativo()
Me.TxtNombreAtraccion.Focus()
Call LlenarComboCategoria()
Call LlenarComboCiudad()
Me.CboCategoria.Text = "Seleccione"
Me.CboCiudad.Text = "Seleccione"
End Sub
Ya estamos preparados para agregar un nuevo registro a nuestra base de datos, entonces se prosigue
con la creacin del sub procedimiento que va almacenar los datos en la base de datos. Tomando en
cuenta que usted puede desarrollar el cdigo dentro del botn guardar, pero a m me gusta la opcin
de crear el sub procedimiento porque as me deja con ms libertad de realizar otras transacciones en
el botn guardar.
Hay que tomar en cuenta que tenemos en este formulario una picturebox que va a capturar la foto
de la atraccin tursticas por ende necesitamos agregar el control
ir el en doble clic de la picturebox.

y el cdigo va

Private Sub PcbAtraccion_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles


PcbAtraccion.DoubleClick
If Me.OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Try

Me.PcbAtraccion.Image = Image.FromFile(OpenFileDialog1.FileName)
Catch ex As BadImageFormatException
MessageBox.Show("Formato incorrecto", "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show("Error al intentar abrir el archivo de imagen " & ex.Message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub
Ya con ste cdigo podemos desarrollar el cdigo para el sub procedimiento guardar().
' Sub Procedimiento que nos permitir ingresar datos en la base de datos.
Public Sub Guardar()
Try
'' Manejo de la foto
Dim oStream As New MemoryStream()
Me.PcbAtraccion.Image.Save(oStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim oBytes(oStream.Length - 1) As Byte
oStream.Position = 0
oStream.Read(oBytes, 0, Convert.ToInt32(oStream.Length))
oStream.Close()
'________________________________________________________________
Dim sql As String
sql = "Insert into Atraccion "
sql &= "(NombreAtraccion, Descripcion, CategoriaID, CiudadID, Imagen) "
sql &= "values ('" & Trim(Me.TxtNombreAtraccion.Text) & "', "
sql &= "'" & Trim(Me.TxtDescripcion.Text) & "'," & Me.CboCategoria.SelectedValue & ", "
sql &= "" & Me.CboCiudad.SelectedValue & ", @imagen)"
Dim comando As New SqlServerCe.SqlCeCommand(sql, con)
' Le pasamos la conversion de la imagen a binario por medio de un parmetro.
comando.Parameters.Add("@imagen", SqlDbType.Image, oBytes.Length).Value = oBytes
con.Open()
comando.ExecuteNonQuery()
MessageBox.Show("Atraccin registrada satisfactoriamente", "Agencia de Viajes",
MessageBoxButtons.OK, MessageBoxIcon.Information)
con.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
En Este sub procedimiento guardar sucede algo peculiar y es que tenemos que insertar la imagen de
la atraccin que estamos registrando, y no queremos guardar el path de un directorio donde se

encuentre la foto, ya que esto conlleva una desventaja porque si se borra la foto por error no nos va
a mostrar la foto, si la guardamos en la base de datos, siempre va a estar all, recuerde que una base
de datos es precisamente eso, un conjunto de datos persistente, ya que ellos permanecen hasta que
el usuario decide eliminarlos en este caso sera el DBA de la base de datos. Al tipo de consulta que
hice para realizar el insert yo le llamo hbrida ya que utilizo, una string normal, pero en la foto le
agrego un parmetro, ya que con la string normal es bien difcil hacer que se almacenen los binarios
que ha producido la librera oStream. Entonces para guardar la imagen se lo paso por medio
parmetro sql.
Ahora creamos el cdigo del sub procedimiento limpiar.
Public Sub limpiar()
Me.TxtIdAtraccion.Text = Nothing
Me.TxtNombreAtraccion.Text = Nothing
Me.TxtDescripcion.Text = Nothing
Me.CboCategoria.DataSource = Nothing
Me.CboCategoria.Text = Nothing
Me.CboCiudad.DataSource = Nothing
Me.CboCiudad.Text = Nothing
Me.PcbAtraccion.Image = Nothing
End Sub
Ahora nos llega el tiempo de crear el cdigo que va ir en el botn guardar.
Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnGuardar.Click
Call guardar()
Call limpiar()
Me.BtnGuardar.Enabled = False
End Sub
Ya hemos creado el respectivo sub procedimiento para guardar los registros en la base de datos, y
hemos creado el cdigo del botn guardar, ahora vamos a crear el cdigo del sub procidimiento que
nos va a permitir consultar esos registros guardados.
'' Sub Procidimiento para consultar los datos de las atracciones en la base de datos.
Public Sub ConsultarAtracciones()
Me.LsvAtraccion.Items.Clear()
Try
Dim sql As String = "Select a.AtraccionID, a.NombreAtraccion, a.Descripcion,
b.NombreCategoria, c.NombreCiudad " _
& "From Atraccion a inner join Categoria b on a.CategoriaID = b.CategoriaID " _
& "inner join Ciudad c on a.CiudadID = c.CiudadID " _
& "Order by a.AtraccionID Asc"
con.Open()
Dim ConsultaC As New SqlServerCe.SqlCeCommand(sql, con)

Dim Lector As SqlServerCe.SqlCeDataReader = ConsultaC.ExecuteReader()


While Lector.Read
With Me.LsvAtraccion.Items.Add(Lector.Item("AtraccionID").ToString)
.SubItems.Add(Lector.Item("NombreAtraccion").ToString)
.SubItems.Add(Lector.Item("Descripcion").ToString)
.SubItems.Add(Lector.Item("NombreCategoria").ToString)
.SubItems.Add(Lector.Item("NombreCiudad").ToString)
End With
End While
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Ahora escribimos el cdigo del checkbox responsable de detonar el sub procedimiento para realizar
la consulta a la base de datos.
Private Sub ChkVer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles ChkVer.CheckedChanged
Call ConsultarAtracciones()
Me.TabControl1.SelectedTab = TbpVerAtracciones
End Sub
Algo muy importante de explicar es que en la consulta no mostramos la foto de la atraccin turstica,
y es por el hecho que la foto la vamos a mostrar por separado, primero vamos a seleccionar en el
registro (en el listview) que foto deseamos ver y para poderla visualizar le vamos a dar clic en el
checkbox Ver Foto, pero antes vamos a crear el sub procedimiento que va ir a consultar la foto que le
corresponde al registro seleccionado por el usuario.

Sub MostrarFoto()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("SELECT NombreAtraccion, Imagen " _
& " From Atraccion" _
& " where AtraccionID = " & Val(Me.LsvAtraccion.FocusedItem.Text) & "", con)
Dim atraccionreader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If atraccionreader.Read = True Then
If atraccionreader("NombreAtraccion") Is DBNull.Value Then

Else
Me.LblAtraccion.Text = atraccionreader("NombreAtraccion").ToString
Dim msStream As New System.IO.MemoryStream(DirectCast(atraccionreader("Imagen"),
[Byte]()))
Dim objImagen As Image = Image.FromStream(msStream)
Me.PcbAtraccionVer.Image = objImagen
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "Agencia de Viajes")
Finally
con.Close()
End Try
End Sub
Ahora escribimos el cdigo de la checkbox que va a llamar el sub procedimiento de mostrar la foto.
Private Sub ChkVerFoto_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ChkVerFoto.CheckedChanged
If Me.ChkVerFoto.Checked = True Then
Me.VerFotoPanel.Visible = True
Call MostrarFoto()
Else
Me.VerFotoPanel.Visible = False
Me.PcbAtraccionVer.Image = Nothing
End If
End Sub
A continuacin le muestro una secuencia de imgenes para que tengan una idea de como se va ver
ya el codigo implementado en los controles correspondiente.

Ahora explico la secuencia de imgenes:


1. Le damos clic en el checkbox que dice ver atracciones.
2. Esto detona el sub procedimiento consultaratracciones y nos activa la tbpveratracciones, en
donde se encuentra el listview con los datos de la consulta.
3. Seleccionamos el registro del cual queremos ver la foto.
4. Le damos clic en ver foto y nos aparecer la foto.
Como podemos observar aparece el nombre de la atraccin Montaas Marron eso se lo enviamos a
una label desde el cdigo mostrar foto.
Tambin debajo de la foto tiene una linklabel que tiene como texto cerrar, esa lleva el siguiente
cdigo.
Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
Me.ChkVerFoto.Checked = False
Me.VerFotoPanel.Visible = False
Me.PcbAtraccionVer.Image = Nothing
End Sub
Ya hemos guardado, realizado consultas a la base de datos y que se muestran en un listview, ahora
vamos a actualizar (modificar) registros. Recuerden que la opcin de eliminar no es muy conveniente
en los programas en donde los usuarios son los que manipulan los datos normalmente esta funcin
la realiza el DBA mediante peticin firmada, pero si su programa tiene privilegios de usuarios bien
pueden crear la opcin de eliminar tomando como base la consulta del insert o update.
Antes de crear el sub procedimiento para actualizar, vamos a crear el cdigo donde le demos doble
clic al registro de la listview y nos pase esos valores a las textbox de tbpatracciones para que
podamos realizar el cambio correspondiente.
Private Sub LsvAtraccion_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles
LsvAtraccion.DoubleClick
Me.TxtIdAtraccion.Text = Me.LsvAtraccion.FocusedItem.Text
Me.TxtNombreAtraccion.Text = Me.LsvAtraccion.FocusedItem.SubItems(1).Text
Me.TxtDescripcion.Text = Me.LsvAtraccion.FocusedItem.SubItems(2).Text
Call LlenarComboCategoria()
Call LlenarComboCiudad()
Me.CboCategoria.Text = Me.LsvAtraccion.FocusedItem.SubItems(3).Text
Me.CboCiudad.Text = Me.LsvAtraccion.FocusedItem.SubItems(4).Text
Call MostrarFotoEdition() 'Para mostrar la foto en el PcbAtraccion
Me.BtnActualizar.Visible = True
Me.BtnNuevo.Enabled = False
Me.TabControl1.SelectedTab = TbpAtraccion
Me.TxtNombreAtraccion.Focus()
End Sub
Pueden notar que nos aparece el llamado a otro sub procedimiento que es mostrarfotoedition esto
para llenar el PcbAtraccion con la foto correspondiente por si la quieren actualizar.

Ese sub procedimiento quedara de la siguiente forma:


' Este sub procedimiento se necesita para mostrar la foto al momento de querer
' Editar un registro.
Sub MostrarFotoEdition()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("SELECT NombreAtraccion, Imagen " _
& " From Atraccion" _
& " where AtraccionID = " & Val(Me.LsvAtraccion.FocusedItem.Text) & "", con)
Dim atraccionreader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If atraccionreader.Read = True Then
If atraccionreader("NombreAtraccion") Is DBNull.Value Then
Else
Me.LblAtraccion.Text = atraccionreader("NombreAtraccion").ToString
Dim msStream As New System.IO.MemoryStream(DirectCast(atraccionreader("Imagen"),
[Byte]()))
Dim objImagen As Image = Image.FromStream(msStream)
Me.PcbAtraccion.Image = objImagen
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "SkyManagment")
Finally
con.Close()
End Try
End Sub
Ahora si ya estamos listos para desarrollar el cdigo para actualizar los datos, algo muy importante
que voy a explicar en la implementacin de este sub procedimiento es que lo voy a hacer enviandole
parmetros sql, en realidad toda la codificacin debera llevar sta forma ya que es la mas segura, en
cuanto a las consultas dainas. Con esto aseguramos que no nos puedan enviar un sql injection.
' Sub Procedimiento que nos permitir ingresar datos en la base de datos.
Public Sub ActualizarAtraccion()
Try
'' Manejo de la foto
Dim oStream As New MemoryStream()
Me.PcbAtraccion.Image.Save(oStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim oBytes(oStream.Length - 1) As Byte
oStream.Position = 0
oStream.Read(oBytes, 0, Convert.ToInt32(oStream.Length))
oStream.Close()
'________________________________________________________________
Dim actualizar As String
actualizar = "Update Atraccion "
actualizar &= "set NombreAtraccion = @NombreAtraccion, Descripcion = @Descripcion, "
actualizar &= "Imagen = @Imagen, CategoriaID = @CategoriaID, CiudadID = @CiudadID "

Dim ComandoActualizar As New SqlServerCe.SqlCeCommand(actualizar, con)


' Le pasamos la conversion de la imagen a binario por medio de un parmetro.
ComandoActualizar.Parameters.Add("@NombreAtraccion", SqlDbType.NVarChar).Value =
Trim(Me.TxtNombreAtraccion.Text)
ComandoActualizar.Parameters.Add("@Descripcion", SqlDbType.NVarChar).Value =
Trim(Me.TxtDescripcion.Text)
ComandoActualizar.Parameters.Add("@imagen", SqlDbType.Image, oBytes.Length).Value =
oBytes
ComandoActualizar.Parameters.Add("@CategoriaID", SqlDbType.Int).Value =
Me.CboCategoria.SelectedValue
ComandoActualizar.Parameters.Add("@CiudadID", SqlDbType.Int).Value =
Me.CboCiudad.SelectedValue
con.Open()
ComandoActualizar.ExecuteNonQuery()
MessageBox.Show("Atraccin actualizada satisfactoriamente", "Agencia de Viajes",
MessageBoxButtons.OK, MessageBoxIcon.Information)
con.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub

Aqu viene el paso final para tener concluido nuestro formulario que tanto dilema dio en la dinmica
que est diseado.
El ultimo cdigo que tenemos que crear es el que va en el botn actualizar.
Private Sub BtnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BtnActualizar.Click
Call ActualizarAtraccion()
Call limpiar()
Call ConsultarAtracciones()
Me.BtnNuevo.Enabled = True
Me.BtnActualizar.Visible = False
Me.TabControl1.SelectedTab = TbpVerAtracciones
End Sub

En sta interfaz voy a disearla ms simple ya que el manejo de fotografas ya lo hice en la interfaz
anterior. Con esto quiero decir que es conveniente que se guarde la foto del cliente, pero ya hice
todo el cdigo que pueden utilizar para tratar las imgenes.
En este caso solo voy a disear el formulario para realizar la insercin de un nuevo registro, y lo del
listview lo voy a dejar para la categora de consultas. Entonces solo va a tener una sola fase.

Los controles se listan en el orden en que se utilizaron de arriba hacia abajo.


Descripcin de las propiedades de los controles utilizados
MaskedTextBox
Name: MtbRnp
Mask: 0000-000000000
TextBox1
Name:
TxtNombreCliente
MaxLenght: 50
TextBox2
Name:
TxtApellidoCliente
MaxLenght: 50

ComboBox1
Name: CboSexo
ComboBox2
Name: CboCiudad
MaskedTextBox
Name: MtbTelefono
Mask: (999)000-0000
Texbox3
Name: TxtDireccion
MaxLenght: 200

Button Nuevo:
Name: BtnNuevo
Text : Nuevo
Button Guardar:
Name: BtnGuardar
Text: Guardar
Enabled : Flase
Button Actualizar:
Name: BtnActualizar
Text: Actualizar
Visible: False

Todos los controles,


excluyendo
los
botones,
se
encuentran
contenidas dentro de
un panel, el cual tiene
la propiedad enabled
= false, para que solo
puedan escribir en los
controles cuando se
d clic en el botn
nuevo.

En este caso que no tenemos un Id correlativo sino que es el Rnp del cliente, entonces no
necesitamos crear un sub procedimiento que investigue cual es el nmero correlativo, entonces
vamos a proceder a desarrollar el cdigo de los dos combobox que se van a necesitar.

Public Sub LlenarComboCiudad()


'Muestra todas las ciudades disponibles en la base de datos
Try
Dim Ciudades As String
Dim Ds As New DataSet
con.Open()
Ciudades = "Select CiudadID, NombreCiudad " _
& " From Ciudad " _
& " Order By CiudadID Asc "
Dim da As New SqlServerCe.SqlCeDataAdapter(Ciudades, con)
Dim dt As New DataTable
da.Fill(Ds, "Ciudades")
Me.CboCiudad.DataSource = Ds.Tables(0)
Me.CboCiudad.DisplayMember = Ds.Tables(0).Columns("NombreCiudad").ToString
Me.CboCiudad.ValueMember = Ds.Tables(0).Columns("CiudadID").ToString
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Ahora vamos a escribir el cdigo de crear el cdigo que va ir en el boton nuevo.
Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnNuevo.Click
Call LlenarComboCiudad()
Call LlenarComboSexo()
Me.CboCiudad.Text = "Seleccione"
Me.CboSexo.Text = "Seleccione"
Me.Panel1.Enabled = True
Me.MtbRNP.Focus()
Me.BtnGuardar.Enabled = True
End Sub

Ahora que ya estamos listo habilitando los controles para poder generar un nuevo registro lo vamos
a almacenar en la base de datos, es bueno mencionar que aqu nos vamos a detener en desarrollar el
cdigo de una funcin que me permita ir a buscar el rnp de un cliente y si este ya existe que no me
permita ingresarlo en la base de datos.

' Cdigo que se utiliza para validar el registro y no se ingrese duplicado.


Private Function ExisteRegistro() As Boolean
Try
Dim cliente As String = "Select Count(Rnp) from Clientes where RNP = "
cliente &= " '" & Trim(Me.MtbRNP.Text) & "'"
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand(cliente, con)
Dim i As Integer
i = CInt(sql.ExecuteScalar())
If i > 0 Then
Return True
Else
Return False
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Function

Public Sub guardar()


If ExisteRegistro() = False Then
Try
Dim cliente As String
cliente = " Insert Into Clientes " _
& " (Rnp, NombreCliente, ApellidosCliente, Telefono, CiudadID, SexoId, Direccion) " _
& " values ( '" & Trim(Me.MtbRNP.Text) & "','" & Trim(Me.TxtNombreCliente.Text) & "', " _
& " '" & Trim(Me.TxtApellidoCliente.Text) & "','" & Me.MtbTelefono.Text & "'," &
Me.CboSexo.SelectedValue & ", " _
& " " & Me.CboCiudad.SelectedValue & ",'" & Trim(Me.TxtDireccion.Text) & "')"
con.Open()
Dim Command As New SqlServerCe.SqlCeCommand(cliente, con)

Command.ExecuteNonQuery()
MessageBox.Show("Los datos del cliente se han ingresaron correctamente", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
Else
MessageBox.Show("Ya existe este numero de identidad en la base de datos", "Agencia de
Viajes", MessageBoxButtons.OK, MessageBoxIcon.Information)
Call Limpiar()
Exit Sub
End If
End Sub
Ahora escribimos el cdigo que va a llevar el sub procedimiento limpiar.
Sub limpiar()
Me.MtbRNP.Text = Nothing
Me.TxtNombreCliente.Text = Nothing
Me.TxtApellidoCliente.Text = Nothing
Me.CboSexo.DataSource = Nothing
Me.CboCiudad.DataSource = Nothing
Me.MtbTelefono.Text = Nothing
Me.TxtDireccion.Text = Nothing
Me.Panel1.Enabled = False
End Sub
Ahora escribimos el cdigo que va a llevar en el botn guardar.
Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnGuardar.Click
Call guardar()
Call limpiar()
End Sub

Ahora vamos a disear la interfaz de los viajes o paquetes de viajes que estarn disponibles para que
los clientes puedan seleccionar el paquete que mejor les parece.
Hay que aclarar que en la base de datos la clave primaria de viajes no tiene identity true por ende
vamos a crear el sub procedimiento que nos permita ir mostrando el numero correlativo de cada
transaccin y as poderlo almacenar en la base de datos.

Descripcin de las propiedades de los controles utilizados


GroupBox1
Text:Datos del Viaje
Enabled: False

Textbox1:
Name: TxtIdViaje
Enabled: false

Button Nuevo:
Name: BtnNuevo
Text : Nuevo

Label1:
Text: Id Viaje

Textbox2:
Name: TxtIdAtraccion
Visible: False

Button Guardar:
Name: BtnGuardar
Text: Guardar
Enabled : Flase

Label2:
Text: Atraccin
Label3:
Text: Fecha del Viaje
Label4:
Text: Costo

Textbox3:
Name: TxtAtraccion
DateTimePicker
Name: DtpFechaViaje
Textbox4:
Name: TxtCosto
TextAlign: Right

Button
Name: BtnBuscar
FlatStyle: Flat

Esta otra ventana la vamos a necesitar para que cuando demos clic en el botn de buscar las
atracciones tursticas nos permita ver el listado de las atracciones disponibles en el sistema.
En cuanto a los controles lo nico que tiene es una label con el mensaje Atracciones disponisbles en
el sistema:
Y un listview que tiene 4 columnas: el nombre del listview es LsvListaAtracciones, y las columnas van
con las siguientes propiedades: GridLines: true, FullRowSelected = true
1--Name: AtraccionID
Text: Id Atraccion
Width: 70

2--Name: NombreAtraccion
Text: Nombre Atraccion
Width: 150

3--Name: NombreCategoria
Text: Categora
Width: 100

4--Name: NombreCiudad
Text: Ciudad
Width: 100

El primer sub procedimiento a disear es el de investigar el nmero correlativo de la transaccin:


' Sub Procedimiento para mostrar el numero correlativo del registro a crear.
Public Sub InvestigarCorrelativo()
Try
con.Open()
Dim sql As New SqlServerCe.SqlCeCommand("Select max(IdViajes) + 1 IdViajes from Viajes",
con)
Dim viajereader As SqlServerCe.SqlCeDataReader = sql.ExecuteReader()
If viajereader.Read = True Then
If viajereader("IdViajes") Is DBNull.Value Then
Me.TxtIdViaje.Text = 1
Else
Me.TxtIdViaje.Text = viajereader("IdViajes").ToString
End If
End If
Catch ex As Exception
MessageBox.Show("Error" & vbCrLf & ex.Message, "Agencia de Viajes")
Finally
con.Close()
End Try
End Sub

Ahora vamos a disear el cdigo para el botn nuevo:


Private Sub BtnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnNuevo.Click
Me.GroupBox1.Enabled = True
Call InvestigarCorrelativo()
Me.TxtAtraccion.Focus()
End Sub
Compete que le asignemos el formato moneda al costo en el texbox txtcosto.
Private Sub TxtCosto_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles
TxtCosto.LostFocus
If Me.TxtCosto.TextLength > 0 Then
Me.TxtCosto.Text = FormatCurrency(Me.TxtCosto.Text, 2)
Else
Me.TxtCosto.Text = FormatCurrency(0, 2)
End If
End Sub
Ahora vamos a escribir el codigo en el botn buscar que va a mandar a llamar al formulario que nos
permitir seleccionar las atracciones tursticas.
Private Sub BtnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnBuscar.Click
FrmBuscarAtraccion.Show()
End Sub
Cuando se nos aparece el formulario para seleccionar las atracciones disponibles ahora vamos a
crear el sub procedimiento que hace la consulta a la base de datos.
'' Sub Procidimiento para consultar los datos de las atracciones en la base de datos.
Public Sub ConsultarAtracciones()
Me.LsvListaAtracciones.Items.Clear()
Try
Dim sql As String = "Select a.AtraccionID, a.NombreAtraccion, b.NombreCategoria,
c.NombreCiudad " _
& "From Atraccion a inner join Categoria b on a.CategoriaID = b.CategoriaID " _
& "inner join Ciudad c on a.CiudadID = c.CiudadID " _
& "Order by a.AtraccionID Asc"
con.Open()
Dim ConsultaC As New SqlServerCe.SqlCeCommand(sql, con)
Dim Lector As SqlServerCe.SqlCeDataReader = ConsultaC.ExecuteReader()

While Lector.Read
With Me.LsvListaAtracciones.Items.Add(Lector.Item("AtraccionID").ToString)
.SubItems.Add(Lector.Item("NombreAtraccion").ToString)
.SubItems.Add(Lector.Item("NombreCategoria").ToString)
.SubItems.Add(Lector.Item("NombreCiudad").ToString)
End With
End While
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Ahora vamos a crear el cdigo donde se va a llamar al formulario que es en el evento load del
formulario frmbusquedaatracciones.
Private Sub FrmBuscarAtraccion_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Call ConsultarAtracciones()
End Sub
Continuamos con el cdigo donde damos doble clic en el registro del listview para que pase los datos
seleccionados al formularios donde estamos armando los paquetes tursticos.
Private Sub LsvListaAtracciones_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
Handles LsvListaAtracciones.DoubleClick
FrmViajes.TxtIdAtraccion.Text = Me.LsvListaAtracciones.FocusedItem.Text
FrmViajes.TxtAtraccion.Text = Me.LsvListaAtracciones.FocusedItem.SubItems(1).Text
Me.Close()
End Sub
Ahora proseguimos con el desarrollo del cdigo del sub procedimiento de GuardarViajes.
' Sub Procedimiento que nos permitir ingresar datos en la base de datos.
Public Sub GuardarViajes()
Try
Dim Guardar As String
Guardar = "Insert into Viajes (IdViajes, AtraccionID, FechaViaje, Costo) "
Guardar &= "Values (@IdViajes, @AtraccionID, @FechaViaje, @Costo) "

Dim ComandoGuardar As New SqlServerCe.SqlCeCommand(Guardar, con)


ComandoGuardar.Parameters.Add("@IdViajes", SqlDbType.Int).Value =
Val(Me.TxtIdViaje.Text)
ComandoGuardar.Parameters.Add("@AtraccionID", SqlDbType.Int).Value =
Val(Me.TxtIdAtraccion.Text)
ComandoGuardar.Parameters.Add("@FechaViaje", SqlDbType.DateTime).Value =
Me.DtpFechaViaje.Value.Date
ComandoGuardar.Parameters.Add("@Costo", SqlDbType.Money).Value =
CDbl(Me.TxtCosto.Text)
con.Open()
ComandoGuardar.ExecuteNonQuery()
MessageBox.Show("Paquete turistico almacenado satisfactoriamente", "Agencia de Viajes",
MessageBoxButtons.OK, MessageBoxIcon.Information)
con.Close()
Call limpiar()

Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Creamos el cdigo del botn guardar.
Sub limpiar()
Me.TxtIdViaje.Text = Nothing
Me.TxtIdAtraccion.Text = Nothing
Me.TxtAtraccion.Text = Nothing
Me.TxtCosto.Text = Nothing
Me.GroupBox1.Enabled = False
Me.BtnGuardar.Enabled = False
End Sub
Y Ahora para terminar la codificacin de sta interfaz creamos el cdigo que va en el botn guardar.

Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


BtnGuardar.Click
Call GuardarViajes()
End Sub

Ahora vamos a disear la interfaz de lo que va ser la pantalla de agregar turistas (clientes) a los
paquetes tursticos.
Hay que aclarar que en la base de datos la clave primaria de detalles de viaje no tiene identity true
por ende vamos a crear el sub procedimiento que nos permita ir mostrando el numero correlativo de
cada transaccin y as poderlo almacenar en la base de datos.
El proceso que vamos a realizar para llegar a registrar clientes para x paquete tursticos, primero
vamos a ejecutar una consulta que nos muestra los paquetes tursticos disponibles, de esta forma
vamos a obtener los datos del paquete turstico.
La interfaz de la consulta es la siguiente:

Descripcin de las propiedades de los controles utilizados


Label 1:
Text: Listado de Paquetes
Tursticos disponibles en el
sistema:
ListView (Lv1):
Columnas.
1---Name: IdViajes
Text: Id Viajes
Width: 60

2---Name: AtraccionID
Text: Id Atraccion
Width: 100
3---Name: NombreAtraccion
Text: Nombre Atraccion
Width: 200

4---Name: FechaViaje
Text: Fecha Viaje
Width: 80

5---Name: Costo
Text: Costo Viaje
Width: 80

En primer lugar vamos a crear el cdigo para que realice la consulta de los viajes disponibles.

'' Sub Procidimiento para consultar los datos de los paquetes turisticos disponibles.
Public Sub ConsultarViajes()
Me.LsvPaquetesTuristicos.Items.Clear()
Try
Dim sql As String = "Select a.IdViajes, b.AtraccionID, b.NombreAtraccion,convert(nchar(13),
a.FechaViaje, 103) as FechaViaje, a.Costo " _
& "From viajes a inner join atraccion b on a.atraccionID = b.atraccionID " _
& "Order by a.Idviajes asc"
con.Open()
Dim ConsultaC As New SqlServerCe.SqlCeCommand(sql, con)
Dim Lector As SqlServerCe.SqlCeDataReader = ConsultaC.ExecuteReader()
While Lector.Read
With Me.LsvPaquetesTuristicos.Items.Add(Lector.Item("IdViajes").ToString)
.SubItems.Add(Lector.Item("AtraccionID").ToString)
.SubItems.Add(Lector.Item("NombreAtraccion").ToString)
.SubItems.Add(Lector.Item("FechaViaje").ToString)
.SubItems.Add(FormatCurrency(Lector.Item("Costo").ToString, 2))
End With
End While
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Sub
Si es un poquito curioso ha de notar que sta consulta sql no se dise de forma sencilla, sino que se
utiliz la funcin convert, ya que en la base de datos almacena un datetime y yo solo quera la fecha
entonces la modifico con el convert para que me de el formato que yo deseo convert(nchar(13),
a.FechaViaje, 103). El formato lo decide el numero 103.
Teniendo ya funcional la consulta que nos listas los viajes, ahora vamos a crear el cdigo que va llevar
el evento doble clic del listview para llevar los datos que necesitamos al formulario de agregar
clientes (turistas) a los paquetes.
Vuelvo a recordar que sta fue una forma rpida de analizar para proveerles una material que les
sirviera como una herramienta de apoyo, para el desarrollo de su proyecto de clase.

Private Sub LsvPaquetesTuristicos_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)


Handles LsvPaquetesTuristicos.DoubleClick
FrmAgregarPasajeros.TxtIdViaje.Text = Me.LsvPaquetesTuristicos.FocusedItem.Text
FrmAgregarPasajeros.TxtIdAtracciones.Text =
Me.LsvPaquetesTuristicos.FocusedItem.SubItems(1).Text
FrmAgregarPasajeros.TxtNombreAtraccion.Text =
Me.LsvPaquetesTuristicos.FocusedItem.SubItems(2).Text
FrmAgregarPasajeros.TxtFechaViaje.Text =
Me.LsvPaquetesTuristicos.FocusedItem.SubItems(3).Text
FrmAgregarPasajeros.TxtCosto.Text = Me.LsvPaquetesTuristicos.FocusedItem.SubItems(4).Text
FrmAgregarPasajeros.Show()
Me.Hide()
End Sub
Y por ultimo vamos a crear el cdigo en el form load para que llame a la funcin de consultar los
viajes al cargar el formulario.

Private Sub FrmBuscarViajes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles MyBase.Load
Call ConsultarViajes()
End Sub

You might also like