Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
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.
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.
4. Le escribimos nombre a la relacin en este caso sera RegionPais. Y nos queda la siguiente
configuracin:
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.
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
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.
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.
5. Y con esto estamos listo para abrir la conexin a la base de datos donde lo necesitemos.
2.
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.
Fase 2:
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
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.
Con la programacin del cdigo de check box cuando le demos clic nos tiene que salir lo siguiente:
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.
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
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:
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.
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
'' 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 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:
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.
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
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
CheckBox (k1):
Name: ChkVer
Text : Ver Atracciones
PictureBox (P1):
Name: PcbAtraccion
BorderStyle: FixedSingle
SizeMode: StretchImage
ToolTip on ToolTip1:
"De doble clic para seleccionar una foto"
ToolTip1 y un OpenFileDialog1
Fase 2
L1
P1
Lv1
P2
L3
K1
L2
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
y el cdigo va
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)
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.
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.
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
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.
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.
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.
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
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) "
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.
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:
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.