domingo, 15 de abril de 2012

Formulario_Encuesta


Creación de un formulario de encuesta

En esta ocasión aprenderemos como hacer un formulario de encuesta que guarde, elimine y modifique.  También deberá presentar las gráficas de cada pregunta y  al finalizar lanzara un reporte.


Formulario de encuesta

Paso # 1: para comenzar tenemos que crear una tabla en Access con las preguntas de la encuesta y agregaremos una llave primaria al id de nuestra tabla.
Una vez que esté terminada nos vamos a Visual Basic y agregamos un nuevo formulario.
Lo primero que vamos hacer estando ahí es crear nuestro DataSet.
Primero nos vamos a la ventana de orígenes de datos.


Damos clic en el icono superior de la izquierda “Agregar nuevo origen de dato”



Le damos a la opción “siguiente”, volvemos a repetir este paso y luego daremos clic en “nueva selección” ahí seleccionaremos la tabla que ya tenemos creada en Access.
Damos clic en “siguiente”, después se nos aparecerá un mensaje y responderemos “no”.
Después seleccionamos “Tablas” y “Finalizar”.
Nuestro DataSet esta creado.



Paso # 2: ahora crearemos un entorno.
En esta parte del proyecto:



Hacer clic derecho y seleccionar la opción “Agregar” y luego “Control de Usuario”
Lo llamaremos entorno.
A este entorno le agregaremos un OleDbDataAdapter y un OleDbConnetion.
En el cuadro de herramientas nos vamos a la sección de “datos” y le damos clic derecho, luego “Elegir Elementos”



Luego nos aparecerá un cuadro donde haremos selección en OleDbDataAdapter y un OleDbConnetion.



Luego hacemos clic en “Aceptar”.
Primero pegamos el OleDbDataAdapter se nos aparecerá un cuadro. Haremos clic en “nueva selección”. Se aparecerá otro cuadro, entonces haremos clic en “Examinar” y ahí seleccionaremos nuestra tabla de Access luego “Aceptar” “Siguiente” “No”. Para finalizar nos saldrá una pregunta y un cuadro blanco y en caso de que esté vacio, haremos clic en “Generador de Consulta” se nos aparecerá un nuevo cuadro.




Seleccionamos el nombre de la tabla “Agregar” y luego en el otro cuadro se nos aparecerá una tabla con los campos que tenemos, haremos clic en “Todas las Columnas” y luego  “Aceptar” eso nos mandara al cuadro inicial y terminaremos con “Finalizar”.
Cambiamos en “Name” a  “daFicha” según el nombre de la tabla que tengamos.
Cuando terminemos esto se nos aparecerá el OleDbConnetion en la barra inferior y solo cambiaremos en “Name” a “oConexion”.
Ahora solamente hacemos doble clic sobre el entorno y copiamos el siguiente código:
Public Class Entorno

    Public Shared Datos As New Entorno

    Public Sub Conectar()

        If oConexion.State <> ConnectionState.Open Then

            oConexion.Open()

        End If

    End Sub

    Public Function ObtenerDatos() As DataSet

        Dim ds As New DataSet

        Conectar()

        daFicha.Fill(ds, "Ficha")

        oConexion.Close()

        Return ds

    End Function

    Public Sub salvarFicha(ByRef ds As DataSet)

        Conectar()

        daFicha.Update(ds)

        oConexion.Close()

    End Sub



    Private Sub Entorno_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



    End Sub

End Class
Paso # 3: ahora pegaremos en nuestro formulario cada una de las preguntas de la encuesta que están en nuestro DataSet.
Seleccionamos nuestra primera pregunta y arrastramos. Si nuestra pregunta es cerrada y requiere de un ComboBox, entonces seleccionamos la pregunta y damos clic en la flecha que aparece al lado y por ultimo seleccionamos un ComboBox. Si es  un CheckBox hacemos lo mismo.
Y si lo que tenemos primero es nuestro id, entonces solo lo arrastramos al formulario, después damos clic en la flecha y seleccionamos “ninguno”.
En nuestros ComboBox haremos algunos cambios.
Seleccionamos el ComboBox y hacemos selección a la flecha de la esquina superior derecha y nos vamos a la opción “Editar Elementos” estando ahí escribiremos las respuestas de la pregunta “si” o “no” o cualquiera que sea.
Luego nos vamos al cuadro de herramientas y buscamos el DropDownStyle y luego seleccionamos la opción DropDownList.
En el caso del CheckBox solo cambiamos la opción “Text” y escribimos el nombre de la respuesta en caso de que no se haya aparecido.
 En nuestro formulario deberán aparecer ya un BindingNavigator, un BindingSource y nuestro DataSet.




Paso # 4: ahora procederemos a programar. Presionamos F7 para abrir la ventana de código y escribimos lo siguiente:

Imports Ficha_Estadistica.Entorno

Public Class frmEvento

    Private Sub frmEvento_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dsTablas.Merge(Datos.ObtenerDatos, False)

    End Sub

    Private Function validar() As Boolean

        Return True

    End Function

