none
Optimizar código para reducir tiempos de carga, ayuda¡ RRS feed

  • Pregunta

  • Hola, debido a los largos tiempos de carga, la aplicación se vuelve poco útil, de ahí os pido un poco de ayuda para poder agilizar los tiempos de cargas, ya os comento de antemano que soy un programador con muy escasa experiencia. También me gustaría hacer un progreesbar para este código:

    Private Sub traspasofaltas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Send1.Visible = False
            Send2.Visible = False
            Send3.Visible = False
            Send4.Visible = False
            Label1.Visible = False
            Label2.Visible = False
            Label3.Visible = False
            Label4.Visible = False
            txtsmpt.Visible = False
            txtcontraseña.Visible = False
            txtpuerto.Visible = False
            txtusuario.Visible = False
            Send1.Text = "agarcia@macral.com"
            Send2.Text = "cbuendia@macral.com"
            Send3.Text = "acaballero@macral.com"
            Send4.Text = "produccion@macral.com"
            SeccionautoDataGridView.DataSource = Nothing
            SeccionDataGridView.DataSource = Nothing

            'Carga base de datos de intercambio
            sql = "SELECT * FROM intercambio"
            conexion = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\LOGICEXP.mdb")
            conexion.Open()
            olecommand = New OleDbCommand()
            olecommand.CommandText = sql
            olecommand.CommandType = CommandType.Text
            olecommand.Connection = conexion
            dataadapter = New OleDbDataAdapter(olecommand)
            dataset = New DataSet
            dataadapter.Fill(dataset)
            vista = dataset.Tables(0).DefaultView
            IntercambioDataGridView.DataSource = vista
            conexion.Close()
            For Each row As DataGridViewRow In IntercambioDataGridView.Rows
                codigo = row.Cells(0).Value
                If codigo = Nothing Then
                Else
                    'busqueda de articulos
                    sql = " SELECT articulos.Codigologic, articulos.Descripcion, articulos.Codbarras FROM articulos WHERE (((articulos.Codigologic)= @codigo ))"
                    conexion = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\basetiempos.mdb")
                    conexion.Open()
                    olecommand = New OleDbCommand()
                    olecommand.CommandText = sql
                    olecommand.CommandType = CommandType.Text
                    olecommand.Connection = conexion
                    olecommand.Parameters.Add("@codigo", OleDbType.VarChar)
                    olecommand.Parameters("@codigo").Value = codigo
                    dataadapter = New OleDbDataAdapter(olecommand)
                    dataset = New DataSet
                    dataadapter.Fill(dataset)
                    ArticulosDataGridView.DataSource = dataset.Tables(0).DefaultView
                    conexion.Close()
                    If ArticulosDataGridView.Rows.Count >= 1 Then
                        descripcion = ArticulosDataGridView.Rows(ArticulosDataGridView.CurrentCellAddress.Y).Cells(0).Value
                        codigodebarras = ArticulosDataGridView.Rows(ArticulosDataGridView.CurrentCellAddress.Y).Cells(1).Value
                    End If

                    ' detectar rutas

                    sql = "SELECT * FROM seccionauto WHERE codigo=@codigo"
                    conexion = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\basetiempos.mdb")
                    conexion.Open()
                    olecommand = New OleDbCommand()
                    olecommand.CommandText = sql
                    olecommand.CommandType = CommandType.Text
                    olecommand.Connection = conexion
                    olecommand.Parameters.Add("@codigo", OleDbType.VarChar)
                    olecommand.Parameters("@codigo").Value = codigo
                    dataadapter = New OleDbDataAdapter(olecommand)
                    dataset = New DataSet
                    dataadapter.Fill(dataset)
                    vista = dataset.Tables(0).DefaultView
                    SeccionautoDataGridView.DataSource = vista
                    vista.RowFilter = "Codigo LIKE '%" & codigo & "%'"
                    conexion.Close()
                    If SeccionautoDataGridView.RowCount >= 1 Then
                        If SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(2).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(3).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(4).Value = "NO" Or _
                       SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(5).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(6).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(7).Value = "NO" Or _
                       SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(8).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(9).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(10).Value = "NO" Or _
                       SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(11).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(12).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(13).Value = "NO" Or _
                       SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(14).Value = "NO" Or SeccionautoDataGridView.Rows(SeccionautoDataGridView.CurrentCellAddress.Y).Cells(15).Value = "NO" Then
                            rutaarticulo = "NO"
                        Else
                            rutaarticulo = "SI"
                        End If
                    End If

                    'update export
                    If SeccionautoDataGridView.RowCount >= 1 Then
                        If codigodebarras = Nothing Then
                            codigodebarras = 0
                        End If
                        clavelogicexp = IntercambioDataGridView.Rows(IntercambioDataGridView.CurrentCellAddress.Y).Cells(0).Value
                        conexion = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\LOGICEXP.mdb")
                        conexion.Open()
                        dataadapter = New OleDbDataAdapter("select * from intercambio order by codigoarticulo", conexion)
                        olecommand = New OleDbCommand("UPDATE intercambio set descripcion=@descripcion,ruta=@ruta,codbarras=@codbarras WHERE codigoarticulo = @codigoarticulo")
                        olecommand.Parameters.Add("@descripcion", OleDbType.VarChar)
                        olecommand.Parameters("@descripcion").Value = descripcion
                        olecommand.Parameters.Add("@ruta", OleDbType.VarChar)
                        olecommand.Parameters("@ruta").Value = "SI"
                        olecommand.Parameters.Add("@codbarras", OleDbType.VarChar)
                        olecommand.Parameters("@codbarras").Value = codigodebarras
                        olecommand.Parameters.Add("@codigoarticulo", OleDbType.VarChar)
                        olecommand.Parameters("@codigoarticulo").Value = codigo
                        olecommand.Connection = conexion
                        olecommand.ExecuteNonQuery()
                        conexion.Close()
                    Else
                        If codigodebarras = Nothing Then
                            codigodebarras = 0
                        End If
                        clavelogicexp = IntercambioDataGridView.Rows(IntercambioDataGridView.CurrentCellAddress.Y).Cells(0).Value
                        conexion = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\LOGICEXP.mdb")
                        conexion.Open()
                        dataadapter = New OleDbDataAdapter("select * from intercambio order by codigoarticulo", conexion)
                        olecommand = New OleDbCommand("UPDATE intercambio set descripcion=@descripcion,ruta=@ruta,codbarras=@codbarras WHERE codigoarticulo = @codigoarticulo")
                        olecommand.Parameters.Add("@descripcion", OleDbType.VarChar)
                        olecommand.Parameters("@descripcion").Value = descripcion
                        olecommand.Parameters.Add("@ruta", OleDbType.VarChar)
                        olecommand.Parameters("@ruta").Value = "NO"
                        olecommand.Parameters.Add("@codbarras", OleDbType.VarChar)
                        olecommand.Parameters("@codbarras").Value = codigodebarras
                        olecommand.Parameters.Add("@codigoarticulo", OleDbType.VarChar)
                        olecommand.Parameters("@codigoarticulo").Value = codigo
                        olecommand.Connection = conexion
                        olecommand.ExecuteNonQuery()
                        conexion.Close()
                    End If
                End If

            Next

            'Actualizar de nuevo
            sql = "SELECT * FROM intercambio"
            conexion = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\LOGICEXP.mdb")
            conexion.Open()
            olecommand = New OleDbCommand()
            olecommand.CommandText = sql
            olecommand.CommandType = CommandType.Text
            olecommand.Connection = conexion
            dataadapter = New OleDbDataAdapter(olecommand)
            dataset = New DataSet
            dataadapter.Fill(dataset)
            vista = dataset.Tables(0).DefaultView
            IntercambioDataGridView.DataSource = vista
            conexion.Close()
            'TODO: esta línea de código carga datos en la tabla 'Seccion._seccion' Puede moverla o quitarla según sea necesario.
            saveruta.BackColor = Color.Transparent
            ruta.BackColor = Color.Transparent
            SeccionautoDataGridView.DataSource = Nothing
            SeccionDataGridView.DataSource = Nothing
        End Sub

    jueves, 12 de julio de 2012 5:30

