Demasiado lento el grid con setall

47 views
Skip to first unread message

Germán Montini

unread,
Nov 27, 2014, 7:05:34 PM11/27/14
to Grupo Fox
Quería consultarles porque estoy utilizando SETALL en un grid, es para mostrar una ctacte, lo hago de la siguiente manera:
 

This

.SetAll("DynamicBackColor", "IIF(EMPTY(IdCtaCte), RGB(192,192,192), IIF(!EMPTY(Haber), RGB(255,0,0), RGB(0,128,64)))", "Column")

Con EMPTY(IdCtaCte) ==> un registro que separa entre asignaciones de Facturas, Rojo para las facturas, Verde para los pagos asignados

El tema es que se pone muy lento para subri o bajar dentro del grid, se puede hacer de otro modo?

 

Muchas Gracias

Germán Montini

Analista de Sistemas

 

Fidel Charny

unread,
Nov 27, 2014, 7:29:40 PM11/27/14
to publice...@googlegroups.com
Puedes probar con ICASE. Te conviene transformar los colores antes (pasar el número de color en lugar de la función RGB)

Ejemplo:
lDynColor=.T.
nRows=20

lcGris=TRANSFORM(RGB(192,192,192))
lcVerde=TRANSFORM(RGB(0,128,64))
lcRojo=TRANSFORM(RGB(255,0,0))
lcPut="ICASE(EMPTY(curClien.idclien),&lcGris,!EMPTY(curClien.haber),&lcRojo,&lcVerde)"

WITH thisform.grilla1
    .recordSource="curClien"
    .Height=.HeaderHeight + nRows * .RowHeight + 2 ;
        +IIF(INLIST(.ScrollBars,1,3),17,0)
    if lDynColor

        .setall("DynamicBackColor",lcPut,"Column")
    endif
endwith

Germán Montini

unread,
Nov 27, 2014, 7:50:47 PM11/27/14
to publice...@googlegroups.com
Gracias Fidel, la verdad que se aceleró bastante.
Digamos que ya es aceptable como queda, lo unico que veo es cuando llega al primer o ultimo registro visible en la grilla, quedan como resaltados dos registros y demora para correr al siguiente o anterior registro.
 
Muchas gracias
 
Germán Montini
Analista de sistemas

Fidel Charny

unread,
Nov 28, 2014, 7:38:53 AM11/28/14
to publice...@googlegroups.com
Geraldo
Lo que puedes ver es el código que haya en AfterRowColChange. Sobre todo si tienes algún Thisform.Refresh o This.refresh. Si es necesario refrescar objetos porque están ligados por ControlSource, conviene utilizar el refresh de cada objeto.
Lo otro que puede hacer más remolón es que el cursor tenga muchos campos y una o más etiquetas de índice complejas.

También puedes probar esta alternativa (siempre revisando AfterRowColChange)
lcGris=TRANSFORM(RGB(192,192,192))
lcGris
=TRANSFORM(Thisform.grilla1.GridLineColor)
lcVerde
=TRANSFORM(RGB(0,128,64))
lcRojo
=TRANSFORM(RGB(255,0,0))
lcBlanco
=TRANSFORM(RGB(255,255,255))
lDynColor
= RECCOUNT("curClien") > 2

lcDnBackColor
="IIF(EMPTY(curClien.idclien),&lcGris,&lcBlanco)"
lcDnForeColor
="ICASE(EMPTY(curClien.idclien),&lcGris,!EMPTY(curClien.haber),&lcRojo,&lcVerde)"
nRows
=30
thisform
.WindowState=2
WITH thisform
.grilla1
   
.HighlightStyle=2
   
.AllowAddNew=.F.
   
.AllowCellSelection=.f.
   
.recordSource="curClien"
   
.Width=thisform.width-40
   
.left=20
   
.top=20

   
.Height=.HeaderHeight + nRows * .RowHeight + 2 ;
       
+IIF(INLIST(.ScrollBars,1,3),17,0)
   
if
lDynColor
       
.setall("DynamicBackColor",lcDnBackColor,"Column")
       
.Setall("DynamicForeColor",lcDnForeColor,"Column")
    ELSE
       
.Setall("DynamicBackColor","","Column")    
       
    ENDIF
   
.BackColor=RGB(242,247,243)
   
.zorder(0)
   
.refresh
ENDWITH
thisform
.grilla1.SetFocus


Este "curclien" con el que pruebo es un cursor que tiene 10 campos y funciona bien (no tiene ese efecto, aunque si es un poquito "duro").
Para la prueba hice un iterativo para que tuviera más de 500000 registros. Aún así no produce el defecto y es bastante ágil.



Reply all
Reply to author
Forward
0 new messages