none
un solo formulario en visual studio y varias tablas en access RRS feed

  • Pregunta

  • Saludos y gracias de antemano.

    Quiero que me orienten para realizar una aplicacion en visual studio y access, el proyecto consta de una base de datos en access compuesta de 6 tablas o mas donde se guardaran los datos de estudiantes como numero de lista, nombre, foto, evaluaciones y promedio de notas; cada tabla representa una seccion A, B, C, D, .... hasta la ultima. pero las tablas deben ser llenadas desde un mismo formulario donde se pueda buscar la seccion y desde alli llenar y modificar los datos de la seccion. como todas las tablas tienen la misma estructura el formulario tendra una unica configuracion. A quien pueda darme idea de como hacerlo le agradezco su colaboracion. visual studio 2010, access con instrucciones SQL 2008.


    Niazoa

    lunes, 27 de mayo de 2019 1:39

Respuestas

  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Imports System.Drawing.Drawing2D
    Public Class FrmPrueba
        Private msCadenaACCESS As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\TU_BASE_DATOS.accdb"
        Private msQuery As String
        Private mbSwCambio As Boolean
        Private mbNuevo As Boolean
        Private Sub FrmPrueba_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.grbDetalle.Visible = False
            Me.txtNumero.Enabled = False
            Me.txtPromedio.Enabled = False
            'Cargar combos
            Dim lsQuery As String = "SELECT id_seccion, descripcion FROM seccion ORDER BY descripcion"
            gP_CargaCombo(Me.cboBSeccion, lsQuery, "descripcion", "id_seccion")
            gP_CargaCombo(Me.cboSeccion, lsQuery, "descripcion", "id_seccion")
            '
            msQuery = "SELECT * FROM prueba WHERE 1=0"
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            ' estilo para la cabecera
            Dim styCabecera As DataGridViewCellStyle
            styCabecera = New DataGridViewCellStyle()
            styCabecera.BackColor = Color.LightBlue
            styCabecera.ForeColor = Color.DarkOliveGreen
            styCabecera.Font = New Font("Bradley Hand ITC", 10, FontStyle.Bold)
            styCabecera.Alignment = DataGridViewContentAlignment.BottomCenter
            Me.dgrDatos.ColumnHeadersDefaultCellStyle = styCabecera
            ' desactivar la visualización de tooltips en las celdas
            Me.dgrDatos.ShowCellToolTips = False
            ' crear y aplicar un estilo al grid
            Dim styTexto As New DataGridViewCellStyle()
            styTexto.BackColor = Color.Aquamarine
            styTexto.ForeColor = Color.Gray
            styTexto.Font = New Font("Courier New", 10, FontStyle.Bold)
            Me.dgrDatos.DefaultCellStyle = styTexto
            Me.WindowState = FormWindowState.Maximized
        End Sub
        Private Sub lP_Salir()
            Me.AutoValidate = Windows.Forms.AutoValidate.Disable
            Me.Close()
        End Sub
        Private Sub lP_Buscar()
            Dim lbHayFiltro As Boolean = False
            msQuery = "SELECT * FROM prueba"
            If Me.txtBNombre.Text <> "" Then
                msQuery &= " WHERE nombre Like '%" & Me.txtBNombre.Text & "%'"
                lbHayFiltro = True
            End If
            If Me.cboBSeccion.Text <> "" Then
                If lbHayFiltro = True Then
                    msQuery &= " AND "
                Else
                    msQuery &= " WHERE "
                End If
                msQuery &= "seccion=" & Me.cboBSeccion.SelectedValue.ToString()
            End If
            msQuery &= " ORDER BY numero"
            'Actualizamos el DataGrid con el DataTable
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            Me.ToolStripButtonNuevo.Enabled = False
            Me.ToolStripButtonBuscar.Enabled = False
            Me.ToolStripButtonNBusqueda.Enabled = True
        End Sub
        Private Sub lP_NBusqueda()
            msQuery = "SELECT * FROM prueba WHERE 1=0"
            Me.txtBNombre.Text = ""
            Me.cboBSeccion.SelectedIndex = -1
            'Actualizamos el DataGrid con el DataTable
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            Me.ToolStripButtonNuevo.Enabled = True
            Me.ToolStripButtonBuscar.Enabled = True
            Me.ToolStripButtonNBusqueda.Enabled = False
            Me.cboSeccion.Focus()
        End Sub
        Private Sub lP_Nuevo()
            grbBusqueda.Enabled = False
            grbDatos.Enabled = False
            grbDetalle.Visible = True
            Me.ToolStripButtonEliminar.Enabled = False
            lP_QuitarHandle()
            Me.txtNumero.Text = gF_sValorMaximo("prueba", "numero", "")
            Me.cboSeccion.SelectedIndex = -1
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtNota1.Text = ""
            Me.txtNota2.Text = ""
            Me.txtNota3.Text = ""
            Me.txtNota4.Text = ""
            Me.txtPromedio.Text = ""
            Me.txtNumero.Focus()
            mbNuevo = True
            mbSwCambio = False
            lP_PonerHandle()
            Me.ErrorProviderPrueba.Clear()
        End Sub
        Private Sub dgrDatos_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgrDatos.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            grbBusqueda.Enabled = False
            grbDatos.Enabled = False
            grbDetalle.Visible = True
            Me.ToolStripButtonEliminar.Enabled = True
            lP_QuitarHandle()
            Dim loFila As DataGridViewRow = Me.dgrDatos.CurrentRow()
            Me.cboSeccion.SelectedValue = CInt(loFila.Cells("seccion").Value)
            Me.txtNumero.Text = Convert.ToString(loFila.Cells("numero").Value)
            Me.txtNombre.Text = Convert.ToString(loFila.Cells("nombre").Value)
            Me.txtApellidos.Text = Convert.ToString(loFila.Cells("apellidos").Value)
            Me.txtNota1.Text = Convert.ToString(loFila.Cells("nota1").Value)
            Me.txtNota2.Text = Convert.ToString(loFila.Cells("nota2").Value)
            Me.txtNota3.Text = Convert.ToString(loFila.Cells("nota3").Value)
            Me.txtNota4.Text = Convert.ToString(loFila.Cells("nota4").Value)
            Me.txtPromedio.Text = Convert.ToString(loFila.Cells("promedio").Value)
            Me.txtNumero.Focus()
            mbNuevo = False
            mbSwCambio = False
            lP_PonerHandle()
            Me.ErrorProviderPrueba.Clear()
        End Sub
        Private Sub lP_Aceptar()
            If mbSwCambio = True Then
                mbSwCambio = False
            Else
                MessageBox.Show("No se han realizado cambios", "lP_Aceptar", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            End If
            'Controlamos si los datos han sido introducidos
            Me.Cursor = Cursors.WaitCursor
            If Me.ValidateChildren = False Then
                Me.Cursor = Cursors.Default
                MessageBox.Show("Datos erroneos", "lP_Aceptar", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            Try
                Dim lsQuery As String
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    If mbNuevo = True Then
                        lsQuery = "INSERT INTO prueba (numero, nombre, apellidos, nota1, nota2, nota3, nota4, promedio, foto, seccion) Values (@Numero, @Nombre, @Apellidos, @Nota1, @Nota2, @Nota3, @Nota4, @Promedio, @Foto, @Seccion)"
                    Else
                        Dim loFila As DataGridViewRow = Me.dgrDatos.CurrentRow()
                        lsQuery = "UPDATE prueba SET nombre=@Nombre, apellidos=@Apellidos, nota1=@Nota1, nota2=@Nota2, nota3=@Nota3, nota4=@Nota4, promedio=@Promedio, foto=@Foto, seccion=@Seccion WHERE numero=" & loFila.Cells("numero").Value.ToString()
                    End If
                    ' crear
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        If mbNuevo = True Then
                            loComando.Parameters.Add(New OleDbParameter("@Numero", Me.txtNumero.Text))
                        End If
                        loComando.Parameters.Add(New OleDbParameter("@Nombre", Me.txtNombre.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Apellidos", Me.txtApellidos.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota1", Me.txtNota1.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota2", Me.txtNota2.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota3", Me.txtNota3.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota4", Me.txtNota4.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Promedio", Me.txtPromedio.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Foto", OleDbType.VarBinary))
                        loComando.Parameters("@Foto").Value = DBNull.Value
                        loComando.Parameters.Add(New OleDbParameter("@Seccion", Me.cboSeccion.SelectedValue))
                        loConexion.Open()   ' abrir conexión
                        loComando.ExecuteNonQuery()
                    End Using
                End Using
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_Aceptar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            Me.Cursor = Cursors.Default
            grbBusqueda.Enabled = True
            grbDatos.Enabled = True
            grbDetalle.Visible = False
        End Sub
        Private Sub lP_Cancelar()
            grbBusqueda.Enabled = True
            grbDatos.Enabled = True
            grbDetalle.Visible = False
        End Sub
        Private Sub lP_Eliminar()
            Dim loFila As DataGridViewRow = Me.dgrDatos.CurrentRow()
            Dim lsMensage As String = "¿Esta seguro de querer eliminar esta prueba?" & vbCrLf & loFila.Cells("DNI").Value.ToString()
            If MessageBox.Show(lsMensage, "lP_Eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly) = Windows.Forms.DialogResult.No Then
                Return
            End If
            Try
                Dim lsQuery As String = "DELETE FROM prueba WHERE numero=" & loFila.Cells("numero").Value.ToString()
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    ' crear comando
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loConexion.Open()   ' abrir conexión
                        loComando.ExecuteNonQuery()
                    End Using
                End Using
            Catch Exp As OleDbException
                MessageBox.Show(Exp.Message, "lP_Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            grbBusqueda.Enabled = True
            grbDatos.Enabled = True
            grbDetalle.Visible = False
        End Sub
        Private Sub ToolStripBotones_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripBotones.ItemClicked
            lP_Botones(CType(e.ClickedItem, ToolStripItem).Text)
        End Sub
        Private Sub lP_Botones(ByVal vsMenuItemText As String)
            Select Case (vsMenuItemText)
                Case "&Aceptar"
                    lP_Aceptar()
                Case "&Cancelar"
                    lP_Cancelar()
                Case "&Eliminar"
                    lP_Eliminar()
            End Select
        End Sub
        Private Sub ToolStripBusqueda_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripBusqueda.ItemClicked
            lP_Botones1(CType(e.ClickedItem, ToolStripItem).Text)
        End Sub
        Private Sub lP_Botones1(ByVal vsMenuItemText As String)
            Select Case (vsMenuItemText)
                Case "&Nuevo"
                    lP_Nuevo()
                Case "&Buscar"
                    lP_Buscar()
                Case "&NBusqueda"
                    lP_NBusqueda()
                Case "&Salir"
                    lP_Salir()
            End Select
        End Sub
        'HAY QUE AÑADIR VALIDACIONES PARA TODOS LOS CAMPOS QUE NO ADMITAN NULOS
        Private Sub txtNombre_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtNombre.Validating
            If Me.txtNombre.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProviderPrueba.SetError(Me.txtNombre, "Introduzca el Nombre")
            Else
                Me.ErrorProviderPrueba.SetError(Me.txtNombre, Nothing)
            End If
        End Sub
        Private Sub lP_Cambio(ByVal sender As System.Object, ByVal e As System.EventArgs)
            mbSwCambio = True
        End Sub
        Private Sub lP_PonerHandle()
            AddHandler txtNombre.TextChanged, AddressOf lP_Cambio
            AddHandler txtApellidos.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota1.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota2.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota3.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota4.TextChanged, AddressOf lP_Cambio
            AddHandler cboSeccion.SelectionChangeCommitted, AddressOf lP_Cambio
        End Sub
        Private Sub lP_QuitarHandle()
            RemoveHandler txtNombre.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtApellidos.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota1.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota2.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota3.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota4.TextChanged, AddressOf lP_Cambio
            RemoveHandler cboSeccion.SelectionChangeCommitted, AddressOf lP_Cambio
        End Sub
        Private Sub dgrDatos_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dgrDatos.CellPainting
            ' si la celda a pintar es cabecera de fila
            If e.ColumnIndex < 0 AndAlso e.RowIndex >= 0 Then
                ' calcular el número a pintar en la celda
                Dim nNumeroFila As Integer = e.RowIndex + 1
                ' crear un array con las coordenadas sobre las que aplicaremos los colores con fundido basadas en la posición y dimensión de la celda
                Dim aPuntos As Point() = New Point() {New Point(e.CellBounds.X, e.CellBounds.Y), New Point(e.CellBounds.X, e.CellBounds.Y + e.CellBounds.Height), New Point(e.CellBounds.X + e.CellBounds.Width, e.CellBounds.Y + e.CellBounds.Height), New Point(e.CellBounds.X + e.CellBounds.Width, e.CellBounds.Y)}
                Dim pgbBrush As PathGradientBrush
                Dim aColores As Color()
                ' crear el objeto brush con efecto de fundido utilizando una combinación de colores diferente en función de si la celda está o no seleccionada
                If (e.State And DataGridViewElementStates.Selected) = DataGridViewElementStates.Selected Then
                    aColores = New Color() {Color.LightSeaGreen, Color.Beige, Color.DarkTurquoise, Color.Aquamarine}
                    pgbBrush = New PathGradientBrush(aPuntos)
                    pgbBrush.CenterColor = Color.LawnGreen
                    pgbBrush.SurroundColors = aColores
                Else
                    aColores = New Color() {Color.Aquamarine, Color.DarkTurquoise, Color.Beige, Color.LightSeaGreen}
                    pgbBrush = New PathGradientBrush(aPuntos)
                    pgbBrush.CenterColor = Color.Lavender
                    pgbBrush.SurroundColors = aColores
                End If
                ' aplicar el objeto brush con el efecto de colores fundidos y dibujar un borde para el rectángulo de la celda
                e.Graphics.FillRectangle(pgbBrush, e.CellBounds)
                e.Graphics.DrawRectangle(New Pen(Color.DarkMagenta, 3), e.CellBounds)
                ' crear la fuente a usar para dibujar el número
                Dim oFont As New Font("Comic Sans MS", 12, FontStyle.Italic)
                ' calcular el tamaño del texto
                Dim szTexto As Size = TextRenderer.MeasureText(nNumeroFila.ToString(), oFont)
                ' dibujar el número
                TextRenderer.DrawText(e.Graphics, nNumeroFila.ToString(), oFont, e.CellBounds, e.CellStyle.ForeColor)
                e.Handled = True
            End If
        End Sub
        Private Sub gP_ActualizaGrid(ByRef dgrDataGridView As DataGridView, ByVal vsQuery As String)
            Try
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Dim loDataTable As New DataTable
                    Dim loDataAdapter As New OleDbDataAdapter(vsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                    'Para enlazar el datatable con el datagrid, en DataSource se asigna el datatable
                    dgrDataGridView.DataSource = loDataTable
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "gP_ActualizaGrid", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub gP_CargaCombo(ByRef cboComboBox As ComboBox, ByVal vsQuery As String, ByVal vsVisualiza As String, ByVal vsValor As String)
            Try
                Dim loDataTable As New DataTable
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loDataAdapter As New OleDbDataAdapter(vsQuery, loConexion)
                        loDataAdapter.Fill(loDataTable)
                    End Using
                End Using
                If loDataTable.Rows.Count > 0 Then
                    'Creamos un nuevo registro para el elemento en blanco
                    Dim loFila As DataRow = loDataTable.NewRow()
                    loFila.Item(vsValor) = 0
                    loFila.Item(vsVisualiza) = ""
                    ' Insertamos la nueva fila en la primera posición del objeto DataTable.
                    loDataTable.Rows.InsertAt(loFila, 0)
                End If
                With cboComboBox
                    .DataSource = loDataTable
                    .DisplayMember = vsVisualiza
                    .ValueMember = vsValor
                    .SelectedIndex = -1
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "gP_CargaCombo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub txtNota4_KeyUp(sender As Object, e As KeyEventArgs) Handles txtNota1.KeyUp, txtNota2.KeyUp, txtNota3.KeyUp, txtNota4.KeyUp
            Dim ldNota1 As Decimal = 0
            Dim ldNota2 As Decimal = 0
            Dim ldNota3 As Decimal = 0
            Dim ldNota4 As Decimal = 0
            Dim liContador As Integer = 0
            If txtNota1.Text.Length > 0 Then
                liContador += 1
                ldNota1 = Convert.ToDecimal(txtNota1.Text)
            End If
            If txtNota2.Text.Length > 0 Then
                liContador += 1
                ldNota2 = Convert.ToDecimal(txtNota2.Text)
            End If
            If txtNota3.Text.Length > 0 Then
                liContador += 1
                ldNota3 = Convert.ToDecimal(txtNota3.Text)
            End If
            If txtNota4.Text.Length > 0 Then
                liContador += 1
                ldNota4 = Convert.ToDecimal(txtNota4.Text)
            End If
            If liContador = 0 Then
                Return
            End If
            Me.txtPromedio.Text = CStr((ldNota1 + ldNota2 + ldNota3 + ldNota4) / liContador).Replace(".", ",")
        End Sub
        Private Function gF_sValorMaximo(ByVal vsTabla As String, ByVal vsCampo As String, ByVal vsWhere As String) As String
            Dim liResultado As Object = Nothing
            Dim lsQuery As String = "Select Max(" & vsCampo & ") As NUMERO From " & vsTabla
            If Len(vsWhere) > 0 Then
                lsQuery &= vsWhere
            End If
            Try
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loConexion.Open()
                        liResultado = loComando.ExecuteScalar()
                        If IsDBNull(liResultado) = True Then
                            liResultado = 0
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "gF_sValorMaximo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return CStr(CType(liResultado, Integer) + 1)
        End Function
    End Class

    P.D.
    Le falta afinar muchas cvalidaciones, etc. Esto te lo dejo para ti para que te entretengas

    Un saludo desde Bilbo
    Carlos 

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 30 de mayo de 2019 13:53
    • Marcado como respuesta niazoa jueves, 30 de mayo de 2019 14:08
    jueves, 30 de mayo de 2019 9:36

Todas las respuestas

  • Hola:
    > como todas las tablas tienen la misma estructura <
    Si todas las tablas tienen la misma estructura, ¿NO se pueden sustituir por 1 tabla añadiendo 1 campo (por ejemplo TIPO)?

    ¿Puedes explicar un poco mas el escenario?

    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 27 de mayo de 2019 14:42
    lunes, 27 de mayo de 2019 4:54
  • Hola buenos días, colócate el diagrama de entidad de relación de la base de datos, para apoyarte en normalizar esa base de datos y se te pueda dar alguna orientación.

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 27 de mayo de 2019 14:42
    lunes, 27 de mayo de 2019 11:57
  • saludos las tablas a las que me refiero son asi.

    numero de lista, nombre y apellido, nota1, nota2, nota3, nota4,..., promedio, foto.

    esos serian los campos y si tengo 6 secciones A, B, C, D, E Y F, entonces las seis serian iguales con los mismos campos. la cuestion es llenarlas desde un mismo formulario que se conecte a cada tabla una por una para actualizar los datos, moficarlos y eso.


    Niazoa

    lunes, 27 de mayo de 2019 23:41
  • saludos las tablas a las que me refiero son asi.

    numero de lista, nombre y apellido, nota1, nota2, nota3, nota4,..., promedio, foto.

    esos serian los campos y si tengo 6 secciones A, B, C, D, E Y F, entonces las seis serian iguales con los mismos campos. la cuestion es llenarlas desde un mismo formulario que se conecte a cada tabla una por una para actualizar los datos, moficarlos y eso.

    la clave primaria seria el numero de lista. las tablas no estan relacionadas ninguna.


    Niazoa


    • Editado niazoa martes, 28 de mayo de 2019 0:36
    lunes, 27 de mayo de 2019 23:42
  • la clave primaria seria el numero de lista. las tablas no estan relacionadas ninguna

    Niazoa


    • Editado niazoa martes, 28 de mayo de 2019 0:36
    lunes, 27 de mayo de 2019 23:43
  • Hola Nia, te recomiendo que grafiques eso, trata de esforzarte un poco, pues asi te podria gustosamente apoyar un poco!, saludos!
    martes, 28 de mayo de 2019 0:51
  • Hola:
    Tienes que crear 1 tabla con la siguiente estructura

    Otra tabla con la siguiente estructura

    Y despues relacionar ambas tablas

    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Carlos_Ruiz_M martes, 28 de mayo de 2019 13:11
    martes, 28 de mayo de 2019 7:53
  • saludos esa seria una solucion logica. Pero en el proyecto lo que se quiere es poderse conectar a cada una de las tablas que representan a cada seccion de estudiantes por ejemplo un boton para SECCION A OTRO PARA SECCION B Y ASI SUCESIVAMENTE, TODO ESTO DESE UN UNICO FORMULARIO


    Niazoa

    jueves, 30 de mayo de 2019 0:20
  • Hola:
    Eso lo puedes hacer con las 2 tablas que te he expuesto.
    ¿Que pasaria sin en vez de 6 secciones, pasas a tener 6000?
    Con las 2 tablas lo que tendrias que hacer es añadir 5994 registros a la tabla seccion.
    Te voy a preparar un ejemplo con 6 secciones y 2 tablas, una vez me entere un poco del escenario

    Un saludo desde Bilbo
    Carlos

    jueves, 30 de mayo de 2019 6:46
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Imports System.Drawing.Drawing2D
    Public Class FrmPrueba
        Private msCadenaACCESS As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\TU_BASE_DATOS.accdb"
        Private msQuery As String
        Private mbSwCambio As Boolean
        Private mbNuevo As Boolean
        Private Sub FrmPrueba_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.grbDetalle.Visible = False
            Me.txtNumero.Enabled = False
            Me.txtPromedio.Enabled = False
            'Cargar combos
            Dim lsQuery As String = "SELECT id_seccion, descripcion FROM seccion ORDER BY descripcion"
            gP_CargaCombo(Me.cboBSeccion, lsQuery, "descripcion", "id_seccion")
            gP_CargaCombo(Me.cboSeccion, lsQuery, "descripcion", "id_seccion")
            '
            msQuery = "SELECT * FROM prueba WHERE 1=0"
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            ' estilo para la cabecera
            Dim styCabecera As DataGridViewCellStyle
            styCabecera = New DataGridViewCellStyle()
            styCabecera.BackColor = Color.LightBlue
            styCabecera.ForeColor = Color.DarkOliveGreen
            styCabecera.Font = New Font("Bradley Hand ITC", 10, FontStyle.Bold)
            styCabecera.Alignment = DataGridViewContentAlignment.BottomCenter
            Me.dgrDatos.ColumnHeadersDefaultCellStyle = styCabecera
            ' desactivar la visualización de tooltips en las celdas
            Me.dgrDatos.ShowCellToolTips = False
            ' crear y aplicar un estilo al grid
            Dim styTexto As New DataGridViewCellStyle()
            styTexto.BackColor = Color.Aquamarine
            styTexto.ForeColor = Color.Gray
            styTexto.Font = New Font("Courier New", 10, FontStyle.Bold)
            Me.dgrDatos.DefaultCellStyle = styTexto
            Me.WindowState = FormWindowState.Maximized
        End Sub
        Private Sub lP_Salir()
            Me.AutoValidate = Windows.Forms.AutoValidate.Disable
            Me.Close()
        End Sub
        Private Sub lP_Buscar()
            Dim lbHayFiltro As Boolean = False
            msQuery = "SELECT * FROM prueba"
            If Me.txtBNombre.Text <> "" Then
                msQuery &= " WHERE nombre Like '%" & Me.txtBNombre.Text & "%'"
                lbHayFiltro = True
            End If
            If Me.cboBSeccion.Text <> "" Then
                If lbHayFiltro = True Then
                    msQuery &= " AND "
                Else
                    msQuery &= " WHERE "
                End If
                msQuery &= "seccion=" & Me.cboBSeccion.SelectedValue.ToString()
            End If
            msQuery &= " ORDER BY numero"
            'Actualizamos el DataGrid con el DataTable
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            Me.ToolStripButtonNuevo.Enabled = False
            Me.ToolStripButtonBuscar.Enabled = False
            Me.ToolStripButtonNBusqueda.Enabled = True
        End Sub
        Private Sub lP_NBusqueda()
            msQuery = "SELECT * FROM prueba WHERE 1=0"
            Me.txtBNombre.Text = ""
            Me.cboBSeccion.SelectedIndex = -1
            'Actualizamos el DataGrid con el DataTable
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            Me.ToolStripButtonNuevo.Enabled = True
            Me.ToolStripButtonBuscar.Enabled = True
            Me.ToolStripButtonNBusqueda.Enabled = False
            Me.cboSeccion.Focus()
        End Sub
        Private Sub lP_Nuevo()
            grbBusqueda.Enabled = False
            grbDatos.Enabled = False
            grbDetalle.Visible = True
            Me.ToolStripButtonEliminar.Enabled = False
            lP_QuitarHandle()
            Me.txtNumero.Text = gF_sValorMaximo("prueba", "numero", "")
            Me.cboSeccion.SelectedIndex = -1
            Me.txtNombre.Text = ""
            Me.txtApellidos.Text = ""
            Me.txtNota1.Text = ""
            Me.txtNota2.Text = ""
            Me.txtNota3.Text = ""
            Me.txtNota4.Text = ""
            Me.txtPromedio.Text = ""
            Me.txtNumero.Focus()
            mbNuevo = True
            mbSwCambio = False
            lP_PonerHandle()
            Me.ErrorProviderPrueba.Clear()
        End Sub
        Private Sub dgrDatos_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgrDatos.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            grbBusqueda.Enabled = False
            grbDatos.Enabled = False
            grbDetalle.Visible = True
            Me.ToolStripButtonEliminar.Enabled = True
            lP_QuitarHandle()
            Dim loFila As DataGridViewRow = Me.dgrDatos.CurrentRow()
            Me.cboSeccion.SelectedValue = CInt(loFila.Cells("seccion").Value)
            Me.txtNumero.Text = Convert.ToString(loFila.Cells("numero").Value)
            Me.txtNombre.Text = Convert.ToString(loFila.Cells("nombre").Value)
            Me.txtApellidos.Text = Convert.ToString(loFila.Cells("apellidos").Value)
            Me.txtNota1.Text = Convert.ToString(loFila.Cells("nota1").Value)
            Me.txtNota2.Text = Convert.ToString(loFila.Cells("nota2").Value)
            Me.txtNota3.Text = Convert.ToString(loFila.Cells("nota3").Value)
            Me.txtNota4.Text = Convert.ToString(loFila.Cells("nota4").Value)
            Me.txtPromedio.Text = Convert.ToString(loFila.Cells("promedio").Value)
            Me.txtNumero.Focus()
            mbNuevo = False
            mbSwCambio = False
            lP_PonerHandle()
            Me.ErrorProviderPrueba.Clear()
        End Sub
        Private Sub lP_Aceptar()
            If mbSwCambio = True Then
                mbSwCambio = False
            Else
                MessageBox.Show("No se han realizado cambios", "lP_Aceptar", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            End If
            'Controlamos si los datos han sido introducidos
            Me.Cursor = Cursors.WaitCursor
            If Me.ValidateChildren = False Then
                Me.Cursor = Cursors.Default
                MessageBox.Show("Datos erroneos", "lP_Aceptar", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            Try
                Dim lsQuery As String
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    If mbNuevo = True Then
                        lsQuery = "INSERT INTO prueba (numero, nombre, apellidos, nota1, nota2, nota3, nota4, promedio, foto, seccion) Values (@Numero, @Nombre, @Apellidos, @Nota1, @Nota2, @Nota3, @Nota4, @Promedio, @Foto, @Seccion)"
                    Else
                        Dim loFila As DataGridViewRow = Me.dgrDatos.CurrentRow()
                        lsQuery = "UPDATE prueba SET nombre=@Nombre, apellidos=@Apellidos, nota1=@Nota1, nota2=@Nota2, nota3=@Nota3, nota4=@Nota4, promedio=@Promedio, foto=@Foto, seccion=@Seccion WHERE numero=" & loFila.Cells("numero").Value.ToString()
                    End If
                    ' crear
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        If mbNuevo = True Then
                            loComando.Parameters.Add(New OleDbParameter("@Numero", Me.txtNumero.Text))
                        End If
                        loComando.Parameters.Add(New OleDbParameter("@Nombre", Me.txtNombre.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Apellidos", Me.txtApellidos.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota1", Me.txtNota1.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota2", Me.txtNota2.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota3", Me.txtNota3.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Nota4", Me.txtNota4.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Promedio", Me.txtPromedio.Text))
                        loComando.Parameters.Add(New OleDbParameter("@Foto", OleDbType.VarBinary))
                        loComando.Parameters("@Foto").Value = DBNull.Value
                        loComando.Parameters.Add(New OleDbParameter("@Seccion", Me.cboSeccion.SelectedValue))
                        loConexion.Open()   ' abrir conexión
                        loComando.ExecuteNonQuery()
                    End Using
                End Using
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_Aceptar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            Me.Cursor = Cursors.Default
            grbBusqueda.Enabled = True
            grbDatos.Enabled = True
            grbDetalle.Visible = False
        End Sub
        Private Sub lP_Cancelar()
            grbBusqueda.Enabled = True
            grbDatos.Enabled = True
            grbDetalle.Visible = False
        End Sub
        Private Sub lP_Eliminar()
            Dim loFila As DataGridViewRow = Me.dgrDatos.CurrentRow()
            Dim lsMensage As String = "¿Esta seguro de querer eliminar esta prueba?" & vbCrLf & loFila.Cells("DNI").Value.ToString()
            If MessageBox.Show(lsMensage, "lP_Eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly) = Windows.Forms.DialogResult.No Then
                Return
            End If
            Try
                Dim lsQuery As String = "DELETE FROM prueba WHERE numero=" & loFila.Cells("numero").Value.ToString()
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    ' crear comando
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loConexion.Open()   ' abrir conexión
                        loComando.ExecuteNonQuery()
                    End Using
                End Using
            Catch Exp As OleDbException
                MessageBox.Show(Exp.Message, "lP_Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lP_Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            gP_ActualizaGrid(Me.dgrDatos, msQuery)
            grbBusqueda.Enabled = True
            grbDatos.Enabled = True
            grbDetalle.Visible = False
        End Sub
        Private Sub ToolStripBotones_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripBotones.ItemClicked
            lP_Botones(CType(e.ClickedItem, ToolStripItem).Text)
        End Sub
        Private Sub lP_Botones(ByVal vsMenuItemText As String)
            Select Case (vsMenuItemText)
                Case "&Aceptar"
                    lP_Aceptar()
                Case "&Cancelar"
                    lP_Cancelar()
                Case "&Eliminar"
                    lP_Eliminar()
            End Select
        End Sub
        Private Sub ToolStripBusqueda_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripBusqueda.ItemClicked
            lP_Botones1(CType(e.ClickedItem, ToolStripItem).Text)
        End Sub
        Private Sub lP_Botones1(ByVal vsMenuItemText As String)
            Select Case (vsMenuItemText)
                Case "&Nuevo"
                    lP_Nuevo()
                Case "&Buscar"
                    lP_Buscar()
                Case "&NBusqueda"
                    lP_NBusqueda()
                Case "&Salir"
                    lP_Salir()
            End Select
        End Sub
        'HAY QUE AÑADIR VALIDACIONES PARA TODOS LOS CAMPOS QUE NO ADMITAN NULOS
        Private Sub txtNombre_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtNombre.Validating
            If Me.txtNombre.Text.Length = 0 Then
                e.Cancel = True
                Me.ErrorProviderPrueba.SetError(Me.txtNombre, "Introduzca el Nombre")
            Else
                Me.ErrorProviderPrueba.SetError(Me.txtNombre, Nothing)
            End If
        End Sub
        Private Sub lP_Cambio(ByVal sender As System.Object, ByVal e As System.EventArgs)
            mbSwCambio = True
        End Sub
        Private Sub lP_PonerHandle()
            AddHandler txtNombre.TextChanged, AddressOf lP_Cambio
            AddHandler txtApellidos.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota1.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota2.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota3.TextChanged, AddressOf lP_Cambio
            AddHandler txtNota4.TextChanged, AddressOf lP_Cambio
            AddHandler cboSeccion.SelectionChangeCommitted, AddressOf lP_Cambio
        End Sub
        Private Sub lP_QuitarHandle()
            RemoveHandler txtNombre.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtApellidos.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota1.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota2.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota3.TextChanged, AddressOf lP_Cambio
            RemoveHandler txtNota4.TextChanged, AddressOf lP_Cambio
            RemoveHandler cboSeccion.SelectionChangeCommitted, AddressOf lP_Cambio
        End Sub
        Private Sub dgrDatos_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dgrDatos.CellPainting
            ' si la celda a pintar es cabecera de fila
            If e.ColumnIndex < 0 AndAlso e.RowIndex >= 0 Then
                ' calcular el número a pintar en la celda
                Dim nNumeroFila As Integer = e.RowIndex + 1
                ' crear un array con las coordenadas sobre las que aplicaremos los colores con fundido basadas en la posición y dimensión de la celda
                Dim aPuntos As Point() = New Point() {New Point(e.CellBounds.X, e.CellBounds.Y), New Point(e.CellBounds.X, e.CellBounds.Y + e.CellBounds.Height), New Point(e.CellBounds.X + e.CellBounds.Width, e.CellBounds.Y + e.CellBounds.Height), New Point(e.CellBounds.X + e.CellBounds.Width, e.CellBounds.Y)}
                Dim pgbBrush As PathGradientBrush
                Dim aColores As Color()
                ' crear el objeto brush con efecto de fundido utilizando una combinación de colores diferente en función de si la celda está o no seleccionada
                If (e.State And DataGridViewElementStates.Selected) = DataGridViewElementStates.Selected Then
                    aColores = New Color() {Color.LightSeaGreen, Color.Beige, Color.DarkTurquoise, Color.Aquamarine}
                    pgbBrush = New PathGradientBrush(aPuntos)
                    pgbBrush.CenterColor = Color.LawnGreen
                    pgbBrush.SurroundColors = aColores
                Else
                    aColores = New Color() {Color.Aquamarine, Color.DarkTurquoise, Color.Beige, Color.LightSeaGreen}
                    pgbBrush = New PathGradientBrush(aPuntos)
                    pgbBrush.CenterColor = Color.Lavender
                    pgbBrush.SurroundColors = aColores
                End If
                ' aplicar el objeto brush con el efecto de colores fundidos y dibujar un borde para el rectángulo de la celda
                e.Graphics.FillRectangle(pgbBrush, e.CellBounds)
                e.Graphics.DrawRectangle(New Pen(Color.DarkMagenta, 3), e.CellBounds)
                ' crear la fuente a usar para dibujar el número
                Dim oFont As New Font("Comic Sans MS", 12, FontStyle.Italic)
                ' calcular el tamaño del texto
                Dim szTexto As Size = TextRenderer.MeasureText(nNumeroFila.ToString(), oFont)
                ' dibujar el número
                TextRenderer.DrawText(e.Graphics, nNumeroFila.ToString(), oFont, e.CellBounds, e.CellStyle.ForeColor)
                e.Handled = True
            End If
        End Sub
        Private Sub gP_ActualizaGrid(ByRef dgrDataGridView As DataGridView, ByVal vsQuery As String)
            Try
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Dim loDataTable As New DataTable
                    Dim loDataAdapter As New OleDbDataAdapter(vsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                    'Para enlazar el datatable con el datagrid, en DataSource se asigna el datatable
                    dgrDataGridView.DataSource = loDataTable
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "gP_ActualizaGrid", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub gP_CargaCombo(ByRef cboComboBox As ComboBox, ByVal vsQuery As String, ByVal vsVisualiza As String, ByVal vsValor As String)
            Try
                Dim loDataTable As New DataTable
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loDataAdapter As New OleDbDataAdapter(vsQuery, loConexion)
                        loDataAdapter.Fill(loDataTable)
                    End Using
                End Using
                If loDataTable.Rows.Count > 0 Then
                    'Creamos un nuevo registro para el elemento en blanco
                    Dim loFila As DataRow = loDataTable.NewRow()
                    loFila.Item(vsValor) = 0
                    loFila.Item(vsVisualiza) = ""
                    ' Insertamos la nueva fila en la primera posición del objeto DataTable.
                    loDataTable.Rows.InsertAt(loFila, 0)
                End If
                With cboComboBox
                    .DataSource = loDataTable
                    .DisplayMember = vsVisualiza
                    .ValueMember = vsValor
                    .SelectedIndex = -1
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "gP_CargaCombo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub txtNota4_KeyUp(sender As Object, e As KeyEventArgs) Handles txtNota1.KeyUp, txtNota2.KeyUp, txtNota3.KeyUp, txtNota4.KeyUp
            Dim ldNota1 As Decimal = 0
            Dim ldNota2 As Decimal = 0
            Dim ldNota3 As Decimal = 0
            Dim ldNota4 As Decimal = 0
            Dim liContador As Integer = 0
            If txtNota1.Text.Length > 0 Then
                liContador += 1
                ldNota1 = Convert.ToDecimal(txtNota1.Text)
            End If
            If txtNota2.Text.Length > 0 Then
                liContador += 1
                ldNota2 = Convert.ToDecimal(txtNota2.Text)
            End If
            If txtNota3.Text.Length > 0 Then
                liContador += 1
                ldNota3 = Convert.ToDecimal(txtNota3.Text)
            End If
            If txtNota4.Text.Length > 0 Then
                liContador += 1
                ldNota4 = Convert.ToDecimal(txtNota4.Text)
            End If
            If liContador = 0 Then
                Return
            End If
            Me.txtPromedio.Text = CStr((ldNota1 + ldNota2 + ldNota3 + ldNota4) / liContador).Replace(".", ",")
        End Sub
        Private Function gF_sValorMaximo(ByVal vsTabla As String, ByVal vsCampo As String, ByVal vsWhere As String) As String
            Dim liResultado As Object = Nothing
            Dim lsQuery As String = "Select Max(" & vsCampo & ") As NUMERO From " & vsTabla
            If Len(vsWhere) > 0 Then
                lsQuery &= vsWhere
            End If
            Try
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loComando As New OleDbCommand(lsQuery, loConexion)
                        loConexion.Open()
                        liResultado = loComando.ExecuteScalar()
                        If IsDBNull(liResultado) = True Then
                            liResultado = 0
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "gF_sValorMaximo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return CStr(CType(liResultado, Integer) + 1)
        End Function
    End Class

    P.D.
    Le falta afinar muchas cvalidaciones, etc. Esto te lo dejo para ti para que te entretengas

    Un saludo desde Bilbo
    Carlos 

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 30 de mayo de 2019 13:53
    • Marcado como respuesta niazoa jueves, 30 de mayo de 2019 14:08
    jueves, 30 de mayo de 2019 9:36
  • Pues tienes toda la razon mil gracias.

    Niazoa

    jueves, 30 de mayo de 2019 14:10