Nuevo Grid (más veloz)

HMG en Español

Moderator: Rathinagiri

Post Reply
joposadas

Nuevo Grid (más veloz)

Post by joposadas »

HGM,

He leído que hay una nueva versión o un nuevo GRID que es mucho más veloz que oriiginal
actualmente uso la versión original de esta forma

Frm_Users.Grd_Users.AddItem ( { TRANSFORM (oReadCustomerData:Fields("User_Id"):Value,"999999999999"), +;
oReadCustomerData:Fields("Name"):Value } )

Mi pregunta es ¿como debo de usar el nuevo GRID, ya que en el ejemplo solo dice:

FOR i = 1 TO Form_1.Grid_1.ItemCount
FOR k = 1 TO Form_1.Grid_1.ColumnCount
xValue := Form_1.Grid_1.CellEx (i,k)
IF k == 1
xValue := ALLTRIM(STR(i)) +") "+ xValue
ENDIF
Form_1.Grid_1.CellEx (i,k) := xValue
NEXT
NEXT

pero no se como indicarle que me ponga el campo que yo deseo, algo asi como lo hace el original

Ojala y alguien me pueda ayudar con eso, deseo probarlo y compararlo con el original

Y de antemano muchas gracias por la ayuda
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Nuevo Grid (más veloz)

Post by Pablo César »

joposadas wrote:He leído que hay una nueva versión o un nuevo GRID que es mucho más veloz que oriiginal
Hola Jorge, no sé si se puede decir que se trata de un nuevo Grid, pero es bueno que hayas tcado en el asunto. Porque viene a tona en los nuevos recursos que Claudio adicionou al Grid. Algunas cosas fueron removidas e muchas otras mejoradas y adicionadas.
srvet_claudio wrote:IMHO I think that GridEx it should be integrated to Grid control, because GridEx is only a small patch of Grid.
Best Regards,
Claudio.
Fijate en este mensaje: http://hmgforum.com/viewtopic.php?p=27350#p27350
... actualmente uso la versión original de esta forma

Frm_Users.Grd_Users.AddItem ( { TRANSFORM (oReadCustomerData:Fields("User_Id"):Value,"999999999999"), +;
oReadCustomerData:Fields("Name"):Value } )
Por lo que pude ver este AddItem ahora es existe un nuevo método llamado AddItemEx, aunque yo utilizé ahora ultimo AddItem sin problemas.
Mi pregunta es ¿como debo de usar el nuevo GRID, ya que en el ejemplo solo dice:

Code: Select all

      FOR i = 1 TO Form_1.Grid_1.ItemCount
         FOR k = 1 TO Form_1.Grid_1.ColumnCount
            xValue := Form_1.Grid_1.CellEx (i,k)
            IF k == 1
               xValue := ALLTRIM(STR(i)) +") "+ xValue
            ENDIF
            Form_1.Grid_1.CellEx (i,k) := xValue
         NEXT
      NEXT
Este es apenas un ejemplo para demonstrar la velocidad que hay entre Cell() y CellEx(), la interpretacion de los arrays anineados, permanece igual.
pero no se como indicarle que me ponga el campo que yo deseo, algo asi como lo hace el original
Podrias mostrar tu código u otro código ejemplo que estés con dificultad ?
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
joposadas

Re: Nuevo Grid (más veloz)

Post by joposadas »

HMG

Actualmente trabajo con HMG+MS-SQL y estoy haciendo pruebas con la versión 3.1.5 en especial con el nuevo control GRID y he hecho algunas pruebas de velocidad y este es el resultado. Leyendo la misma tabla de SQL con 59,161 registros
Usando el "antiguo" (por llamarlo así para diferenciarlo y no para despreciarlo) GRID tengo este codigo:

Frm_Users.Lbl_InitTime.Value := TIME()
DO WHILE !oReadCustomerData:EOF()
Frm_Users.Grd_Users.AddItem ( { TRANSFORM (oReadCustomerData:Fields("User_Id"):Value,"999999999999"), +;
oReadCustomerData:Fields("Name"):Value } )
oReadCustomerData:MoveNext()
ENDDO
Frm_Users.Lbl_EndTime.Value := TIME()

El tiempo en leer esos 59,161 es de 10 segundo

AHORA con la "nuevo" GRID


Frm_Users.Lbl_InitTime.Value := TIME()
DO WHILE !oReadCustomerData:EOF()
Frm_Users.Grd_Users.AddItemEx ( { TRANSFORM (oReadCustomerData:Fields("User_Id"):Value,"999999999999"), +;
oReadCustomerData:Fields("Name"):Value }, NIL )
oReadCustomerData:MoveNext()
ENDDO
Frm_Users.Lbl_EndTime.Value := TIME()

el tiempo en leer los 59,161 es de 9 segundos,

Es decir que la diferencia es de 1 segundo, cabe acalara que uso una lap con Windows8, con 8g de ram, procesador Intel core i7, a 64bits

Ahora mi pregunta es:
¿Porque en los ejemplo que viene con la versión 3.1.5 realmente si hay una diferencia de velicidad, ¿a caso tengo que poner algo más en mi código?,

