GRID CONTROL

Moderator: Rathinagiri

Post Reply
Izdeo
Posts: 17
Joined: Sat Jun 28, 2014 7:17 am

GRID CONTROL

Post by Izdeo »

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!!
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.
gisjr134
Posts: 47
Joined: Tue Dec 08, 2020 11:37 am
DBs Used: DBF,MySQL,PostgreSQL
Location: Brasil
Contact:

Re: GRID CONTROL

Post by gisjr134 »

You sholud use indexes to make the process less slow using dbf, i would do that. Filters are slow.
Izdeo
Posts: 17
Joined: Sat Jun 28, 2014 7:17 am

Re: GRID CONTROL

Post by Izdeo »

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,
ASESORMIX
Posts: 216
Joined: Thu Oct 25, 2012 8:08 pm
Location: Bqto, Venezuela

Re: GRID CONTROL

Post by ASESORMIX »

Saludos.
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) 

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.
ASESORMIX
Posts: 216
Joined: Thu Oct 25, 2012 8:08 pm
Location: Bqto, Venezuela

Re: GRID CONTROL

Post by ASESORMIX »

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.
ASESORMIX
Posts: 216
Joined: Thu Oct 25, 2012 8:08 pm
Location: Bqto, Venezuela

Re: GRID CONTROL

Post by ASESORMIX »

Code: Select all

aadd(arredo , LST_FLT->(recno()) )
Esta línea de código (ubicada a continuación del DBEVAL...) es un error, no va, esta sobrando.
Red2
Posts: 281
Joined: Sat May 18, 2019 2:11 pm
DBs Used: Visual FoxPro, FoxPro
Location: United States of America

Re: GRID CONTROL

Post by Red2 »

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
franco
Posts: 877
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: GRID CONTROL

Post by franco »

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

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.
Then create and use grid.

When closing main program I erase temp indexes
erase "c:\mytemp\*.ntx"
All The Best,
Franco
Canada
Izdeo
Posts: 17
Joined: Sat Jun 28, 2014 7:17 am

Re: GRID CONTROL

Post by Izdeo »

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,
Post Reply