none
APLICACION LENTA RRS feed

  • Pregunta

  • Hola a todos, estoy desarrollando una modulo de compras donde se incluye los datos del proveedor y datos del comprobante de venta pero aun no llego ni a la  mitad de los campos necesarios y el formulario cuando carga se me demora hasta 3 segundos en abrirse ( este no es el formulario principal)

    mi pregunta es si no se puede hacer que al cargar el formulario de compras esto se haga mas rapido.. o que tengo en mi codigo que lo esta haciendo lento... de antemano gracias por su ayuda.. aqui les dejo el codigo del formulario que tengo hasta ahora cuando carga

        Me.Height = FormPrincipal.ClientRectangle.Height - FormPrincipal.LbDirEmpresa.Top - FormPrincipal.LbDirEmpresa.Height
            Me.Width = FormPrincipal.ClientRectangle.Width - FormPrincipal.btCompras.Width
            Me.Top = FormPrincipal.LbDirEmpresa.Top + FormPrincipal.LbDirEmpresa.Height
            Me.Left = FormPrincipal.btCompras.Width
    
            'inabilita los controles de proveedor
            For Each objeto As Control In grBoxProveedor.Controls
                If objeto.Name <> "btLista" And objeto.Name <> "btNuevo" Then
                    objeto.Enabled = False
                End If
            Next
            btLista.Enabled = True
    
            'llena el combo tipo de identificacion
            Dim tablarefTipoId As DataTable
            ConsultaTablaATS("refTipoId", tablarefTipoId)
            cbtipoId.DataSource = tablarefTipoId
            cbtipoId.ValueMember = "Codigo"
            cbtipoId.DisplayMember = "Descripcion"
            cbtipoId.SelectedIndex = -1
    
            Dim tablaTipoCont As DataTable
            ConsultaclaseContribuyente("ClaseProv", tablaTipoCont)
            cbtipContribuyente.DataSource = tablaTipoCont
            cbtipContribuyente.ValueMember = "Codigo"
            cbtipContribuyente.DisplayMember = "Descripcion"
            cbtipContribuyente.SelectedIndex = -1
    
            Dim tablaPagoLocExt As DataTable
            ConsultaTablaATS("tipoPago", tablaPagoLocExt)
            cbResidencia.DataSource = tablaPagoLocExt
            cbResidencia.ValueMember = "codigo"
            cbResidencia.DisplayMember = "tipo"
            cbResidencia.SelectedIndex = -1
    
            cbPais.Visible = False
            LabPais.Visible = False
            lbTipRegimen.Visible = False
            cbTipoRegi.Visible = False
            LabRegMenImp.Visible = False
            txtRegMenImp.Visible = False
            lbParaisoFiscal.Visible = False
            cbParFiscal.Visible = False
            cbPaisParFiscal.Visible = False
            btEditar.Enabled = False
            lbaplicConvDobTrib.Visible = False
            cbaplicConvDobTrib.Visible = False
            lbpagExtSujRetNorLeg.Visible = False
            cbpagExtSujRetNorLeg.Visible = False
    
    
            Dim dtCodSustento As New DataTable
            Dim sqlCodSustento As String = "SELECT Codigo, tipoSustento FROM codSustento WHERE fechaInicio <#" & DateTime.Today & "# AND fechaFin is Null"
            ConsultaTablaATSEditado(dtCodSustento, sqlCodSustento)
            cbCodSustento.DataSource = dtCodSustento
            cbCodSustento.ValueMember = "Codigo"
            cbCodSustento.DisplayMember = "tipoSustento"
        End Sub
    
        Private Sub btLista_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btLista.Click
            GrBoxListaProv.Visible = True
            Dim proveedores As New DataTable
            proveedores = ConsultarProveedorCampos("idProv, denoProv", "Proveedor")
            DgvTxtcRazonSocial.Width = dgvListado.Width - DgvTxtcIdentificacion.Width
            Dim insfila As Integer = 0
            For Each fila As DataRow In proveedores.Rows
                dgvListado.Rows.Add()
                dgvListado.Rows(insfila).Cells(0).Value = fila(0).ToString
                dgvListado.Rows(insfila).Cells(1).Value = fila(1).ToString
                insfila += 1
            Next
            proveedores.Clear()

    sábado, 24 de junio de 2017 0:14

