GRID CONTROL
Moderator: Rathinagiri
GRID CONTROL
Hola a todos,
Hace años que utilizo HMG y hasta ahora sigo utilizando obligadamente la versión HMG 3.4.1.
Cuando utilizo versiones como HMG 3.4.3 o superior hay problemas al utilizar el Control Grid de forma virtual con bases de datos grandes.
Adjunto ejemplo simple del software con el que tengo este inconveniente para comprobar el uso de Control Grid que utiliza variables dinámicas y base de datos con 100.000 registros, que funciona correctamente compilado con HMG 3.4.1,incluso con 600.000 registros.
Adjunto también ejemplo compilado con HMG3.4.2 donde ya se detecta cierta ralentización al cargar y al hacer scroll con respecto a la compilación HMG 3.4.1., y otros más compilados con versiones posteriores de HMG 4.4.4 hasta HMG 3.6.6 en los que el control grid colapsa, sin que haya forma de que funcione correctamente.
Sólo cuando se desconecta la función de PAINTDOUBLEBUFFER que evita el parpadeo del control gris durante el scroll, se muestran algún registro muy ralentizado y no atiende a las definiciones de las variables dinámicas.
El botón de estado sobre la columna permite filtrar el tipo de estado seleccionado en la lista.
Con los ejemplos adjuntos puede apreciarse la diferencia de funcionamiento sobre cada versión.
Este problema impide que pueda actualizar y utilizar las versiones superiores del compilador HMG.
Por favor, alguien puede aportar alguna solución.??
Muchas gracias a todos!!
Hace años que utilizo HMG y hasta ahora sigo utilizando obligadamente la versión HMG 3.4.1.
Cuando utilizo versiones como HMG 3.4.3 o superior hay problemas al utilizar el Control Grid de forma virtual con bases de datos grandes.
Adjunto ejemplo simple del software con el que tengo este inconveniente para comprobar el uso de Control Grid que utiliza variables dinámicas y base de datos con 100.000 registros, que funciona correctamente compilado con HMG 3.4.1,incluso con 600.000 registros.
Adjunto también ejemplo compilado con HMG3.4.2 donde ya se detecta cierta ralentización al cargar y al hacer scroll con respecto a la compilación HMG 3.4.1., y otros más compilados con versiones posteriores de HMG 4.4.4 hasta HMG 3.6.6 en los que el control grid colapsa, sin que haya forma de que funcione correctamente.
Sólo cuando se desconecta la función de PAINTDOUBLEBUFFER que evita el parpadeo del control gris durante el scroll, se muestran algún registro muy ralentizado y no atiende a las definiciones de las variables dinámicas.
El botón de estado sobre la columna permite filtrar el tipo de estado seleccionado en la lista.
Con los ejemplos adjuntos puede apreciarse la diferencia de funcionamiento sobre cada versión.
Este problema impide que pueda actualizar y utilizar las versiones superiores del compilador HMG.
Por favor, alguien puede aportar alguna solución.??
Muchas gracias a todos!!
- Attachments
-
- GIM_PRG.zip
- (18.79 MiB) Downloaded 129 times
Last edited by Izdeo on Fri May 09, 2025 5:07 pm, edited 2 times in total.
-
- Posts: 47
- Joined: Tue Dec 08, 2020 11:37 am
- DBs Used: DBF,MySQL,PostgreSQL
- Location: Brasil
- Contact:
Re: GRID CONTROL
You sholud use indexes to make the process less slow using dbf, i would do that. Filters are slow.
Re: GRID CONTROL
Hola Gisjr134,
claro obviamente también uso índices, pero esto no es la causa del problema.
Si esto fuera el origen del problema tampoco funcionaría correctamente la compilación con HMG 3.4.1 que tambien he subido, sin embargo hasta esta versión el control grid siempre funcionó correctamente y muy veloz.
Desde mi punto de vista, ahora el control grid hay algo que no parece funcionar correctamente en modo virtual con bases de datos de varios miles de registros y esto empeora si se añaden variables dinámicas para condicionar el estilo y también al añadir paintdoublebuffer para evitar el parpadeo.
Un saludo,
claro obviamente también uso índices, pero esto no es la causa del problema.
Si esto fuera el origen del problema tampoco funcionaría correctamente la compilación con HMG 3.4.1 que tambien he subido, sin embargo hasta esta versión el control grid siempre funcionó correctamente y muy veloz.
Desde mi punto de vista, ahora el control grid hay algo que no parece funcionar correctamente en modo virtual con bases de datos de varios miles de registros y esto empeora si se añaden variables dinámicas para condicionar el estilo y también al añadir paintdoublebuffer para evitar el parpadeo.
Un saludo,
Re: GRID CONTROL
Saludos.
Este código fuente no te soluciona el problema, pero creo que te ayuda:
Disculpa el desorden y las variables innecesarias que dejo, lo hice algo apurado.
La intención es darte ideas para que soluciones.
Nota importante: Fíjate el "memory" que coloco al final del INDEX ON ..., esto no crea en archivo índice físicamente y eso ayuda mucho.
Disminuye al mínimo el uso macro sustitución, ( tienes muchos y eso pone el proceso lento).
Trata de que las condiciones para pintar las celdas sean lo mas directo posible.
Este código fuente no te soluciona el problema, pero creo que te ayuda:
Code: Select all
#INCLUDE <hmg.ch>
FUNCTION GIMPRG
xesc := 1
xGridFont := "'Courier New'"
DatColBack := { || {220,220,220} }
NorColBack := { || {255,255,255} }
NorText := { || This.CellValue }
xSysFontName = "'Arial'"
xFiltering05 = .f.
arrfields := {"origen","afecha","ahora","ubicacion","concepto","estado","cfecha","chora","oficial","notas","NumPrev"}
* use LST_FLT.dbf SHARED NEW ALIAS LST_FLT
use LST_MST.dbf SHARED NEW ALIAS LST_FLT
private arredo := {}
dbeval({ || aadd(arredo , LST_FLT->(recno()) ) })
aadd(arredo , LST_FLT->(recno()) )
define window console1 at 1,1 width 1035 height 724 MAIN on interactiveclose exitgim() //on init IniProcess()
define main menu of console1
popup "Menu" name A0
item "Salir" action (exitgim()) name A19
end popup
end menu
define checkbutton BookBt5 // Boton console 5 > Activar filtro de la columna 5 > Estado
parent Console
row 0*xesc
col 530*xesc
caption "Estado"
width 76*xesc
height 24*xesc
fontsize 9*xesc
fontname &xSysFontName
value xFiltering05
tooltip "Filtrar el estado seleccionado / Sin seleción = Pendiente + Proceso"
onchange FilterCol5()
end checkbutton
define grid bookslv // Definicion del control de lista de incidencias filtradas esclavo BOOKSLV
parent console1
row 24*xesc
col (0-5)
width 1025*xesc
height ((620)*xesc)
fontname &xGridFont
fontsize 9*xesc
*visible .f.
virtual .t.
*rowsource "LST_FLT"
headers {"Departamento","Fecha","Hora","Ubicación","Concepto","Estado","Fecha","Hora","Oficial","Observaciones",""}
*columnfields {"origen","afecha","ahora","ubicacion","concepto","estado","cfecha","chora","oficial","notas","NumPrev"}
widths {0,68*xesc,50*xesc,120*xesc,294*xesc,75*xesc,68*xesc,50*xesc,80*xesc,178*xesc,18*xesc}
*dynamicbackcolor { DatColBack ,DatColBack , DatColBack , NorColBack , NorColBack , EstColBack , DatColBack , DatColBack , NorColBack , NorColBack, MemoColBack }
*dynamicforecolor { NormColText ,NormColText , NormColText , PrevColText , PrevColText , EstColFore , NormColText , NormColText , NormColText , NormColText, MemoColText }
*dynamicdisplay { NorText ,NorText , NorText , NorText , NorText , EstText , NorText , NorText , NorText , NorText, MemoText }
cellnavigation .f.
showheaders .t.
*buffered .t.
lines .t.
allowedit .f.
justify { {"NILL"},{"NILL"},{"NILL"},{"NILL"},{"NILL"}, BROWSE_JTFY_CENTER, {"NILL"},{"NILL"},{"NILL"},{"NILL"}}
ITEMCOUNT LASTREC()
ONQUERYDATA { || QueryTest() }
end grid
/*
@ 24*xesc , 0-5 GRID bookslv ;
width 1025*xesc;
height ((620)*xesc);
HEADERS {"Departamento","Fecha","Hora","Ubicación","Concepto","Estado","Fecha","Hora","Oficial","Observaciones",""} ;
WIDTHS {0,68*xesc,50*xesc,120*xesc,294*xesc,75*xesc,68*xesc,50*xesc,80*xesc,178*xesc,18*xesc};
VIRTUAL ;
ITEMCOUNT LASTREC() ;
ON QUERYDATA QueryTest() //ON DBLCLICK DblCLickTest()
*/
END WINDOW
CONSOLE1.bookslv.PaintDoubleBuffer := .T.
CENTER WINDOW console1
ACTIVATE WINDOW console1
RETURN
Procedure QueryTest()
* This.QueryData := Str ( This.QueryRowIndex ) + ',' + Str ( This.QueryColIndex )
i := arredo[This.QueryRowIndex]
GOTO(i)
x := arrfields[This.QueryColIndex]
y := LST_FLT->( fieldpos( x ) )
z := LST_FLT->( fieldget( y ) )
This.QueryData := z
RETURN
PROCEDURE EXITGIM
close all
quit
function FilterCol5
QUAL_EDO := Val(InputBox('Estado ? ','Change...'))
arredo := {}
select LST_FLT
index on recno() to ejemplo.ntx for edofiltra() memory
console1.bookslv.ITEMCOUNT := len(arredo)
CONSOLE1.bookslv.refresh()
RETURN
function edofiltra
local sw := estado=QUAL_EDO
if sw
aadd(arredo , LST_FLT->(recno()) )
endif
return(sw)
La intención es darte ideas para que soluciones.
Nota importante: Fíjate el "memory" que coloco al final del INDEX ON ..., esto no crea en archivo índice físicamente y eso ayuda mucho.
Disminuye al mínimo el uso macro sustitución, ( tienes muchos y eso pone el proceso lento).
Trata de que las condiciones para pintar las celdas sean lo mas directo posible.
Re: GRID CONTROL
Otra recomendación:
Olvida el uso del filtros.
Porque la velocidad con la cual harbour indexa,
mas el uso de "memory" o "additive temporary" para no generar el índice físicamente y
el poder generar el ejecutable en 64 bits no hace falta usar filtro.
Olvida el uso del filtros.
Porque la velocidad con la cual harbour indexa,
mas el uso de "memory" o "additive temporary" para no generar el índice físicamente y
el poder generar el ejecutable en 64 bits no hace falta usar filtro.
Re: GRID CONTROL
Code: Select all
aadd(arredo , LST_FLT->(recno()) )
-
- Posts: 281
- Joined: Sat May 18, 2019 2:11 pm
- DBs Used: Visual FoxPro, FoxPro
- Location: United States of America
Re: GRID CONTROL
Thank you ASESORMIX!
I knew nothing about the index MEMORY option that you mentioned.
Your knowledge and suggestion was very helpful to me.
Thanks again,
Spencer
I knew nothing about the index MEMORY option that you mentioned.
Your knowledge and suggestion was very helpful to me.
Thanks again,
Spencer
Re: GRID CONTROL
I use 3.44
At start of main program I create a folder for my temporary indexes. This is for teminals so temp names are not the same as server.
Like createrfolder("c:\mytemp") If folder exsists it just bypasses.
I found the grid is slow when using large tables.
When ever I want just view data I use the browse. It works very fast, but I don`t edit in browse.
When I want to make changes of a group of items in a table I use a grid . I index to the temp index for group need.
I have a invoice items file that has more then 200,000 items in it. I would
Then create and use grid.
When closing main program I erase temp indexes
erase "c:\mytemp\*.ntx"
At start of main program I create a folder for my temporary indexes. This is for teminals so temp names are not the same as server.
Like createrfolder("c:\mytemp") If folder exsists it just bypasses.
I found the grid is slow when using large tables.
When ever I want just view data I use the browse. It works very fast, but I don`t edit in browse.
When I want to make changes of a group of items in a table I use a grid . I index to the temp index for group need.
I have a invoice items file that has more then 200,000 items in it. I would
Code: Select all
temp := "c:\mytemp\itemtemp" \\ I usually create a itemtemp from the time() for no overlaps
select inv_item
index on item_no to &temp for item_no = "123455"
set index to &temp,mainindex1,2, so on. // This is for adding records.
When closing main program I erase temp indexes
erase "c:\mytemp\*.ntx"
All The Best,
Franco
Canada
Franco
Canada
Re: GRID CONTROL
Gracias Asesormix,
Viendo los cambios que has realizado y siguiendo tu recomendación de utilizar una matriz para la carga del control grid pude comprobar que el resultado era óptimo y funcionaba muy bien.
He implementado estos cambios en mi aplicación para gestionar el control grid y ahora funciona perfectamente con cualquier versión de HGM.
Nuevamente muchas gracias por tu ayuda !!
Un saludo,
Viendo los cambios que has realizado y siguiendo tu recomendación de utilizar una matriz para la carga del control grid pude comprobar que el resultado era óptimo y funcionaba muy bien.
He implementado estos cambios en mi aplicación para gestionar el control grid y ahora funciona perfectamente con cualquier versión de HGM.
Nuevamente muchas gracias por tu ayuda !!
Un saludo,