Respuestas

  • He tratado de depurarte algo el código fuente, aunque sigo pensando que hace falta depurarlo mucho más.

    Antes de copiar y pegar código, lo primero que vas a hacer es efectuar una copia de seguridad de tu proyecto actual, porque no quiero ser el responsable de la perdida de código fuente por las modificaciones que he efectuado en tu código.

    Una vez efectuada la copia de seguridad del proyecto, ya puedes copiar y pegar en él lo siguiente:

    ' Cadenas de conexión con las dos bases de datos ' Private cadenaConexionLogicExp As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\LOGICEXP.mdb" Private cadenaConexionBaseTiempos As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\basetiempos.mdb"

    Private Sub traspasofaltas_Load(sender As Object, e As EventArgs) Handles MyBase.Load Send1.Visible = False Send2.Visible = False Send3.Visible = False Send4.Visible = False Label1.Visible = False Label2.Visible = False Label3.Visible = False Label4.Visible = False txtsmpt.Visible = False txtcontraseña.Visible = False txtpuerto.Visible = False txtusuario.Visible = False Send1.Text = "agarcia@macral.com" Send2.Text = "cbuendia@macral.com" Send3.Text = "acaballero@macral.com" Send4.Text = "produccion@macral.com" SeccionautoDataGridView.DataSource = Nothing SeccionDataGridView.DataSource = Nothing End Sub Private Sub traspasofaltas_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown Try ' Carga base de datos de intercambio ' Dim cmd As New OleDbCommand() cmd.CommandText = "SELECT * FROM intercambio" Dim dt As DataTable = GetData(cadenaConexionLogicExp, cmd) IntercambioDataGridView.DataSource = dt For Each row As DataRow In dt.Rows ' El primer campo de la tabla intercambio entiendo que ' se llama Codigologic. ' Dim codigo As String = Convert.ToString(row("Codigologic")) If (codigo = String.Empty) Then ' Continuamos el bucle Continue For End If 'busqueda de articulos ' cmd = New OleDbCommand() cmd.CommandText = _ "SELECT Codigologic, Descripcion, Codbarras " & _ "FROM articulos WHERE Codigologic=@codigo" cmd.Parameters.AddWithValue("@codigo", codigo) Dim dtArticulos As DataTable = GetData(cadenaConexionBaseTiempos, cmd) ArticulosDataGridView.DataSource = dtArticulos If (dtArticulos.Rows.Count >= 1) Then ' Referenciamos el primer registro ' Dim fila As DataRow = dtArticulos.Rows(0) descripcion = fila(0) codigodebarras = fila(1) End If ' detectar rutas ' cmd = New OleDbCommand() cmd.CommandText = "SELECT * FROM seccionauto WHERE codigo=@codigo" cmd.Parameters.AddWithValue("@codigo", codigo) Dim dtSeccionAuto As DataTable = GetData(cadenaConexionBaseTiempos, cmd) SeccionautoDataGridView.DataSource = dtSeccionAuto Dim vista As DataView = dtSeccionAuto.DefaultView vista.RowFilter = "Codigo LIKE '%" & codigo & "%'" If (dtSeccionAuto.Rows.Count >= 1) Then ' Referenciamos el primer registro ' Dim fila As DataRow = dtSeccionAuto.Rows(0) If (Convert.ToString(fila(2)) = "NO" OrElse _ Convert.ToString(fila(3)) = "NO" OrElse _ Convert.ToString(fila(4)) = "NO" OrElse _ Convert.ToString(fila(5)) = "NO" OrElse _ Convert.ToString(fila(6)) = "NO" OrElse _ Convert.ToString(fila(7)) = "NO" OrElse _ Convert.ToString(fila(8)) = "NO" OrElse _ Convert.ToString(fila(9)) = "NO" OrElse _ Convert.ToString(fila(10)) = "NO" OrElse _ Convert.ToString(fila(11)) = "NO" OrElse _ Convert.ToString(fila(12)) = "NO" OrElse _ Convert.ToString(fila(13)) = "NO" OrElse _ Convert.ToString(fila(14)) = "NO" OrElse _ Convert.ToString(fila(15)) = "NO") Then rutaarticulo = "NO" Else rutaarticulo = "SI" End If End If 'update export ' clavelogicexp = IntercambioDataGridView.Rows( _ IntercambioDataGridView.CurrentCellAddress.Y).Cells(0).Value If (String.IsNullOrEmpty(codigodebarras)) Then codigodebarras = "0" End If cmd = New OleDbCommand() cmd.CommandText = _ "UPDATE intercambio SET " & _ "descripcion=@descripcion,ruta=@ruta,codbarras=@codbarras " & _ "WHERE codigoarticulo = @codigoarticulo" If (dtSeccionAuto.Rows.Count >= 1) Then cmd.Parameters.AddWithValue("@descripcion", descripcion) cmd.Parameters.AddWithValue("@ruta", "SI") cmd.Parameters.AddWithValue("@codbarras", codigodebarras) cmd.Parameters.AddWithValue("@codigoarticulo", codigo) Else cmd.Parameters.AddWithValue("@descripcion", descripcion) cmd.Parameters.AddWithValue("@ruta", "NO") cmd.Parameters.AddWithValue("@codbarras", codigodebarras) cmd.Parameters.AddWithValue("@codigoarticulo", codigo) End If ExecuteAction(cadenaConexionLogicExp, cmd) Next 'Actualizar de nuevo ' cmd = New OleDbCommand() cmd.CommandText = "SELECT * FROM intercambio" Dim dtIntercambio As DataTable = GetData(cadenaConexionLogicExp, cmd) IntercambioDataGridView.DataSource = dtIntercambio 'TODO: esta línea de código carga datos en la tabla 'Seccion._seccion' ' Puede moverla o quitarla según sea necesario. ' saveruta.BackColor = Color.Transparent ruta.BackColor = Color.Transparent SeccionautoDataGridView.DataSource = Nothing SeccionDataGridView.DataSource = Nothing Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub Private Function ExecuteAction(cadenaConexion As String, cmd As OleDbCommand) As Integer Try Using cnn As New OleDbConnection(cadenaConexion) cmd.Connection = cnn cnn.Open() Return cmd.ExecuteNonQuery() End Using Catch ex As Exception Throw End Try End Function Private Function GetData(cadenaConexion As String, cmd As OleDbCommand) As DataTable Try Using cnn As New OleDbConnection(cadenaConexion) cmd.Connection = cnn Dim da As New OleDbDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) Return dt End Using Catch ex As Exception Throw End Try End Function

    No quiere decir que con estas modificaciones se muestre en un tiempo menor el formulario, porque el problema que tienes es que estás ejecutando consultas SQL de selección y actualización en los eventos de presentación del formulario, cuando quizás deban de ejecutarse en el evento Click de un control Button por ponerte un ejemplo.

    Al menos servirá para que observes cómo se divide el código en procedimientos más pequeños que hagan un trabajo concreto, como puede ser ejecutar una consulta UPDATE (método ExecuteAction) u objeto un objeto DataTable (método GetData).


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    jueves, 12 de julio de 2012 8:25
    Moderador
  • > javito835638046" preguntó:
    >
    > Sabrías decirme como puedo hacer un progressbar
    > para esta carga.
    >
    > soy un programador con muy escasa experiencia.

    Para mostrar una barra de progreso tendrías que ejecutar todo el código de acceso a datos en otro subproceso ("hilo" o Thread) distinto al subproceso principal del formulario, y si eres un "programador con muy escasa experiencia" (son palabras tuyas, no me las he inventado yo), va a ser bastante complicado de explicarlo por este medio para que comprendas en condiciones óptimas lo que tienes que hacer.

    Si estás interesado en el tema, lo único que te puedo decir es que busques información sobre la ejecución de subprocesos en Visual Basic .net y sobre el control BackgroundWorker.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    viernes, 13 de julio de 2012 6:30
    Moderador