Respuestas

  • Hola:

     Dibujar los controles no debería de ser mayor problema, los problemas normalmente vienen al cargar controles con datos en el evento Load del formulario, ya que como sabrás se tiene que generar la conexión a la BD, hacer la solicitud de información y devolverla al control que la solicito, esto sin mencionar, que .Net demora mas cuando es la primer conexión a la BD.

     En tu codigo veo que estas cargando varios controles ComboBox con informacion de un DataTable, desconozco si el DataTable es llenado con datos provenientes de una Bd haciendo lo que te comente mas arriba, si este es el caso y creo que lo es, entonces te sugeriria que cargaras estos controles una vez cargado el formulario ¿Como hacerlo? 

    1. Usa un control Timer con un interval definido a tu gusto

    2. En el Load del formulario llamas a Timer.Tick

    3. Defines una variable del tipo int a nivel de clase (formulario)

    4. En el evento Tick del timer preguntas si la variable Global es igual a 3 (por ejemplo) si lo es llamas a todas las rutinas  que llenan los ComboBox si no incrementas 1 a la variable global.

     De este modo, el formulario se cargara correctamente y los controles se llenaran solo después de cargado el formulario.

     Otra solución podría ser que definieras si realmente requieres que todos esos ComboBox estén cargados con datos al momento del inicio o si puedes ir haciendo una carga según se vayan seleccionando valores de otros combobox, que como imaginaras no es lo mismo cargar un control que cargar 10.

     Otro punto que veo es que estas equivocando la manera en cargar de datos el control DataGridView, ya que para llenarlo no es necesario que recorras la fuente y que agregues valor por valor en las celdas, esto creo que viene de Vb.6 pero en .Net el control tiene un DataSource el cual se encarga de recibir la información y mapear los elementos a las celdas correspondientes.

    Private Sub btLista_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btLista.Click
        GrBoxListaProv.Visible = True
    
    	'Entiendo que la funcion ConsultarProveedorCampos devuelve un objeto DataTable, entonces no es necesario declarar una variable del Tipo
    	'DataTable para almacenar el resultado, bastara con asignarlo de forma directa al control
    	dgvListado.DataSource = ConsultarProveedorCampos("idProv, denoProv", "Proveedor")
    	DgvTxtcRazonSocial.Width = dgvListado.Width - DgvTxtcIdentificacion.Width
    proveedores.Clear()

     Esos son los puntos principales a corregir y mejorar desde ya.

    Espero que te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!

    lunes, 26 de junio de 2017 1:16
  • Saludos:

    En mi forma de ver puedes evitar lo siguiente:

    1) Recorrer todos los controles para inhabilitarlos:

     'inabilita los controles de proveedor
            For Each objeto As Control In grBoxProveedor.Controls
                If objeto.Name <> "btLista" And objeto.Name <> "btNuevo" Then
                    objeto.Enabled = False
                End If
            Next
            btLista.Enabled = True
    

    Simplemente en tiempo de diseño colocas la propiedad Enable = False. Solamente los habilitas cuando los vas a usar.

    2) Tambien esto:

    cbPais.Visible = False
            LabPais.Visible = False
            lbTipRegimen.Visible = False
            cbTipoRegi.Visible = False
            LabRegMenImp.Visible = False
            txtRegMenImp.Visible = False
            lbParaisoFiscal.Visible = False
            cbParFiscal.Visible = False
            cbPaisParFiscal.Visible = False
            btEditar.Enabled = False
            lbaplicConvDobTrib.Visible = False
            cbaplicConvDobTrib.Visible = False
            lbpagExtSujRetNorLeg.Visible = False
            cbpagExtSujRetNorLeg.Visible = False
    
    

    Al igual que el otro colocas la propiedad Visible = False y tambien la cambias cuando la uses.

    3) Tambien en el DGV solamente deberias asignar el DataSource en vez de recorrer cada fila. Las Columnas que no quieras mostrar, colocas la propiedad Visible = False.

    4) Los anteriores son arreglos menores. Creo que la mayor demora puede ser debida a los queries que haces a la base de datos. Revisa la estructura de las tablas y sus indices, para que sean de lectura rapida.

    Espero ayude.

    JOSE LUIS


    Dios NO los llamo LAS DIEZ RECOMENDACIONES

    lunes, 26 de junio de 2017 0:56