mucho agradeceré si alguien ya ha usado el nuevo GRID y si realmente ha visto diferencia en velocidad, yo estoy muy interesado en ese tema ya que tengo que leer y presentar muchos registros en pantalla.

De antemano agradezco la atención a la presente.

PD Copio el procedimiento completo en donde hago la lectura del Resultset de SQL:

#INCLUDE <hmg.ch>
#INCLUDE <PS_Cnfg.ch>

PROCEDURE Users
IF HMG SUPPORT UNICODE RUN
SET TOOLTIPSTYLE BALLOON
IF IsWindowActive (Frm_Users)
MsgStop("Ya esta en en uso esta opción","ERROR")
RETURN NIL
ELSE
LOAD WINDOW Frm_Users
END WINDOW
LoadUsersGrid()
CENTER WINDOW Frm_Users
ACTIVATE WINDOW Frm_Users
ENDIF

PROCEDURE LoadUsersGrid
LnRow := 0
PutMsg ("Espere... Obteniendo registros de la base de datos.")
Connect2SQL()
oReadCustomerData := CreateObject("ADODB.Recordset")
GsQueryRead := "SELECT User_Id, Name FROM USERS ORDER BY User_id"
oReadCustomerData:Open(GsQueryRead, oConnectionDB, adOpenDynamic, adLockReadOnly)
oReadCustomerData:MoveFirst()
Frm_Users.Grd_Users.DeleteAllItems
IF oReadCustomerData:RecordCount = 0
msginfo("No hay datos")
RETURN
ENDIF
*IF oReadCustomerData:RecordCount > 0
* PutMsg ("Espere... Llenando el grid para ser mostrado")
*ENDIF
Frm_Users.Lbl_InitTime.Value := TIME()
DO WHILE !oReadCustomerData:EOF()
Frm_Users.Grd_Users.AddItem ( { TRANSFORM (oReadCustomerData:Fields("User_Id"):Value,"999999999999"), +;
oReadCustomerData:Fields("Name"):Value } )

*Frm_Users.Grd_Users.AddItemEx ( { TRANSFORM (oReadCustomerData:Fields("User_Id"):Value,"999999999999"), +;
* oReadCustomerData:Fields("Name"):Value }, NIL )

oReadCustomerData:MoveNext()
ENDDO
Frm_Users.Lbl_EndTime.Value := TIME()
msginfo(str(Frm_Users.Grd_Users.ItemCount)," .ColumnCOUNT")
ClearMsg()
RETURN
User avatar
luisvasquezcl
Posts: 1263
Joined: Thu Jul 31, 2008 3:23 am
Location: Chile
Contact:

Re: Nuevo Grid (más veloz)

Post by luisvasquezcl »

Hola colegas,

Existe el método GetRows() del objeto recordset que nos permite obtener una matriz con los datos de la consulta.
Este método se puede utilizar de la siguiente forma:
GetRows() sin parámetros, devuelve todos los registros del recordset.
GetRows(nLinea) devuelve la línea indicada en el parámetro comenzando desde 1.

Tenga en cuenta que los datos vienen en su tipo original, es decir, si es numérico devuelve un número no texto.

ejemplo:
Private aData

aData := oRs:getRows()

de esa forma lo podemos pasar directo al grid y es mucho más rápido ya que el arreglo lo obtienes de forma instantánea.

Tenga en cuenta que

Respecto del grid, siempre pensé que la forma más optimizada como debería trabajar es mostrando sólo la cantidad de líneas que hay en pantalla tal como lo hace el Browse y no cargando todo el arreglo, de esa forma la vista se cargaría muy rápido.
Ojalá se pudiera implementar algo así ya que el uso del grid se ha vuelto muy exhaustivo.
Bueno, espero les sea de ayuda.
Saludos cordiales,
Luis Vásquez
User avatar
srvet_claudio
Posts: 2224
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: Nuevo Grid (más veloz)

Post by srvet_claudio »

joposadas wrote: Ahora mi pregunta es:
¿Porque en los ejemplo que viene con la versión 3.1.5 realmente si hay una diferencia de velicidad, ¿a caso tengo que poner algo más en mi código?,

mucho agradeceré si alguien ya ha usado el nuevo GRID y si realmente ha visto diferencia en velocidad
Hola Joposadas.

La diferencia en velocidad se aprecia con el nuevo Grid cuando mayor sea el numero de campos de la base de datos (ej. Nombre, Apellido, Direccion, Telefono, etc.).

Por ejemplo, si quieres saber el valor del campo Nombre de un determinado registro, el grid viejo cargará en una matriz todos los campos de ese registro, luego los trasformara a todos los campos a su respectivo tipo de dato (numero, fecha, lógico, etc) y por último te devuelve el valor del campo especificado, también para guardar el valor de un determinado campo el grid viejo hace exactamente lo mismo.

Con el grid nuevo se evita esa múltiple lectura/transformación por eso es mas rápido cuanto mayor sea el numero de campos del grid.

Saludos,
Claudio.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
Post Reply