Todas las respuestas

  • "javito835638046" escribió:

    > debido a los largos tiempos de carga, la aplicación se vuelve poco útil,

    Hola:

    Ejecutar todo ese código en el evento Load del formulario es una barbaridad. No me extraña que se tarde un montón de tiempo en visualizar ese formulario.

    Prueba a eliminar del evento Load todo el código de acceso a datos, y lo ejecutas en el evento Shown del formulario, el cual se ejecuta cuando se muestra el formulario por primera vez y después del evento Load, aunque tampoco esperes muchos "milagros".

    Ese código fuente lo tienes que depurar y bastante.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    jueves, 12 de julio de 2012 7:03
    Moderador
  • He tratado de depurarte algo el código fuente, aunque sigo pensando que hace falta depurarlo mucho más.

    Antes de copiar y pegar código, lo primero que vas a hacer es efectuar una copia de seguridad de tu proyecto actual, porque no quiero ser el responsable de la perdida de código fuente por las modificaciones que he efectuado en tu código.

    Una vez efectuada la copia de seguridad del proyecto, ya puedes copiar y pegar en él lo siguiente:

    ' Cadenas de conexión con las dos bases de datos ' Private cadenaConexionLogicExp As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\LOGICEXP.mdb" Private cadenaConexionBaseTiempos As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\basetiempos.mdb"

    Private Sub traspasofaltas_Load(sender As Object, e As EventArgs) Handles MyBase.Load Send1.Visible = False Send2.Visible = False Send3.Visible = False Send4.Visible = False Label1.Visible = False Label2.Visible = False Label3.Visible = False Label4.Visible = False txtsmpt.Visible = False txtcontraseña.Visible = False txtpuerto.Visible = False txtusuario.Visible = False Send1.Text = "agarcia@macral.com" Send2.Text = "cbuendia@macral.com" Send3.Text = "acaballero@macral.com" Send4.Text = "produccion@macral.com" SeccionautoDataGridView.DataSource = Nothing SeccionDataGridView.DataSource = Nothing End Sub Private Sub traspasofaltas_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown Try ' Carga base de datos de intercambio ' Dim cmd As New OleDbCommand() cmd.CommandText = "SELECT * FROM intercambio" Dim dt As DataTable = GetData(cadenaConexionLogicExp, cmd) IntercambioDataGridView.DataSource = dt For Each row As DataRow In dt.Rows ' El primer campo de la tabla intercambio entiendo que ' se llama Codigologic. ' Dim codigo As String = Convert.ToString(row("Codigologic")) If (codigo = String.Empty) Then ' Continuamos el bucle Continue For End If 'busqueda de articulos ' cmd = New OleDbCommand() cmd.CommandText = _ "SELECT Codigologic, Descripcion, Codbarras " & _ "FROM articulos WHERE Codigologic=@codigo" cmd.Parameters.AddWithValue("@codigo", codigo) Dim dtArticulos As DataTable = GetData(cadenaConexionBaseTiempos, cmd) ArticulosDataGridView.DataSource = dtArticulos If (dtArticulos.Rows.Count >= 1) Then ' Referenciamos el primer registro ' Dim fila As DataRow = dtArticulos.Rows(0) descripcion = fila(0) codigodebarras = fila(1) End If ' detectar rutas ' cmd = New OleDbCommand() cmd.CommandText = "SELECT * FROM seccionauto WHERE codigo=@codigo" cmd.Parameters.AddWithValue("@codigo", codigo) Dim dtSeccionAuto As DataTable = GetData(cadenaConexionBaseTiempos, cmd) SeccionautoDataGridView.DataSource = dtSeccionAuto Dim vista As DataView = dtSeccionAuto.DefaultView vista.RowFilter = "Codigo LIKE '%" & codigo & "%'" If (dtSeccionAuto.Rows.Count >= 1) Then ' Referenciamos el primer registro ' Dim fila As DataRow = dtSeccionAuto.Rows(0) If (Convert.ToString(fila(2)) = "NO" OrElse _ Convert.ToString(fila(3)) = "NO" OrElse _ Convert.ToString(fila(4)) = "NO" OrElse _ Convert.ToString(fila(5)) = "NO" OrElse _ Convert.ToString(fila(6)) = "NO" OrElse _ Convert.ToString(fila(7)) = "NO" OrElse _ Convert.ToString(fila(8)) = "NO" OrElse _ Convert.ToString(fila(9)) = "NO" OrElse _ Convert.ToString(fila(10)) = "NO" OrElse _ Convert.ToString(fila(11)) = "NO" OrElse _ Convert.ToString(fila(12)) = "NO" OrElse _ Convert.ToString(fila(13)) = "NO" OrElse _ Convert.ToString(fila(14)) = "NO" OrElse _ Convert.ToString(fila(15)) = "NO") Then rutaarticulo = "NO" Else rutaarticulo = "SI" End If End If 'update export ' clavelogicexp = IntercambioDataGridView.Rows( _ IntercambioDataGridView.CurrentCellAddress.Y).Cells(0).Value If (String.IsNullOrEmpty(codigodebarras)) Then codigodebarras = "0" End If cmd = New OleDbCommand() cmd.CommandText = _ "UPDATE intercambio SET " & _ "descripcion=@descripcion,ruta=@ruta,codbarras=@codbarras " & _ "WHERE codigoarticulo = @codigoarticulo" If (dtSeccionAuto.Rows.Count >= 1) Then cmd.Parameters.AddWithValue("@descripcion", descripcion) cmd.Parameters.AddWithValue("@ruta", "SI") cmd.Parameters.AddWithValue("@codbarras", codigodebarras) cmd.Parameters.AddWithValue("@codigoarticulo", codigo) Else cmd.Parameters.AddWithValue("@descripcion", descripcion) cmd.Parameters.AddWithValue("@ruta", "NO") cmd.Parameters.AddWithValue("@codbarras", codigodebarras) cmd.Parameters.AddWithValue("@codigoarticulo", codigo) End If ExecuteAction(cadenaConexionLogicExp, cmd) Next 'Actualizar de nuevo ' cmd = New OleDbCommand() cmd.CommandText = "SELECT * FROM intercambio" Dim dtIntercambio As DataTable = GetData(cadenaConexionLogicExp, cmd) IntercambioDataGridView.DataSource = dtIntercambio 'TODO: esta línea de código carga datos en la tabla 'Seccion._seccion' ' Puede moverla o quitarla según sea necesario. ' saveruta.BackColor = Color.Transparent ruta.BackColor = Color.Transparent SeccionautoDataGridView.DataSource = Nothing SeccionDataGridView.DataSource = Nothing Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub Private Function ExecuteAction(cadenaConexion As String, cmd As OleDbCommand) As Integer Try Using cnn As New OleDbConnection(cadenaConexion) cmd.Connection = cnn cnn.Open() Return cmd.ExecuteNonQuery() End Using Catch ex As Exception Throw End Try End Function Private Function GetData(cadenaConexion As String, cmd As OleDbCommand) As DataTable Try Using cnn As New OleDbConnection(cadenaConexion) cmd.Connection = cnn Dim da As New OleDbDataAdapter(cmd) Dim dt As New DataTable() da.Fill(dt) Return dt End Using Catch ex As Exception Throw End Try End Function

    No quiere decir que con estas modificaciones se muestre en un tiempo menor el formulario, porque el problema que tienes es que estás ejecutando consultas SQL de selección y actualización en los eventos de presentación del formulario, cuando quizás deban de ejecutarse en el evento Click de un control Button por ponerte un ejemplo.

    Al menos servirá para que observes cómo se divide el código en procedimientos más pequeños que hagan un trabajo concreto, como puede ser ejecutar una consulta UPDATE (método ExecuteAction) u objeto un objeto DataTable (método GetData).


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    jueves, 12 de julio de 2012 8:25
    Moderador
  • Muchas gracias, se ha reducido un poco el tiempo, aunque sigue tardando mucho, voy a probarlo cargarlo mas tarde mediante un botón.

    Sabrías decirme como puedo hacer un progressbar para esta carga.

    Muchas gracias,

    jueves, 12 de julio de 2012 12:07
  • Sigue tardando muchisimo, que me aconsejas hacer para reducir la carga de datos a un tiempo aceptable.

    Gracias de antemano.

    jueves, 12 de julio de 2012 13:54
  • "javito835638046" preguntó:

    > Sigue tardando muchisimo, que me aconsejas hacer para
    > reducir la carga de datos a un tiempo aceptable.

    ¿Me pides un consejo? Que en los eventos de carga del formulario no recorras un bucle con todos los registros de la tabla intercambio para ejecutar consultas de selección de las tablas Articulos y SeccionAuto para posteriormente actualizar la tabla intercambio.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    viernes, 13 de julio de 2012 6:13
    Moderador
  • lo he realizado mediante un botón, al cargar el formulario este no carga nada.

    Y sigue tardando bastante.

    viernes, 13 de julio de 2012 6:17
  • > javito835638046" preguntó:
    >
    > Sabrías decirme como puedo hacer un progressbar
    > para esta carga.
    >
    > soy un programador con muy escasa experiencia.

    Para mostrar una barra de progreso tendrías que ejecutar todo el código de acceso a datos en otro subproceso ("hilo" o Thread) distinto al subproceso principal del formulario, y si eres un "programador con muy escasa experiencia" (son palabras tuyas, no me las he inventado yo), va a ser bastante complicado de explicarlo por este medio para que comprendas en condiciones óptimas lo que tienes que hacer.

    Si estás interesado en el tema, lo único que te puedo decir es que busques información sobre la ejecución de subprocesos en Visual Basic .net y sobre el control BackgroundWorker.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    viernes, 13 de julio de 2012 6:30
    Moderador
  • Mira en primer lugar es bueno que todo lo que tenga que ver con la base de datos este en una clase, ahora bien es mas eficiente trabajar con procedimientos almacenados y llamar estos procedimientos en determinadas funciones de determinadas clase, técnicamente creas instancias a las funciones de determinada clase.
    domingo, 28 de abril de 2013 2:41