none
Progressbar a un for each RRS feed

  • Pregunta

  • Buenas noches ,tengo un store que me genera un listado el cual me  toma casi 20 segundos en mostrar la lista, eso lo muestro  con un aplicativo en visual estudio, lo que quisiera es que mientras va cargando mostrar un progressbar que este contando el numero de fila..

    Public Function Listar_Saldos() As DataTable
            Dim cmd As New SqlCommand
            Dim dt As New DataTable("Excluidos_con_Aportes")
            With cmd
                .Connection = cone.CNX
                .CommandType = CommandType.StoredProcedure
                .CommandText = "usp_listadoRetiradosconsaldos"
    
                Try
                    cone.CNX.Open()
                    dt.Load(.ExecuteReader)
                    'miada.Fill(dt)
                Catch ex As Exception
                    Throw New Exception("Listar-Excluidos():" + ex.Message)
                Finally
                    If cone.CNX.State = ConnectionState.Open Then
                        cone.CNX.Close()
                    End If
                End Try
                Return dt
            End With
        End Function
    End Class
    
    aca en la aplicacion en el boton mostrar:
    
    Private Sub ListarTodos()
            Me.socios_consaldo = sociosExc.ListarExculidos_Aportepordevolver
            txttotal.Text = socios_consaldo.Rows.Count
            Dgvlista.DataSource = Me.socios_consaldo

    Algun ejemplo de donde utilizaria el for each.

    gracias.


    lutermick

    viernes, 16 de enero de 2015 4:43

Respuestas

  • Lutermick,

    Hay varios hilos en estos foros que tratan el tema de la realización de operaciones en sengundo plano y barras de progreso:

    Threads en WPF

    Tarea en segundo plano y barra de progreso

    Por otra parte, estoy casi completamente seguro de que la causa del bajo rendimiento de ese procedimiento almacenado es el uso de la función escalar con acceso a datos que estás usando. Está demostrado desde SQL Server 2000 que incluyeron esa funcionalidad, que este tipo de funciones hacen muy lentas las consultas que las usan.

    Ahora no tengo tiempo para reescribir tu consulta de manera que no use la función escalar, tengo que it a recoger a mi hija al cole, pero en cuanto tenga un rato lo intentaré. Sería de gran ayuda que me proporionaras los scripts de creación de las tablas base, así no tengo que inventármelas y puedo al menos probar que el procedimiento se ejecuta sin errores. ¿Podrás hacerlo?. Gracias.

    Por cierto, la función está mal, la variable @CODOFIN no está declarada, así que fallaría la creación de la función. Puedes, por favor, proporcionar la funciónn real?



    Jesús López


    EntityLite a lightweight, database first, micro orm




    viernes, 16 de enero de 2015 14:58

