Sobre Grid/TBrowse/skipBlock

HMG en Español

Moderator: Rathinagiri

User avatar
andyglezl
Posts: 858
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 7 times
Been thanked: 25 times
Contact:

Re: Sobre Grid/TBrowse/skipBlock

Post by andyglezl » Fri Jul 22, 2016 4:29 am

Hola J.A. ??

Desconozco porque el GRID se comporta de ese modo...
(ademas de que nunca lo he utilizado de esa forma)

Tampoco entiendo el porque querer "hace un BROWSE" a un archivo completo (y de tantos registros)
sabiendo que solo puedo editar un registro a la vez y puedo ir directamente a el.

Desde Clipper, se podía utilizar la función DBEVAL() para filtrar una serie de registros
y poderlos manipular.

A continuación te muestro tu ejemplo modificado... espero te sirva.
*-------------------------------------------------------------------------------------------------------------------------
Hello JA. ??

I do not know because the GRID behaves that way ...
(Besides that I've never used that way)

I do not understand why wanting to "make a BROWSE" to a whole file (and so many records)
knowing that I can only edit one record at a time and I can go directly to it.

From Clipper, you could use the DBEVAL () function to filter a set of records
and be able to handle.

Then I'll show you your modified example ... I hope you serve.


Code: Select all

#include "hmg.ch"

 Function Main
	*-----------------
	LOCAL aCpos := {}
	*-----------------

SET EXCLUSIVE ON
SET DELETED ON
	
  use fact new

  	if !file("fact.ntx")
  	    index on FACT to FACT
  	endif
  set index to fact

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 900 ;
		HEIGHT 800 ;
		MAIN 

	@ 0,0 GRID Grid_1 ;
		WIDTH 210 HEIGHT 500 ;
		HEADERS {"FACTURA","FECHA"} ;
		WIDTHS {80,100} ;
		ITEMS aCpos 
		// ROWSOURCE "fact" COLUMNFIELDS {"FACT","FECH"}
		
	*-----------------------------------------------------------------------------------------------
	DBEval( { || DoEvent(), Form_1.Grid_1.AddItem( { FACT, FECH } ) }, { || ("A" $ FACT ) } )
	*-----------------------------------------------------------------------------------------------


	END WINDOW

	CENTER WINDOW Form_1
	ACTIVATE WINDOW Form_1

 Return
FUNCTION DoEvent()
	DO EVENTS
RETURN
Andrés González López
Desde Guadalajara, Jalisco. México.

jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm
Has thanked: 2 times

Post by jpuntoapunto » Fri Jul 22, 2016 3:41 pm

andyglezl wrote:Hola J.A. ??

Desconozco porque el GRID se comporta de ese modo...
(ademas de que nunca lo he utilizado de esa forma)

Tampoco entiendo el porque querer "hace un BROWSE" a un archivo completo (y de tantos registros)
sabiendo que solo puedo editar un registro a la vez y puedo ir directamente a el.

Desde Clipper, se podía utilizar la función DBEVAL() para filtrar una serie de registros
y poderlos manipular.

A continuación te muestro tu ejemplo modificado... espero te sirva.
*-------------------------------------------------------------------------------------------------------------------------
Hello JA. ??

I do not know because the GRID behaves that way ...
(Besides that I've never used that way)

I do not understand why wanting to "make a BROWSE" to a whole file (and so many records)
knowing that I can only edit one record at a time and I can go directly to it.

From Clipper, you could use the DBEVAL () function to filter a set of records
and be able to handle.

Then I'll show you your modified example ... I hope you serve.


Code: Select all

#include "hmg.ch"

 Function Main
	*-----------------
	LOCAL aCpos := {}
	*-----------------

SET EXCLUSIVE ON
SET DELETED ON
	
  use fact new

  	if !file("fact.ntx")
  	    index on FACT to FACT
  	endif
  set index to fact

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 900 ;
		HEIGHT 800 ;
		MAIN 

	@ 0,0 GRID Grid_1 ;
		WIDTH 210 HEIGHT 500 ;
		HEADERS {"FACTURA","FECHA"} ;
		WIDTHS {80,100} ;
		ITEMS aCpos 
		// ROWSOURCE "fact" COLUMNFIELDS {"FACT","FECH"}
		
	*-----------------------------------------------------------------------------------------------
	DBEval( { || DoEvent(), Form_1.Grid_1.AddItem( { FACT, FECH } ) }, { || ("A" $ FACT ) } )
	*-----------------------------------------------------------------------------------------------


	END WINDOW

	CENTER WINDOW Form_1
	ACTIVATE WINDOW Form_1

 Return
FUNCTION DoEvent()
	DO EVENTS
RETURN
Hola Andy, gracias por tu respuesta.

El motivo de utilizar browse sobre la base de datos completa es que así lo tenía diseñado en Clipper. Era perfectamente operativo y rápido (con hasta 2 millones de registros).
Mostraba todos los registros, desde el mismo browse hacia todas las busquedas necesarias por cualquier campo y con un simple Return editaba todo
el registro. Quería impletementar la misma interfaz para que el cambio no sea demasido traumático.

Ya estaba utilizando Grid en la nueva reprogramación con hmg pero claro, no se me habia ocurrido hacer la prueba sobre una cierta cantidad de datos como la del ejemplo. De ahí mi sorpresa y susto (del que aun no me he repuesto) al ver funcionando con tan exagerada lentitud Grid.

Gracias y Saludos.
Juan Antonio.

User avatar
luisvasquezcl
Posts: 1039
Joined: Thu Jul 31, 2008 3:23 am
Location: Chile
Has thanked: 12 times
Been thanked: 14 times
Contact:

Post by luisvasquezcl » Fri Jul 22, 2016 4:34 pm

Estimado,
Cambia el indice a CDX en el grid.prg.
Ve el mensaje que te envié.
saludos cordiales,

EduardoLuis
Posts: 525
Joined: Tue Jun 04, 2013 6:33 pm
Location: Argentina
Been thanked: 28 times

Post by EduardoLuis » Fri Jul 22, 2016 4:44 pm

Hola Jose Antonio:

Reponte rápido que hay mucho trabajo por delante.-
A poco de que te familiarices con HMG verás que hay muchos métodos de búsqueda y edición, los que por cierto son mucho mejores que en Clipper.-
Como te señalé Browse está directamente vinculado con tablas, aún cuando puedas utilizar GRID para la misma función.-
Al contrario Grid está directamente vinculado a arrays; si observas el ejemplo de Andyglez, advertirá que el contenido de la dbf es convertido a array, y ahí es donde GRID le toma ventaja al Browse.-
Coincido con Andy en la innecesariedad de montar la edición en un Browse o Grid.- Muchos optamos porque tanto el Browse como el Grid, sirvan de un indice rápido de visualización, y en cada caso habilitar la edición sobre campos y no directamente sobre el Browse ó Grid.-
Una gran ventaja del GRID - además de su velocidad - , es que trabajando con arrays, dejas la tabla libre hasta el momento en que debas guardar la modificación; esto en un entorno de red agiliza ostensiblemente los tiempos de acceso para todos los usuarios.- En la carpeta SAMPLES vas a encontrar gran cantidad de ejemplos para utilizar eficientemente el GRID.-
HMG es un semi OOP, por lo que las posibilidades son mucho mayores que en Clipper; es por eso que una conversión directa de prg escritos en Clipper a HMG, carece de sentido; en mi caso como provengo de CA Visual Object, me costó algo menos, pero ciertamente tuve que re-escribir mucho de lo hecho con aquel lenguaje.-
Pero una vez que te acostumbres a la filosofía de HMG, advertirás lo rápido que podrá reutilizar códigos ya escritos en diferentes aplicaciones.-
Cordialmente.
Eduardo

jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm
Has thanked: 2 times

Post by jpuntoapunto » Fri Jul 22, 2016 5:25 pm

luisvasquezcl wrote:Estimado,
Cambia el indice a CDX en el grid.prg.
Ve el mensaje que te envié.
saludos cordiales,
Ok.
EduardoLuis wrote:Hola Jose Antonio:
Reponte rápido que hay mucho trabajo por delante.-
A poco de que te familiarices con HMG verás que hay muchos métodos de búsqueda y edición, los que por cierto son mucho mejores que en Clipper.-
Como te señalé Browse está directamente vinculado con tablas, aún cuando puedas utilizar GRID para la misma función.-
Al contrario Grid está directamente vinculado a arrays; si observas el ejemplo de Andyglez, advertirá que el contenido de la dbf es convertido a array, y ahí es donde GRID le toma ventaja al Browse.-
Coincido con Andy en la innecesariedad de montar la edición en un Browse o Grid.- Muchos optamos porque tanto el Browse como el Grid, sirvan de un indice rápido de visualización, y en cada caso habilitar la edición sobre campos y no directamente sobre el Browse ó Grid.-
Una gran ventaja del GRID - además de su velocidad - , es que trabajando con arrays, dejas la tabla libre hasta el momento en que debas guardar la modificación; esto en un entorno de red agiliza ostensiblemente los tiempos de acceso para todos los usuarios.- En la carpeta SAMPLES vas a encontrar gran cantidad de ejemplos para utilizar eficientemente el GRID.-
HMG es un semi OOP, por lo que las posibilidades son mucho mayores que en Clipper; es por eso que una conversión directa de prg escritos en Clipper a HMG, carece de sentido; en mi caso como provengo de CA Visual Object, me costó algo menos, pero ciertamente tuve que re-escribir mucho de lo hecho con aquel lenguaje.-
Pero una vez que te acostumbres a la filosofía de HMG, advertirás lo rápido que podrá reutilizar códigos ya escritos en diferentes aplicaciones.-
Cordialmente.
Eduardo
Pues no se, quizá sea lo que dices. Yo, al venir directamente de Clipper y haber utilizado tanto Tbrowse, me está costando mucho. Avancé bastante y rápido con HMG, hasta que me tropecé con este muro.

Saludos a ambos y muy agradecido. Seguimos probando.
Juan Antonio.

EduardoLuis
Posts: 525
Joined: Tue Jun 04, 2013 6:33 pm
Location: Argentina
Been thanked: 28 times

Post by EduardoLuis » Fri Jul 22, 2016 7:16 pm

Hola Jose Antonio:

Acabo de compilar tu demos, y no he notado ninguna merma en la velocidad del Grid respecto del Browse.- Los mas de 50K registros se acceden velozmente.-
He notado que tus ejecutables son ligeramente mayores que el mio, y tu GRID.EXE efectivamente se ejecuta con mas lentitud.-
Podrías indicar que versión de HMG estas utilizando y bajo que SO.- Esto podría ayudar a identificar que genera la respuesta tan lenta.-
Cordialmente.
Eduardo

jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm
Has thanked: 2 times

Post by jpuntoapunto » Sat Jul 23, 2016 12:11 am

EduardoLuis wrote:Hola Jose Antonio:

Acabo de compilar tu demos, y no he notado ninguna merma en la velocidad del Grid respecto del Browse.- Los mas de 50K registros se acceden velozmente.-
He notado que tus ejecutables son ligeramente mayores que el mio, y tu GRID.EXE efectivamente se ejecuta con mas lentitud.-
Podrías indicar que versión de HMG estas utilizando y bajo que SO.- Esto podría ayudar a identificar que genera la respuesta tan lenta.-
Cordialmente.
Eduardo
Hola Eduardo.

¿De verdad que tu compilacion con Grid no va lentísimo cuando te desplazas al final de la tabla?!!.
Ahora si que estoy totalmente sorprendido.
Pues yo estoy utilizando la que creo que es la ultima version que descague HMG 3.4.3.
Ya dentro del programa, la funcion HMGVersion() da como resultado HMG 3.4.3 Stable (32 bit).

Aunque lo extraño es que despues de la compilacion, da un texto de resultado diciendo:
Harbour 3.2.0dev (r1601151502)
Copyright (c) 1999-2015, http://harbour-project.org/

El sistema operativo utilizado es Windows 10 sobre un disco duro ssd de 256 Gb y memoria ram de 8 Gb.

Espero que te sirva de ayuda. ¿Que version del compilador utilizas tu donde no has observado esa merma de velocidad de Grid?.

Atentísimo y agradecido.
Juan Antonio


User avatar
andyglezl
Posts: 858
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 7 times
Been thanked: 25 times
Contact:

Post by andyglezl » Sun Jul 24, 2016 4:53 pm

Hola Juan Antonio

A mi tambien me intrigo ese comportamiento del GRID, e hice algunas pruebas.

Si comentas la siguente linea, el Grid funciona perfecto.
// SET DELETED ON
-------------------------------------------------------------------------------------------------
Hi Juan Antonio

I would also intrigued that I GRID behavior, and did some tests.

If you comment the next line, the Grid works perfect.
// SET DELETED ON
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
mustafa
Posts: 603
Joined: Fri Mar 20, 2009 11:38 am
Location: Alicante - Spain
Been thanked: 46 times

Post by mustafa » Sun Jul 24, 2016 5:15 pm

Andres Muy Bien !!!

// SET DELETED ON <- Sin , el Grid funciona perfecto.

Al sample le he añadido un contador de registros, por si os puede servir.
*------------------------------------------------------------------------------------*
Andres Very Good !!!

// SET DELETED ON <- No, the Grid works perfect.

The sample I have added a record counter, if you can serve.

Code: Select all

#include "hmg.ch"

 Function Main

  REQUEST DBFCDX , DBFFPT ,DBFNTX , DBFDBT
  RDDSETDEFAULT( 'DBFCDX','DBFNTX' )

   *-----------------
   PRIVATE aReg ,nValor ,Regs
   *-----------------

   SET EXCLUSIVE ON
 * SET DELETED ON   <---  (anular)
	
  use fact new
  if !file("fact.CDX")
      index on FACT to FACT
  endif
  set index to fact

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 900 ;
		HEIGHT 800 ;
		MAIN 

      @ 160, 500 Label Label_1G    ;
                width   150        ;
                height  035        ;
                FONT "Arial"  SIZE 10 BOLD ;
                value "Registro / Total"

      @ 182, 504 Label Label_2G    ;
                width   150        ;
                height  035        ;
                FONT "Arial"  SIZE 10 BOLD ;
                value ""

	@ 0,0 GRID Grid_1 ;
                 WIDTH 210 HEIGHT 500 ;
		HEADERS {"FACTURA","FECHA"} ;
		WIDTHS {80,100} ;
		ROWSOURCE "fact" ;
                ON CHANGE PositionData() ;   
		COLUMNFIELDS {"FACT","FECH"}

	END WINDOW

	CENTER WINDOW Form_1
	ACTIVATE WINDOW Form_1

 Return

*------------------------------------------------------------* 
 Function PositionData()  // Nº de Registro / Total  
*------------------------------------------------------------*
  aReg    :=  Form_1.Grid_1.Value  
  nValor  :=  0
  Regs    :=  STR( Form_1.Grid_1.ItemCount )  
 
   Select('FACT')
   nValor := aReg[1] 
   Form_1.Label_2G.value := ALLTRIM(STR((nValor)))+SPACE(1)+"/"+SPACE(1)+ALLTRIM( Regs)  

return 


jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm
Has thanked: 2 times

Post by jpuntoapunto » Sun Jul 24, 2016 7:50 pm

andyglezl wrote:Hola Juan Antonio

A mi tambien me intrigo ese comportamiento del GRID, e hice algunas pruebas.

Si comentas la siguente linea, el Grid funciona perfecto.
// SET DELETED ON
-------------------------------------------------------------------------------------------------
Hi Juan Antonio

I would also intrigued that I GRID behavior, and did some tests.

If you comment the next line, the Grid works perfect.
// SET DELETED ON
¡¡ INCREIBLE !!. ¡¡Genial!!.

Efectivamente, quitando "set deleted on", el grid ha cambiado como de la noche al dia. Es pulsar Fin para ir al final del archivo y el desplazamiento es instantaneo. El movimiento página a página igual de rápido. Me he quedado muy impresionado como esa simple instrucción para tratar o no los registros borrados puede afectar tanto a grid. Y, ya que se sabe el motivo, ¿ se arreglará esto en un futuro ?.

¿ Que haceis vosotros con los registros borrados ?. ¿ Compactais bases de datos en cada borrado de registro ?. Yo nunca lo he hecho así, pero en fin, habrá que tratarlos de otra forma.

Esto me anima a continuar.
Te estoy super agradecido, Andy. Te debo unas cervezas.

Saludos.
Juan Antonio.

Post Reply