Carga de msflexgrid muy lento

yayon
11 de Febrero del 2004
Hola, espero me puedan ayudar.
Tengo un form con una grila (msflexgrid) y a través de un boton cargo desde un procedimiento almacenado más de 2000 proyectos , este proceso se demora mucho, ¿ existe otra forma de llenar la grilla mucho mas rápido?

sdemingo
11 de Febrero del 2004
Es vb......, es lento.....

yo lo hago con mfgrid.AddItem en un bucle, pero cuando cargo más de 1000 registros es algo lento

salu2
sdemingo

Baltasar
11 de Febrero del 2004
Pero buenooooooo, qué diceeeeees, no ves que se van a dar cuenta????

Visual Basic no es lento . . .. lo que pasa es que a veces se toma las cosas con calma ;-)

(particularmente me encanta)
Saludos.

Baltasar
11 de Febrero del 2004
Hay algunos trucos para que la carga sea más rápida, porqué no expones aquí el código y te digo cuales son los posibles errores?

Saludos

yayon
11 de Febrero del 2004
Private Sub Command1_Click()

Dim Comm_SQL As ADODB.Command
Dim Rec As ADODB.Recordset
Dim par1 As ADODB.Parameter

Set Comm_SQL = New ADODB.Command

Set Comm_SQL.ActiveConnection = coneccion

Comm_SQL.CommandText = "PRO_TRAETODOSPROYECTOS"
Comm_SQL.CommandType = adCmdStoredProc

Set Rec = Comm_SQL.Execute()

SETEA_GRILLAPROY

While Not Rec.EOF = True

If Not IsNull(Rec.Fields("FLD_BIPCODIGO")) Then
BIP = Trim(Rec.Fields("FLD_BIPCODIGO"))
End If
If Not IsNull(Rec.Fields("FLD_PROYECTONOMBRE")) Then
NOMBRE = Trim(Rec.Fields("FLD_PROYECTONOMBRE"))
Else
NOMBRE = ""
End If
If Not IsNull(Rec.Fields("fld_utecnicacodigo")) Then
UNIDAD = Val(Rec.Fields("fld_utecnicacodigo"))
UNIDAD = NOMBREUNIDADTECNICA(UNIDAD)
End If
If Not IsNull(Rec.Fields("fld_etapa")) Then
etapa = Trim(Rec.Fields("fld_etapa"))
Else
etapa = ""
End If
If Not IsNull(Rec.Fields("fld_comunacodigo")) Then
COMU = Trim(Rec.Fields("fld_comunacodigo"))
COMU = NOMBRE_COMUNA(COMU)
Else
COMU = ""
End If
If Not IsNull(Rec.Fields("fld_sectorcodigo")) Then
SECTOR1 = Trim(Rec.Fields("fld_sectorcodigo"))
SECTOR1 = NOMBRE_SECTOR(SECTOR1)
Else
SECTOR1 = ""
End If
If Not IsNull(Rec.Fields("fld_areacodigo")) Then
AREA1 = Trim(Rec.Fields("fld_areacodigo"))
AREA1 = NOMBRE_AREA(AREA1)
Else
AREA1 = ""
End If
If Not IsNull(Rec.Fields("fld_provinciacodigo")) Then
PROVI = Trim(Rec.Fields("fld_provinciacodigo"))
PROVI = NOMBRE_PROVINCIA(PROVI)
Else
PROVI = ""
End If

If Not IsNull(Rec.Fields("fld_localizacion")) Then
localiza = Trim(Rec.Fields("fld_localizacion"))
Else
localiza = ""
End If
If Not IsNull(Rec.Fields("fld_unidadformuladora")) Then
uformuladora = Trim(Rec.Fields("fld_unidadformuladora"))
Else
uformuladora = ""
End If
If Not IsNull(Rec.Fields("fld_provision")) Then
provisionAUX = Trim(Rec.Fields("fld_provision"))
Else
provisionAUX = ""
End If
If Not IsNull(Rec.Fields("fld_convenioprog")) Then
convenioAUX = Trim(Rec.Fields("fld_convenioprog"))
Else
convenioAUX = ""
End If
If Not IsNull(Rec.Fields("fld_otroprog")) Then
otroprog = Trim(Rec.Fields("fld_otroprog"))
Else
otroprog = ""
End If
If Not IsNull(Rec.Fields("fld_descripcion")) Then
descripcion = Trim(Rec.Fields("fld_descripcion"))
Else
descripcion = ""
End If
todos = BIP & Chr(9) & NOMBRE & Chr(9) & UNIDAD & Chr(9) & etapa & Chr(9) & COMU & Chr(9) & SECTOR1 & _
Chr(9) & AREA1 & Chr(9) & PROVI & Chr(9) & localiza & Chr(9) & uformuladora & _
Chr(9) & provisionAUX & Chr(9) & convenioAUX & Chr(9) & otroprog & Chr(9) & descripcion
Grid1.AddItem todos

Rec.MoveNext

Wend

Rec.Close

End Sub

Baltasar
11 de Febrero del 2004
Bueno, hay algunas cosas que podrías hacer para acelerar el proceso:

los IF que contienen el bucle los puedes simplificar, por ejemplo:

If Not IsNull(Rec.Fields("FLD_PROYECTONOMBRE")) Then
NOMBRE = Trim(Rec.Fields("FLD_PROYECTONOMBRE"))
Else
NOMBRE = ""
End If

en lugar de eso pon:

NOMBRE = Trim(Rec.Fields("FLD_PROYECTONOMBRE")& "")

de ese modo no te canta error.

Luego está el tema de la visualización del grid: si an comenzar el bucle, antes del while pones:
Grid1.visible=false
y al acabar, después del Wend pones:
Grid1.visible=true

eso acelera muchísimo, ya lo verás.

Y otro truco está en el crecimiento del grid. Cada vez que el grid crece (añades una línea) consume algo de tiempo, así que yo primero asigno el tamaño del grid mirando el valor de recordcount, y luego lo relleno. Parece una tontería, pero la diferencia es bastante grande.

Espero que tu grid se rellene ahora de una manera más "fluida", eso sí, por favor, avísame de cómo te ha funcionado.

Saludos

yayon
11 de Febrero del 2004
Ok, muchas gracias probaré como funciona

Baltasar
11 de Febrero del 2004
primero haz lo del visible, y ya verás.