Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. Arreglos Bidimensionales
http://www.elguille.info/colabora/puntoNET/FernandoLuque_Arrays_Bidimensionales.
htm
2. Barras de Herramientas y Menús en Visual Basic .Net
http://www.elguille.info/colabora/NET2005/FernandoLuque_MenusBarras.htm
3. Controles en Visual Basic .Net – El control ChechedListBox
http://www.elguille.info/colabora/puntoNET/FernandoLuque_Controles.htm
4. Consumiendo XML Web Services
http://www.elguille.info/colabora/NET2005/FernandoLuque_WebServiceBD.htm
5. Controlando Eventos y Arrays
http://www.elguille.info/colabora/NET2005/FernandoLuque_Controlando_Eventos_y_
Arreglos.htm
6. El control ComboBox
http://www.elguille.info/colabora/NET2005/FernandoLuque_El_Control_ComboBox.ht
m
7. El Control ListBox – Opciones Principales
http://www.elguille.info/colabora/NET2005/FernandoLuque_El_Control_ListBox.htm
8. Maestro – Detalle. Clientes y Órdenes
http://www.elguille.info/colabora/NET2005/FernandoLuque_MaestroDetalleSimple.ht
m
9. Mantenimiento de Categorías usando Northwind
http://www.elguille.info/colabora/NET2005/FernandoLuque_MatenimietoCateg.htm
10. Usando SQLDataReaders – Entornos conectados
http://www.elguille.info/colabora/NET2005/FernandoLuque_Usando_SQLDataReader.
htm
11. El control ListView –Parte I
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListView.htm
12. Formateando el control DataGrid
http://www.elguille.info/colabora/NET2005/FernandoLuque_FormateandoDataGrid.ht
m
13. El control ListView (II)
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListViewII.htm
14. Navegando en un sitio Web
http://www.elguille.info/colabora/NET2005/FernandoLuque_ASPSinLogin.htm
15. Controles de lista en Visual Basic .Net
http://www.elguille.info/colabora/NET2005/FernandoLuque_ControlesBasicos.htm
16. Iniciando en ASP .Net
http://www.elguille.info/colabora/NET2005/FernandoLuque_IniciandoASP.htm
17. El Control ListView III
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewAvanzado.htm
18. Uso de DataBindings
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataBinding.htm
19. Ordenar y Filtrar un DataView
http://www.elguille.info/colabora/NET2005/FernandoLuque_FiltrosOrdenamientos.htm
20. Controles de Lista enlazados a Base de datos
http://www.elguille.info/colabora/NET2005/FernandoLuque_ControlesListaBD.htm
21. DataSets Tipificados y No Tipificados I
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataSetsI.htm
22. El Control TabControl – Manejo de los TabPages
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_TabControl.htm
23. DataSets Tipificados y no Tipìficados II
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataSetsII.htm
24. Llenar un control DataGrid y actualizarlo
http://www.elguille.info/colabora/NET2005/FernandoLuque_TypedDataSetI.htm
25. Examinar una tabla con claves foráneas
http://www.elguille.info/colabora/NET2005/FernandoLuque_ExaminarTabla01.htm
26. Typed DataSet – Ejercicio
http://www.elguille.info/colabora/NET2005/FernandoLuque_TypedDataSetII.htm
27. Borrar el contenido de controles I
http://www.elguille.info/colabora/NET2005/FernandoLuque_BorrarContenidos.htm
28. El control ListView usando Base de datos
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewBD.htm
29. Typed DataSet – Ejercicio
http://www.elguille.info/colabora/NET2005/FernandoLuque_TypedDataSet03.htm
30. El Control TreeView
http://www.elguille.info/colabora/NET2005/FernandoLuque_TreViewBDatos.htm
31. GDI+ Gráficos en Visual Basic: Textos Artísticos
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto01.htm
32. GDI+ Gráficos en Visual Basic: Textos con sombra
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto02.htm
33. GDI+ Gráficos en Visual Basic: Textos en contorno
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto03.htm
34. GDI+ Gráficos en Visual Basic: Textos Block, Cursiva y Reflejo
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto04.htm
35. Borrar el contenido de los controles II
http://www.elguille.info/colabora/NET2005/FernandoLuque_BorrarContenidosII.htm
36. GDI+ Crear gráficos permanentes
http://www.elguille.info/colabora/NET2005/FernandoLuque_GraficosPermanentes.htm
37. DataBindings en Visual Basic .Net
http://elguille.info/colabora/NET2005/FernandoLuque_DataBindings.htm
38. Aplicaciones en N-Capas usando Visual Basic .Net
http://elguille.info/colabora/NET2005/FernandoLuque_NCapas.htm
39. Creando un Explorador de Windows usando Clases de componente
http://www.elguille.info/colabora/NET2005/FernandoLuque_Explorador01.htm
40. Creando un Explorador usando el IDE
http://elguille.info/colabora/NET2005/FernandoLuque_Explorador02.htm
41. GDI+ Trabajando con Lápices (Pens)
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDILapices.htm
42. Herencia en Visual Basic .Net
http://elguille.info/colabora/NET2005/FernandoLuque_HerenciaNet.htm
43. Usando Hojas de Estilos en Cascada en Aplicaciones Web con ASP .Net
http://www.elguille.info/colabora/NET2005/FernandoLuque_ASPEstilos.htm
44. Controles de Validación en Aplicaciones Web ASP .Net
http://www.elguille.info/colabora/NET2005/FernandoLuque_ASPValidar.htm
45. Usando Store Procedures en Aplicaciones Web ASP .Net
http://www.elguille.info/colabora/NET2006/FernandoLuque_SP_en_ASP.htm
46. Leer y escribir archivos XML en aplicaciones Web ASP .Net
http://www.elguille.info/colabora/NET2006/FernandoLuque_ASPyXML.htm
47. Uso de XMLDataDocument en aplicaciones Web ASp .Net
http://www.elguille.info/colabora/NET2006/FernandoLuque_ASPyXML_02.htm
48. Filtrando DataViews usando Fechas
http://www.elguille.info/colabora/NET2006/FernandoLuque_DataViewFiltro.htm
49. Combos con datos relacionados
http://www.elguille.info/colabora/NET2006/FernandoLuque_CombosListViewStatusBa
r.htm
El presente trabajo pretende colaborar con el conocimiento de Visual Basic .Net y de las
opciones especificas de los arreglos de dos dimensiones. El ejemplo maneja dos arrays
bidimensionales que tienen relación (ya se que podría hacerse usando DataSet y
DataTables), pero la idea del ejercicio es justamente el manejo de arrays
bidimensionales.
Un poco de teoría
Los Arrays o arreglos son conjuntos de Variables Agrupadas con un nombre, que se
pueden manejar juntas o individualmente, en Visual Basic .Net se pueden tener arreglos
desde una dimensión y hasta un máximo de 32 dimensiones.
Como se definen
Para definir un arrays se utiliza Dim, Private, Friend o Public según el alcande del
mismo, por ejemplo la orden:
Redim Cursos(2,Incluidos)
Todos los elementos del arrays deben ser del mismo tipo.En Visual Studio .Net los
arrays derivan de la clase Arrays del NameSpace System. Esta Clase (Array)
proporciona los métodos para crear, manipular, realizar busquedas y ordenación de
arrays.
Un elemento es un valor de Array, al que se puede acceder haciendo uso del indice o
indices según las dimensiones. Por ejemplo, para acceder al elemento de la segunda fila
y la tercera columna del arrays bidimensional con nombre Cursos se debe escribir
Cursos(1,2), cabe adelantar que en Visual Basic .Net el valor inicial de cada dimensión
es CERO. El método GetLowerBound permite obtener el límite inferior de una
determinada dimensión. Para el límite superior de la dimensión especificada se utiliza el
método GetUpperBound.
Ahora mi ejercicio
Una vez registrado el o los cursos, se podrá matricular alumnos, de los cuales se
pedirá el ingreso de Apellidos, Nombres, teléfono y fecha de matricula. Los datos por
cada curso deben de registrarse y aparecer en un formulario de reporte.
Los datos de la tabla siguiente :
Vacantes: 25
Pereda Geronimo, Luis
IES
2004-07 Telf. 9444567
Computación e
Informática Computación e Informática Fecha: 28/09/2004
Terranova Carrion Esmeralda
Fecha de Inicio: 05/11/2004
Telf. 9499498
Vacantes: 20
Fecha: 30/09/2004
Hinostroza Ramirez Carlos
Nota: Bajar el empaquetado del ejercicio para ejecutarlo, fue hecho con Visual Studio
2002.
En el Módulo:
'************* MODULO *******************
'Noviembre 2004
Module SistMatriculas
End Module
En el formulario Principal
Inherits System.Windows.Forms.Form
#End Region
NReporte.ShowDialog()
RepAlumnos.ShowDialog()
End If
End Sub
Application.Exit()
End Sub
mnuIngPromo.Enabled = False
iPromos.MdiParent = Me
iPromos.Show()
End Sub
'Procedimientos para la Inserción de Alumnos
Me.mnuIngAlumnos.Enabled = False
formAlumnos.ShowDialog()
End Sub
'ACERCA DE....
fAcerca.ShowDialog()
End Sub
End Sub
Private Sub mnuReporte_Select(ByVal sender As Object, ByVal e As
System.EventArgs) Handles mnuReporte.Select
End Sub
End Class
Notas importantes:
Imports System.Drawing
Imports System.Drawing.Brush
Imports System.Drawing.Brushes
Imports System.Drawing.Bitmap
Imports System.Drawing.Drawing2D
End Sub
End Class
El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda,
no olviden dar su opinión en mi Panoramabox, gracias. Cualquier consulta a los correos
que están al inicio del articulo.
Un poco de teoría
El Control CheckedListBox
chklProductos.DataSource = dsDatos.Tables("dtProductos")
chklProductos.DisplayMember = "NombreProducto"
chklPromovidos.Items.Add("María Fernanda")
chklPromovidos.Items.AddRange(aPromovidos)
Para eliminar una opción se utiliza Remove cuando se usa el texto de la opción y
RemoveAt cuando usamos el índice que lo identifica. Para eliminar todos usamos
Clear.
Para eliminar al
selecccionado: chklPromovidos.Items.Remove(chklPromovidos.SelectedItem)
Algunas propiedades
CheckedListBox y ListBox
Propiedad Descripción
Indica si la casilla
cambia de estado con
un solo clic.
CheckOnClick Aconsejo establecerla
a True. Solo la tiene
el control
CheckedListBox
Indica el Origen de
DataSource
Datos
Indica la columna del
DisplayMember origen de datos que
se mostrará
Indica el valor que se
utilizará en caso la
ValueMember propiedad
DislpayMember no
sea el dato a utilizar.
Colección de valores
Items incluidos en el
control
El Control TabControl
Este control TabControl muestra una colección de fichas similares a las etiquetas de
una ventana de opciones (Herramientas, Opciones ... aunque sea de Internet Explorer),
cada ficha o Página puede contener otros controles y también imágenes.
Este control es similar al control SStab y el control TabStrip de Visual Basic 6.0, actúa
como un contenedor.
Algunas propiedades
TabControl
Propiedad Descripción
Contiene las fichas a
TabPages
mostrar en el control.
Las fichas cambian
HotTrack de apariencia cuando
el cursor para sobre
ellas
Relaciona el control
con un control
ImagesList ImageList para
mostrar el cada ficha
una imagen
Muestra las fichas en
Multiline varias líneas cuando
esta en True.
Especifica el menú
ContextMenu
contextual del control
El Primero: PracOtros
lstSublineas.Items.Clear()
Sublineas = SubLacteos.Clone
Sublineas = SubFerreteria.Clone
Sublineas = SubPerfumes.Clone
Sublineas = Subhogar.Clone
End Select
lstSublineas.Items.AddRange(Sublineas)
End Sub
El segundo: PracListas
Este ejercicio complementa el uso del control ListBox, supone que debe escribir un
nombre, luego seleccionar un programa donde matricular al alumno, de acuerdo al
programa seleccionado que son: Computación e Informática, Secretariado o
Contabilidad se generan cursos que se insertan en una lista, estos cursos deben
seleccionarse, activar el CheckBox para matricularlo y luego calcular el costo de la
matrícula.
Else
lstSelec.Items.Add(lstDispo.SelectedItem)
lstDispo.Items.Remove(lstDispo.SelectedItem)
End If
Dim x As Integer
For x = 0 To lstDispo.Items.Count - 1
lstSelec.Items.Add(lstDispo.Items.Item(x))
Next
lstDispo.Items.Clear()
If lstSelec.SelectedIndex = -1 Then
Else
lstDispo.Items.Add(lstSelec.SelectedItem)
lstSelec.Items.Remove(lstSelec.SelectedItem)
End If
Dim x As Integer
For x = 0 To lstSelec.Items.Count - 1
lstDispo.Items.Add(lstSelec.Items.Item(x))
Next
lstSelec.Items.Clear()
End If
End Sub
El Tercero: Practica02
Este ejercicio permite complementar el uso de los controles básicos de Windows Forms,
asi como el uso del control PictureBox para agregar una imagen o una foto dentro del
formulario.
End
txtnombre.Clear()
txtdire.Clear()
optsoltero.Checked = True
optcasado.Checked = False
optestable.Checked = False
optcontrato.Checked = True
optotro.Checked = False
dtpFechaReg.Value = Now
Dim x As Integer
For x = 0 To chklAficiones.Items.Count - 1
'QUITAR LA SELECCION
chklAficiones.SetItemChecked(x, False)
End If
Next
Me.chklAficiones.ClearSelected()
Me.PictureBox1.Image = Nothing
txtnombre.Focus()
MessageBox.Show("Agregar el registro...", _
ControlChars.CrLf & _
ControlChars.CrLf & _
ControlChars.CrLf & _
"Aficiones : " & ControlChars.CrLf
For x = 0 To chklAficiones.Items.Count - 1
& chklAficiones.Items(x)
End If
Next
MessageBoxButtons.OK)
End If
End Sub
El Cuarto: PracVariosForms01
cmdMostrar.Enabled = False
lstSelec.Items.Add(lstDispo.SelectedItem)
lstDispo.Items.Remove(lstDispo.SelectedItem)
End If
Dim x As Integer
For x = 0 To lstDispo.Items.Count - 1
lstSelec.Items.Add(lstDispo.Items.Item(x))
Next
lstDispo.Items.Clear()
lstDispo.Items.Add(lstSelec.SelectedItem)
lstSelec.Items.Remove(lstSelec.SelectedItem)
End If
Dim x As Integer
For x = 0 To lstSelec.Items.Count - 1
lstDispo.Items.Add(lstSelec.Items.Item(x))
Next
lstSelec.Items.Clear()
End If
End Sub
Notas importantes:
Imports System.Web.Security
Imports System.Data.SqlClient
Imports System.Data
'Crear el comando
cmd.CommandType = CommandType.StoredProcedure
prmDato.Direction = ParameterDirection.ReturnValue
cmd.Parameters.Add("@user", TextBox1.Text)
cmd.Parameters.Add("@clave", TextBox2.Text)
'Abrir la conexion
con.Open()
'Ejecutar el comando
cmd.ExecuteNonQuery()
'Recoger el resultado
Resultado = cmd.Parameters("RETURN_VALUE").Value
'Cerrar la conexion
con.Close()
If Resultado = 1 Then
FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, False)
'Response.Redirect("defoult.aspx")
Else
End If
End Sub
End Class
El código completo está en el archivo adjunto, cree los directorios virtuales después de
desempaquetar los archivos fuente.
Suerte a todos, espero les sirva de ayuda, no olviden dar su opinión en mi Panoramabox,
gracias.
Sres. Desarrolladores, en esta ocasión les envío un aporte interesante para comprender
el uso de Delegados en aplicaciones de Visual Studio .Net
Un poco de Teoría
Nos podemos dar cuenta de lo siguiente, Visual Studio le asigna al procedimiento Sub
el nombre cmdGuardar_Click, este nombre en aplicaciones de escritorio lo podemos
cambiar sin ningún problema, en aplicaciones ASP debemos cambiar el valor de la
Propiedad AutoEventWireUp a False para poder hacerlo. Lo mas importante de los
controladores se define después de la palabra Handles. Después de esto podemos
definir los controles y eventos que han sido asignados al evento.
End Sub
Lo que significa que el peocedimiento Procesar se ejecuta cuando se pulsa click en los
controles cmdGuardar, cmdCambiar y cmdEliminar.
Para controlar que control fue pulsado utilizamos la variable sender de la siguiente
manera:
End If
End Sub
2. Asignar el controlador utilizando la instrucción AddHandler, cuya sintaxis es como
sigue:
Notas importantes:
Si se quisiera eliminar el controlador para los controles anteriores las ordenes serían:
En nuestro ejemplo se pide cinco datos y luego se almacenan estos en un arrays de dos
dimensiones, luego esos datos del array se guardan en un DataTable de un DataSet
creado por código. Espero les sirva.
'NOTA IMPORTANTE:
' Se utiliza la variable sender para saber que control
' se ha utilizado.
End Sub
End If
If cboGrado.SelectedIndex = -1 Then
Exit Sub
End If
cRegistros += 1
End Sub
ReDim aRegistros(4, 0)
cRegistros = 0
dgRegistrados.DataSource = Nothing
txtNombre.Clear()
txtDire.Clear()
optEstable.Checked = True
optSoltero.Checked = True
cboGrado.SelectedItem = -1
cboGrado.Text = "Seleccionar"
txtNombre.Focus()
End Sub
El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda,
no olviden dar su opinión en mi Panoramabox, gracias.
El control ComboBox
Opciones principales
Sres Desarrolladores, les envio este aporte que permitirá conocer las opciones
principales del control ComboBox, en este articulo no utilizo el enlace del control a
base de datos, pero les prometo que dentro de poco preparo otro con enlaces a Base de
Datos. Suerte a todos
UN POCO DE TEORIA
El ComboBox es uno de los controles de lista mas utilizados en las aplicaciones tanto de
escritorio como ASP .Net, este es sumamente versastil, su propiedad DropDownStyle
nos brinda presentarlo de forma variada. en el ejemplo he tratado de mostrar estas
opciones.
El ejemplo también muestra como ingresar una fecha considerando edades entre 17 y 90
años. El botón Comprobar permite mostrar un mensaje si la fecha seleccionada es
Correcta o Incorrecta.
For i = 1 To 12
cboMes.Items.Add(MonthName(i, False))
Next
End Sub
Private Sub CompruebaFecha(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdComprobar.Click
If cboDia.SelectedIndex = -1 Or cboMes.SelectedIndex = -1 Or
cboAnio.SelectedIndex = -1 Then
MessageBox.Show("Faltan datos...", "Fecha incompleta",
MessageBoxButtons.OK)
Exit Sub
End If
End Sub
El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda,
no olviden dar su opinión en mi Panoramabox, gracias.
El control ListBox
Sres Desarrolladores, les envío este aporte que permitirá conocer las opciones
principales del control ListBox, en este articulo no utilizo el enlace del control a base de
datos, pero de todas maneras espero que les sea útil. Suerte a todos.
UN POCO DE TEORÍA
La diferencia básica del control ListBox con respecto al ComboBox es que el control
ListBox permite la selección de múltiples opciones además lógicamente de poder
mostrarlas.
Dim aOpciones() As String = {"Net Desarrollo", "Visual Basic .Net", "ASP .Net",
_
lstDisponibles.Items.AddRange(aOpciones)
lstMulti.DataSource = aMultiple
lstMulti.ClearSelected()
End Sub
If Len(Trim(txtnombre.Text)) = 0 Then
txtnombre.Focus()
Exit Sub
End If
For i = 0 To lstNombres.Items.Count - 1
vPresente = True
Exit For
End If
Next
lstNombres.Items.Add(txtnombre.Text)
lstNombres.Focus()
End If
End Sub
lstNombres.Items.Remove(lstNombres.SelectedItem)
End If
End Sub
El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda,
no olviden dar su opinión en mi Panoramabox, gracias.
Maestro - Detalle
Clientes - Órdenes usando Northwind
Sres. Desarrolladores, en esta oportunidad les envío un pequeño pero útil ejemplo de
como utilizar un DataView en una consulta Maestro (la tabla Customers) y obtener las
órdenes del Cliente seleccionado (de la tabla Orders), los clientes son cargados en un
ComboBox y luego de seleccionar uno de ellos se pueden visualizar sus órdenes.
A continuación sigue código en Visual Basic, nótese que la Region generada por
Windows Forms ha sido eliminada para mostrar únicamente lo que se desea:
Imports System.Data
Imports System.Data.SqlClient
daOrdenes.Fill(dsDatos, "Ordenes")
cboClientes.DataSource = dsDatos.Tables("Clientes")
cboClientes.DisplayMember = dsDatos.Tables("Clientes").Columns(1).ToString
cboClientes.ValueMember = dsDatos.Tables("clientes").Columns(0).ToString
'Definir el DataView
dvOrdenes = dsDatos.Tables("Ordenes").DefaultView
End Sub
With dgOrdenes
.DataSource = dvOrdenes
End With
End Sub
dgOrdenes.DataSource = Nothing
End Sub
End Class
Como se pueden dar cuenta, es una de las formas mas sencillas de obtener un Maestro -
Detalle, también es posible agregar una relación (Relation) entre las dos tablas
(DataTables) y utilizar el método GetChildRows del objeto DataRow para obtener el
detalle.
Mantenimiento de Categorías
Usando la Base de datos Northwind
También se muestra como se utiliza el control ToolTip, recuerden que en los exámenes
del Desarrollador Cinco Estrellas asi como en la Certificación MCSD .Net viene
preguntas acerca del Control ToolTip. Basta con uno solo para todos los controles que
se les pueda especificar un mensaje.
Notas importantes:
El ejemplo incluye dos formas de manipular los registros de Categorías, la
primera es únicamente con el uso de un grid y un botón que actualice la tabla de
la base de datos con el uso del SQLDataAdapter respectivo.
La segunda forma es incluyendo los clásicos botones de navegación entre
registros y los botones Insertar, Modificar, Actualizar y Eliminar.
El ejemplo muestra en el mismo Form las dos opciones.
Les envío además un archivo de Word en Versión Imprimible.
grdCategorias.DataSource = dsCat.Tables("Categorias")
' **********************************************************'
'CREAR EL ADAPTADOR
daCat = New SqlDataAdapter("Select CategoryId,CategoryName,Description from
Categories", cn1)
'CREAR EL COMMANDBUILDER
'ESTE OBJETO PERMITE CREAR LOS COMANDOS DEL ADAPTADOR
Dim cbCat As New SqlCommandBuilder(daCat)
'Abrir la Conexion
cn1.Open()
'Llenar el DataSet
Me.daCat.Fill(dsCatCod, "CategoriasCod")
'Cerrar la conexion
cn1.Close()
'Indicador de registros a 0
Me.iPosicion = 0
End Sub
'DEFINIR UN DATAROW
Dim drFila As DataRow
'ASIGNAR LOS DATOS DEL PRIMER REGISTRO AL DATAROW
drFila = dsCatCod.Tables("CategoriasCod").Rows(Me.iPosicion)
Me.txtIdCat.Text = drFila("CategoryID")
Me.txtNombreCat.Text = drFila("CategoryName")
Me.txtDescCat.Text = drFila("Description")
End Sub
End Sub
'REGISTRO ANTERIOR
If Me.iPosicion = 0 Then
Else
Me.iPosicion -= 1
CargarDatos()
End If
End Sub
'SIGUIENTE REGISTRO
Else
Me.iPosicion += 1
CargarDatos()
End If
End Sub
'DEFINIR EL DATAROW
FilaNueva = Me.dsCatCod.Tables("CategoriasCod").NewRow()
'ASIGNAR LOS VALORES CON LOS DE LAS CAJAS DE TEXTO
FilaNueva("CategoryName") = Me.txtNombreCat.Text
FilaNueva("Description") = Me.txtDescCat.Text
'Agregar el Row
Me.dsCatCod.Tables("CategoriasCod").Rows.Add(FilaNueva)
'Deshabilitar Botones
Me.cmdInsertar.Enabled = False
Me.cmdActualCod.Enabled = True
Me.cmdModificar.Enabled = True
Me.cmdEliminar.Enabled = True
Me.cmdLimpiar.Enabled = True
DesactivarCajas()
Me.cmdActualCod.Text = "Actualizar"
Me.iPosicion = Me.dsCatCod.Tables("CategoriasCod").Rows.Count - 1
End Sub
El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda,
no olviden dar su opinión en mi Panoramabox, gracias.
Usando SQLDataReader
Entornos Conectados
Sres Desarrolladores, en esta ocasión va mi aporte para entender un poco el uso del
objeto SQLDataReader usado en Entornos conectados usando Base de Datos.
UN POCO DE TEORIA
SQLDataReader es una clase que permite leer un conjunto de registros avanzando
unicamente hacia adelante, es una clase que no se puede heredar.
AS
RETURN
'Crear el DataReader
Dim drConsulta As SqlDataReader
'Abrir la conexión
cn.Open()
'Ejecutar el DataReader
drConsulta = cmd.ExecuteReader()
'ARTICULOS NO DESCONTINUADOS
While drConsulta.Read
ListBox1.Items.Add(drConsulta(1))
'el número 1 indica la segunda
'columna de la consulta
End While
'SIGUIENTE RESULTADO
'PRODUCTOS DE CATEGORIAS 1, 3 Y 5
drConsulta.NextResult()
While drConsulta.Read
ListBox2.Items.Add(drConsulta(1))
End While
'SIGUIENTE RESULTADO
'PRODUCTOS CON PRECIO UNITARIO > 20
drConsulta.NextResult()
While drConsulta.Read
ListBox3.Items.Add(drConsulta(1))
End While
'Cerrar el DataReader
drConsulta.Close()
'Cerrar la conexión
cn.Close()
End Sub
El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda,
no olviden dar su opinión en mi Panoramabox, gracias.
El Control ListView
Uso de Estructuras
Sres. Desarrolladores, en esta oportunidad les envie un aporte para poder comprender la
parte básica de uno de los controles mas utilizados en aplicaciones de Escritorio, el
control ListView.
UN POCO DE TEORIA
El control ListView es un control de lista que tiene mucha versatilidad, se puede utilizar
hasta en 4 vistas diferentes: LargeIcon, Details, SmallIcon y List (Iconos grandes,
Detalle, Iconos pequeños y Lista). Las mismas opciones están incluidas en el botón
Vistas del Explorador de Windows.
El control ListView presenta una lista de elementos que son heredados de la clase
ListViewItem, cada uno de estos elementos a su vez tiene Subelementos (SubItems),
que van relacionados con el ListViewItem respectivo.En la vista Detalle (propiedad
View en la opción Details) permite mostrar el control con los ListViewItem y los
SubItems respectivos en una cuadricula similar a un control Grid (control DataGrid). En
esta vista se muestran los encabezados de cada columna (colección Columns) donde
podemos asignar nombres a las mismas, un texto que se mostrará en cada una asi como
el ancho.
Como en todo control de Lista los elementos del control ListView se agregan a la
colección Items.
http://www.elguille.info/colabora/NET2005/FernandoLuque_El_Control_ListBox.htm
para el control ListBox -
Algunas de las propiedades ligadas a la vista Details del control ListView son:
Propiedad Descripción
NUESTRO EJEMPLO
El aporte que comparto con ustedes señores desarrolladores muestra como ingresar dos
datos: Nombre y Nota y mostrarlos en un control ListView. Estos dos datos están
incluidos en una Estructura previamente creada, luego se crea un arreglo donde cada
elemento es del tipo de la estructura. ES NECESARIO ANOTAR QUE LA
CONSISTENCIA DE LOS DATOS REPETIDOS O DEL TIPO ADECUADO (String
para el nombre y Numeric para la nota) NO ESTAN COSISTENCIADOS.
Structure alumno
Public nombre As String
Public nota As Integer
End Structure
Exit Sub
End If
cmdMostrar.Enabled = True
aIntegrantes(cContador).nombre = txtNombre.Text
aIntegrantes(cContador).nota = txtNota.Text
cContador += 1
txtNombre.Focus()
End Sub
Sres. Desarrolladores, este aporte ayudará a muchos de ustedes a darle ese toque final a
sus proyectos, en esta oportunidad envio un ejemplo donde explico como cambiar la
forma de presentación de un Grid en una aplicción Windows.
UN POCO DE TEORIA
Este Grid o control DataGrid tiene una apariencia que en muchas ocasiones no se
adecua a nuestros requerimientos, para esto debemos cambiarle la forma de como se ve
aplicando un Estilo o lo que se conoce como CAMBIARLE EL FORMATO AL GRID.
La Clase DataGridTableStyle
With dgEstiloTabla
.AlternatingBackColor = Color.GhostWhite
.BackColor = Color.GhostWhite
.ForeColor = Color.MidnightBlue
.GridLineColor = Color.RoyalBlue
.HeaderBackColor = Color.MidnightBlue
.HeaderFont = New Font("Tahoma", 8.0!, FontStyle.Bold)
.HeaderForeColor = Color.Lavender
.SelectionBackColor = Color.Teal
.SelectionForeColor = Color.PaleGreen
' Establecer la propiedad Mapping
'para que tenga efecto el objeto DataGridTableStyle
.MappingName = vNombreTabla
.PreferredColumnWidth = 125
.PreferredRowHeight = 15
End With
Luego para asignar el estilo creado al control DataGrid debemos utilizar la propiedad
Mapping y seleccionar el nombre del DataTable que tomará el formato definido.
Una vez definido el formato, especificada la propiedad Mapping debe agregarse este a
la colección TableStyles del control DataGrid, la instrucción para nuestro ejemplo es:
dgClientes.TableStyles.Add(dgEstiloTabla)
La Clase DataGridColumnStyle
Después de crear todos los estilos de las columnas a mostrar deben agregarse estos a la
colección GridColumnStyles del control DataGrid.
VAMOS CON EL EJEMPLO
'NameSpace necesarios
Imports System.Data
Imports System.Data.SqlClient
Sres. Desarrolladores, les envio otro ejercicio de ListView, este es mas completo, que el
anterior publicado, el link del anterior es el siguiente:
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListView.htm, en
este artículo usé estructuras junto con el control LstView.
El control ListView es un control de lista que tiene mucha versatilidad, se puede utilizar
hasta en 4 vistas diferentes: LargeIcon, Details, SmallIcon y List (Iconos grandes,
Detalle, Iconos pequeños y Lista). Las mismas opciones están incluidas en el botón
Vistas del Explorador de Windows.
El control ListView presenta una lista de elementos que son heredados de la clase
ListViewItem, cada uno de estos elementos a su vez tiene Subelementos (SubItems),
que van relacionados con el ListViewItem respectivo.En la vista Detalle (propiedad
View en la opción Details) permite mostrar el control con los ListViewItem y los
SubItems respectivos en una cuadricula similar a un control Grid (control DataGrid). En
esta vista se muestran los encabezados de cada columna (colección Columns) donde
podemos asignar nombres a las mismas, un texto que se mostrará en cada una asi como
el ancho.
Como en todo control de Lista los elementos del control ListView se agregan a la
colección Items.
http://www.elguille.info/colabora/NET2005/FernandoLuque_El_Control_ListBox.htm
para el control ListBox .
EL EJEMPLO
Este ejemplo es muy similar al anterior, pero aqui no se manejan los datos con
estructuras, dejo a criterio de ustedes desarrolladores la elección de como implementar
su uso.
A continuación sigue código en Visual Basic
El código completo está en el archivo adjunto, voten por mi PanoramaBox para que me
den mas aliento para seguir publicando. Suerte a todos.
res. Desarrolladores, en esta oprtunidad quiero compartir con ustedes este pequeño Site,
que muestra como navegar en el por las páginas donde solamente algunas necesitan de
autenticación.
Algunos ejemplos los encontramos en las páginas del Desarrollador Cinco Estrellas,
donde se puede navegar a través del sitio sin loguearse, solamente cuando accedemos al
perfil o a los examenes nos piden usuario y contraseña.
Muchos de los Sitios Web que construimos nos piden esa forma de trabajo, me parece la
forma mas sencilla de desarrollar esto con el uso de variables de sesión. El ejemplo que
comparto con ustedes tiene una ZONA DE MIEMBROS, la cual se accede siempre que
el usuario se haya autenticado.
Todo el código está en el archivo adjunto. No olviden calificar, me incentiva para seguir
publicando, suerte a todos
Sres. Desarrolladores, les envio otro aporte, este trata de despejar algunas dudas de
como utiizar los controles básicos en una aplicación Windows usando Visual Basic
.Net.
EL EJEMPLO
Los controles mas utilizados en aplicaciones Windows son las cajas de texto y los
controles de lista, en este ejemplo se ingresa los datos de un producto que se repartirá
entre los departamentos que se seleccionen de una empresa, la cantidad de
departamentos es mínimo dos.
Se usan variables y se grafica un poco como usar estas a nivel de clase y como cambiar
y manejar su valor entre los diferentes procedimientos.En este ejemplo se ingresa una
cantidad de un supuesto producto que luego según los departamentos seleccionados
tendrá que repartirse. Note ciertas consistencias en el ingreso de datos y luego en el
manejo de las variables. Suerte.
If c >= 2 Then
cboDepa.Items.Clear()
lstAsignado.Items.Clear()
cmdMostrar.Enabled = True
cmdAsignar.Enabled = False
For i = 0 To chklDepas.Items.Count - 1
If chklDepas.GetItemChecked(i) = True Then
cboDepa.Items.Add(chklDepas.Items.Item(i))
End If
Next
Sres. Desarrolladores, esta oportunidad les envio un aporte en ASP .Net, en este artículo
muy simple intento explicar el uso de los principales controles en ASP y el uso de los
Controles Button.
ALGO DE TEORIA
Existe diferencias entre una aplicación Windows y una aplicación ASP .Net,
basicamente en el uso de los principales controles como:
Hemos de anotar que la mayor parte de aplicaciones utilizan mucho estos controles, por
lo que este artículo está orientado a explicar lo mas importante de cada uno de ellos.
Caja de texto, control que almacena datos alfanuméricos como nombres, emails,
direcciones, etc. El uso de este control es básico en todo tipo de aplicaciones.
Propiedad Descripción
Obtiene o establece la tecla de
acceso rápido en combinación con
AccessKey
la tecla ALT. Solo se permite una
letra.
BorderColor, BorderStyle,
Color, Estilo y ancho del borde
BorderWidth
Obtiene o establece si la caja de
Enabled
texto está disponible
MaxLength Longitud máxima del texto
Comportamiento de la caja de
texto:
SingleLine: para una sola linea
TextMode
MultiLine: múltiples líneas
Password: para el ingreso de
contraseñas
Obtiene o establece el contenido de
la caja de texto, para borrar el
Text contenido podemos usar la
siguiente línea:
txtNombre.Text = ""
Algo mas, la definición en la vista HTML del control Web TextBox es como sigue:
<asp:TextBox
id="txtNombre"
runat="server"
accessKey="N"></asp:TextBox>
Propiedad Descripción
Obtiene o establece la tecla de
acceso rápido en combinación con
AccessKey
la tecla ALT. Solo se permite una
letra.
BorderColor, BorderStyle,
Color, Estilo y ancho del borde
BorderWidth
Obtiene o establece si la caja de
Enabled
texto está disponible
MaxLength Longitud máxima del texto
True: El control está seleccionado
Cheched False: El control no está
seleccionado
Obtiene o establece el texto que
Text
muestra el control
Algo mas, la definición en la vista HTML del control Web RadioButton es como sigue:
<asp:RadioButton
id="optEstable"
runat="server" Text="Estable"
Checked="True"
GroupName="condicion"></asp:RadioButton>
Los controles ListBox y DropDownList de aplicaciones ASP .Net son muy similares, la
diferencia o la decisión de usar uno o el otro es el espacio para el diseño y el tipo de
selección. Si no hay suficiente espacio en la aplicación puede ser mejor usar un
DropDownList, si existe mejor un ListBox; el control ListBox permite la selección de
varias alternativas, sin embargo el control DropDownList no.
Control Button
Control LinkButton
Control Hyperlink
Control ImageButton
Control Descripción
Control de servidor Presenta un botón de comando estándar, que se representa
Web Button como un botón "Enviar" de HTML.
Control de servidor Se representa como un hipervínculo en la página. No obstante,
Web LinkButton contiene una secuencia de comandos del lado cliente que hace
que el formulario se devuelva al servidor. (Puede crear un
hipervínculo auténtico mediante el control de servidor Web
HyperLink).
Control de servidor Permite especificar un gráfico como botón. Esto es útil para
Web ImageButton representar los botones con una apariencia más rica. Los
controles ImageButton determinan con precisión el punto en
el que hizo clic el usuario, lo que permite utilizar el botón
como si fuera un mapa de imagen.
NUESTRO EJEMPLO
El código completo está en el archivo adjunto al final del artículo, suerte a todos y no se
olviden botar en mi PanoramaBox, eso me alienta a seguir publicando. Suerte a todos.
ListView Avanzado
Uso de Vistas
Manejo de los datos del Item seleccionado
Sres. Desarrolladores, este ejemplo trata de mostrar el uso del control ListView, además
de incluir un ContextMenu para permitir al usuario seleccionar la Vista que desee de
este. Lo artículos antes publicados respecto a este mismo control son:
El control ListView
(II): http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListVie
wII.htm
En una cuarta parte manejaré el control enlazado a una base de datos en SQL Server y
otro con el uso del control TreeView.
UN POCO DE TEORIA
Propiedad Descripción
Indica si el usuario puede reordenar las
AllowColumnReorder
columnas
CheckBoxes Indica si se muestran casillas de
verificación
Indica si al seleccionar un Item se marcan
FullRowSelect todos los SubItems del elemento
seleccionado
GridLines Muestra las líneas en la vista Details
MultiSelect Permite la selección de Multiples Items
View Cambia la Vista
Permite que el usuario modique
LabelEdit
directamente las etiquetas de los elementos.
Columnas que se mostrarán en la vista
Columns
Detalle (Details)
Identificador de cada elementos del
Items
ListView
Conjunto de elementos que dependen del
SubItems
Item
NUESTRO EJEMPLO
En el ejemplo que comparto con ustedes les incluyo dos controles ListView, el primero
con 4 elementos incluídos con la vista Detalle por defecto, este primer ListView tiene
especificados las propiedades SmallImageList y LargeImageList y también un menú
contextual para cambiar la vista del control.
El botón Copiar copia los elementos seleccionados a un array y luego los incluye en el
segundo ListView, si bien es cierto pueden hacerlo directamente, hago esto debido a
una consulta que me hicieron por el correo, ¿COMO PUEDO COPIAR LOS DATOS
DEL LISTVIEW A OTRO FORMULARIO?, me parece que contanto con un array
definido en un módulo es sumamente sencillo conseguir esto. En otro envio trabajaré
con datos extraido de una base de datos de SQL Server.
LlenarListview()
FormatoGridCopiados()
End Sub
lsvDatos.Items.Add("FL3049", 0)
lsvDatos.Items(0).SubItems.Add("Ing. Fernando Luque Sánchez")
lsvDatos.Items(0).SubItems.Add("39")
lsvDatos.Items(0).SubItems.Add("Av. Brasil 567 Lima")
lsvDatos.Items.Add("CVA049", 1)
lsvDatos.Items(1).SubItems.Add("Carolina Villacorta de Luque")
lsvDatos.Items(1).SubItems.Add("39")
lsvDatos.Items(1).SubItems.Add("Av. Angamos Oeste 466")
lsvDatos.Items.Add("FLV456", 2)
lsvDatos.Items(2).SubItems.Add("Fernando Luque Villacorta")
lsvDatos.Items(2).SubItems.Add("8")
lsvDatos.Items(2).SubItems.Add("Av. Larco 906 Miraflores")
lsvDatos.Items.Add("MFL012", 3)
lsvDatos.Items(3).SubItems.Add("María Fernanda Luque Villacorta")
lsvDatos.Items(3).SubItems.Add("4")
lsvDatos.Items(3).SubItems.Add("Canaval y Moreyra 499 La Molina")
End Sub
Sub FormatoGridCopiados()
lsvSelec.GridLines = True
lsvSelec.FullRowSelect = True
'Encabezados
lsvSelec.Columns(0).Text = "Id. Empleado"
lsvSelec.Columns(1).Text = "Nombre"
lsvSelec.Columns(2).Text = "Edad"
lsvSelec.Columns(3).Text = "Dirección"
'Ancho de cada Columna
lsvSelec.Columns(0).Width = 100
lsvSelec.Columns(1).Width = 200
lsvSelec.Columns(2).Width = 50
lsvSelec.Columns(2).TextAlign = HorizontalAlignment.Right
lsvSelec.Columns(3).Width = 280
End Sub
Uso de DataBinding
Los controles que con regularidad se utilizan en aplicaciones Windows así como en
aplicaciones Web tienen la propiedad DataBinding, es necesario configurar la propiedad
de cada control que contendrá en enlace a los datos, luego para administrar esta se debe
utilizar la propiedad BindingContext de la clase contenedora. Al usar el
BindingContext obtiene el BindingManagerBase que mantiene sincronizados todos los
controles enlazados al mismo origen de datos, se puede utilizar la propiedad Position
del BindingManagerBase para especificar el elemento actualmente seleccionado de una
lista.
Por ejemplo, para enlazar una caja de texto con el campo FirsName de la Tabla
Empleados (dtEmpleados) contenida en una DataSet previamente definido utilizo la
siguiente instrucción:
Luego para administrar por ejemplo la posición actual o lo que es lo mismo el registro
activo se utiliza la siguiente instrucción:
Me.BindingContext(dtEmpleados).Position = 0
NUESTRO EJEMPLO
El ejemplo muestra un formulario donde aparecen los Empleados (Tabla Employees), el
Total de sus ventas, las Órdenes Registradas (Tabla Oders) por el Empleado y el
Detalle de las mismas (Tabla Order Details). La Base de datos es Northwind.
2. Para llenar Total de las ventas creamos un DataTable con el Id del Empleado y el
valor total de las Órdenes.
En el ejemplo se han incluído cuatro DataTable y tres Vistas, con las siguientes órdenes
asigno los DataTables creados a variables y especifico el origen de las Vistas creadas.
El siguiente es una porción del código, intento mostrar la zona de declaraciones para
que se den cuenta de los datos definidos:
'Las vistas
Dim dvOrdenes As DataView
Dim dvDetalle As DataView
Dim dvVentas As DataView
'El SQLDataAdapter
Dim daDatos As SqlDataAdapter
.....
El procedimiento para crear y añadir los DataBindings a los controles es como sigue:
Para que puedas ejecutar el ejemplo baja el código fuente al final del artículo y actualiza
tu cadena de conexión, no te olvides de calificarme en PanoramaBox, si lo haces me das
los puntos que me incentiva seguir publicando. Suerte a todos y A SEGUIR
DESARROLLANDO....cualquier consulta por correo.
UN POCO DE TEORIA
Crear un DataView
2. Utilizando el Constructor del DataView, para esto debe asignarse los parámetros
necesarios como: el DataTable de Origen, la cadena de Filtrado (Propiedad RowFilter),
la cadena de Ordenamiento (Sort) y el estado de las filas o registros que muestre
(RowState). En nuestro ejemplo utilizamos la siguente instrucción:
Donde:
Para nuestro ejemplo la cadena de conexión la armamos con las opciones seleccionadas
previamente:
DataViewRowState Descripción
CurrentRows La versión de fila Current de todas las filas
Unchanged, Added y Modified. Éste es el valor
predeterminado.
Added La versión de fila Current de todas las filas
Added.
Deleted La versión de fila Original de todas las filas
Deleted.
ModifiedCurrent La versión de fila Current de todas las filas
Modified.
ModifiedOriginal La versión de fila Original de todas las filas
Modified.
None Ninguna fila.
OriginalRows La versión de fila Original de todas las filas
Unchanged, Modified y Deleted.
Unchanged La versión de fila Current de todas las filas
Unchanged.
En otro aporte enviare un código para poder modificar los datos mediante DataView, les
adelanto que se puede controlar esto con las propiedades AllowNew, AllowEdit y
AllowDelete. Tenga en cuenta que los cambios definitivos en la base de datos se
efectuan con los métodos AcceptChanges o RejectChanges de DataTable de origen.
Una cosa muy importante, sabemos que las aplicaciones constan siempre de varios
DataTables relacionados, para sincronizar las vistas de todas las tablas del DataSet es
ideal utilizar un DatAViewManager.
'Cadena de ordenamiento
Dim vCadenaOrden As String = cboCampos.SelectedItem & " " &
IIf(optASCcampos.Checked, "ASC", "DESC")
dvProductos.Sort = vCadenaOrden
drgProductos.DataSource = dvProductos
lblOrdenActual.Text = vCadenaOrden
End Sub
El código completo se encuentra en el archivo adjunto al final del artículo, suerte a
todos y A SEGUIR DESARROLLANDO, cualquier consulta al correo que se encuentra
al inicio.
Sres. Desarriolladores, este artículo pretende mostrar como enlazar los controles de
lista ListBox, ComboBox y CheckedListBox al contenido de una tabla en una base de
datos de SQL Server.
En el artículo que comparto con ustedes utilizo las tablas Customers, Products y Region
de la base de datos Northwind.
UN POCO DE TEORIA
En las aplicaciones de escritorio son muy utilizados los controles de lista, especialmente
los controles ListBox y ComboBox. También para mostrar un grupo de casillas de
verificación se utiliza el control CheckedListBox.
He publicado otros artículos que muestran el uso de estos controles pero sin enlace a
base de datos:
El control ComboBox:
http://www.elguille.info/colabora/NET2005/FernandoLuque_El_Control_Co
mboBox.htm
Para no llenar de texto el artículo, les comento que en le ayuda de Visual Studio
se encuentra la explicación detallada de como manejar estos controles, les
incluyo una parte:
En los tres ejemplos siguientes se muestran las tres colecciones indizadas que admite la
clase ListBox.
Índice Elemento
0 objeto2
1 objeto4
2 objeto5
NUESTRO EJEMPLO
En este artículo que comparto con ustedes señores desarrolladores, les muestro como
llenar los controles con los elementos de una base de datos de dos formas:
Dim i As Integer
For i = 0 To dsDatos.Tables("Productos").Rows.Count - 1
'Llenar ProductId, ProductName y UnitPrice
Dim vdato As String
vdato = dsDatos.Tables("Productos").Rows(i).Item(0).ToString
vdato &= Space(5) &
dsDatos.Tables("Productos").Rows(i).Item(1).ToString
vdato &= Space(5) &
dsDatos.Tables("Productos").Rows(i).Item(5).ToString
cboTres.Items.Add(vdato)
Next
Por ejemplo:
cboTodos.DataSource = dsDatos.Tables("Productos")
cboTodos.DisplayMember = dsDatos.Tables("Productos").Columns(1).ToString
cboTodos.ValueMember = dsDatos.Tables("Productos").Columns(0).ToString
A continuación sigue código en Visual Basic:
'Crear el SQLDataAdapter
Dim daDatos As New SqlDataAdapter("Select * from Customers", cn)
'Crear el DataSet
Dim dsDatos As New DataSet
'Llenar el DataTable
daDatos.Fill(dsDatos, "Clientes")
Dim i As Integer
For i = 0 To dsDatos.Tables("Clientes").Rows.Count - 1
'Llenar CustomerId, CompanyName, ContactName
Dim vdato As String
vdato = dsDatos.Tables("Clientes").Rows(i).Item(0).ToString
vdato &= Space(5) & dsDatos.Tables("Clientes").Rows(i).Item(1).ToString
vdato &= Space(5) & dsDatos.Tables("Clientes").Rows(i).Item(2).ToString
lstClientes01.Items.Add(vdato)
Next
End Sub
El código completo está en el archivo adjunto al final del artículo, cualquier consulta al
correo que se encuentra al inicio del artículo. No olvides dar tu voto en mi
PanoramaBox. Suerte a todos y a seguir desarrollando.
Sres. Desarrolladores, este es el primero de una serie de artículos que estoy preparando
para explicar el uso de DataSets, para los que desarrollamos aplicaciones en Visual
Studio tanto para Windows como aplicaciones Web sabemos que toda la información la
manejamos en DataSets, por lo que creo necesario que conozcamos lo mejor posible
estos.
UN POCO DE TEORIA
El modelo de trabajo con datos desde una base de datos en aplicaciones con Visual
Studio .Net necesita de una Adaptador, este relaciona el DataSet con la Tabla
correspondiente en la base de datos, se encarga de la Inserción, Modificación,
Eliminación y Selección de registros.
DataSet Tipificados
Los DataSets tipificados son aquellos que tienen como referencia un esquema XML
presente en la aplicación (archivo con extensión xsd), estos tipos de DataSets pueden ser
creados desde el IDE siguiendo los siguientes pasos:
TIPS
NUESTRO EJEMPLO
En el ejemplo que comparto con ustedes señores desarrolladores, uso la tabla Customers
de la Base de datos Northwind, con esta creo dos tablas en Master y cada una la uno a
cada uno de los Grids presentes en formulario.
En un segundo aporte relacionado con este incluiré como relacionar o manejar los
DataSet no Tipificados, ademas de como instanciarlos.
'No Tipificado
El control TabControl
Manejo de los TabPages
Sres. Desarrolladores, este aporte pretende explicar el manejo del control TabControl,
este control puede ser utilizado cuando se tienen demasiados datos en un solo
formulario y es posible separarlos.
Para insertar fichas debe agregarse una opción a la colección TabPages. Especificar la
propiedad Text para el texto que mostrará la ficha.
Es un control que posee muchas propiedades y métodos pero que la mayoría de usuarios
las usamos por defecto.
EL EJEMPLO
En el aporte que comparto con ustedes intento mostrar como administrar las diferentes
fichas, teniendo en cuenta los ingresos de datos. Es muy útil, bajen el fichero zip y
ejecuten.
Manejo de registros
En este artículo pretendo mostrar como se acceden a los datos cuando se trabajan con
DataSets Tipificados y como se acceden cuando se trabajan con DataSets NO
Tipificados.
AL GRANO
DataSet Tipificado
For i = 0 To dsTDatos.ClientesTyped.Count - 1
...código necesaio
Next i
dsTDatos.ClientesTyped(i).ContactName.ToString
DataSet NO TIPIFICADO
drRegistro1("CompanyName") = txtCompanyName.Text
Donde txtCompanyName.Text es el contenido de una caja de texto. Note que los
elementos del DataRow se acceden utilizando (" ")
For i = 0 To dsUDatos.Tables("ClientesUnTyped").Rows.Count - 1
...código necesaio
Next i
dsTDatos.Tables("ClientesUnTyped").Rows(i) ("ContactName").ToString
Notas IMPORTANTES:
'Abrir la conexión
cn.Open()
'Crear el SQLCommand
Dim coClientes As New SqlCommand
coClientes.Connection = cn
coClientes.CommandType = CommandType.Text
'Se usarán dos tablas adicionales con los mismos datos
'de Customers: ClientesTyped y ClientesUnTyped
'Para ClientesTyped...comprobar si existe y borrarla
coClientes.CommandText = _
"IF EXISTS (SELECT * FROM sysobjects WHERE id =
object_id(N'[ClientesTyped]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP
TABLE [ClientesTyped] "
'Crear ClientesUnTyped
coClientes.CommandText = _
"CREATE TABLE ClientesUnTyped (" & _
"CustomerID nchar (5) PRIMARY KEY ," & _
"CompanyName nvarchar (40) NOT NULL," & _
"ContactName nvarchar (30) NULL," & _
"ContactTitle nvarchar (30) NULL," & _
"Address nvarchar (60) NULL," & _
"City nvarchar (15) NULL," & _
"Region nvarchar (15) NULL ," & _
"PostalCode nvarchar (10) NULL," & _
"Country nvarchar (15) NULL," & _
"Phone nvarchar (24) NULL," & _
"Fax nvarchar (24) NULL )"
coClientes.ExecuteNonQuery() 'Ejecuta Crear Tabla ClientesUnTyped
'TABLA ClientesTyped
coClientes.CommandText = _
"INSERT INTO ClientesTyped " & _
"(CustomerID,CompanyName,ContactName,ContactTitle," & _
"Address,City,Region,PostalCode,Country,Phone,Fax )" & _
"(Select CustomerID,CompanyName,ContactName,ContactTitle," & _
"Address,City,Region,PostalCode,Country," & _
"Phone,Fax from Customers)"
coClientes.ExecuteNonQuery()
'TABLA ClientesUntyped
coClientes.CommandText = _
"INSERT INTO ClientesUnTyped " & _
"(CustomerID , CompanyName, ContactName, ContactTitle," & _
"Address ,City,Region,PostalCode,Country,Phone ,Fax )" & _
"(Select CustomerID , CompanyName, ContactName, ContactTitle,"
&_
"Address , City, Region, PostalCode, Country," & _
"Phone , Fax from Customers)"
coClientes.ExecuteNonQuery()
'Crear el Adaptador
daTDatos.Fill(dsTDatos, "ClientesTyped")
'No Tipificado
'CERRAMOS LA CONEXION
cn.Close()
txtCustomerId.Text = "FLS23"
txtcompanyNema.Text = "Net Desarrollo SAC"
txtContactName.Text = "Ing. Fernando Luque"
txtContactTitle.Text = "Gerente General"
txtAddress.Text = "Av. Brasil 3546 Magdalena"
txtCity.Text = "Lima"
txtRegion.Text = "Oeste"
txtCountry.Text = "Perú"
txtPostalCode.Text = "51"
txtPhone.Text = "045968879"
txtFax.Text = "054-567466"
End Sub
El código completo se encuentra en el archivo adjunto al final del artículo, recuerda dar
tu opinión para PanoramaBox, suerte a todos y A SEGUIR DESARROLLANDO.
Sres Desarrolladores, esta vez comparto con ustedes un ejemplo sencillo de como
trabajar con DataSets Tipificados, la parte teórica de como incluir desde el IDE y crear
un DataSet Tipificado la encuentran en:
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataSetsI.htm
En este artículo muestro unicamente como llenar un control DataGrid y según los datos
agregados, modificados o eliminados, actualizarlo directamente en la Base de datos.
El formulario se presenta como sigue:
El ejemplo tiene incluidos desde el IDE los siguientes objetos:
Imports System.Data.SqlClient
Imports System.Data
daAutores.Fill(dsAutores)
DataGrid1.DataSource = dsAutores.Tables(0)
End Sub
daAutores.Update(dsAutores)
End Sub
End Class
Como se darán cuenta, no hay que escribir casi nada de código. Solo llenar
el DataTable con el SQLDataAdapter y especificar la propiedad DataSource del control
DataGrid, para actualizar se utiliza el Adaptador con el método Update.
Sres. Desarrolladores, este aporte es util para saber como mostrar la información de una
Tabla cuando esta tiene, en alguno de sus campos datos de otras tablas (Claves Foraneas
- Foreing Keys).
Sabemos que al desarrollar una aplicación todas las tablas se encuentran relacionadas,
aquellos atributos que son claves foráneas deben tener en cuenta los datos de otra tabla
(vaya si digo lo mismo), para el aporte que comparto con ustedes, los datos del
Proveedor y la Categoría en la tabla Productos son claves foráneas.
EL EJEMPLO
'Conexión
'Adaptadores
Dim daProductos As New SqlDataAdapter("Select * from Products", cn)
Dim daProveedores As New SqlDataAdapter("Select SupplierId,CompanyName
from Suppliers order by SupplierId", cn)
Dim daCategorias As New SqlDataAdapter("Select * from Categories", cn)
'Llenar el DataSet
daProductos.Fill(dsDatos, "Productos")
daProveedores.Fill(dsDatos, "Proveedores")
daCategorias.Fill(dsDatos, "Categorias")
'Llenar ListView
For i = 0 To dsDatos.Tables("Productos").Rows.Count - 1
lvProductos.Items.Add(dsDatos.Tables("Productos").Rows(i)("ProductID"))
lvProductos.Items(i).SubItems.Add(dsDatos.Tables("Productos").Rows(i)("Prod
uctName"))
lvProductos.Items(i).SubItems.Add(dsDatos.Tables("Productos").Rows(i)("Unit
sInStock"))
lvProductos.Items(i).SubItems.Add(dsDatos.Tables("Productos").Rows(i)("Unit
Price"))
lvProductos.Items(i).SubItems.Add(dsDatos.Tables("Productos").Rows(i)("Unit
sOnOrder"))
Next
cboCategorias.DataSource = dsDatos.Tables("Categorias")
cboCategorias.DisplayMember =
dsDatos.Tables("Categorias").Columns("CategoryName").ToString
cboCategorias.ValueMember =
dsDatos.Tables("Categorias").Columns("CategoryID").ToString
CategoriaActivar()
'Llenar las Cajas de texto y el CheckBox
LlenarRegistro()
End Sub
txtProductID.Text = dsDatos.Tables("Productos").Rows(vposicion)("ProductID")
txtProductName.Text =
dsDatos.Tables("Productos").Rows(vposicion)("ProductName")
txtUnitsInStock.Text =
dsDatos.Tables("Productos").Rows(vposicion)("UnitsInStock")
txtUnitPrice.Text = dsDatos.Tables("Productos").Rows(vposicion)("UnitPrice")
txtReorderLevel.Text =
dsDatos.Tables("Productos").Rows(vposicion)("ReorderLevel")
txtUnitsOnOrder.Text =
dsDatos.Tables("Productos").Rows(vposicion)("UnitsOnOrder")
txtQuantityPerUnit.Text =
dsDatos.Tables("Productos").Rows(vposicion)("QuantityPerUnit")
chkDiscontinued.Checked =
CType(dsDatos.Tables("Productos").Rows(vposicion)("Discontinued"), Boolean)
End Sub
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataSetsI.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataSetsII.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListView.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListViewII.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewAvanzado.htm
El código completo del aporte se encuentra al final del artículo, solo recuerda que tienes
que actualizar la cadena de conexión y listo. Cualquier consulta a mi correo que aparece
al inicio del artículo. Muchas suerte a todos y...A SEGUIR DESARROLLANDO..
http://www.elguille.info/colabora/NET2005/FernandoLuque_DataSetsI.htm
El Ejemplo
daAutores.Fill(dsDatos)
Pos = 0
CargarDatos()
dgAutores.DataSource = dsDatos.Tables(0)
End Sub
Me.Pos = dgAutores.CurrentRowIndex
CargarDatos()
End Sub
fila = dsDatos.Tables(0).Rows(Pos)
Me.txtIdAutor.Text = fila(0)
Me.txtApellidos.Text = fila(1)
Me.txtNombres.Text = fila(2)
Me.txtFono.Text = fila(3)
Me.txtDire.Text = fila(4)
Me.txtCiudad.Text = fila(5)
Me.txtEstado.Text = fila(6)
Me.txtPostal.Text = fila(7)
End Sub
El código completo está en el archivo adjunto al final del artículo. La Base de datos es
Pubs y la tabla con la que se trabaja en Authors. Actualiza tu cadena de conexión.
Sres. Desarrolladores, este aporte pretende ahorrar algo de tiempo en las tareas de la
eliminación del contenido de los controles en la tarea de agregar registros.
txtIdEmpleado.Clear()
txtNombre.Clear()
txtDireccion.Clear()
txtFono.Clear()
Nuestro Formulario:
Este ejemplo muestra un par de botones de comando...uno para limpiar el contenido de
las cajas de texto y otro para los combobox, ustedes señores desarrolladores usen este
ejemplo para implementar y optimizar sus procedimiento.
Variable para el Tipo de control -- "CT" para cajas de texto y "CO" para ComboBox
El código completo de este pequeño aporte está en el final del artículo, no olviden
calificar en PanoramaBox, me alienta a seguir compartiendo con ustedes mis
conocimientos.
Sres. Desarrolladores, continuando con el control ListView, comparto con ustedes este
ejemplo de como llenar el control con los datos de un DataTable.
Personalmente creo que el trabajo con este es mas sencillo que el de un Grid, la cantidad
de código (si lo hacen por código obvio) es mayor en un Grid para formatearla que
usando el control ListView. Siempre habrán seguidores de unos y otros controles, lo
importante es saber como utilizarlos y en ese sentido esta mi aporte.
El Ejemplo
En la zona de Declaraciones:
El código completo del ejercicio está en el archivo adjunto al final del artículo. No
olviden votar en PanoramaBox, me alienta a seguir compartiendo con ustedes mis
conocimientos.
Sres. Desarrolladores, les envio otro ejemplo sencillo pero creo sumamente util de como
manejar DataSet Tipificados.Los artículos anteriores se encuentran en:
Ejemplos de Typed DataSets
http://www.elguille.info/colabora/NET2005/FernandoLuque_TypedDataSetI.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_TypedDataSetII.htm
El ejemplo
Donde:
cnRegion -- es un objeto SQLConnection que conecta a Northwind
daRegion -- un SQLDataAdapter con la tabla Region
daTerritorios -- un SQLDataAdapter con la tabla Territories
dsRegiones -- el DATASET TIPIFICADO
El control TreeView
Sres. Desarrolladores, esta primera entrega del control TreeView permite enseñar como
construir un TreeView con los datos de dos tablas.
Un poco de Teoría
El control TreeView muestra los datos de manera jerárquica de manera similar a como
lo muestra el panel izquierdo en el Explorador de Windows. Estos elementos se llaman
Nodos y estos pueden contener a su vez otros nodos llamados nodos secundarios.
EL EJEMPLO
En la zona de declaraciones.
Al cargar el formulario.
Espero sea útil para sus aplicaciones, en las siguientes entregas incluiré mas
funcionalidad.
No olviden votar en PanoramaBox, eso me alienta a seguir compartiendo con ustedes
mis conocimientos. El código completo se encuentra en el empaquetado adjunto al final
del artículo, bájalo, es sencillo.
Textos artísticos
Sres. Desarrolladores, esta es la primera entrega de una colección de artículos que les
enseñará como crear textos artísticos usando GDI+ así como de animaciones sencillas.
UN POCO DE TEORIA
Partes de GDI+
Gráficos vectoriales 2D
Imágenes
Tipografía
Gráficos vectoriales 2D
Los gráficos vectoriales están relacionados con el dibujo de tipos primitivos (como
líneas, curvas y figuras) que se especifican mediante conjuntos de puntos en un sistema
de coordenadas. Por ejemplo, una línea recta puede especificarse mediante sus dos
extremos, y un rectángulo puede especificarse mediante un punto que indique la
ubicación del borde superior izquierdo y un par de números que indiquen el ancho y el
alto. Un trazado simple puede especificarse mediante una matriz de puntos que se van a
conectar mediante líneas rectas. Una curva spline de Bézier es una curva sofisticada,
especificada por cuatro puntos de control.
Imágenes
Hay ciertos tipos de imágenes que no se pueden o son muy difíciles de mostrar con las
técnicas de gráficos vectoriales. Por ejemplo, las imágenes de los botones de la barra de
herramientas y las imágenes que aparecen en forma de iconos serían difíciles de
especificar en forma de colecciones de líneas y curvas. Una fotografía digital de alta
resolución de un estadio de béisbol abarrotado sería aún más difícil de crear con las
técnicas vectoriales. Las imágenes de este tipo se almacenan como mapas de bits,
matrices de números que representan los colores de puntos individuales de la pantalla.
GDI+ proporciona la clase Bitmap para mostrar, manipular y guardar mapas de bits.
Tipografía
Se puede utilizar cualquier objeto Graphics como superficie para representar texto. La
representación de texto requiere la utilización de un objeto Brush, que indica qué
modelo rellenará el texto, y un objeto Font, que describirá el modelo que se debe
rellenar. La fuente puede ser cualquiera de las instaladas en el sistema, y el pincel puede
ser de cualquier tipo. Por lo tanto, es posible pintar texto con un color sólido, con un
modelo o incluso con una imagen.
EL EJEMPLO
Para nuestro primer ejemplo hemos creado un formulario como el que se muestra en la
siguiente figura:
Figura 01
Para nuestro ejemplo la creación del objeto gráfico es como se ve en las sigueintes
líneas de código:
Una vez creado el objeto Graphics este se puede utilizar para representar líneas, formas,
texto o manipular imágenes. Nuestro ejemplo muestra como dibujar texto, los objetos
principales para esto son: Las clases Pen, Brush y Font y la estructura Color.
La clase Brush
Las clases que se derivan de esta clase permiten crear objetos utilizados para rellenar el
interior de formas gráficas.Las clases derivadas de Brush son: SolidBrush,
TextureBrush y LinearGradientBrush.
2. Cree una instancia de la clase Brush que desee usar para pintar el texto.
Por ejemplo:
3. Dim mybrush As New Drawing2D.LinearGradientBrush(ClientRectangle, _
4. Color.Red, Color.Yellow, Drawing2D.LinearGradientMode.Horizontal)
5. Cree la fuente en la que desee que aparezca el texto. Por ejemplo:
Sres. Desarrolladores, esta es la segunda entrega de una colección de artículos que les
enseñará como crear textos artísticos usando GDI+ así como de animaciones sencillas.
ALGO DE TEORIA
El ejemplo
En este ejemplo muestro como crear texto artístico con Sombra (Shadow).
Figura 01
Texto en Contorno
Sres. Desarrolladores, esta es la tercera entrega de una colección de artículos que les
enseñará como crear textos artísticos usando GDI+ así como de animaciones sencillas.
Las anteriores
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto01.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto02.htm
El ejemplo
'Creamos la fuente
Dim miLetra As New Font("Times New Roman", Me.nuSize.Value, _
FontStyle.Bold, GraphicsUnit.Pixel)
Sres. Desarrolladores, esta es la cuarta entrega de una colección de artículos que les
enseñará como crear textos artísticos usando GDI+ así como de animaciones sencillas.
Las anteriores
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto01.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto02.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto03.htm
El ejemplo
'Creamos la fuente
Dim miLetra As New Font("Times New Roman", Me.nuSize.Value, _
FontStyle.Bold, GraphicsUnit.Pixel)
Dim i As Integer
For i = CInt(Me.nuBlock.Value) To 0 Step -1
grafico.DrawString(Me.txtTexto.Text, miLetra, pincelSombra, _
xPos - i, yPos + i)
Next
End Sub
Sres. Desarrolladores, este aporte pretende ahorrar algo de tiempo en las tareas de la
eliminación del contenido de los controles en la tarea de agregar registros.
Nuestro Formulario:
Application.DoEvents()
Next ctlControl
End Sub
El código completo de este pequeño aporte está en el final del artículo, no olviden
calificar en PanoramaBox, me alienta a seguir compartiendo con ustedes mis
conocimientos.
Sres. Desarrolladores, en las entregas anteriores publiqué como crear de forma sencilla
gráficos utilizando GDI+, estas entregas están en los siguientes enlaces:
Textos Artísticos:
http://elguille.info/colabora/NET2005/FernandoLuque_GDITexto01.htm
Texto en Contorno:
http://elguille.info/colabora/NET2005/FernandoLuque_GDITexto03.htm
Los que siguieron y bajaron los gráficos se dieron cuenta de lo siguiente, EL GRAFICO
SE DIBUJA y AL CAMBIAR DE FORMULARIO Y CAMBIAR LA APLICACION Y
REGRESAR......¡¡¡¡ DESAPARECE !!!
Existe una forma de graficar lo que deseamos para crear una mejor presentación de
manera permanente, es decir, cambiarmos de enfoque nuestro formulario, regresamos y
permanece la imagen dibujada.
El Ejemplo
A continuación sigue código en Visual Basic:
'El Pincel
Dim pincel As New Pen(Color.Red, 4)
'Un Rectángulo
grafico.DrawRectangle(pincel, 10, 50, 120, 30)
'Otra Forma para el Rectángulo
Dim Rectangulo As New Rectangle(150, 20, 100, 50)
grafico.DrawRectangle(pincel, Rectangulo)
' Líneas
grafico.DrawLine(New Pen(Color.Olive, 4), 60, 100, 100, 100)
grafico.DrawLine(New Pen(Color.OrangeRed, 4), 20, 130, 100, 130)
grafico.DrawLine(New Pen(Color.Magenta, 4), 30, 200, 150, 100)
'Texto Artístico
'Para Block se definen los colores de fuente y de la sombra
Dim pincelSombra As Brush = Brushes.DarkBlue
Dim pincelFuente As Brush = Brushes.GreenYellow
'Creamos la fuente
Dim miLetra As New Font("Times New Roman", 55, FontStyle.Bold,
GraphicsUnit.Pixel)
Dim i As Integer
For i = 10 To 0 Step -1
grafico.DrawString("Net Desarrollo", miLetra, pincelSombra, _
xPos - i, yPos + i)
Next
'Elipses
Dim RectaElipse As New Rectangle(30, 400, 300, 50)
grafico.DrawEllipse(New Pen(Color.SlateBlue, 6), RectaElipse)
End Sub
Como pueden darse cuenta, al implementar el método OnPaint del formulario los
objetos dibujados en este procedimiento permanecen en este mientras esta abierto, al
cambiar de enfoque al formulario y al redimensionar también.
El código completo esta en el empaquetado al final del artículo, no olvides votar, eso
me alienta a seguir publicando.
DataBindings en Visual Basic .Net
Maestro - Detalle
Un poco de teoría
En las líneas de código precedentes se han agregado DataBindings a dos cajas de texto,
al control con nombre txtApellido se ha relacionado las propiedades Text y Tag a los
objetos LastName y EmployeeID del DataTable dtEmpleados respectivamente.
La Clase BindingContext
Para manejar la navegación entre los registros podemos utilizar un BindingContext que
administra la colección de objetos BindingManagerBase para cualquier objeto que se
herede de la clase Control. El BindigManagerBase permite la sincronización de
controles con enlace al mismo origen. La Clase CurrencyManager que administra la
lista de objetos Binding se hereda de la clase BindingManagerBase y
mantiene sincronizados los controles señalando el elemento actual de la lista.
El ejemplo
'Elementos necesarios
'DataTables
Dim dtEmpleados As DataTable
Dim dtOrdenes As DataTable
Dim dtDetalle As DataTable
Dim dtVentas As DataTable
'vistas
Dim dvOrdenes As DataView
Dim dvDetalle As DataView
Dim dvVentas As DataView
'El dataset
Dim dsDatos As DataSet
'Ordenes
Dim vInsOrdenes As String
vInsOrdenes = "SELECT Od.OrderID, SUM(CONVERT(money, (Od.UnitPrice *
"&_
" Od.Quantity) * (1 - Od.Discount) / 100) * 100) " & _
" AS Total, o.EmployeeID, o.OrderDate, " & _
" c.CompanyName" & vbCrLf & _
"FROM [Order Details] Od " & _
" INNER JOIN Orders o " & _
" ON Od.OrderID = o.OrderID" & vbCrLf & _
" INNER JOIN Customers c " & _
" ON o.CustomerID = c.CustomerID" & vbCrLf & _
"GROUP BY Od.OrderID, o.EmployeeID, o.OrderDate, c.CompanyName"
dtEmpleados = dsDatos.Tables("Empleados")
dtOrdenes = dsDatos.Tables("Ordenes")
dtDetalle = dsDatos.Tables("Detalle")
dtVentas = dsDatos.Tables("Ventas")
'Las Vistas
dvOrdenes = dtOrdenes.DefaultView
dvDetalle = dtDetalle.DefaultView
dvVentas = dtVentas.DefaultView
CrearBindings()
dvVentas.RowFilter = "EmployeeID = " & txtApellido.Tag.ToString
'Mostrar las Ordenes, el Detalle y el Registro
Mostrarordenes()
MostrarDetalle()
RegistroActual()
End Sub
Maestro - Detalle
Un poco de teoría
Los modelos de acceso a datos han evolucionado junto a los modelos de equipos, desde
los modelos centralizados hasta los modelos distribuidos. La cantidad de usuarios de los
sistemas antes no tenia en número que tiene ahora cambiando desde aplicaciones de un
usuario o aplicaciones simples (en un equipo unicamente) hasta aplicaciones en Internet,
el último modelo es el modelo de Servicios Web XML (XML Web Services).
Definición de Capa
El ejemplo
Imports System.Data
Imports System.Data.SqlClient
'Los Adaptadores
Private daCat As SqlDataAdapter
Private daProd As SqlDataAdapter
Sres. Desarrolladores, este aporte pretende ayudar a ustedes a crear una pequeña
aplicación simulando el Explorador de Windows, en este primer envío, solamente está
implementada la funcionalidad para ver los archivos y carpetas.
Este ejemplo incluye el uso de Clases para su ejecución, si bien es cierto muchos opinan
que resulta mas fácil directamente, envío primero este, donde desde código se
implementa hasta la interface.
Un poco de teoría
El NameSpace System.IO
Este NameSpace contiene todos los tipos que permiten leer y escribir en los archivos y
secuencia de datos, así como tipos que proporcionan compatibilidad básica con los
archivos y directorios.
Clase Descripción
Expone métodos estáticos para crear, mover y
Directory
enumerar archivos en directorios y subdirectorios
Expone métodos de instancia para crear, mover y
DirectoryInfo
enumerar archivos en directorios y subdirectorios.
Proporciona métodos estáticos para crear, copiar,
eliminar, mover y abrir archivos y contribuye a la
creación de objetos FileStream.
Utilice la clase FileStream para leer, escribir, abrir y
cerrar archivos en un sistema de archivos, así como
para manipular otros identificadores del sistema
File
operativo relacionados con archivos, como
canalizaciones, entrada estándar y salida estándar
amd. Puede especificar que las operaciones de lectura
y escritura sean sincrónicas o asincrónicas.
FileStream almacena en el búfer la entrada y la
salida para obtener un mejor rendimiento.
Proporciona métodos de instancia para crear, copiar,
FileInfo eliminar, mover y abrir archivos y contribuye a la
creación de objetos FileStream.
Expone un objeto Stream alrededor de un archivo; se
admiten operaciones de lectura y escritura sincrónica
FileStream
y asincrónica. Un objeto Stream proporciona una
vista genérica de una secuencia de bytes.
Ejecuta operaciones en instancias de String que
contienen información de rutas de archivos o
Path
directorios. Estas operaciones se ejecutan de forma
adecuada para múltiples plataformas.
Para nuestro ejemplo hemos creado las clases de componentes cpDirectorio, cpArchivos
y cpMenu, el constructor de la clase de componente para cpDirectorios es:
'Crea el árbol
Public Sub ConstruirArbol()
BeginUpdate()
Nodes.Clear()
La finalización de un componente
El Ejemplo
' El Splitter
Dim split As New Splitter
split.Parent = Me
split.Dock = DockStyle.Left
split.BackColor = SystemColors.Control
Dim i As Integer
For i = 0 To 3
'Clase cpMenu
Dim miv As New cpMenu
miv.Text = astrView(i)
miv.View = aview(i)
miv.RadioCheck = True
'el manejador
AddHandler miv.Click, manejador
En una segunda publicación enviaré como crear esta pequeña aplicación sin Clases de
componentes, estén atentos
Sres. Desarrolladores, este aporte pretende ayudar a ustedes a crear una pequeña
aplicación simulando el Explorador de Windows, en este segundo envío, solamente está
implementada la funcionalidad para ver los archivos y carpetas.
Este ejemplo incluye el uso de controles para su ejecución directamente desde el IDE,
en el ejemplo anterior se creó la aplicación usando Clases de componentes. El link es el
siguiente:
FernandoLuque_Explorador01.htm
Un poco de teoría
Clase Descripción
Expone métodos estáticos para crear, mover y
Directory
enumerar archivos en directorios y subdirectorios
Expone métodos de instancia para crear, mover y
DirectoryInfo
enumerar archivos en directorios y subdirectorios.
Proporciona métodos estáticos para crear, copiar,
eliminar, mover y abrir archivos y contribuye a la
creación de objetos FileStream.
File Utilice la clase FileStream para leer, escribir, abrir y
cerrar archivos en un sistema de archivos, así como
para manipular otros identificadores del sistema
operativo relacionados con archivos, como
canalizaciones, entrada estándar y salida estándar
amd. Puede especificar que las operaciones de lectura
y escritura sean sincrónicas o asincrónicas.
FileStream almacena en el búfer la entrada y la
salida para obtener un mejor rendimiento.
Proporciona métodos de instancia para crear, copiar,
FileInfo eliminar, mover y abrir archivos y contribuye a la
creación de objetos FileStream.
Expone un objeto Stream alrededor de un archivo; se
admiten operaciones de lectura y escritura sincrónica
FileStream
y asincrónica. Un objeto Stream proporciona una
vista genérica de una secuencia de bytes.
Ejecuta operaciones en instancias de String que
contienen información de rutas de archivos o
Path
directorios. Estas operaciones se ejecutan de forma
adecuada para múltiples plataformas.
El Ejemplo
LlenarArbol()
AgregarArchivos(tvDir.SelectedNode.Text)
End Sub
Try
' Obtiene en un array todos los subdirectorios
aDir = diDirectory.GetDirectories()
Catch exp As Exception
Exit Sub
End Try
Dim di As DirectoryInfo
For Each di In aDir
' Crea un Nodo y pasa el nombre y la imagen
Dim tnDir As New TreeNode(di.Name, 1, 2)
'Agrega el Nodo creado
tn.Nodes.Add(tnDir)
Next
End Sub
Try
' Array de todos los archivos
afiFiles = diDirectories.GetFiles()
Catch
Return 'Para que no salga error
End Try
Dim fi As FileInfo
For Each fi In afiFiles
'Crear ListViewItem y asginarle el nombre del archivo
Dim lvi As New ListViewItem(fi.Name)
'Imagen
Select Case Path.GetExtension(fi.Name).ToUpper()
Case ".EXE"
lvi.ImageIndex = 1
Case Else
lvi.ImageIndex = 0
End Select
' Tamaño y fecha de modificación: Length - LastWriteTime
lvi.SubItems.Add(fi.Length.ToString("N0"))
lvi.SubItems.Add(fi.LastWriteTime.ToString())
'Atributos
Dim strAttr As String = ""
If (fi.Attributes And FileAttributes.Archive) <> 0 Then strAttr += "A"
If (fi.Attributes And FileAttributes.Hidden) <> 0 Then strAttr += "H"
If (fi.Attributes And FileAttributes.ReadOnly) <> 0 Then strAttr += "R"
If (fi.Attributes And FileAttributes.System) <> 0 Then strAttr += "S"
lvi.SubItems.Add(strAttr)
'Añadir el Item
lvArchivos.Items.Add(lvi)
Next fi
End Sub
ListView
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListView.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListViewII.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewAvanzado.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewBD.htm
TreeView
http://www.elguille.info/colabora/NET2005/FernandoLuque_TreViewBDatos.htm
ALGO DE TEORIA
Método Descripción
NUESTRO EJEMPLO
AL CARGAR EL FORMULARIO
Private Sub Cargar(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Estilo
cboEstilo.Items.Add(DashStyle.Solid)
cboEstilo.Items.Add(DashStyle.Dash)
cboEstilo.Items.Add(DashStyle.DashDot)
cboEstilo.Items.Add(DashStyle.DashDotDot)
cboEstilo.Items.Add(DashStyle.Dot)
cboEstilo.Items.Add(DashStyle.Custom)
' El Relleno
cboRelleno.Items.Add(DashCap.Flat)
cboRelleno.Items.Add(DashCap.Round)
cboRelleno.Items.Add(DashCap.Triangle)
' Alineación
cboAlinear.Items.Add(PenAlignment.Center)
cboAlinear.Items.Add(PenAlignment.Inset)
cboAlinear.Items.Add(PenAlignment.Left)
cboAlinear.Items.Add(PenAlignment.Outset)
cboAlinear.Items.Add(PenAlignment.Right)
End Sub
LOS MANEJADORES
'TIPO DE PINCEL
Select Case cboPincel.Text
Case "Solid"
'Pincel y lápiz del mismo color
vPincel = New SolidBrush(vLapizColor)
Case "Hatch"
'TIPO DE BRUSH
vPincel = New HatchBrush(HatchStyle.DarkVertical, vLapizColor)
Case "Texture"
' TEXTURA - UNA IMAGEN
vPincel = New TextureBrush( _
New Bitmap("..\Textura.jpg"), WrapMode.Tile)
Case "Gradient"
'DEGRADE
vPincel = New LinearGradientBrush( _
New Point(0, 0), _
New Point(pcDibujo.Width, pcDibujo.Height), _
Color.Chocolate, Color.DarkBlue)
End Select
vLapiz.Brush = vPincel
End If
' Transformación
Select Case cboTransforma.Text
Case "None"
' Elimina la Transformación
vLapiz.ResetTransform()
Case "Scale"
vLapiz.ScaleTransform(0.5, 2)
Case "Rotate"
vLapiz.RotateTransform(45)
Case "Translate"
vLapiz.TranslateTransform(2, 4)
End Select
'Crear
grafico = pcDibujo.CreateGraphics()
'Làpiz ancho
grafico.DrawEllipse(vLapizAncho, 25, 25, 200, 200)
grafico.DrawArc(vLapizAncho, 255, 5, pcDibujo.Width - 255, _
pcDibujo.Height - 55, 10, 150)
End If
End Sub
ALGO DE TEORIA
La herencia permite escribir y depurar una clase una vez, y después volver a utilizar ese
código una y otra vez como base de nuevas clases. La herencia también permite utilizar
el polimorfismo basado en la herencia, la posibilidad de definir clases que pueden
utilizarse de forma intercambiable mediante código cliente en tiempo de ejecución, pero
con funcionalidad diferente, incluyo con métodos o propiedades denominados de
manera idéntica.
La instrucción Inherits
La instrucción Inherits se utiliza para declarar una nueva clase, denominada clase
derivada, basada en una clase existente conocida como clase base. Las clases derivadas
heredan, y pueden extender, las propiedades, métodos, eventos, campos y constantes
definidos en la clase base. En la siguiente sección se describen algunas de las reglas de
herencia, así como los modificadores que se pueden utilizar para cambiar la forma en
que las clases heredan o son heredadas:
Modificadores de herencia
Visual Basic .Net presenta las siguientes instrucciones y modificadores de nivel de clase
para ofrecer compatibilidad con la herencia:
De forma predeterminada, una clase derivada hereda métodos de su clase base. Si una
propiedad o método heredado debe comportarse de forma diferente en la clase derivada,
puede ser reemplazado; es decir, puede definirse una nueva implementación del método
en la clase derivada. Los siguientes modificadores se utilizan para controlar cómo se
reemplazan propiedades y métodos:
Puede utilizar la palabra clave MyBase para llamar a métodos de una clase base cuando
reemplace métodos en una clase derivada. Por ejemplo, suponga que diseña una clase
derivada que reemplaza un método heredado de la clase base. El método reemplazado
puede llamar al método de la clase base y modificar el valor devuelto como se muestra
en el fragmento de código siguiente:
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalcularPago(ByVal Dist As Double, _
ByVal Rate As Double) As Double
' Llama al método de la Clase Base y retorna el Valor
Return MyBase.CalcularPago(Dist, Rate) * 2
End Function
End Class
EL EJEMPLO
End Sub
Note en la porción de código anterior la línea:
dgClientes.DataSource = CrearDataSet.Tables("Clientes")
en esta instrucción se ejecuta la función CrearDataSet implementada en la clase Base.
Al crearse el formulario heredado para nuestro ejemplo aparece con el siguiente diseño
visto desde el IDE, en este hemos insertado un Grid, note los identificadores de los
controles que pertenecen a la clase Base.
Para terminar con el ejemplo, formateamos el Grid con el siguiente procedimiento
Sres. Desarrolladores, se que me extrañaron mucho, pero estuve y aun estoy algo
ocupado con unos proyectos pero definitivamente la fuerza y las ganas por colaborar
con sus conocimientos es mayor. Sin mas preámbulos vamor con lo nuestro.
Una hoja de estilos en cascada (CSS) contiene definiciones de estilos que se aplican
a los elementos de un documento HTML. Los estilos CSS definen la forma de mostrar
los elementos y su posición en la página. En lugar de asignar individualmente atributos
a cada elemento de la página, puede crear una regla general que aplique atributos
específicos siempre que un explorador Web encuentre una instancia de un elemento o
un elemento asignado a un cierto estilo CLASS.
Para utilizar las reglas de estilo CSS en el Diseñador HTML, la propiedad targetSchema
del documento HTML se debe establecer en un explorador Web compatible con HTML
4.0 o superior. Los exploradores más antiguos, compatibles sólo con HTML 3.2 o
anteriores, ignorarán los estilos CSS. Cuando la propiedad targetSchema está
establecida en un explorador Web más antiguo, el entorno de desarrollo integrado (IDE)
oculta las opciones y propiedades de CSS que sólo están disponibles en exploradores
más recientes. Si se establece la propiedad targetSchema en un explorador compatible
con HTML 4.0, las reglas de estilo CSS constituyen el mejor método para especificar la
apariencia y la posición deseadas de los elementos HTML.
Cascada
Las reglas de estilo CSS se aplican "en cascada", es decir, las reglas de estilo globales se
seguirán aplicando a todos los elementos HTML a menos que sean sustituidas por las
reglas de estilo locales. En general, las reglas de estilo locales tienen prioridad sobre las
reglas de estilo globales. Esto significa que un estilo definido en un bloque STYLE de
una página Web, por ejemplo, puede modificar desde una página concreta el estilo de
todo el sitio Web definido en una hoja de estilos CSS externa. De forma similar, un
estilo en línea definido dentro de una etiqueta HTML individual de la página puede
modificar en una línea los estilos definidos para este tipo de elemento en todo el sitio.
Las partes de las reglas de estilo globales que no sean modificadas por las reglas de
estilo CSS locales seguirán aplicándose a los elementos HTML incluso después de que
se hayan aplicado los estilos locales. En el ejemplo anterior, los estilos CSS locales que
se aplican al texto escrito entre etiquetas <H1> reemplazan algunas reglas de estilo
globales del explorador Web para el texto de las etiquetas <H1> (centrar el texto de las
etiquetas <H1> y cambiar el color a rojo), pero no modifican las otras reglas (mostrar
todo el texto de las etiquetas <H1> en una fuente más grande y en negrita). Las reglas
de estilo globales y locales se aplican (en ese orden), y se muestra el texto de las
etiquetas <H1> de la página con una fuente grande, en negrita, y centrado y de color
rojo.
El archivo de Estilos
Un documento de hoja de estilos CSS externa es un archivo de texto sin formato con
una extensión .css que sólo contiene reglas de estilo. La instrucción
aplica a la página las reglas de estilo de la hoja de estilos CSS externa "MiEstilo.css".
Otra forma
Se pueden asignar los formatos al estilo directamente usando la ventana de edición, la
imagen siguiente muestra el Intelissence que se despliega.
Seleccione el adecuado y especifique el formato, obviamente es mas complicado esta
forma.
Luego de agregar la Regla de estilo debe definirse el estilo de este, la forma mas
sencilla la he descrito lineas arriba, una vez definido el estilo puede quedar así:
Uso de los estilos
Cuando crea una aplicación en Visual Basic .Net automáticamente se crea un archivo de
estilo Style.css (para aplicaciones en C# debe insertarse) pero para utilizar los estilos
definidos en este debemos insertar el enlace de este en el HEAD de la página. La
imagen muestra resaltada la línea que debemos incluir:
Una vez asignada la Hoja de Estilos nuestro Web Form se muestra como sigue,
je,je,je...decidi cambiar algunas líneas de texto:
Crear estilo para un elemento específico
Se puede crear un estilo para un elemento específico, para esto debemos incluir su
definición utilizando el ID del elemento (Nombre) precedido del símbolo #. La
siguiente imagen muestra un estilo definido para el elemento con ID lblTitulo
Después de creado el estilo en la definición de la etiqueta debemos añadir el atributo
CssClass, la definición de la etiqueta es como sigue:
Después de asignar o cambiar algunos estilos para los elementos presentes para asignar
al texto presente basta seleccionarlo y utilizar el botón Formato de Bloque presente en la
barra de herramientas de Formato, después de jugar un poco hice esto bien feo...je,je,je.
Recuerden votar por este artículo, sus votos me animan a seguir publicando,
además que son un premio a mi esfuerzo.
Una cosilla que esta de mas: Crea un directorio Virtual y copias los archivos del
empaquetado que puedes bajarlo en el enlace al final del artículo... ya sé que sabías
hacerlo... no te enojes.
Espero que les sea útil, en las siguientes entregas veremos como:
Reciban un fuerte abrazo (aunque un poquito atrazado) por Navidad y que todos sus
sueños y proyectos se cumplan y que el próximo año sea mucho mejor del que se
termina.
Sres. Desarrolladores, se que me extrañaron mucho, pero estuve y aun estoy algo
ocupado con unos proyectos pero definitivamente la fuerza y las ganas por colaborar
con sus conocimientos es mayor. Sin mas preámbulos vamos con lo nuestro.(párrafo
repetido de mi artículo anterior...je,je,je)
Validación de Datos
Una de las formas más sencillas de validación de datos consiste en comprobar el tipo de
datos. La validación del tipo de datos responde a preguntas tan simples como "¿Es
alfabética la cadena?" y "¿Es numérico el número?". Normalmente, validaciones tan
simples se pueden controlar con la interfaz de usuario de la aplicación.
La siguiente tabla muestra las principales propiedades que se aplican a todos los
controles de validación.
Propiedad Descripción
RequiredFieldValidator
A veces, se desea tener un valor inicial que no sea una cadena vacía. Esto resulta útil
cuando hay un valor predeterminado para un control de entrada y se desea que el
usuario seleccione otro valor. Por ejemplo, puede haber un control ListBox con una
entrada seleccionada, de manera predeterminada, que contiene instrucciones para que el
usuario seleccione un elemento de la lista. El usuario debe seleccionar un elemento del
control, pero se desea que el usuario no seleccione el elemento que contiene las
instrucciones. Para impedir que el usuario seleccione este elemento, especifique su valor
como valor inicial. Si el usuario selecciona este elemento, RequiredFieldValidator
mostrará su mensaje de error. Para especificar el valor inicial del control de entrada
asociado, establezca la propiedad InitialValue.
CompareValidator
RangeValidator
La propiedad Type se utiliza para especificar el tipo de datos de los valores que se van a
comparar. Los valores que se van a comparar se convierten a este tipo de datos antes de
realizarse cualquier comparación.
RegularExpressionValidator
CustomValidator
El control CustomValidator permite crear un control de validación con lógica de
validación personalizada. Por ejemplo, se puede crear un control de validación que
compruebe si el valor especificado en un cuadro de texto es un número par.
Los controles de validación siempre realizan la comprobación de validación en el
servidor. También tienen una implementación completa en el cliente que permite a los
exploradores compatibles con DHTML (como Microsoft Internet Explorer 4.0 ó
posterior) realizar la validación en el cliente.
La validación en el cliente mejora el proceso de validación ya que se comprueban los
datos proporcionados por el usuario antes de enviarlos al servidor. De este modo se
pueden detectar los errores en el cliente antes de enviar el formulario y se evita la acción
de ida y vuelta de la información necesaria para la validación en el servidor. Para crear
una función de validación en el servidor, proporcione un controlador del evento
ServerValidate que realiza la validación.
Para obtener acceso a la cadena del control de entrada que se va a validar, utilice la
propiedad Value del objeto ServerValidateEventArgs que se ha pasado al controlador de
eventos como parámetro. A continuación, se almacena el resultado de la validación en
la propiedad IsValid del objeto ServerValidateEventArgs.
Por ejemplo, se pueden aplicar varios controles de validación a un control TextBox que
permite al usuario especificar la cantidad de elementos que se han de agregar a un
carrito de la compra. Se puede utilizar un control CustomValidator para asegurar que el
valor especificado es menor que la cantidad del inventario y un control
RequiredFieldValidator para asegurar que el usuario especifica un valor en el control
TextBox.
End Sub
Nuestro Ejemplo
Definiciones:
Para nuestro ejemplo, las definiciones resultantes de los controles utilizados es como
sigue:
<asp:requiredfieldvalidator id="rfvNombre"
runat="server" ToolTip="Ver error al final de la página"
Para txtNombre
Display="Dynamic" ControlToValidate="txtNombre"
RequiredFieldValidator
ErrorMessage="Falta Ingreso de
Nombre">*</asp:requiredfieldvalidator>
<asp:requiredfieldvalidator id="rfvDire" runat="server"
Para txtDire
Display="Dynamic" ControlToValidate="txtDire"
RequiredFieldValidator ErrorMessage="Falta Ingreso de
Dirección">*</asp:requiredfieldvalidator>
<asp:comparevalidator id="CompareValidator1"
runat="server" Display="Dynamic"
ControlToValidate="txtPass2" ErrorMessage="Password
No coincide"
ControlToCompare="txtPass1">**</asp:comparevalidator
>
<asp:comparevalidator id="cvFecha" runat="server"
Display="Dynamic" ControlToValidate="txtFecha"
ErrorMessage="Fecha incorrecta, debe ser antes de la
Para txtFecha
fecha actual" Type="Date"
CompareValidator
Operator="LessThan">*</asp:comparevalidator>
(este es un dato opcional)
Se comprueba que la fecha sea anterior a la fecha
actual
En el Load de la página se escribe el siguiente
código
cvFecha.ValueToCompare = Today
End If
<asp:requiredfieldvalidator id="rfvFono" runat="server"
Display="Dynamic" ControlToValidate="txtFono"
ErrorMessage="Falta Ingreso de
Teléfono">*</asp:requiredfieldvalidator>
<asp:regularexpressionvalidator id="revFono"
runat="server" Display="Dynamic"
ControlToValidate="txtFono" ErrorMessage="Formato de
teléfono no valido" ValidationExpression="\(\d{3}\)\-
\d{3}\-\d{7}">**</asp:regularexpressionvalidator>
Caracter Definición
? 0 o un caracter
* 0 o N caracteres
Rango de 0 a n números
[0-n]
enteros
Separador de múltiples
|
opciones
El caracter que sique es
\
un comodín
Una cosilla que esta de mas: Crea un directorio Virtual y copias los archivos del
empaquetado que puedes bajarlo en el enlace al final del artículo... ya sé que sabías
hacerlo... no te enojes.
Reciban un fuerte abrazo (aunque un poquito atrazado) por Navidad y que todos sus
sueños y proyectos se cumplan y que el próximo año sea mucho mejor del que se
termina.
Sres. Desarrolladores, empezando este año 2006 quiero compartir con ustedes algunos
ejemplo de como usar Store Procedures en Aplicaciones Web ASP .Net.
Algo de Teoría
Un Store Procedure es un procedimiento de base de datos el cual se utiliza en una
determinada base de datos. El Store Procedure o Procedimiento Almacenado puede ser
accedido por cualquier aplicación con el fin de manipular los datos de esta.
El Store Procedure tiene escrito sus propias sentencias SQL llamadas sentencias
Transact-SQL, son similares a las funciones o procedimientos en las aplicaciones, son
llamados por su nombre y pueden tener parámetros tanto de ingreso de datos, de salida
o ambos.
Este tipo de Store Procedures son utilizados para buscar registros específicos, ordenar o
filtrar estos y reportan su resultado el cual se almacena en un DataSet o en un control de
lista, son basados en sentencias SQL.
Ejemplo: Un Store Procedure que presente los clientes o pasajeros que viajaron en el
último mes que paso, y guardarlos en un DataSet o en un ListBox.
Este tipo de Store Procedures son utilizados para ejecutar un comando en una base de
datos o una función que retorna un valor único. El resultado de estos tipos de Store
Procedure se asignan generalmente a una variable.
Este tipo de Store Procedures son utilizados para realizar una acción determinada dentro
de una base de datos, no retornan registros ni valores. Las sentencias utilizadas en estos
tipos de Store Procedures pueden incluir actualizaciones, ediciones, modificaciones o
eliminaciones de registros.
Existen varios motivos por los cuales un desarrollador puede decidir usar Store
Procedures, una de las mas resaltantes es que resulta mas eficiente, mas seguro y no
requiere de conocimiento de como está diseñada la base de datos, en la siguiente tabla
se pueden resumir los principales beneficios del uso de Store Procedures:
Beneficio Descripción
Un Store Procedure es un clásico ejemplo de
Programación programación modular. Este se crea solo, se testea
Modular solo y se puede llamar muchas veces desde
diversas aplicaciones.
Los Store Procedure pueden crearse
independientemente por un especialista en base de
Distribución datos, mientras que pueden ser utilizados por los
desarrolladores de aplicaciones Web o por otros
desarrolladores.
Usando Store Procedures se aumentan
significativamente la seguridad en una base de
Seguridad
datos. Unicamente los testeadores y los dueños de
la base de datos pueden modificarlos.
El Store Procedure tiene mejor performance que
Ejecución rápida realizar las sentencias de manejo de datos
directamente desde la aplicación
Es posible que si una operación que requiera de
muchas sentencias se pueda ejecutar estas
Reduce el tráfico de
directamente en el Store Procedure, en nuestra
red
aplicación posiblemente realicemos esto con una
línea, la que ejecuta o invoca al SP.
El desarrollador de la base de datos puede cambiar
Flexibilidad
la estructura de esta sin afectar a las aplicaciones.
Tips:
EL EJEMPLO
Diseñe un WebForm con el siguiente aspecto: Dos DropDownList, dos DataGrids, dos
Buttons y dos etiquetas (Label) para mostrar el total de Items para una orden y el total
de órdenes de un Cliente.
En este se notan dos partes, la primera: la extracción de los detalles de una orden y el
cálculo del total de Items (suma de Quantity) para la orden y la segunda: mostrar las
órdenes de un determinado cliente y la suma de las órdenes generadas.
Nota:
Los dos Store Procedures previos están presentes en la Base de datos Northwind (si no
lo están deben crearse).
El SP CustOrdersDetail tiene un parámetro de entrada llamado @OrderID y es de tipo
de los que retornan registros, el SP TotalItemsOrden tiene dos parámetros llamados
@OrderId y @TotalItems este de tipo OutPut y el SP es de tipo que retorna un valor.
'Parámetros si hubieran
Dim miParam As New SqlParameter("@OrderId", SqlDbType.Int)
miParam.Direction = ParameterDirection.Input
coDetalle.Parameters.Add(miParam)
coDetalle.Parameters("@OrderId").Value =
DropDownList1.SelectedItem.ToString
'Llenar el DataSet
'Al llenar el DataSet se ejecuta el Store Procedure
'el SQLCommand del SQLDataAdapter se especificó
'del tipo StoreProcedure
daDetalle.Fill(dsDatos, "Detalle")
'Origen del DataGrid
DataGrid1.DataSource = dsDatos.Tables("Detalle")
DataGrid1.DataBind()
cn.Open()
'Ejecutar el Store Procedure
coTotal.ExecuteScalar()
cn.Close()
lblTotalItems.Text = coTotal.Parameters("@TotalItems").Value.ToString
End Sub
Recuerden votar antes de bajar el código fuente en el archivo ZIP al final del artículo,
eso me motiva a seguir compartiendo mis conocimientos.
Artículos relacionados:
Uso de SQLDataReader con Store Procedures:
http://www.elguille.info/colabora/NET2005/FernandoLuque_Usando_SQLDataReader.
htm
Suerte y A SEGUIR DESARROLLANDO
Sres. Desarrolladores, nuevamente para compartir con ustedes sobre el apasionante tema
del desarrollo y la programación de aplicaciones Web ASP .Net utilizando Visual Basic
.Net
Algo de teoría
Un DataSet puede leer y escribir datos y esquemas como documentos XML. Los datos
y esquemas pueden transportarse, a continuación, a través de HTTP y cualquier
aplicación puede utilizarlos en cualquier plataforma que sea compatible con XML. Los
esquemas se pueden guardar como esquemas XML mediante el método
WriteXMLSchema, y tanto los esquemas como los datos se pueden guardar mediante el
método WriteXML. Hay que utilizar el método ReadXML para leer un documento
XML que incluya esquema y datos.
En nuestro ejemplo describiremos como manejar documentos XML, leer desde estos la
información y escribir en estos el contenido de un DataSet.
Para insertar un archivo XML dentro de nuestra aplicación debemos seguir los
siguientes pasos:
Tip: En la Vista de datos el ingreso de estos es mas sencillo, previamente debe crearse
la estructura en la vista XML, luego pasar a la vista de datos y agregar los datos. La
vista de datos para el ejemplo anterior es:
En la fila donde aparece el asterisco puede insertarse facilmente otro Cliente.
daProductos.Fill(dsProductos, "Productos")
Dim miCarpeta As String =
System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)
dsProductos.WriteXml(miCarpeta & "\ProductosSinEsquema.XML",
XmlWriteMode.IgnoreSchema)
End Sub
daProductos.Fill(dsProductos, "Productos")
Dim miCarpeta As String =
System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)
dsProductos.WriteXml(miCarpeta & "\ProductosConEsquema.XML",
XmlWriteMode.WriteSchema)
End Sub
' La Relación
Dim colPadre As DataColumn
colPadre = dsCatProd.Tables("Categorias").Columns("CategoryId")
Dim colHijo As DataColumn
colHijo = dsCatProd.Tables("Productos").Columns("CategoryId")
Dim drCatProd As New DataRelation("CatProd", colPadre, colHijo)
Sres. Desarrolladores, nuevamente para compartir con ustedes sobre el apasionante tema
del desarrollo y la programación de aplicaciones Web ASP .Net utilizando Visual Basic
.Net
El artículo anterior tiene una explicación mas amplia (parte teórica siempre necesaria)
http://www.elguille.info/colabora/NET2006/FernandoLuque_ASPyXML.htm
Artículos relacionados:
Como ven... casi todo para que dominen este apasionante mundo del desarrollo.
XMLDataDocument
Esta clase extiende XMLDocument. Permite cargar datos relacionales o datos XML y
manipularlos utilizando Document Object Model (DOM) del Consorcio W3C. DOM
presenta los datos como una jerarquía de objetos de nodo. Dado que
XmlDataDocument implementa la interfaz IXPathNavigable, también se puede utilizar
como documento de origen de la clase XslTransform.
XmlDataDocument tiene una relación estrecha con la clase DataSet que proporciona
una vista relacional de los datos XML cargados. Los cambios efectuados en
XmlDataDocument se reflejan en DataSet y viceversa.
Para cargar DataSet con datos XML, utilice ReadXmlSchema para generar una
asignación relacional. A continuación, los datos XML se pueden cargar mediante Load
o LoadXML
Para cargar datos relacionales, especifique el DataSet que contenga los datos
relacionales como parámetro del constructor XmlDocument.
Fuente: Ayuda de Visual Studio 2003
El ejemplo
Quiero compartir con ustedes este tema muy interesante, la comunicación a través de
diferentes sistemas heterogeneos se da conversando el mismo idioma: XML.
En esta ocasión quiero resaltar la forma de como se forma un archivo Nested XML, este
se forma activando la propiedad Nested del objeto DataRelation utilizado al escribir el
archivo XML. Nuestro ejemplo en est ocasión simplemente lee el archivo, este se
muestra mas o menos así...
</Categorias>
- <Categorias>
<categoryId>2</categoryId>
< CategoryName > Condiments </ CategoryName >
< Description > Sweet and savory sauces, relishes, spreads, and seasonings </
Description >
-< Productos >
<ProductID>3</ProductID>
<ProductName>Aniseed Syrup</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>2</CategoryID>
<QuantityPerUnit>12 - 550 ml bottles</QuantityPerUnit>
<UnitPrice>10.0000</UnitPrice>
<UnitsInStock>13</UnitsInStock>
<UnitsOnOrder>70</UnitsOnOrder>
<ReorderLevel>25</ReorderLevel>
<Discontinued>false</Discontinued>
</Productos>
-< Productos >
<ProductID>4</ProductID>
<ProductName>Chef Anton's Cajun Seasoning</ProductName>
<SupplierID>2</SupplierID>
<CategoryID>2</CategoryID>
<QuantityPerUnit>48 - 6 oz jars</QuantityPerUnit>
<UnitPrice>22.0000</UnitPrice>
<UnitsInStock>53</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>0</ReorderLevel>
<Discontinued>false</Discontinued>
</Productos>
.
.
.
La porción es la siguiente
Los datos se presentan de manera jerárquica, note las lineas cambiadas a color azul
donde se presenta la categoria 1 y luego los productos de esa categoria mostrados en
color marrón.
'Crear el XMLDataDocument
Dim xmlData As New XmlDataDocument(dsdatos)
'Productos
Dim vRel As String = dsdatos.Relations(0).RelationName
Dim vPrimero As String = dgDatos.Items.Item(0).Cells(0).Text
Dim mitabla As DataTable = dsdatos.Tables(1)
Dim mifiltro As String = "Categoryid = '" & vPrimero & "'"
Dim miorden As String = "ProductId ASC"
'Crear la Vista
Dim dvVista As New DataView(mitabla, mifiltro, miorden, _
DataViewRowState.CurrentRows)
End Sub
El código completo ya sabes que se encuentra al final del artículo, vota previamente en
PanoramaBox, eso me alienta a seguir publicando.
Uso de RowFilter
El Ejemplo
Al filtrar las órdenes de Enero de 1997, usando Northwind se muestra como sigue,
notese como se muestra la etiqueta con la cantidad de órdenes.
Nota: Como he puesto en el código a manera de comentario, faltan las consistencias al
especificar el rango de fechas. La idea principal es manejar y construir de manera
correcta la cadena de filtro.
Imports System.Data
Imports System.Data.SqlClient
'La conexion
Dim cn As SqlConnection
'El SQLDataAdaptar
Dim daOrdenes As SqlDataAdapter
'El DataSet
Dim dsDatos As DataSet
'La Vista
Dim dvOrdenes As DataView
daOrdenes.Fill(dsDatos, "Ordenes")
LlenarlistaOriginal()
End Sub
lvOrdenes.Items.Add(dsDatos.Tables("Ordenes").Rows(i)("OrderId"))
lvOrdenes.Items(i).SubItems.Add(Format(dsDatos.Tables("Ordenes").Rows(i)("
OrderDate").ToString, "Short Date"))
lvOrdenes.Items(i).SubItems.Add(dsDatos.Tables("Ordenes").Rows(i)("Freight"
).ToString)
Next
End Sub
El botón filtrar
'Instancia de la Vista
Me.lvOrdenes.Items.Clear()
lvOrdenes.Items.Add(dvOrdenes.Item(i).Item(0).ToString)
lvOrdenes.Items(i).SubItems.Add(Format(dvOrdenes.Item(i).Item(1).ToString,
"Short Date"))
lvOrdenes.Items(i).SubItems.Add(dvOrdenes.Item(i).Item(2).ToString)
Next
End Sub
End Class
También muestro de manera muy elemental el uso del control ListView, para aprender a
usar este control pueden visitar estos enlaces.
Para el uso del control ListView
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListView.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_Control_ListViewII.htm
http://www.elguille.info/colabora/NET2005/FernandoLuque_ListViewAvanzado.htm
En la parte superior del formulario se puede visualizar los Clientes en el primer combo
y las órdenes del Cliente seleccionado en el segundo Combo. En la parte inferior como
insertar de manera simple datos en un ListView.
Imports System.Data
Imports System.Data.SqlClient
Dim cn As SqlConnection
Dim dsDatos As DataSet
Dim daClientes As SqlDataAdapter
Dim daOrdenes As SqlDataAdapter
Dim reClientesOrdenes As DataRelation
'El Adaptador
daClientes = New SqlDataAdapter("select customerid, companyname,
contactname from customers", cn)
'Llenar el DataSet
daClientes.Fill(dsDatos, "Clientes")
End Sub
verOrdenes()
Me.lblCliente.Text =
dsDatos.Tables("Clientes").Rows(cboClientes.SelectedIndex)("CompanyName").ToStri
ng
Me.lblCantidad.Text = Me.cboOrdenes.Items.Count.ToString + " órdenes"
End Sub
End Class