Para trabajar con graficas estadsticas en VB.NET 2010 y el objeto ChartControl, lo podemos realizar utilizando: Cuadros de texto, ingresando el nombre de la serie y los puntos o valores para la seria. Listas, creando una lista para las series y los valores. Vectores o Arrays, alimentando la grafica a travs de vectores que almacenan la informacin al igual como lo haramos mediante listas. Instrucciones SQL, crear una solicitud de datos mediante la instruccin Select-SQL, la cual la ejecutamos mediante el objeto comando y almacenamos el resultado de registros en un DataReader, para despus enlazar estos datos con la grafica a travs del mtodo DataBindTable. Caso de estudio # 2 para esta publicacin. Haciendo una compilacin de los anteriores para enlazarlos en la grafica a travs del mtodo DataBindCrossTable, el cual solicita el origen de datos del que alimentara la grafica, el nombre del campo usado para agrupar los datos de la serie, nombre del campo para los valores X, lista separada por comas de nombres de los campos para los valores Y; y otras propiedades de puntos de datos que se pueden enlazar. Cmo funciona el objeto ChartControl, al presentar una grafica estadstica? El objeto Chart Control est compuesto por una coleccin (tiene un comportamiento como los vectores o array) de propiedades, mtodos y eventos que permiten la construccin del mismo, entre ellos tenemos: 1. ChartAreas: Es de tipo coleccin permite crear la zona donde se visualizara el grafico, esta se puede dividir en ms de un rea para colocar graficas en cada una de ellas. En el rea del grafico se puede configurar para mostrar en forma 3D o 2D mediante la propiedad Enable3DStyle. 2. Series: Es de tipo coleccin, cada serie tiene la propiedad ChartType, que determina el tipo de grafico que estar contenido en un ChartArea, los tipos de grficos pueden ser, Pastel, Barras, Columnas, Lneas, reas, Puntos y otros grficos que soporta el objeto ChartControl. Las series se pueden agrupar en un solo ChartArea para crear una grafica comparativa en tipos de grafico (Barras, Columnas, Lneas, reas y Puntos). No puede adjuntar dos series en una grafica de tipo Pastel. 3. Las series en su interior tiene una coleccin de propiedades llamada puntos (Point, tambin una coleccin), estos son los valores que toma la grafica si es de columnas seria la altura que mostrara la barra. 4. Titles: Es de tipo coleccin, que permite agregar el titulo a una grafica Una coleccin tiene mtodos Add, Clear que permiten agregar y limpiar el contenido de un array o vector (en nuestro caso de estudio las propiedades ChartAreas, Series, Point y Titleson de tipo coleccion; por tanto tienen metodos Add y Clear)
Cmo enlazar un objeto ChartControl con un DataSet para crear una grafica? El enlace de datos simple de una tabla a un control grfico se puede lograr utilizando el mtodo Chart.DataBindTable (requiere que un esquema de tablas exista antes de hacer el enlace). Las series y puntos se crean automticamente y se agregan al control grfico basado en el nmero de columnas del origen de datos. Para este ejemplo usaremos una tabla de nombre Empresas, creada en Access, en esta tabla se almacena la informacin de una ficha para encuesta de empresas, y tiene la siguiente estructura: Nombre de tabla: Empresas Campo Tipo IdEmpresa Autonum Propietario Texto Empresa Texto Telefono Numero Celular Numero Direccion Texto Correo Texto Actividad Texto Opcin de seleccin nica Actividad Comercial Cmo est constituida? Est dispuesto a asociarse con otros? Tiene acceso al sistema financiero? Le han asesorado tcnicamente? Conoce de canales de distribucin? Constituido Texto Asociacin Texto Financiamiento Texto Asesoria Texto Distribucion Texto Observaciones Texto Turismo Si/No Opcin de seleccin mltiple, mediante CheckBox en el formulario Caficultura Si/No Agroindustria Si/No Ganaderia Si/No Artesanias Si/No Horticultura Si/No Pisicultura Si/No Ecoturismo Si/No Apiario Si/No Floricultura Si/No Otros Si/No Ninguno Si/No
Programar las graficas estadsticas para las preguntas Cul es la actividad comercial de la empresa?, Cmo est constituida la empresa?, Est dispuesto a asociarse con otras personas?, Tiene acceso al sistema financiero Nacional?, Ha recibido asesora tcnica?, Tiene conocimiento sobre canales de distribucin?; se debe escribir una instruccin SQL de resumen que obtiene el numero de respuestas de esa pregunta (Select Actividad, count(Actividad) as Total from Empresas group by Actividad), y se genera la fuente de datos para mostrar la grafica, este paso es igual para las dems preguntas solo cambiando el nombre del campo. Pero en las opciones de seleccin mltiple como lo es la pregunta En qu otras actividades comerciales desea invertir?, aqu se debe contar el nmero de empresas que han marcado por cada una de las opciones, en casos como estos que se quiere crear la grafica estadstica de Actividades comerciales a invertir, se debe programar para alimentar el esquema de tablas en el DataSet de VB.NET, para generar la grafica que muestre el nmero de empresas que piensan invertir en Turismo, Ecoturismo, etc.. Para tal fin comenzaremos por el formulario, las propiedades que deber modificar sern: Propiedad Valor Name frmGraficaporActividades MinimizeBox False StartPosition CenterScreen Text Grafica de Actividades comerciales a invertir Al Formulario agregue el objeto Button, del Cuadro de Herramientas, seccin Controles comunes, y cambie las siguientes propiedades: Propiedad Valor Name Cmdactualizar Anchor Bottom, Right Text Actualizar La propiedad Anchor es para que el objeto al que se configura, mantenga la posicin al maximizar o restaurar el formulario.
El tipo de grafica a mostrar es pastel, al generar la grafica se mostraran los valores de cada categora, el objeto ChartControlcuenta con una propiedad dentro de las series para que los valores de la grafica se muestren en porcentaje, pero la suma de este porcentaje no resulta en 100%, por tanto agregare un cdigo que permita esa opcin, mientras tanto agregue un objeto CheckBoxdel Cuadro de Herramientas, seccin Controles comunes, y modifique las siguientes propiedades: Propiedad Valor Name chkPorcentajes Anchor Bottom, Right Text Ver Porcentajes Cuando la propiedad Checked de este objeto se encuentre activada (True), entonces la grafica mostrara los porcentajes representativos de cada pieza del pastel, ahora agregue el objeto Chart del Cuadro de Herramientas, seccin Datos, y modifique las propiedades: Propiedad Valor Name oGrafico Anchor Top, Bottom, Left, Righ
Su formulario debe tener un aspecto como el de la siguiente imagen:
Ahora procederemos a configurar el conjunto de datos que alimentara la grafica, para esto abra su DataSet, sino tiene uno haga el nuevo DataSet y le escribe el nombredsTablas, dentro del DataSet, clic derecho en una zona limpia y selecciona Agregar/Table de Datos, al objeto nuevo que se ha creado llmele EmpresasGrafico, cambiando la propiedad Name de la ventana de propiedades. Luego haga clic derecho sobre la tabla creada y seleccionesAgregar/Columna, a la columna llmele Categoria y su tipo de dato (DataType) ser System.String todo desde la ventana de propiedades, despus de eso, haga clic derecho sobre la Columna Categoria y selecciona Agregar/Clave, se aparecer una ventana en la cual deber cambiar algunos datos como se muestra en la imagen.
Una vez hecha la clave principal, agregue una nueva columna y le llama Total, con tipo de dato System.Int16.
Si no se configura la clave principal, no se podr hacer uso del mtodo Find( ) del objeto DataRow
La siguiente imagen muestra como deber quedar su conjunto de datos dentro del DataSet.
Una vez configurado el formulario y la tabla dentro del conjunto de datos, procedemos a programar el cdigo para crear la grafica, pero recuerde que siempre, para programar se debe tener un camino a seguir para llegar a la solucin.
Cabe recordar que para generar las graficas donde la pregunta es seleccin nica (en las respuestas), se realiza con la instruccin SQL-Select (Select Actividad, count(Actividad) as Total from Empresas group by Actividad), y esta creara una tabla de informacin para la grafica donde muestra: Actividad Total Si ## Pero para construir nuestra grafica de Actividades comerciales a invertir, nuestra tabla de datos deber quedar formada de la siguiente forma: Categoria Total Turismo ## Caficultura ## Ganaderia ## . . . . . . Para crear una tabla de informacin con los datos anteriores, usaremos la instruccin SQL-Select (Select Turismo, count(Turismo) as Total from Empresas group by Turismo), y los datos devueltos por esta instruccin se almacenaran en la tabla del DataSet, EmpresasGrafico, y luego continuaremos de la misma forma solo que cambiando la actividad comercial, todo esto se puede hacer manualmente, pero Cmo actualizar los datos del grafico cuando se agregue nueva informacin a la tabla?, si se est construyendo una aplicacin, se debe de programar todo el cdigo necesario para construir la grafica, y para ello seguiremos un procedimiento o secuencia de pasos que nos ayudaran a formar nuestra grafica estadstica. 1. Realizar un array o vector donde se almacenen todos los rubros (Turismo, Caficultura, ) 2. Crear un ciclo repetitivo que recorra el array o vector de los rubros. 2.1. Crear una instruccin SQL-Select que obtenga los datos de cada uno de los rubros por separado. 2.2. Alimentar los datos del DataSet con los datos devueltos por la instruccin SQL-Select de cada rubro. 3. Generar la grafica.
Procedimiento: Haga clic derecho sobre el formulario y seleccione la opcin Ver Cdigo, y antes del comando Public ClassfrmGraficaporActividades, presione la tecla ENTER y escriba Imports System.Data.OleDb Esta lnea de cdigo es para adjuntar referencias a la librera de clases OleDb, la cual nos permite objetos para trabajar con tablas de Access.
Durante el procedimiento haremos uso del Objeto DataRow, el cual representa una fila primaria de una tabla, a la cual se le pueden asignar valores para agregar o actualizar en la tabla. Un DataRow tiene una estructura de la tabla, en nuestro caso de la tabla EmpresasGrafico, y se representa de la siguiente forma: Categoria Total Informacin que guarda el DataRow
Luego presione las teclas Shift + F7, para ir a la parte grafica del formulario, y estando aqu, haga doble clic sobre el botn actualizar y escriba el siguiente cdigo:
'Crear la cadena de conexion y abrir una conexion de datos con la BD Empresas Dim Cadena As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\IIIBTC_2012\Registro_de_Empresas.accdb" Dim oConexion As New OleDbConnection(Cadena) oConexion.Open()
'Limpiar el contenido del DataSet para la nueva informacion DsTablas.EmpresasGrafico.Clear()
'Paso 1, Array con todos los rubros Dim aRubros As String() = {"Turismo", "Caficultura", "Ganaderia", "Artesanias", "Horticultura", "Pisicultura", "Ecoturismo","A piario", "Floricultura", "Otros", "Ninguno"}
'Variable para estar cambiando la instruccin SQL Dim cSQL As String = "" 'Paso 2, Ciclo repetitivo que recorre el array For i As Integer = 0 To aRubros.Length - 1 'Paso 2.1, Crear un Select para obtener los datos segun cada rubro cSQL = "Select " & aRubros(i) & ", count(" & aRubros(i) & ") as Total from Empresas where " & aRubros(i) & "= true group by " & aRubros(i)
Dim oComando As New OleDbCommand(cSQL, oConexion) Dim lector As OleDbDataReader = oComando.ExecuteReader 'El objeto DataRow es usado para representar una fila primaria, en nuestro caso con la 'estructura de la tabla EmpresasGrafico, para las columnas Categoria y Total Dim Fila As DataRow = DsTablas.EmpresasGrafico.NewRow If lector.Read Then If lector("Total") <> 0 Then 'Asignar los valores a cada campo, el del Rubro y # Total para ese rubro Fila("Categoria") = aRubros(i) Fila("Total") = lector("Total") 'Paso 2.2 Alimentar el DataSet con los datos de cada rubro DsTablas.EmpresasGrafico.Rows.Add(Fila) 'Guardar los valores y convertirlos a porcentajes si as se desea Valores(i) = lector("Total") 'Esta variable fue creada como array despus de la declaracin Public Class End If 'End if para la condicin lector(Total)<> 0 End If 'End if para la condicin lector.Read() Next
'Aplicar cambios al DataSet DsTablas.EmpresasGrafico.AcceptChanges()
'Cerrar conexin de datos oConexion.Close()
'Limpiar el contenido del grafico antes de enlazar con los nuevos datos oGrafico.Series.Clear() oGrafico.Titles.Clear()
'Activar las opciones para visualizar la grafica en 3D oGrafico.ChartAreas(0).Area3DStyle.Enable3D = True
'Agregar el titulo de la grafica oGrafico.Titles.Add("Otras actividades comerciales a invertir")
'Cambiar el tipo de letra para la grafica oGrafico.Titles(0).Font = New Font("Tahoma", 15, FontStyle.Bold)
'Cambiar opciones de rotacin y profundidad de la grafica en 3D oGrafico.ChartAreas(0).Area3DStyle.Rotation = 20 oGrafico.ChartAreas(0).Area3DStyle.PointDepth = 75 oGrafico.ChartAreas(0).Area3DStyle.PointGapDepth = 35
'Paso 3, Generar la grafica, enlazando a travs del mtodo DataBindTable oGrafico.DataBindTable(EmpresasGraficoBindingSource, "Categoria") 'EmpresasGraficoBindingSource proporciona el enlace a de datos a la grafica ' Categoria, permite dar el nombre a cada pieza del pastel 'adems que estas categoras son mostradas como rtulos en la leyenda de la grafica
'Cambiar el tipo de grafico a Pastel oGrafico.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Pie
'Mostrar como etiqueta de datos, los valores totales que alimentan la grafica oGrafico.Series(0).IsValueShownAsLabel = True
La declaracin del Array Valores, esta creada de la siguiente forma, y usted la deber ubicar en el lugar que le corresponde como se muestra en la imagen
Creo que explicar cada lnea de cdigo del botn Actualizar seria redundante, debido a que rotule cada una Asi que solo explicara la
Como el usuario puede pedir que se muestren los porcentajes que representa cada pieza del pastel, se agrego el CheckBox Ver Porcentajes para tal fin, vuelva a la parte grafica del formulario (Shift + F7) y haga doble clic sobre el CheckBox Ver Porcentajes, y en el editor de cdigo escriba las siguientes lneas:
Dim aRubros As String() = {"Turismo", "Caficultura", "Ganaderia", "Artesanias", "Horticultura", "Pisicultura", "Ecoturismo","A piario", "Floricultura", "Otros", "Ninguno"}
Dim Sumatoria As Integer = 0 'Obtener 1ro una sumatoria de todos los valores visualizados en la grafica For i As Integer = 0 To Valores.Count - 1 Sumatoria += Valores(i) Next If chkPocentajes.Checked = True Then 'Se trabajara con la actualizacion de los totales en el dataset For i As Integer = 0 To aRubros.Count - 1 Dim Fila As DataRow 'Se buscara cada uno de los rubros para obtener el porcentaje que representa ' en la grafica, para eso se hizo la clave principal Categoria Fila = DsTablas.EmpresasGrafico.Rows.Find(aRubros(i)) If Fila IsNot Nothing Then 'Si se ha encontrado la categoria, entonces se calcula el porcentaje Fila("Total") = (Int(Fila("Total")) / Sumatoria) * 100 End If Next oGrafico.Series.Clear() oGrafico.Titles.Clear() oGrafico.ChartAreas(0).Area3DStyle.Enable3D = True oGrafico.Titles.Add("Otras actividades comerciales a invertir, valores en porcentajes") oGrafico.Titles(0).Font = New Font("Tahoma", 15, FontStyle.Bold) oGrafico.ChartAreas(0).Area3DStyle.Rotation = 20 oGrafico.ChartAreas(0).Area3DStyle.PointDepth = 75 oGrafico.ChartAreas(0).Area3DStyle.PointGapDepth = 35 DsTablas.EmpresasGrafico.AcceptChanges() oGrafico.DataBindTable(EmpresasGraficoBindingSource, "Categoria") oGrafico.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Pie oGrafico.Series(0).IsValueShownAsLabel = True Else Call cmdActualizar_Click(Nothing, Nothing) 'Si el usuario no quiere porcentajes, se hace el llamado del evento clic del botn Actualizar End If
Ahora si, usted puede compilar su formulario presionando la combinacion de teclas Ctrl + F5, siempre utilice esta combinacion de teclas para compilar y ejecutar su formulario, ya que si solo presiona F5 su formulario no sera compilado y puede que se esten produciendo errores de los que no se dara cuenta.
Ademas recuerde estas lineas de codigo pueden variar, es importante que usted sepa lo que est haciendo o tratando de hacer con cada una de ellas, ya que ningun programa es igual con otro, al igual que las soluciones con las operaciones matemticas, existen muchos caminos para llegar a la solucion, solo es que usted elija el indicado.