Todas las respuestas

  • Saludos:

    En mi forma de ver puedes evitar lo siguiente:

    1) Recorrer todos los controles para inhabilitarlos:

     'inabilita los controles de proveedor
            For Each objeto As Control In grBoxProveedor.Controls
                If objeto.Name <> "btLista" And objeto.Name <> "btNuevo" Then
                    objeto.Enabled = False
                End If
            Next
            btLista.Enabled = True
    

    Simplemente en tiempo de diseño colocas la propiedad Enable = False. Solamente los habilitas cuando los vas a usar.

    2) Tambien esto:

    cbPais.Visible = False
            LabPais.Visible = False
            lbTipRegimen.Visible = False
            cbTipoRegi.Visible = False
            LabRegMenImp.Visible = False
            txtRegMenImp.Visible = False
            lbParaisoFiscal.Visible = False
            cbParFiscal.Visible = False
            cbPaisParFiscal.Visible = False
            btEditar.Enabled = False
            lbaplicConvDobTrib.Visible = False
            cbaplicConvDobTrib.Visible = False
            lbpagExtSujRetNorLeg.Visible = False
            cbpagExtSujRetNorLeg.Visible = False
    
    

    Al igual que el otro colocas la propiedad Visible = False y tambien la cambias cuando la uses.

    3) Tambien en el DGV solamente deberias asignar el DataSource en vez de recorrer cada fila. Las Columnas que no quieras mostrar, colocas la propiedad Visible = False.

    4) Los anteriores son arreglos menores. Creo que la mayor demora puede ser debida a los queries que haces a la base de datos. Revisa la estructura de las tablas y sus indices, para que sean de lectura rapida.

    Espero ayude.

    JOSE LUIS


    Dios NO los llamo LAS DIEZ RECOMENDACIONES

    lunes, 26 de junio de 2017 0:56
  • Hola:

     Dibujar los controles no debería de ser mayor problema, los problemas normalmente vienen al cargar controles con datos en el evento Load del formulario, ya que como sabrás se tiene que generar la conexión a la BD, hacer la solicitud de información y devolverla al control que la solicito, esto sin mencionar, que .Net demora mas cuando es la primer conexión a la BD.

     En tu codigo veo que estas cargando varios controles ComboBox con informacion de un DataTable, desconozco si el DataTable es llenado con datos provenientes de una Bd haciendo lo que te comente mas arriba, si este es el caso y creo que lo es, entonces te sugeriria que cargaras estos controles una vez cargado el formulario ¿Como hacerlo? 

    1. Usa un control Timer con un interval definido a tu gusto

    2. En el Load del formulario llamas a Timer.Tick

    3. Defines una variable del tipo int a nivel de clase (formulario)

    4. En el evento Tick del timer preguntas si la variable Global es igual a 3 (por ejemplo) si lo es llamas a todas las rutinas  que llenan los ComboBox si no incrementas 1 a la variable global.

     De este modo, el formulario se cargara correctamente y los controles se llenaran solo después de cargado el formulario.

     Otra solución podría ser que definieras si realmente requieres que todos esos ComboBox estén cargados con datos al momento del inicio o si puedes ir haciendo una carga según se vayan seleccionando valores de otros combobox, que como imaginaras no es lo mismo cargar un control que cargar 10.

     Otro punto que veo es que estas equivocando la manera en cargar de datos el control DataGridView, ya que para llenarlo no es necesario que recorras la fuente y que agregues valor por valor en las celdas, esto creo que viene de Vb.6 pero en .Net el control tiene un DataSource el cual se encarga de recibir la información y mapear los elementos a las celdas correspondientes.

    Private Sub btLista_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btLista.Click
        GrBoxListaProv.Visible = True
    
    	'Entiendo que la funcion ConsultarProveedorCampos devuelve un objeto DataTable, entonces no es necesario declarar una variable del Tipo
    	'DataTable para almacenar el resultado, bastara con asignarlo de forma directa al control
    	dgvListado.DataSource = ConsultarProveedorCampos("idProv, denoProv", "Proveedor")
    	DgvTxtcRazonSocial.Width = dgvListado.Width - DgvTxtcIdentificacion.Width
    proveedores.Clear()

     Esos son los puntos principales a corregir y mejorar desde ya.

    Espero que te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!

    lunes, 26 de junio de 2017 1:16