Todas las respuestas

  • Yo no veo ningún foreach en el código que has puesto.

    ¿Qué es lo que está tardando ExecuteReader o DataTable.Load? Lo normal es que lo que tarde sea el ExecuteReader, y en ese caso veo difícil informar del progreso indicando el tanto por ciento completado

    Por favor, ¿Puedes modificar el código para saber qué es lo que está tardando?

    cone.CNX.Open()
    Dim reader = .ExecuteReader()
    dt.Load(reader)                

    Ejecútalo paso a paso y mira si es el ExecuteReader o el Load.

    Aunque sea el Load, tampoco veo una forma de informar del tanto por ciento completado, porque no se sabe cuantas filas devuelve el procedimiento así que si van cargadas 200 filas ¿Cómo sabes qué tanto por ciento de filas se han cargado sin saber cuantas faltan por cargar?

    ¿Podrías poner el código del procedimiento almacenado? ¿El script de creación de las tablas y de los índices de las tablas? Con eso posíblemente podríamos encontrar una forma de optimizar el rendimiento del procedimiento.

    Otra forma de mejorar esto es ejecutar el procedimiento y cargar el datatable en segundo plano, así al menos no se congela el interfaz de usuario. Y mientras se está haciendo esto, mostrar al usuario una barra de progreso tipo marquee, pero sin informar del tanto por ciento completado, ya que no se sabe ni cuanto va a tardar ni cuantas filas va a devolver.



    Jesús López


    EntityLite a lightweight, database first, micro orm


    viernes, 16 de enero de 2015 6:40
  • Gracias por responder, creo que no me explique bien, lo que busco es justo el ultimo párrafo que comentas(Otra forma de mejorar esto es ejecutar el procedimiento y cargar el datatable en segundo plano, así al menos no se congela el interfaz de usuario. Y mientras se está haciendo esto, mostrar al usuario una barra de progreso tipo marquee, pero sin informar del tanto por ciento completado, ya que no se sabe ni cuanto va a tardar ni cuantas filas va a devolver), puesto que a mi procedimiento le paso una función que vincula 3 tablas  que donde me bota el calculo del monto que deseo y por la cantidad de registros que tiene mi base de datos es la demo
    fUNCION:
    
    ALTER FUNCTION [dbo].[SACAAPORTES](@CODIGO INT)
    RETURNS MONEY
    AS
    BEGIN
    DECLARE @APOREFE MONEY
    DECLARE @APORCAJ  MONEY
    DECLARE @APORDIE  MONEY
    DECLARE @APORTE  MONEY
    SET @APOREFE=(SELECT SUM(EFECTUADO)FROM APORTES WHERE CODOFIN=@CODOFIN)
    SET @APORCAJ =(SELECT SUM(MONTO) FROM CAJA WHERE ESTADOREGISTRO <>'D' AND TRANSFERENCIA=10 AND CODOFIN=@CODOFIN)
    SET @APORDIE =(SELECT SUM (DIECO)FROM DSCTO WHERE ESTADOREGISTRO <>'D' AND TIPDESC=10 AND MAKEY=@CODOFIN)
    IF @APOREFE IS NULL
    SET @APOREFE=0
    IF @APORCAJ IS NULL
    SET @APORCAJ=0
    IF @APORDIE IS NULL
    SET @APORDIE=0
    SET @APORTE=@APOREFE+@APORCAJ+@APORDIE 
    IF @APORTE IS NULL
    SET @APORTE=0
    RETURN @APORTE
    END
    
    PROCEDIMIENTO:
    
    
    ALTER proc [dbo].[usp_listadoRetiradosconsaldos]
    as
    select CODOFIN,apenom AS 'APELLIDOS Y NOMBRES', convert(varchar(12),fechatransac,105) 'FECHA EXCLUSION',
    dbo.SACAAPORTES(codofin)'APORTE PENDIENTE'
    from socios where nct=7
    GROUP BY codofin,apenom,fechatransac
    HAVING dbo.SACAAPORTES(codofin)>0
    ORDER BY FECHATRANSAC
    
    Efectivamente no se viusualiza ningun for each por que no se como vincularlo con la aplicacion , para que mientras carga y el usuario espera.


    lutermick

    viernes, 16 de enero de 2015 14:25
  • Lutermick,

    Hay varios hilos en estos foros que tratan el tema de la realización de operaciones en sengundo plano y barras de progreso:

    Threads en WPF

    Tarea en segundo plano y barra de progreso

    Por otra parte, estoy casi completamente seguro de que la causa del bajo rendimiento de ese procedimiento almacenado es el uso de la función escalar con acceso a datos que estás usando. Está demostrado desde SQL Server 2000 que incluyeron esa funcionalidad, que este tipo de funciones hacen muy lentas las consultas que las usan.

    Ahora no tengo tiempo para reescribir tu consulta de manera que no use la función escalar, tengo que it a recoger a mi hija al cole, pero en cuanto tenga un rato lo intentaré. Sería de gran ayuda que me proporionaras los scripts de creación de las tablas base, así no tengo que inventármelas y puedo al menos probar que el procedimiento se ejecuta sin errores. ¿Podrás hacerlo?. Gracias.

    Por cierto, la función está mal, la variable @CODOFIN no está declarada, así que fallaría la creación de la función. Puedes, por favor, proporcionar la funciónn real?



    Jesús López


    EntityLite a lightweight, database first, micro orm




    viernes, 16 de enero de 2015 14:58
  • listo gracias, buscare info en los link y ver la manera de corregir esa función, de seguro tiene razón con la función puesto que cuando la uso para muchos datos se pone lenta., gracias por las observaciones.

    lutermick

    viernes, 16 de enero de 2015 15:05