End Class



Luego doble clic en el botón de salvar y escribimos:

  Private Sub FichaBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FichaBindingNavigatorSaveItem.Click

        If validar() = True Then

            FichaBindingSource.EndEdit()

            Datos.salvarFicha(dsTablas)

            dsTablas.AcceptChanges()

            MsgBox("Los datos se han almacenado correctamente", MsgBoxStyle.Information, "salvar")

            IdEventoTextBox.Focus()

        End If

    End Sub






Botón de eliminar:

Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click

        If MsgBox("Desea eliminar este registro", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Eliminar") = MsgBoxResult.Yes Then

            FichaBindingSource.EndEdit()

            FichaBindingSource.RemoveCurrent()

            Datos.salvarFicha(dsTablas)

            dsTablas.AcceptChanges()

            MsgBox("El registro se ha eliminado de manera permanente", MsgBoxStyle.Information, "confirmado")

            IdEventoTextBox.Focus()



        End If

    End Sub

Y el botón de Nuevo:

Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click

        FichaBindingSource.EndEdit()

        FichaBindingSource.AddNew()

        IdEventoTextBox.Focus()

    End Sub



Nuestra tabla ya deberá guardar, modificar y eliminar.
En caso de algún error podría ser el lugar donde está guardada la tabla. En mi caso, por ejemplo tengo mi propia carpeta con mi trabajo en visual Basic y mi tabla de Access guardados en el disco local C.






Graficas para formulario de encuesta

En esta ocasión escribiré como hacer las graficas para ComboBox o CheckBox.

Graficas para ComboBox:
Creamos un nuevo formulario. Agregamos el objeto Chart, nos vamos a la tabla de propiedades y modificamos en “Name” y lo llamaremos “ografico”.
Luego pegamos en el formulario un “Button” y cambiamos en “Name” a “cmdactualizar” y en “Text” “Actualizar”.
Hacemos doble clic en el botón actualizar y escribimos el siguiente código:

Imports System.Data.OleDb

Public Class frmgrafica1

    Public cadena As String = "Provider =Microsoft.ACE.OLEDB.12.0; Data Source = C:\Ficha_Estadistica\Ficha.accdb"

    Private Sub cmdactualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdactualizar.Click

        Dim cSQL As String = "SELECT Preg1, count (Preg1) AS Total FROM Ficha  GROUP BY Preg1"

        Dim oConexion As New OleDbConnection(cadena)

        oConexion.Open()

        Dim comando As New OleDbCommand(cSQL, oConexion)

        Dim lector As OleDbDataReader = comando.ExecuteReader

        ografico.ChartAreas.Clear()

        ografico.Series.Clear()

        ografico.Titles.Clear()

        ografico.ChartAreas.Add(0)

        ografico.Titles.Add("¿Has participado en un evento organizado?")



        ografico.DataBindTable(lector, "Preg1")

        ografico.Series(0).IsValueShownAsLabel = True

        ografico.ChartAreas(0).Area3DStyle.Enable3D = True

        oConexion.Close()

    End Sub

End Class

En esta línea se debe escribir la dirección de la tabla de Access, ósea donde está guardada

 "Provider =Microsoft.ACE.OLEDB.12.0; Data Source = C:\Ficha_Estadistica\Ficha.accdb"

Nuestra grafica esta lista.







Graficas para CheckBox:

Nos vamos al DataSet que ya tenemos creado, cuando nos aparezca la tabla haremos clic derecho en la pantalla, “Agregar” “Tabla de Datos”





Cambiamos el nombre por “FichaGrafico” luego hacemos clic derecho “Agregar” “Columna” ahí escribiremos “Categoría”. Hacemos el mismo procedimiento para agregar una nueva columna y escribimos “Total”.
Hacemos clic derecho en la tabla “Agregar” “Clave” aparecerá un cuadro con “categoría” seleccionado y damos en “Aceptar”.





Ahora solo creamos un nuevo formulario, le pegamos un Chart y un Button.
Doble clic en el botón “Actualizar” (porque así se llamara el Button cuando cambien el nombre)
Y copiamos el siguiente código:

Imports Ficha_Estadistica.Entorno

Imports System.Data.OleDb

Public Class frmGrafica1



    Private Sub cmdactualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdactualizar.Click

        DsTablas.EmpresasGrafico.Clear()

        '1er paso, array de distintos rubros

        Dim aRubros As String() = {"Turismo", "Caficultura", "Agroindustria", "Ganaderia", "Artesania", "Horticultura", _

                                  "Psicultura", "Ecoturismo", "Apiario", " Floricultura", "Otros", "Ninguno"}

        '2do paso, ciclo repetitivo que recorre el array

        For i As Integer = 0 To aRubros.Count - 1

            'paso 2.1, crear la SQL-Select para obtener los datos de cada rubro

            Dim cSQL As String = "Select " & aRubros(i) & ", count (" & aRubros(i) & ") as Total from Ficha Where " & aRubros(i) & " = true " & _

            "group by " & aRubros(i)

            Datos.Conectar()



            Dim comando As New OleDbCommand(cSQL, Datos.oConexion)

            Dim lector As OleDbDataReader = comando.ExecuteReader

            Dim Fila As DataRow = DsTablas.EmpresasGrafico.NewRow

            If lector.Read Then

                Fila("Categoria") = aRubros(i)

                Fila("Total") = lector("Total")

                'Agrgar esta informacion a la tabla del dataset

                DsTablas.EmpresasGrafico.Rows.Add(Fila)

            End If

            Datos.oConexion.Close()

        Next

        DsTablas.EmpresasGrafico.AcceptChanges()

        'Verificar si hay en la tabla del dataset para generar la grafica

        If DsTablas.EmpresasGrafico.Count > -1 Then

            'Generar la grfica

            ografico.Series.Clear()

            ografico.Titles.Clear()

            ografico.DataBindTable(EmpresasGraficoBindingSource, "Categoria")

            ografico.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Pie

            ografico.ChartAreas(0).Area3DStyle.Enable3D = True

            ografico.Series(0).IsValueShownAsLabel = True

            ografico.Titles.Add("Otras actividades a invertir")

        Else

            MsgBox("No se ha generado la grafica, porque no se encontro la informacion " & " para crear la misma", MsgBoxStyle.Information, "sin Datos")

        End If

    End Sub

End Class




Reporte

Vamos al Explorador de Soluciones, clic derecho “Agregar” “Nuevo Elemento”, cuando nos aparezca el cuadro vamos a la columna izquierda y seleccionamos “Reporting”, se nos aparecerán 3 opciones de reporte y escogeremos la segunda, que dice “Informe”, le damos un nombre y “Aceptar”.

                                                                 

Ahora pegamos un objeto “Lista” del cuadro de herramientas, aparecerá un cuadro que será necesario para hacer la conexión con nuestra tabla.




En “Nuevo” se selecciona el DataSet que ya tenemos y en “Conjunto de datos disponibles” seleccionamos el nombre de la Tabla, “Aceptar”.
Agrandamos el reporte del tamaño que más nos convenga y el objeto “Lista” también debe llevar el mismo tamaño.
Agregamos cuadros de texto (del cuadro de herramientas) y escribimos el titulo. Agregamos más cuadros de textos para escribir las preguntas y otros para las respuestas. En caso de que el formulario de encuesta lleve nombre o cosas así, en el reporte, en el segundo cuadro de texto (respuesta) haremos clic en un cuadrito azul que aparece y seleccionaremos el campo “Nombre”.
Que en mi caso es mi idEvento.





 Agregamos más cuadros de texto para las respuestas que podrían ser de selección única como “A, B o C”.
Primero las ponemos en el reporte, con sus respectivas respuestas al lado. Luego selecciono solo el cuadro de texto que dice “A”, vamos a la ventana de propiedades y seleccionamos “BackGroundColor” escogemos el color que más nos parezca.
Luego hacemos clic derecho en “A” “propiedades del cuadro de texto”, se aparecerá un cuadro, entonces nos vamos a la sección de “Visibilidad” damos clic en “mostrar u ocultar en Función  de una Expresión” clic en el icono del cuadro de texto en blanco.





Luego se aparecerá una línea de código que tendremos que complementar y aquí esta:  =not(Fields!preg1.Value = "Si")
Y al final quedara algo así:





Repetiremos este procedimiento hasta terminar el reporte.
Pero si nuestra pregunta tiene respuestas con selección múltiple, cambiaremos la línea de código, que será esta:  =not (Fields!Turismo.Value =  "True" or "False")
 Al final quedara así:





Para finalizar, seleccionaremos “Detalles” (esta en la parte inferior del proyecto) y haremos clic en la pequeña flecha, luego “Propiedades de grupo”, aparece un cuadro en el cual nos iremos a la sección de “Salto de pagina” y ahí seleccionamos “En cada instancia de grupo” y “También al principio de grupo”.



Y después nos vamos a la sección “General” la opción “Agregar” y seleccionamos nuestro id y aceptar.





Por último creamos un nuevo formulario y en el cuadro de herramientas en la sección de “Informe” seleccionamos un “ReportViewer” y lo pegamos al formulario.

Lo seleccionamos y hacemos clic en la flecha negra de la esquina superior derecha, hacemos clic en la opción “Acoplar a contenido primario” y  en “Elegir informe” seleccionaremos el informe que acabamos de hacer.





Hacemos doble clic en el formulario y copiamos el siguiente código:
Imports Ficha_Estadistica.Entorno

Public Class frmReporte



    Private Sub frmReporte_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dsTablas.Merge(Datos.ObtenerDatos, False)

        Me.ReportViewer1.RefreshReport()

    End Sub

End Class

Con esto finalizamos nuestro reporte.
De esta manera concluyo con el formulario de encuesta, la grafica y el reporte.
Espero que les sirva.

No hay comentarios:

Publicar un comentario